From cfd09a5cb668edc092921eda0d081f88c22fdd7d Mon Sep 17 00:00:00 2001 From: JT Smith Date: Tue, 28 Nov 2006 02:23:34 +0000 Subject: [PATCH] upgraded to yui 0.12.0 upgraded to yui-ext 0.33 rc2 --- www/extras/yui-ext/README.txt | 12 + www/extras/yui-ext/animator-lib.js | 45 + www/extras/yui-ext/basic-dialog.js | 66 + www/extras/yui-ext/basic-grid-lib.js | 194 + www/extras/yui-ext/build/Bench-min.js | 9 + www/extras/yui-ext/build/CSS-min.js | 16 + .../yui-ext/build/CompositeElement-min.js | 16 + www/extras/yui-ext/build/Date-min.js | 43 + www/extras/yui-ext/build/DomHelper-min.js | 33 + www/extras/yui-ext/build/Element-min.js | 83 + www/extras/yui-ext/build/EventManager-min.js | 28 + www/extras/yui-ext/build/JSON-min.js | 21 + .../yui-ext/build/MixedCollection-min.js | 21 + www/extras/yui-ext/build/State-min.js | 21 + www/extras/yui-ext/build/UpdateManager-min.js | 24 + www/extras/yui-ext/build/anim/Actor-min.js | 28 + www/extras/yui-ext/build/anim/Animator-min.js | 22 + .../build/data/AbstractDataModel-min.js | 7 + .../build/data/DefaultDataModel-min.js | 18 + .../yui-ext/build/data/JSONDataModel-min.js | 14 + .../build/data/LoadableDataModel-min.js | 16 + .../yui-ext/build/data/XMLDataModel-min.js | 24 + .../build/grid/AbstractColumnModel-min.js | 7 + .../build/grid/DefaultColumnModel-min.js | 16 + .../yui-ext/build/grid/EditorGrid-min.js | 7 + .../build/grid/EditorSelectionModel-min.js | 18 + www/extras/yui-ext/build/grid/Grid-min.js | 38 + www/extras/yui-ext/build/grid/GridDD-min.js | 7 + www/extras/yui-ext/build/grid/GridView-min.js | 50 + .../yui-ext/build/grid/PagedGridView-min.js | 9 + .../yui-ext/build/grid/SelectionModel-min.js | 16 + .../build/grid/editor/CellEditor-min.js | 9 + .../build/grid/editor/CheckboxEditor-min.js | 9 + .../build/grid/editor/DateEditor-min.js | 20 + .../build/grid/editor/NumberEditor-min.js | 16 + .../build/grid/editor/SelectEditor-min.js | 8 + .../build/grid/editor/TextEditor-min.js | 13 + .../yui-ext/build/layout/BorderLayout-min.js | 19 + .../build/layout/BorderLayoutRegions-min.js | 27 + .../yui-ext/build/layout/ContentPanels-min.js | 14 + .../yui-ext/build/layout/LayoutManager-min.js | 8 + .../yui-ext/build/layout/LayoutRegion-min.js | 38 + .../build/layout/LayoutStateManager-min.js | 12 + .../build/layout/SplitLayoutRegion-min.js | 17 + .../yui-ext/build/widgets/BasicDialog-min.js | 66 + .../yui-ext/build/widgets/DatePicker-min.js | 19 + .../yui-ext/build/widgets/Resizable-min.js | 28 + .../yui-ext/build/widgets/SplitBar-min.js | 19 + .../yui-ext/build/widgets/TabPanel-min.js | 29 + .../yui-ext/build/widgets/TemplateView-min.js | 23 + .../yui-ext/build/widgets/Toolbar-min.js | 18 + www/extras/yui-ext/build/yutil-min.js | 28 + www/extras/yui-ext/date-lib.js | 43 + www/extras/yui-ext/docs/index.html | 242 + .../docs/output/AbstractColumnModel.js.html | 131 + .../docs/output/AbstractDataModel.js.html | 226 + www/extras/yui-ext/docs/output/Actor.js.html | 758 + .../yui-ext/docs/output/Animator.js.html | 483 + .../yui-ext/docs/output/BasicDialog.js.html | 789 + www/extras/yui-ext/docs/output/Bench.js.html | 38 + .../yui-ext/docs/output/BorderLayout.js.html | 275 + .../docs/output/BorderLayoutRegions.js.html | 208 + www/extras/yui-ext/docs/output/CSS.js.html | 152 + .../yui-ext/docs/output/CellEditor.js.html | 91 + .../docs/output/CheckboxEditor.js.html | 60 + .../docs/output/CompositeElement.js.html | 140 + .../yui-ext/docs/output/ContentPanels.js.html | 296 + www/extras/yui-ext/docs/output/Date.js.html | 409 + .../yui-ext/docs/output/DateEditor.js.html | 268 + .../yui-ext/docs/output/DatePicker.js.html | 343 + .../docs/output/DefaultColumnModel.js.html | 306 + .../docs/output/DefaultDataModel.js.html | 337 + .../yui-ext/docs/output/DomHelper.js.html | 400 + .../yui-ext/docs/output/EditorGrid.js.html | 16 + .../docs/output/EditorSelectionModel.js.html | 182 + .../yui-ext/docs/output/Element.js.html | 1807 + .../yui-ext/docs/output/EventManager.js.html | 428 + www/extras/yui-ext/docs/output/Function.html | 183 + www/extras/yui-ext/docs/output/Grid.js.html | 896 + www/extras/yui-ext/docs/output/GridDD.js.html | 101 + .../yui-ext/docs/output/GridView.js.html | 763 + www/extras/yui-ext/docs/output/JSON.js.html | 129 + .../yui-ext/docs/output/JSONDataModel.js.html | 81 + .../docs/output/LayoutDragDropMgr.js.html | 35 + .../yui-ext/docs/output/LayoutManager.js.html | 131 + .../yui-ext/docs/output/LayoutRegion.js.html | 587 + .../docs/output/LayoutRegionDD.js.html | 44 + .../docs/output/LayoutStateManager.js.html | 68 + .../docs/output/LoadableDataModel.js.html | 331 + www/extras/yui-ext/docs/output/LogMsg.html | 156 + www/extras/yui-ext/docs/output/LogReader.html | 493 + www/extras/yui-ext/docs/output/LogWriter.html | 169 + .../docs/output/MixedCollection.js.html | 188 + .../yui-ext/docs/output/NumberEditor.js.html | 166 + .../yui-ext/docs/output/PagedGridView.js.html | 194 + .../yui-ext/docs/output/Resizable.js.html | 654 + .../yui-ext/docs/output/SelectEditor.js.html | 37 + .../docs/output/SelectionModel.js.html | 444 + .../yui-ext/docs/output/SplitBar.js.html | 451 + .../docs/output/SplitLayoutRegion.js.html | 282 + www/extras/yui-ext/docs/output/State.js.html | 265 + .../yui-ext/docs/output/TabPanel.js.html | 705 + .../yui-ext/docs/output/TaskPanel.js.html | 1 + .../yui-ext/docs/output/TemplateView.js.html | 492 + .../yui-ext/docs/output/TextEditor.js.html | 110 + .../yui-ext/docs/output/Toolbar.js.html | 286 + .../yui-ext/docs/output/UpdateManager.js.html | 477 + .../yui-ext/docs/output/XMLDataModel.js.html | 257 + .../yui-ext/docs/output/YAHOO.ext.Actor.html | 3505 ++ .../docs/output/YAHOO.ext.Animator.html | 458 + .../output/YAHOO.ext.AnimatorComposite.html | 296 + .../output/YAHOO.ext.BasicDialog.Button.html | 271 + .../docs/output/YAHOO.ext.BasicDialog.html | 899 + .../docs/output/YAHOO.ext.BorderLayout.html | 714 + .../output/YAHOO.ext.CompositeElement.html | 111 + .../YAHOO.ext.CompositeElementLite.html | 99 + .../docs/output/YAHOO.ext.ContentPanel.html | 495 + .../output/YAHOO.ext.DomHelper.Template.html | 221 + .../docs/output/YAHOO.ext.DomHelper.html | 247 + .../docs/output/YAHOO.ext.Element.html | 2896 + .../docs/output/YAHOO.ext.EventManager.html | 225 + .../docs/output/YAHOO.ext.EventObject.html | 743 + .../docs/output/YAHOO.ext.GridPanel.html | 519 + .../docs/output/YAHOO.ext.JsonView.html | 758 + .../docs/output/YAHOO.ext.LayoutDialog.html | 995 + .../docs/output/YAHOO.ext.LayoutManager.html | 444 + .../docs/output/YAHOO.ext.LayoutRegion.html | 881 + .../output/YAHOO.ext.NestedLayoutPanel.html | 519 + .../docs/output/YAHOO.ext.Resizable.html | 740 + ...OO.ext.SplitBar.AbsoluteLayoutAdapter.html | 202 + ...YAHOO.ext.SplitBar.BasicLayoutAdapter.html | 98 + .../docs/output/YAHOO.ext.SplitBar.html | 524 + .../output/YAHOO.ext.SplitLayoutRegion.html | 921 + .../docs/output/YAHOO.ext.TabPanel.html | 813 + .../docs/output/YAHOO.ext.TabPanelItem.html | 537 + .../docs/output/YAHOO.ext.Toolbar.html | 199 + .../docs/output/YAHOO.ext.ToolbarButton.html | 256 + ...YAHOO.ext.UpdateManager.BasicRenderer.html | 74 + .../docs/output/YAHOO.ext.UpdateManager.html | 801 + .../yui-ext/docs/output/YAHOO.ext.View.html | 744 + .../YAHOO.ext.grid.AbstractColumnModel.html | 466 + .../YAHOO.ext.grid.AbstractDataModel.html | 330 + .../output/YAHOO.ext.grid.CellEditor.html | 38 + .../output/YAHOO.ext.grid.CheckboxEditor.html | 66 + .../output/YAHOO.ext.grid.DateEditor.html | 82 + .../YAHOO.ext.grid.DefaultColumnModel.html | 882 + .../YAHOO.ext.grid.DefaultDataModel.html | 752 + .../YAHOO.ext.grid.DefaultSelectionModel.html | 771 + ...AHOO.ext.grid.EditorAndSelectionModel.html | 37 + .../output/YAHOO.ext.grid.EditorGrid.html | 1785 + .../YAHOO.ext.grid.EditorSelectionModel.html | 794 + .../docs/output/YAHOO.ext.grid.Grid.html | 1822 + .../docs/output/YAHOO.ext.grid.GridDD.html | 71 + .../docs/output/YAHOO.ext.grid.GridView.html | 246 + .../output/YAHOO.ext.grid.JSONDataModel.html | 1260 + .../YAHOO.ext.grid.LoadableDataModel.html | 1255 + .../output/YAHOO.ext.grid.NumberEditor.html | 83 + .../output/YAHOO.ext.grid.PagedGridView.html | 391 + .../output/YAHOO.ext.grid.SelectEditor.html | 81 + .../YAHOO.ext.grid.SingleSelectionModel.html | 769 + .../output/YAHOO.ext.grid.TextEditor.html | 79 + .../output/YAHOO.ext.grid.XMLDataModel.html | 1288 + .../YAHOO.ext.state.CookieProvider.html | 233 + .../docs/output/YAHOO.ext.state.Manager.html | 185 + .../docs/output/YAHOO.ext.state.Provider.html | 204 + .../docs/output/YAHOO.ext.util.Browser.html | 198 + .../docs/output/YAHOO.ext.util.CSS.html | 146 + .../docs/output/YAHOO.ext.util.Config.html | 121 + .../output/YAHOO.ext.util.DelayedTask.html | 122 + .../docs/output/YAHOO.ext.util.JSON.html | 98 + .../YAHOO.ext.util.MixedCollection.html | 711 + .../output/YAHOO.ext.util.Observable.html | 184 + www/extras/yui-ext/docs/output/YAHOO.html | 166 + .../yui-ext/docs/output/YAHOO.util.Anim.html | 542 + .../docs/output/YAHOO.util.AnimMgr.html | 194 + .../docs/output/YAHOO.util.Attribute.html | 343 + .../output/YAHOO.util.AttributeProvider.html | 297 + .../docs/output/YAHOO.util.Bezier.html | 76 + .../docs/output/YAHOO.util.ColorAnim.html | 567 + .../docs/output/YAHOO.util.Config.html | 592 + .../docs/output/YAHOO.util.Connect.html | 255 + .../docs/output/YAHOO.util.CustomEvent.html | 390 + .../yui-ext/docs/output/YAHOO.util.DD.html | 1572 + .../docs/output/YAHOO.util.DDProxy.html | 1683 + .../docs/output/YAHOO.util.DDTarget.html | 1413 + .../yui-ext/docs/output/YAHOO.util.Dom.html | 712 + .../docs/output/YAHOO.util.DragDrop.html | 1445 + .../docs/output/YAHOO.util.DragDropMgr.html | 1055 + .../docs/output/YAHOO.util.Easing.html | 448 + .../docs/output/YAHOO.util.Element.html | 647 + .../yui-ext/docs/output/YAHOO.util.Event.html | 858 + .../docs/output/YAHOO.util.KeyListener.html | 251 + .../docs/output/YAHOO.util.Motion.html | 542 + .../yui-ext/docs/output/YAHOO.util.Point.html | 342 + .../docs/output/YAHOO.util.Region.html | 312 + .../docs/output/YAHOO.util.Scroll.html | 542 + .../docs/output/YAHOO.util.Subscriber.html | 212 + .../output/YAHOO.widget.AutoComplete.html | 1019 + .../docs/output/YAHOO.widget.Calendar.html | 2984 ++ .../docs/output/YAHOO.widget.Calendar2up.html | 1294 + .../output/YAHOO.widget.CalendarGroup.html | 1327 + .../output/YAHOO.widget.Calendar_Core.html | 2951 ++ .../output/YAHOO.widget.ContainerEffect.html | 457 + .../docs/output/YAHOO.widget.ContextMenu.html | 2738 + .../output/YAHOO.widget.ContextMenuItem.html | 1277 + .../docs/output/YAHOO.widget.DS_JSArray.html | 447 + .../output/YAHOO.widget.DS_JSFunction.html | 447 + .../docs/output/YAHOO.widget.DS_XHR.html | 652 + .../docs/output/YAHOO.widget.DataSource.html | 435 + .../docs/output/YAHOO.widget.DateMath.html | 469 + .../docs/output/YAHOO.widget.Dialog.html | 2789 + .../docs/output/YAHOO.widget.HTMLNode.html | 1438 + .../docs/output/YAHOO.widget.LogMsg.html | 156 + .../docs/output/YAHOO.widget.LogReader.html | 493 + .../docs/output/YAHOO.widget.LogWriter.html | 169 + .../docs/output/YAHOO.widget.Logger.html | 301 + .../docs/output/YAHOO.widget.Menu.html | 2700 + .../docs/output/YAHOO.widget.MenuBarItem.html | 1276 + .../docs/output/YAHOO.widget.MenuItem.html | 1278 + .../docs/output/YAHOO.widget.MenuManager.html | 200 + .../docs/output/YAHOO.widget.MenuModule.html | 1837 + .../output/YAHOO.widget.MenuModuleItem.html | 65 + .../docs/output/YAHOO.widget.MenuNode.html | 1500 + .../docs/output/YAHOO.widget.Menubar.html | 2689 + .../docs/output/YAHOO.widget.Module.html | 1120 + .../docs/output/YAHOO.widget.Node.html | 1345 + .../docs/output/YAHOO.widget.Overlay.html | 1837 + .../output/YAHOO.widget.OverlayManager.html | 416 + .../docs/output/YAHOO.widget.Panel.html | 2258 + .../docs/output/YAHOO.widget.RootNode.html | 1344 + .../output/YAHOO.widget.SimpleDialog.html | 2950 ++ .../docs/output/YAHOO.widget.Slider.html | 2081 + .../docs/output/YAHOO.widget.SliderThumb.html | 1737 + .../docs/output/YAHOO.widget.TVAnim.html | 137 + .../docs/output/YAHOO.widget.TVFadeIn.html | 184 + .../docs/output/YAHOO.widget.TVFadeOut.html | 184 + .../yui-ext/docs/output/YAHOO.widget.Tab.html | 977 + .../docs/output/YAHOO.widget.TabView.html | 1019 + .../docs/output/YAHOO.widget.TextNode.html | 1505 + .../docs/output/YAHOO.widget.Tooltip.html | 2053 + .../docs/output/YAHOO.widget.TreeView.html | 922 + ...YAHOO.widget.YAHOO.widget.Calendar2up.html | 1298 + .../yui-ext/docs/output/animation.js.html | 1273 + .../yui-ext/docs/output/autocomplete.js.html | 3077 ++ .../yui-ext/docs/output/calendar.js.html | 4239 ++ .../yui-ext/docs/output/connection.js.html | 960 + .../yui-ext/docs/output/container.js.html | 4561 ++ .../docs/output/container_core.js.html | 2884 + www/extras/yui-ext/docs/output/dom.js.html | 882 + .../yui-ext/docs/output/dragdrop.js.html | 2941 ++ www/extras/yui-ext/docs/output/event.js.html | 1739 + www/extras/yui-ext/docs/output/logger.js.html | 1568 + www/extras/yui-ext/docs/output/menu.js.html | 6779 +++ www/extras/yui-ext/docs/output/output.zip | Bin 0 -> 1194566 bytes .../output/output/YAHOO.util.AnimMgr.html | 194 + .../output/output/YAHOO.util.Attribute.html | 343 + .../output/YAHOO.util.AttributeProvider.html | 297 + .../docs/output/output/YAHOO.util.Bezier.html | 76 + .../output/output/YAHOO.util.ColorAnim.html | 95 + .../docs/output/output/YAHOO.util.Config.html | 1575 + .../output/output/YAHOO.util.CustomEvent.html | 390 + .../docs/output/output/YAHOO.util.DD.html | 1574 + .../output/output/YAHOO.util.DDProxy.html | 1685 + .../output/output/YAHOO.util.DDTarget.html | 1415 + .../docs/output/output/YAHOO.util.Dom.html | 712 + .../output/output/YAHOO.util.DragDrop.html | 1447 + .../output/output/YAHOO.util.DragDropMgr.html | 1055 + .../docs/output/output/YAHOO.util.Easing.html | 448 + .../output/output/YAHOO.util.Element.html | 633 + .../docs/output/output/YAHOO.util.Event.html | 858 + .../output/output/YAHOO.util.KeyListener.html | 251 + .../docs/output/output/YAHOO.util.Motion.html | 67 + .../docs/output/output/YAHOO.util.Point.html | 342 + .../docs/output/output/YAHOO.util.Region.html | 312 + .../docs/output/output/YAHOO.util.Scroll.html | 67 + .../output/output/YAHOO.util.Subscriber.html | 212 + .../output/YAHOO.widget.AutoComplete.html | 1616 + .../output/YAHOO.widget.CalendarGroup.html | 1331 + .../output/YAHOO.widget.Calendar_Core.html | 37 + .../output/YAHOO.widget.ContainerEffect.html | 457 + .../output/YAHOO.widget.ContextMenu.html | 1958 + .../output/YAHOO.widget.ContextMenuItem.html | 1385 + .../output/output/YAHOO.widget.DateMath.html | 3369 ++ .../output/output/YAHOO.widget.Dialog.html | 2019 + .../output/output/YAHOO.widget.HTMLNode.html | 1438 + .../output/output/YAHOO.widget.Logger.html | 301 + .../docs/output/output/YAHOO.widget.Menu.html | 1917 + .../output/YAHOO.widget.MenuBarItem.html | 1384 + .../output/output/YAHOO.widget.MenuItem.html | 1386 + .../output/YAHOO.widget.MenuManager.html | 200 + .../output/YAHOO.widget.MenuModule.html | 1015 + .../output/YAHOO.widget.MenuModuleItem.html | 65 + .../output/output/YAHOO.widget.MenuNode.html | 1500 + .../output/output/YAHOO.widget.Menubar.html | 1903 + .../docs/output/output/YAHOO.widget.Node.html | 1345 + .../output/output/YAHOO.widget.Overlay.html | 1016 + .../output/YAHOO.widget.OverlayManager.html | 416 + .../output/output/YAHOO.widget.Panel.html | 1460 + .../output/output/YAHOO.widget.RootNode.html | 1344 + .../output/YAHOO.widget.SimpleDialog.html | 2180 + .../output/YAHOO.widget.SliderThumb.html | 1739 + .../output/output/YAHOO.widget.TVAnim.html | 137 + .../output/output/YAHOO.widget.TVFadeIn.html | 184 + .../output/output/YAHOO.widget.TVFadeOut.html | 184 + .../docs/output/output/YAHOO.widget.Tab.html | 1150 + .../output/output/YAHOO.widget.TextNode.html | 1505 + .../output/output/YAHOO.widget.Tooltip.html | 1231 + ...YAHOO.widget.YAHOO.widget.Calendar2up.html | 1298 + .../yui-ext/docs/output/output/tree.html | 80 + www/extras/yui-ext/docs/output/slider.js.html | 1114 + .../yui-ext/docs/output/tabview.js.html | 1951 + www/extras/yui-ext/docs/output/tree.html | 210 + .../yui-ext/docs/output/treeview.js.html | 2183 + .../yui-ext/docs/output/utilities.js.html | 100 + .../docs/output/yahoo-dom-event.js.html | 1 + www/extras/yui-ext/docs/output/yahoo.js.html | 146 + www/extras/yui-ext/docs/output/yutil.js.html | 411 + .../yui-ext/docs/resources/block-bg.gif | Bin 0 -> 834 bytes www/extras/yui-ext/docs/resources/class.gif | Bin 0 -> 945 bytes .../yui-ext/docs/resources/collapse-bg.gif | Bin 0 -> 1623 bytes www/extras/yui-ext/docs/resources/cssQuery.js | 6 + www/extras/yui-ext/docs/resources/docs.css | 87 + www/extras/yui-ext/docs/resources/docs.gif | Bin 0 -> 1016 bytes www/extras/yui-ext/docs/resources/docs.js | 114 + www/extras/yui-ext/docs/resources/example.gif | Bin 0 -> 1008 bytes www/extras/yui-ext/docs/resources/folder.gif | Bin 0 -> 1003 bytes .../yui-ext/docs/resources/folder_open.gif | Bin 0 -> 997 bytes www/extras/yui-ext/docs/resources/forum.gif | Bin 0 -> 1031 bytes .../yui-ext/docs/resources/inherited.gif | Bin 0 -> 881 bytes www/extras/yui-ext/docs/resources/minus.gif | Bin 0 -> 904 bytes .../yui-ext/docs/resources/pkg-closed.gif | Bin 0 -> 1037 bytes .../yui-ext/docs/resources/pkg-open.gif | Bin 0 -> 1040 bytes www/extras/yui-ext/docs/resources/plus.gif | Bin 0 -> 912 bytes www/extras/yui-ext/docs/resources/print.css | 206 + www/extras/yui-ext/docs/resources/print.gif | Bin 0 -> 1032 bytes www/extras/yui-ext/docs/resources/reset.css | 7 + www/extras/yui-ext/docs/resources/style.css | 221 + www/extras/yui-ext/docs/resources/tree-bg.gif | Bin 0 -> 1925 bytes .../yui-ext/docs/resources/welcome-bg.gif | Bin 0 -> 1925 bytes www/extras/yui-ext/docs/resources/welcome.css | 61 + www/extras/yui-ext/docs/welcome.html | 78 + www/extras/yui-ext/editor-grid-lib.js | 268 + www/extras/yui-ext/examples/README.txt | 3 + www/extras/yui-ext/examples/dialog/blog.html | 85 + .../yui-ext/examples/dialog/comments.txt | 44 + www/extras/yui-ext/examples/dialog/hello.html | 68 + www/extras/yui-ext/examples/dialog/hello.js | 45 + .../examples/dialog/images/comment-bg.gif | Bin 0 -> 838 bytes .../examples/dialog/images/comment.gif | Bin 0 -> 595 bytes .../examples/dialog/images/warning.gif | Bin 0 -> 960 bytes .../yui-ext/examples/dialog/layout.html | 43 + www/extras/yui-ext/examples/dialog/layout.js | 64 + www/extras/yui-ext/examples/dialog/post.css | 124 + www/extras/yui-ext/examples/dialog/post.js | 152 + www/extras/yui-ext/examples/dialog/post.php | 10 + www/extras/yui-ext/examples/examples.css | 33 + www/extras/yui-ext/examples/grid/PropsGrid.js | 194 + .../yui-ext/examples/grid/array-grid.html | 29 + .../yui-ext/examples/grid/array-grid.js | 87 + .../yui-ext/examples/grid/custom-grid.html | 31 + .../yui-ext/examples/grid/custom-grid.js | 18 + .../yui-ext/examples/grid/edit-grid.html | 42 + www/extras/yui-ext/examples/grid/edit-grid.js | 92 + .../yui-ext/examples/grid/paging-grid.html | 22 + www/extras/yui-ext/examples/grid/plants.xml | 327 + www/extras/yui-ext/examples/grid/sheldon.xml | 1 + .../yui-ext/examples/grid/xml-grid.html | 34 + www/extras/yui-ext/examples/grid/xml-grid.js | 28 + www/extras/yui-ext/examples/info-bg.gif | Bin 0 -> 852 bytes .../yui-ext/examples/layout/complex.html | 163 + .../yui-ext/examples/layout/feed-proxy.php | 9 + .../yui-ext/examples/layout/feed-viewer.css | 221 + .../yui-ext/examples/layout/feed-viewer.html | 37 + .../yui-ext/examples/layout/feed-viewer.js | 312 + .../yui-ext/examples/layout/images/Thumbs.db | Bin 0 -> 27136 bytes .../examples/layout/images/add-feed.gif | Bin 0 -> 1052 bytes .../examples/layout/images/article.gif | Bin 0 -> 954 bytes .../yui-ext/examples/layout/images/bullet.gif | Bin 0 -> 835 bytes .../yui-ext/examples/layout/images/cancel.gif | Bin 0 -> 1282 bytes .../examples/layout/images/comment-bg.gif | Bin 0 -> 838 bytes .../examples/layout/images/feed-item.gif | Bin 0 -> 954 bytes .../examples/layout/images/grid-hrow.gif | Bin 0 -> 825 bytes .../examples/layout/images/header-bar.gif | Bin 0 -> 927 bytes .../yui-ext/examples/layout/images/header.gif | Bin 0 -> 834 bytes .../examples/layout/images/myfeeds.gif | Bin 0 -> 1220 bytes .../examples/layout/images/new_tab.gif | Bin 0 -> 956 bytes .../examples/layout/images/new_window.gif | Bin 0 -> 1019 bytes .../examples/layout/images/post-bg.gif | Bin 0 -> 852 bytes .../examples/layout/images/preview.gif | Bin 0 -> 1196 bytes .../yui-ext/examples/layout/images/rss.gif | Bin 0 -> 1041 bytes .../yui-ext/examples/layout/images/signin.gif | Bin 0 -> 1271 bytes .../examples/layout/images/signout.gif | Bin 0 -> 1330 bytes .../examples/layout/images/suggested.gif | Bin 0 -> 1470 bytes .../examples/layout/images/toolbar.gif | Bin 0 -> 859 bytes .../yui-ext/examples/layout/nested.html | 120 + .../yui-ext/examples/layout/simple.html | 124 + .../yui-ext/examples/resizable/basic.html | 185 + .../yui-ext/examples/resizable/basic.js | 82 + .../yui-ext/examples/resizable/sara.jpg | Bin 0 -> 122603 bytes .../examples/resizable/sara_and_zack.jpg | Bin 0 -> 108080 bytes .../yui-ext/examples/resizable/zack.jpg | Bin 0 -> 120514 bytes www/extras/yui-ext/examples/tabs/ajax1.htm | 9 + www/extras/yui-ext/examples/tabs/ajax2.htm | 7 + .../yui-ext/examples/tabs/tabs-example.css | 26 + .../yui-ext/examples/tabs/tabs-example.js | 33 + www/extras/yui-ext/examples/tabs/tabs.html | 79 + www/extras/yui-ext/layout-lib.js | 105 + www/extras/yui-ext/resizable-lib.js | 28 + www/extras/yui-ext/resources/css/README.txt | 8 + .../yui-ext/resources/css/basic-dialog.css | 291 + www/extras/yui-ext/resources/css/grid.css | 687 + www/extras/yui-ext/resources/css/layout.css | 273 + .../yui-ext/resources/css/reset-min.css | 6 + .../yui-ext/resources/css/resizable.css | 174 + www/extras/yui-ext/resources/css/tabs.css | 168 + www/extras/yui-ext/resources/css/toolbar.css | 65 + www/extras/yui-ext/resources/css/yui-ext.css | 1624 + .../images/basic-dialog/btn-sprite.gif | Bin 0 -> 1186 bytes .../resources/images/basic-dialog/close.gif | Bin 0 -> 893 bytes .../images/basic-dialog/e-handle.gif | Bin 0 -> 995 bytes .../images/basic-dialog/gray/close.gif | Bin 0 -> 893 bytes .../images/basic-dialog/gray/dlg-bg.gif | Bin 0 -> 27857 bytes .../images/basic-dialog/gray/e-handle.gif | Bin 0 -> 995 bytes .../images/basic-dialog/gray/hd-sprite.gif | Bin 0 -> 1060 bytes .../images/basic-dialog/gray/s-handle.gif | Bin 0 -> 992 bytes .../images/basic-dialog/gray/se-handle.gif | Bin 0 -> 833 bytes .../images/basic-dialog/hd-sprite.gif | Bin 0 -> 1099 bytes .../images/basic-dialog/s-handle.gif | Bin 0 -> 992 bytes .../images/basic-dialog/se-handle.gif | Bin 0 -> 833 bytes .../yui-ext/resources/images/gradient-bg.gif | Bin 0 -> 1472 bytes .../images/grid/arrow-left-white.gif | Bin 0 -> 825 bytes .../images/grid/arrow-right-white.gif | Bin 0 -> 825 bytes .../yui-ext/resources/images/grid/done.gif | Bin 0 -> 133 bytes .../yui-ext/resources/images/grid/drop-no.gif | Bin 0 -> 947 bytes .../resources/images/grid/drop-yes.gif | Bin 0 -> 860 bytes .../resources/images/grid/footer-bg.gif | Bin 0 -> 834 bytes .../resources/images/grid/grid-blue-hd.gif | Bin 0 -> 829 bytes .../resources/images/grid/grid-blue-split.gif | Bin 0 -> 817 bytes .../resources/images/grid/grid-loading.gif | Bin 0 -> 701 bytes .../resources/images/grid/grid-split.gif | Bin 0 -> 817 bytes .../resources/images/grid/grid-vista-hd.gif | Bin 0 -> 829 bytes .../resources/images/grid/invalid_line.gif | Bin 0 -> 815 bytes .../yui-ext/resources/images/grid/loading.gif | Bin 0 -> 771 bytes .../yui-ext/resources/images/grid/mso-hd.gif | Bin 0 -> 875 bytes .../yui-ext/resources/images/grid/nowait.gif | Bin 0 -> 884 bytes .../images/grid/page-first-disabled.gif | Bin 0 -> 925 bytes .../resources/images/grid/page-first.gif | Bin 0 -> 925 bytes .../images/grid/page-last-disabled.gif | Bin 0 -> 923 bytes .../resources/images/grid/page-last.gif | Bin 0 -> 923 bytes .../images/grid/page-next-disabled.gif | Bin 0 -> 875 bytes .../resources/images/grid/page-next.gif | Bin 0 -> 875 bytes .../images/grid/page-prev-disabled.gif | Bin 0 -> 879 bytes .../resources/images/grid/page-prev.gif | Bin 0 -> 879 bytes .../resources/images/grid/pick-button.gif | Bin 0 -> 1036 bytes .../yui-ext/resources/images/grid/refresh.gif | Bin 0 -> 1015 bytes .../resources/images/grid/sort_asc.gif | Bin 0 -> 825 bytes .../resources/images/grid/sort_desc.gif | Bin 0 -> 826 bytes .../yui-ext/resources/images/grid/wait.gif | Bin 0 -> 1100 bytes .../resources/images/layout/collapse.gif | Bin 0 -> 842 bytes .../resources/images/layout/expand.gif | Bin 0 -> 842 bytes .../resources/images/layout/gradient-bg.gif | Bin 0 -> 1472 bytes .../resources/images/layout/gray/collapse.gif | Bin 0 -> 842 bytes .../resources/images/layout/gray/expand.gif | Bin 0 -> 842 bytes .../images/layout/gray/gradient-bg.gif | Bin 0 -> 1202 bytes .../images/layout/gray/ns-collapse.gif | Bin 0 -> 842 bytes .../images/layout/gray/ns-expand.gif | Bin 0 -> 843 bytes .../images/layout/gray/panel-close.gif | Bin 0 -> 829 bytes .../images/layout/gray/panel-title-bg.gif | Bin 0 -> 838 bytes .../layout/gray/panel-title-light-bg.gif | Bin 0 -> 842 bytes .../images/layout/gray/screenshot.gif | Bin 0 -> 55473 bytes .../images/layout/gray/tab-close-on.gif | Bin 0 -> 880 bytes .../images/layout/gray/tab-close.gif | Bin 0 -> 859 bytes .../resources/images/layout/ns-collapse.gif | Bin 0 -> 842 bytes .../resources/images/layout/ns-expand.gif | Bin 0 -> 843 bytes .../resources/images/layout/panel-close.gif | Bin 0 -> 829 bytes .../images/layout/panel-title-bg.gif | Bin 0 -> 838 bytes .../images/layout/panel-title-light-bg.gif | Bin 0 -> 835 bytes .../resources/images/layout/tab-close-on.gif | Bin 0 -> 880 bytes .../resources/images/layout/tab-close.gif | Bin 0 -> 859 bytes www/extras/yui-ext/resources/images/s.gif | Bin 0 -> 43 bytes .../resources/images/sizer/e-handle-dark.gif | Bin 0 -> 1062 bytes .../resources/images/sizer/e-handle.gif | Bin 0 -> 1586 bytes .../images/sizer/gray/e-handle-dark.gif | Bin 0 -> 1062 bytes .../resources/images/sizer/gray/e-handle.gif | Bin 0 -> 1586 bytes .../images/sizer/gray/ne-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/gray/ne-handle.gif | Bin 0 -> 854 bytes .../images/sizer/gray/nw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/gray/nw-handle.gif | Bin 0 -> 853 bytes .../images/sizer/gray/s-handle-dark.gif | Bin 0 -> 1060 bytes .../resources/images/sizer/gray/s-handle.gif | Bin 0 -> 1318 bytes .../images/sizer/gray/se-handle-dark.gif | Bin 0 -> 838 bytes .../resources/images/sizer/gray/se-handle.gif | Bin 0 -> 853 bytes .../images/sizer/gray/sw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/gray/sw-handle.gif | Bin 0 -> 855 bytes .../resources/images/sizer/ne-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/ne-handle.gif | Bin 0 -> 854 bytes .../resources/images/sizer/nw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/nw-handle.gif | Bin 0 -> 853 bytes .../resources/images/sizer/s-handle-dark.gif | Bin 0 -> 1060 bytes .../resources/images/sizer/s-handle.gif | Bin 0 -> 1318 bytes .../resources/images/sizer/se-handle-dark.gif | Bin 0 -> 838 bytes .../resources/images/sizer/se-handle.gif | Bin 0 -> 853 bytes .../yui-ext/resources/images/sizer/square.gif | Bin 0 -> 864 bytes .../resources/images/sizer/sw-handle-dark.gif | Bin 0 -> 839 bytes .../resources/images/sizer/sw-handle.gif | Bin 0 -> 855 bytes .../tabs/gray/tab-btm-inactive-left-bg.gif | Bin 0 -> 875 bytes .../tabs/gray/tab-btm-inactive-right-bg.gif | Bin 0 -> 1601 bytes .../images/tabs/gray/tab-btm-left-bg.gif | Bin 0 -> 875 bytes .../images/tabs/gray/tab-btm-right-bg.gif | Bin 0 -> 1601 bytes .../resources/images/tabs/gray/tab-sprite.gif | Bin 0 -> 3037 bytes .../images/tabs/tab-btm-inactive-left-bg.gif | Bin 0 -> 875 bytes .../images/tabs/tab-btm-inactive-right-bg.gif | Bin 0 -> 1601 bytes .../resources/images/tabs/tab-btm-left-bg.gif | Bin 0 -> 877 bytes .../images/tabs/tab-btm-right-bg.gif | Bin 0 -> 1606 bytes .../resources/images/tabs/tab-sprite.gif | Bin 0 -> 3088 bytes .../resources/images/toolbar/btn-over-bg.gif | Bin 0 -> 837 bytes .../resources/images/toolbar/gray-bg.gif | Bin 0 -> 832 bytes www/extras/yui-ext/source/Bench.js | 43 + www/extras/yui-ext/source/CSS.js | 157 + www/extras/yui-ext/source/CompositeElement.js | 145 + www/extras/yui-ext/source/Date.js | 413 + www/extras/yui-ext/source/DomHelper.js | 414 + www/extras/yui-ext/source/Element.js | 1827 + www/extras/yui-ext/source/EventManager.js | 433 + www/extras/yui-ext/source/JSON.js | 134 + www/extras/yui-ext/source/MixedCollection.js | 349 + www/extras/yui-ext/source/State.js | 269 + www/extras/yui-ext/source/UpdateManager.js | 481 + www/extras/yui-ext/source/anim/Actor.js | 763 + www/extras/yui-ext/source/anim/Animator.js | 487 + .../yui-ext/source/data/AbstractDataModel.js | 231 + .../yui-ext/source/data/DefaultDataModel.js | 342 + .../yui-ext/source/data/JSONDataModel.js | 86 + .../yui-ext/source/data/LoadableDataModel.js | 335 + .../yui-ext/source/data/XMLDataModel.js | 262 + .../source/grid/AbstractColumnModel.js | 135 + .../yui-ext/source/grid/DefaultColumnModel.js | 311 + www/extras/yui-ext/source/grid/EditorGrid.js | 21 + .../source/grid/EditorSelectionModel.js | 187 + www/extras/yui-ext/source/grid/Grid.js | 900 + www/extras/yui-ext/source/grid/GridDD.js | 106 + www/extras/yui-ext/source/grid/GridView.js | 769 + .../yui-ext/source/grid/PagedGridView.js | 199 + .../yui-ext/source/grid/SelectionModel.js | 449 + .../yui-ext/source/grid/editor/CellEditor.js | 96 + .../source/grid/editor/CheckboxEditor.js | 65 + .../yui-ext/source/grid/editor/DateEditor.js | 273 + .../source/grid/editor/NumberEditor.js | 171 + .../source/grid/editor/SelectEditor.js | 42 + .../yui-ext/source/grid/editor/TextEditor.js | 115 + .../yui-ext/source/layout/BorderLayout.js | 282 + .../source/layout/BorderLayoutRegions.js | 212 + .../yui-ext/source/layout/ContentPanels.js | 301 + .../yui-ext/source/layout/LayoutManager.js | 136 + .../yui-ext/source/layout/LayoutRegion.js | 592 + .../source/layout/LayoutStateManager.js | 73 + .../source/layout/SplitLayoutRegion.js | 287 + .../yui-ext/source/widgets/BasicDialog.js | 1015 + .../yui-ext/source/widgets/DatePicker.js | 348 + .../yui-ext/source/widgets/Resizable.js | 567 + www/extras/yui-ext/source/widgets/SplitBar.js | 455 + www/extras/yui-ext/source/widgets/TabPanel.js | 714 + .../yui-ext/source/widgets/TemplateView.js | 497 + www/extras/yui-ext/source/widgets/Toolbar.js | 291 + www/extras/yui-ext/source/yutil.js | 472 + www/extras/yui-ext/splitbar-lib.js | 19 + www/extras/yui-ext/state-manager-lib.js | 21 + www/extras/yui-ext/tabs-lib.js | 29 + www/extras/yui-ext/yui-ext-core-debug.js | 2552 + www/extras/yui-ext/yui-ext-core.js | 187 + www/extras/yui-ext/yui-ext-debug.js | 12918 +++++ www/extras/yui-ext/yui-ext-nogrid.js | 496 + www/extras/yui-ext/yui-ext.js | 817 + www/extras/yui/README | 151 + www/extras/yui/build/animation/README | 34 + .../yui/build/animation/animation-debug.js | 1276 + .../yui/build/animation/animation-min.js | 1 + www/extras/yui/build/animation/animation.js | 1272 + www/extras/yui/build/autocomplete/README | 59 + .../build/autocomplete/autocomplete-debug.js | 3098 ++ .../build/autocomplete/autocomplete-min.js | 177 + .../yui/build/autocomplete/autocomplete.js | 3066 ++ www/extras/yui/build/calendar/README | 107 + .../yui/build/calendar/assets/calendar.css | 191 + .../yui/build/calendar/assets/callt.gif | Bin 0 -> 93 bytes .../yui/build/calendar/assets/calrt.gif | Bin 0 -> 94 bytes www/extras/yui/build/calendar/assets/calx.gif | Bin 0 -> 88 bytes .../yui/build/calendar/calendar-debug.js | 4277 ++ www/extras/yui/build/calendar/calendar-min.js | 107 + www/extras/yui/build/calendar/calendar.js | 4239 ++ www/extras/yui/build/connection/README | 151 + .../yui/build/connection/connection-debug.js | 978 + .../yui/build/connection/connection-min.js | 99 + www/extras/yui/build/connection/connection.js | 960 + www/extras/yui/build/container/README | 115 + .../yui/build/container/assets/alrt16_1.gif | Bin 0 -> 971 bytes .../yui/build/container/assets/blck16_1.gif | Bin 0 -> 591 bytes .../yui/build/container/assets/close12_1.gif | Bin 0 -> 85 bytes .../yui/build/container/assets/container.css | 211 + .../yui/build/container/assets/hlp16_1.gif | Bin 0 -> 928 bytes .../yui/build/container/assets/info16_1.gif | Bin 0 -> 601 bytes .../yui/build/container/assets/tip16_1.gif | Bin 0 -> 552 bytes .../yui/build/container/assets/warn16_1.gif | Bin 0 -> 580 bytes .../yui/build/container/container-debug.js | 4602 ++ .../yui/build/container/container-min.js | 147 + www/extras/yui/build/container/container.js | 4561 ++ .../build/container/container_core-debug.js | 2911 + .../yui/build/container/container_core-min.js | 99 + .../yui/build/container/container_core.js | 2884 + www/extras/yui/build/dom/README | 66 + www/extras/yui/build/dom/dom-debug.js | 916 + www/extras/yui/build/dom/dom-min.js | 1 + www/extras/yui/build/dom/dom.js | 881 + www/extras/yui/build/dragdrop/README | 96 + .../yui/build/dragdrop/dragdrop-debug.js | 3047 ++ www/extras/yui/build/dragdrop/dragdrop-min.js | 1 + www/extras/yui/build/dragdrop/dragdrop.js | 2940 + www/extras/yui/build/event/README | 122 + www/extras/yui/build/event/event-debug.js | 1766 + www/extras/yui/build/event/event-min.js | 1 + www/extras/yui/build/event/event.js | 1738 + www/extras/yui/build/fonts/README | 13 + www/extras/yui/build/fonts/fonts-min.css | 1 + www/extras/yui/build/fonts/fonts.css | 31 + www/extras/yui/build/grids/README | 40 + www/extras/yui/build/grids/grids-min.css | 2 + www/extras/yui/build/grids/grids.css | 130 + www/extras/yui/build/logger/README | 34 + www/extras/yui/build/logger/assets/logger.css | 20 + www/extras/yui/build/logger/logger-debug.js | 1559 + www/extras/yui/build/logger/logger-min.js | 56 + www/extras/yui/build/logger/logger.js | 1559 + www/extras/yui/build/menu/README | 224 + www/extras/yui/build/menu/assets/menu.css | 297 + .../build/menu/assets/menuarodwn8_dim_1.gif | Bin 0 -> 53 bytes .../build/menu/assets/menuarodwn8_hov_1.gif | Bin 0 -> 53 bytes .../build/menu/assets/menuarodwn8_nrm_1.gif | Bin 0 -> 53 bytes .../build/menu/assets/menuarorght8_dim_1.gif | Bin 0 -> 54 bytes .../build/menu/assets/menuarorght8_hov_1.gif | Bin 0 -> 54 bytes .../build/menu/assets/menuarorght8_nrm_1.gif | Bin 0 -> 54 bytes .../yui/build/menu/assets/menuchk8_dim_1.gif | Bin 0 -> 65 bytes .../yui/build/menu/assets/menuchk8_hov_1.gif | Bin 0 -> 67 bytes .../yui/build/menu/assets/menuchk8_nrm_1.gif | Bin 0 -> 67 bytes www/extras/yui/build/menu/menu-debug.js | 7224 +++ www/extras/yui/build/menu/menu-min.js | 1 + www/extras/yui/build/menu/menu.js | 6779 +++ www/extras/yui/build/reset-fonts-grids/README | 8 + .../reset-fonts-grids-min.css | 4 + .../reset-fonts-grids/reset-fonts-grids.css | 174 + www/extras/yui/build/reset/README | 17 + www/extras/yui/build/reset/reset-min.css | 1 + www/extras/yui/build/reset/reset.css | 15 + www/extras/yui/build/slider/README | 54 + www/extras/yui/build/slider/slider-debug.js | 1152 + www/extras/yui/build/slider/slider-min.js | 1 + www/extras/yui/build/slider/slider.js | 1113 + www/extras/yui/build/tabview/README | 6 + .../yui/build/tabview/assets/border_tabs.css | 44 + www/extras/yui/build/tabview/assets/tabs.css | 66 + www/extras/yui/build/tabview/tabview-debug.js | 1951 + www/extras/yui/build/tabview/tabview-min.js | 1 + www/extras/yui/build/tabview/tabview.js | 1950 + www/extras/yui/build/treeview/README | 112 + www/extras/yui/build/treeview/assets/lm.gif | Bin 0 -> 94 bytes www/extras/yui/build/treeview/assets/lmh.gif | Bin 0 -> 106 bytes www/extras/yui/build/treeview/assets/ln.gif | Bin 0 -> 142 bytes .../yui/build/treeview/assets/loading.gif | Bin 0 -> 2673 bytes www/extras/yui/build/treeview/assets/lp.gif | Bin 0 -> 130 bytes www/extras/yui/build/treeview/assets/lph.gif | Bin 0 -> 111 bytes www/extras/yui/build/treeview/assets/tm.gif | Bin 0 -> 545 bytes www/extras/yui/build/treeview/assets/tmh.gif | Bin 0 -> 563 bytes www/extras/yui/build/treeview/assets/tn.gif | Bin 0 -> 504 bytes www/extras/yui/build/treeview/assets/tp.gif | Bin 0 -> 539 bytes www/extras/yui/build/treeview/assets/tph.gif | Bin 0 -> 568 bytes www/extras/yui/build/treeview/assets/tree.css | 98 + .../yui/build/treeview/assets/vline.gif | Bin 0 -> 503 bytes .../yui/build/treeview/treeview-debug.js | 2228 + www/extras/yui/build/treeview/treeview-min.js | 1 + www/extras/yui/build/treeview/treeview.js | 2182 + www/extras/yui/build/utilities/README | 20 + www/extras/yui/build/utilities/utilities.js | 100 + www/extras/yui/build/yahoo-dom-event/README | 23 + .../build/yahoo-dom-event/yahoo-dom-event.js | 1 + www/extras/yui/build/yahoo/README | 37 + www/extras/yui/build/yahoo/yahoo-debug.js | 145 + www/extras/yui/build/yahoo/yahoo-min.js | 1 + www/extras/yui/build/yahoo/yahoo.js | 145 + www/extras/yui/docs/Anim.js.html | 527 + www/extras/yui/docs/AnimMgr.js.html | 262 + www/extras/yui/docs/Attribute.js.html | 283 + www/extras/yui/docs/AttributeProvider.js.html | 326 + www/extras/yui/docs/AutoComplete.js.html | 2095 + www/extras/yui/docs/Bezier.js.html | 133 + www/extras/yui/docs/Calendar.js.html | 2561 + www/extras/yui/docs/CalendarGroup.js.html | 1121 + www/extras/yui/docs/ColorAnim.js.html | 230 + www/extras/yui/docs/Config.js.html | 574 + www/extras/yui/docs/ContainerEffect.js.html | 415 + www/extras/yui/docs/CustomEvent.js.html | 440 + www/extras/yui/docs/DD.js.html | 400 + www/extras/yui/docs/DDProxy.js.html | 306 + www/extras/yui/docs/DDTarget.js.html | 118 + www/extras/yui/docs/DataSource.js.html | 1170 + www/extras/yui/docs/DateMath.js.html | 367 + www/extras/yui/docs/Dialog.js.html | 629 + www/extras/yui/docs/Dom.js.html | 814 + www/extras/yui/docs/DragDrop.js.html | 1225 + www/extras/yui/docs/DragDropMgr.js.html | 1445 + www/extras/yui/docs/Easing.js.html | 358 + www/extras/yui/docs/Element.js.html | 558 + www/extras/yui/docs/Event.js.html | 1297 + www/extras/yui/docs/EventProvider.js.html | 278 + www/extras/yui/docs/HTMLNode.js.html | 219 + www/extras/yui/docs/KeyListener.js.html | 263 + www/extras/yui/docs/Lang.js.html | 131 + www/extras/yui/docs/LogMsg.js.html | 154 + www/extras/yui/docs/LogReader.js.html | 1125 + www/extras/yui/docs/LogWriter.js.html | 176 + www/extras/yui/docs/Logger.js.html | 444 + www/extras/yui/docs/MenuNode.js.html | 132 + www/extras/yui/docs/Module.js.html | 848 + www/extras/yui/docs/Motion.js.html | 246 + www/extras/yui/docs/Node.js.html | 1080 + www/extras/yui/docs/Overlay.js.html | 1015 + www/extras/yui/docs/OverlayManager.js.html | 401 + www/extras/yui/docs/Panel.js.html | 721 + www/extras/yui/docs/Region.js.html | 270 + www/extras/yui/docs/RootNode.js.html | 136 + www/extras/yui/docs/Scroll.js.html | 176 + www/extras/yui/docs/SimpleDialog.js.html | 292 + www/extras/yui/docs/Slider.js.html | 1015 + www/extras/yui/docs/SliderThumb.js.html | 296 + www/extras/yui/docs/TVAnim.js.html | 150 + www/extras/yui/docs/TVFadeIn.js.html | 159 + www/extras/yui/docs/TVFadeOut.js.html | 157 + www/extras/yui/docs/Tab.js.html | 599 + www/extras/yui/docs/TabView.js.html | 599 + www/extras/yui/docs/TextNode.js.html | 297 + www/extras/yui/docs/Tooltip.js.html | 459 + www/extras/yui/docs/TreeView.js.html | 768 + www/extras/yui/docs/YAHOO.html | 384 + www/extras/yui/docs/YAHOO.js.html | 219 + www/extras/yui/docs/YAHOO.util.Anim.html | 1139 + www/extras/yui/docs/YAHOO.util.AnimMgr.html | 500 + www/extras/yui/docs/YAHOO.util.Attribute.html | 579 + .../docs/YAHOO.util.AttributeProvider.html | 822 + www/extras/yui/docs/YAHOO.util.Bezier.html | 195 + www/extras/yui/docs/YAHOO.util.ColorAnim.html | 300 + www/extras/yui/docs/YAHOO.util.Config.html | 1243 + www/extras/yui/docs/YAHOO.util.Connect.html | 1425 + .../yui/docs/YAHOO.util.CustomEvent.html | 686 + www/extras/yui/docs/YAHOO.util.DD.html | 740 + www/extras/yui/docs/YAHOO.util.DDProxy.html | 537 + www/extras/yui/docs/YAHOO.util.DDTarget.html | 273 + www/extras/yui/docs/YAHOO.util.Dom.html | 1459 + www/extras/yui/docs/YAHOO.util.DragDrop.html | 3198 ++ ...YAHOO.util.DragDropMgr.ElementWrapper.html | 183 + .../yui/docs/YAHOO.util.DragDropMgr.html | 2689 + www/extras/yui/docs/YAHOO.util.Easing.html | 1321 + www/extras/yui/docs/YAHOO.util.Element.html | 1410 + www/extras/yui/docs/YAHOO.util.Event.html | 2243 + .../yui/docs/YAHOO.util.EventProvider.html | 504 + .../yui/docs/YAHOO.util.KeyListener.html | 568 + www/extras/yui/docs/YAHOO.util.Motion.html | 243 + www/extras/yui/docs/YAHOO.util.Point.html | 228 + www/extras/yui/docs/YAHOO.util.Region.html | 559 + www/extras/yui/docs/YAHOO.util.Scroll.html | 243 + .../yui/docs/YAHOO.util.Subscriber.html | 384 + .../yui/docs/YAHOO.widget.AutoComplete.html | 3916 ++ .../yui/docs/YAHOO.widget.Calendar.html | 5842 ++ .../yui/docs/YAHOO.widget.Calendar2up.html | 270 + .../yui/docs/YAHOO.widget.CalendarGroup.html | 2973 ++ .../yui/docs/YAHOO.widget.Calendar_Core.html | 327 + .../docs/YAHOO.widget.ContainerEffect.html | 927 + .../yui/docs/YAHOO.widget.ContextMenu.html | 990 + .../docs/YAHOO.widget.ContextMenuItem.html | 442 + .../yui/docs/YAHOO.widget.DS_JSArray.html | 304 + .../yui/docs/YAHOO.widget.DS_JSFunction.html | 304 + www/extras/yui/docs/YAHOO.widget.DS_XHR.html | 583 + .../yui/docs/YAHOO.widget.DataSource.html | 1052 + .../yui/docs/YAHOO.widget.DateMath.html | 929 + www/extras/yui/docs/YAHOO.widget.Dialog.html | 1386 + .../yui/docs/YAHOO.widget.HTMLNode.html | 402 + www/extras/yui/docs/YAHOO.widget.LogMsg.html | 242 + .../yui/docs/YAHOO.widget.LogReader.html | 1884 + .../yui/docs/YAHOO.widget.LogWriter.html | 360 + www/extras/yui/docs/YAHOO.widget.Logger.html | 841 + www/extras/yui/docs/YAHOO.widget.Menu.html | 4489 ++ .../yui/docs/YAHOO.widget.MenuBarItem.html | 531 + .../yui/docs/YAHOO.widget.MenuItem.html | 2919 + .../yui/docs/YAHOO.widget.MenuManager.html | 896 + .../yui/docs/YAHOO.widget.MenuModule.html | 355 + .../yui/docs/YAHOO.widget.MenuModuleItem.html | 200 + .../yui/docs/YAHOO.widget.MenuNode.html | 288 + www/extras/yui/docs/YAHOO.widget.Menubar.html | 878 + www/extras/yui/docs/YAHOO.widget.Module.html | 1897 + www/extras/yui/docs/YAHOO.widget.Node.html | 2157 + www/extras/yui/docs/YAHOO.widget.Overlay.html | 2223 + .../yui/docs/YAHOO.widget.OverlayManager.html | 831 + www/extras/yui/docs/YAHOO.widget.Panel.html | 1649 + .../yui/docs/YAHOO.widget.RootNode.html | 248 + .../yui/docs/YAHOO.widget.SimpleDialog.html | 926 + www/extras/yui/docs/YAHOO.widget.Slider.html | 1991 + .../yui/docs/YAHOO.widget.SliderThumb.html | 834 + www/extras/yui/docs/YAHOO.widget.TVAnim.html | 294 + .../yui/docs/YAHOO.widget.TVFadeIn.html | 327 + .../yui/docs/YAHOO.widget.TVFadeOut.html | 327 + www/extras/yui/docs/YAHOO.widget.Tab.html | 978 + www/extras/yui/docs/YAHOO.widget.TabView.html | 1048 + .../yui/docs/YAHOO.widget.TextNode.html | 432 + www/extras/yui/docs/YAHOO.widget.Tooltip.html | 1143 + .../yui/docs/YAHOO.widget.TreeView.html | 2028 + www/extras/yui/docs/assets/api-js | 1356 + www/extras/yui/docs/assets/api.css | 133 + www/extras/yui/docs/assets/cheatsheets.zip | Bin 0 -> 2354779 bytes .../yui/docs/assets/dpSyntaxHighlighter.css | 180 + .../yui/docs/assets/dpSyntaxHighlighter.js | 735 + www/extras/yui/docs/assets/examples.css | 79 + www/extras/yui/docs/assets/logo.gif | Bin 0 -> 705 bytes .../yui/docs/assets/reset-fonts-grids-min.css | 4 + www/extras/yui/docs/connection.js.html | 1041 + www/extras/yui/docs/contextmenu.js.html | 465 + www/extras/yui/docs/contextmenuitem.js.html | 200 + www/extras/yui/docs/index.html | 227 + www/extras/yui/docs/index.json | 1 + www/extras/yui/docs/menu.js.html | 3606 ++ www/extras/yui/docs/menubar.js.html | 511 + www/extras/yui/docs/menubaritem.js.html | 245 + www/extras/yui/docs/menuitem.js.html | 2162 + www/extras/yui/docs/menumanager.js.html | 649 + www/extras/yui/docs/menumodule.js.html | 124 + www/extras/yui/docs/menumoduleitem.js.html | 121 + www/extras/yui/docs/module_animation.html | 96 + www/extras/yui/docs/module_autocomplete.html | 93 + www/extras/yui/docs/module_calendar.html | 93 + www/extras/yui/docs/module_connection.html | 87 + www/extras/yui/docs/module_container.html | 105 + www/extras/yui/docs/module_dom.html | 87 + www/extras/yui/docs/module_dragdrop.html | 100 + www/extras/yui/docs/module_event.html | 93 + www/extras/yui/docs/module_logger.html | 97 + www/extras/yui/docs/module_menu.html | 116 + www/extras/yui/docs/module_slider.html | 94 + www/extras/yui/docs/module_tabview.html | 93 + www/extras/yui/docs/module_treeview.html | 103 + www/extras/yui/docs/module_yahoo.html | 87 + www/extras/yui/docs/raw.json | 1 + .../yui/examples/animation/anim_basic.html | 30 + .../yui/examples/animation/anim_from.html | 29 + .../yui/examples/animation/anim_size.html | 35 + .../examples/animation/anim_size_plus.html | 36 + .../animation/anim_size_plus_alt.html | 38 + .../yui/examples/animation/anim_units.html | 29 + www/extras/yui/examples/animation/colors.html | 39 + .../yui/examples/animation/css/demo.css | 94 + www/extras/yui/examples/animation/easing.html | 30 + www/extras/yui/examples/animation/fade.html | 29 + .../yui/examples/animation/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/animation/index.html | 38 + .../yui/examples/animation/motion_basic.html | 31 + .../yui/examples/animation/motion_by.html | 30 + .../examples/animation/motion_control.html | 38 + .../examples/animation/motion_controls.html | 39 + .../yui/examples/animation/motion_plus.html | 40 + .../yui/examples/animation/scroll_by.html | 30 + .../yui/examples/animation/scroll_horiz.html | 34 + .../yui/examples/animation/scroll_vert.html | 34 + .../examples/autocomplete/css/examples.css | 24 + .../yui/examples/autocomplete/customize.html | 350 + .../yui/examples/autocomplete/flickr_xml.html | 210 + .../yui/examples/autocomplete/img/logo.gif | Bin 0 -> 705 bytes .../yui/examples/autocomplete/index.html | 32 + .../yui/examples/autocomplete/js/json.js | 150 + .../autocomplete/js/states_jsfunction.js | 116 + .../autocomplete/php/flickr_proxy.php | 33 + .../autocomplete/php/ysearch_flat.php | 44109 ++++++++++++++++ .../autocomplete/php/ysearch_proxy.php | 45 + .../examples/autocomplete/states_jsarray.html | 672 + .../autocomplete/states_jsfunction.html | 275 + .../examples/autocomplete/ysearch_flat.html | 279 + .../examples/autocomplete/ysearch_json.html | 180 + .../examples/autocomplete/ysearch_xml.html | 164 + .../yui/examples/calendar/assets/style.css | 61 + .../yui/examples/calendar/assets/yui.gif | Bin 0 -> 2425 bytes www/extras/yui/examples/calendar/dual/1.html | 79 + www/extras/yui/examples/calendar/dual/2.html | 67 + .../yui/examples/calendar/dual/solution.html | 32 + .../yui/examples/calendar/events/1.html | 96 + .../yui/examples/calendar/events/2.html | 67 + .../examples/calendar/events/solution.html | 46 + .../yui/examples/calendar/formsel/1.html | 150 + .../yui/examples/calendar/formsel/2.html | 67 + .../examples/calendar/formsel/solution.html | 134 + .../yui/examples/calendar/formtxt/1.html | 122 + .../yui/examples/calendar/formtxt/2.html | 67 + .../examples/calendar/formtxt/solution.html | 66 + .../yui/examples/calendar/germany/1.html | 132 + .../yui/examples/calendar/germany/2.html | 67 + .../examples/calendar/germany/solution.html | 62 + www/extras/yui/examples/calendar/index.html | 98 + www/extras/yui/examples/calendar/japan/1.html | 127 + www/extras/yui/examples/calendar/japan/2.html | 67 + .../yui/examples/calendar/japan/solution.html | 55 + .../yui/examples/calendar/minmax/1.html | 90 + .../yui/examples/calendar/minmax/2.html | 67 + .../examples/calendar/minmax/solution.html | 35 + www/extras/yui/examples/calendar/multi/1.html | 87 + www/extras/yui/examples/calendar/multi/2.html | 67 + .../yui/examples/calendar/multi/solution.html | 33 + www/extras/yui/examples/calendar/popup/1.html | 97 + www/extras/yui/examples/calendar/popup/2.html | 67 + .../yui/examples/calendar/popup/solution.html | 51 + .../yui/examples/calendar/quickstart/1.html | 106 + .../yui/examples/calendar/quickstart/2.html | 67 + .../calendar/quickstart/solution.html | 31 + .../yui/examples/calendar/render/1.html | 101 + .../yui/examples/calendar/render/2.html | 67 + .../examples/calendar/render/solution.html | 47 + www/extras/yui/examples/connection/abort.html | 113 + www/extras/yui/examples/connection/get.html | 123 + www/extras/yui/examples/connection/index.html | 24 + .../yui/examples/connection/php/get.php | 3 + .../yui/examples/connection/php/post.php | 3 + .../yui/examples/connection/php/sync.php | 18 + .../yui/examples/connection/php/weather.php | 19 + www/extras/yui/examples/connection/post.html | 102 + .../yui/examples/connection/weather.html | 138 + .../yui/examples/container/assets/get.php | 32 + .../examples/container/assets/img/aqua-bg.gif | Bin 0 -> 101 bytes .../container/assets/img/aqua-hd-bg.gif | Bin 0 -> 268 bytes .../assets/img/aqua-hd-close-over.gif | Bin 0 -> 1140 bytes .../container/assets/img/aqua-hd-close.gif | Bin 0 -> 1140 bytes .../container/assets/img/aqua-hd-lt.gif | Bin 0 -> 338 bytes .../container/assets/img/aqua-hd-rt.gif | Bin 0 -> 340 bytes .../yui/examples/container/assets/img/bg.png | Bin 0 -> 360 bytes .../yui/examples/container/assets/img/ctx.gif | Bin 0 -> 4946 bytes .../examples/container/assets/img/xp-bl.gif | Bin 0 -> 330 bytes .../container/assets/img/xp-border-rt.gif | Bin 0 -> 54 bytes .../examples/container/assets/img/xp-br.gif | Bin 0 -> 322 bytes .../container/assets/img/xp-brdr-lt.gif | Bin 0 -> 54 bytes .../container/assets/img/xp-brdr-rt.gif | Bin 0 -> 302 bytes .../container/assets/img/xp-close.gif | Bin 0 -> 1235 bytes .../examples/container/assets/img/xp-ft.gif | Bin 0 -> 190 bytes .../examples/container/assets/img/xp-hd.gif | Bin 0 -> 193 bytes .../examples/container/assets/img/xp-tl.gif | Bin 0 -> 598 bytes .../examples/container/assets/img/xp-tr.gif | Bin 0 -> 598 bytes .../container/assets/img/ybox-back.gif | Bin 0 -> 145 bytes .../container/assets/img/ybox-close.gif | Bin 0 -> 177 bytes .../container/assets/img/ybox-next.gif | Bin 0 -> 145 bytes .../yui/examples/container/assets/post.php | 32 + .../examples/container/assets/somedata.php | 8 + .../yui/examples/container/assets/style.css | 62 + .../yui/examples/container/assets/yui.gif | Bin 0 -> 2425 bytes .../yui/examples/container/dialog/1.html | 170 + .../yui/examples/container/dialog/2.html | 71 + .../examples/container/dialog/solution.html | 129 + .../yui/examples/container/effect/1.html | 97 + .../yui/examples/container/effect/2.html | 71 + .../examples/container/effect/solution.html | 98 + www/extras/yui/examples/container/index.html | 111 + .../yui/examples/container/keylistener/1.html | 100 + .../yui/examples/container/keylistener/2.html | 71 + .../container/keylistener/solution.html | 66 + .../yui/examples/container/module/1.html | 152 + .../yui/examples/container/module/2.html | 71 + .../examples/container/module/solution.html | 61 + .../yui/examples/container/overlay/1.html | 151 + .../yui/examples/container/overlay/2.html | 71 + .../examples/container/overlay/solution.html | 90 + .../examples/container/overlaymanager/1.html | 152 + .../examples/container/overlaymanager/2.html | 71 + .../container/overlaymanager/solution.html | 118 + .../yui/examples/container/panel/1.html | 107 + .../yui/examples/container/panel/2.html | 71 + .../examples/container/panel/solution.html | 66 + .../examples/container/panelphotobox/1.html | 337 + .../examples/container/panelphotobox/2.html | 71 + .../container/panelphotobox/solution.html | 291 + .../yui/examples/container/panelresize/1.html | 185 + .../yui/examples/container/panelresize/2.html | 71 + .../container/panelresize/solution.html | 160 + .../yui/examples/container/panelskin/1.html | 132 + .../yui/examples/container/panelskin/2.html | 71 + .../container/panelskin/solution.html | 111 + .../yui/examples/container/panelwait/1.html | 123 + .../yui/examples/container/panelwait/2.html | 71 + .../container/panelwait/solution.html | 78 + .../examples/container/simpledialog/1.html | 105 + .../examples/container/simpledialog/2.html | 71 + .../container/simpledialog/solution.html | 70 + .../yui/examples/container/tooltip/1.html | 92 + .../yui/examples/container/tooltip/2.html | 71 + .../examples/container/tooltip/solution.html | 36 + .../examples/container/tooltipmulti/1.html | 88 + .../examples/container/tooltipmulti/2.html | 71 + .../container/tooltipmulti/solution.html | 44 + www/extras/yui/examples/dom/addclass.html | 38 + www/extras/yui/examples/dom/css/dom.css | 79 + .../examples/dom/getelementsbyclassname.html | 49 + www/extras/yui/examples/dom/getstyle.html | 40 + www/extras/yui/examples/dom/getxy.html | 41 + www/extras/yui/examples/dom/hasclass.html | 37 + www/extras/yui/examples/dom/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/dom/index.html | 27 + www/extras/yui/examples/dom/removeclass.html | 38 + www/extras/yui/examples/dom/setstyle.html | 38 + www/extras/yui/examples/dom/setxy.html | 39 + www/extras/yui/examples/dragdrop/circle.html | 239 + www/extras/yui/examples/dragdrop/css/ie.css | 1 + .../yui/examples/dragdrop/css/screen.css | 301 + www/extras/yui/examples/dragdrop/drag.html | 202 + www/extras/yui/examples/dragdrop/grid.html | 179 + .../yui/examples/dragdrop/img/GREYBG.PNG | Bin 0 -> 200 bytes .../yui/examples/dragdrop/img/HEADER.GIF | Bin 0 -> 203 bytes .../yui/examples/dragdrop/img/bullet.gif | Bin 0 -> 172 bytes .../yui/examples/dragdrop/img/channel.png | Bin 0 -> 3468 bytes .../yui/examples/dragdrop/img/circle.gif | Bin 0 -> 925 bytes www/extras/yui/examples/dragdrop/img/grid.png | Bin 0 -> 450 bytes .../yui/examples/dragdrop/img/hline.png | Bin 0 -> 416 bytes .../yui/examples/dragdrop/img/horizBg.png | Bin 0 -> 519 bytes .../yui/examples/dragdrop/img/horizSlider.png | Bin 0 -> 1115 bytes .../examples/dragdrop/img/horizSlider_on.png | Bin 0 -> 1117 bytes www/extras/yui/examples/dragdrop/img/hue.png | Bin 0 -> 1344 bytes www/extras/yui/examples/dragdrop/img/logo.gif | Bin 0 -> 705 bytes .../yui/examples/dragdrop/img/lthumb.png | Bin 0 -> 1191 bytes .../yui/examples/dragdrop/img/navHover2.png | Bin 0 -> 875 bytes .../yui/examples/dragdrop/img/pickerbg.png | Bin 0 -> 12421 bytes .../yui/examples/dragdrop/img/qbottom.png | Bin 0 -> 1351 bytes .../yui/examples/dragdrop/img/qmiddle.png | Bin 0 -> 385 bytes www/extras/yui/examples/dragdrop/img/qtop.png | Bin 0 -> 2030 bytes .../yui/examples/dragdrop/img/select.gif | Bin 0 -> 78 bytes .../yui/examples/dragdrop/img/select.png | Bin 0 -> 192 bytes .../yui/examples/dragdrop/img/sortList.png | Bin 0 -> 298 bytes www/extras/yui/examples/dragdrop/img/sq1.png | Bin 0 -> 9253 bytes www/extras/yui/examples/dragdrop/img/sq2.png | Bin 0 -> 9475 bytes www/extras/yui/examples/dragdrop/img/sq3.png | Bin 0 -> 10264 bytes .../yui/examples/dragdrop/img/vertBg.png | Bin 0 -> 572 bytes .../yui/examples/dragdrop/img/vertSlider.png | Bin 0 -> 1112 bytes .../examples/dragdrop/img/vertSlider_on.png | Bin 0 -> 1160 bytes .../yui/examples/dragdrop/img/vline.png | Bin 0 -> 481 bytes www/extras/yui/examples/dragdrop/index.html | 80 + .../yui/examples/dragdrop/interface.html | 148 + www/extras/yui/examples/dragdrop/js/DDList.js | 102 + www/extras/yui/examples/dragdrop/js/DDMy.js | 48 + www/extras/yui/examples/dragdrop/js/DDMy2.js | 62 + .../yui/examples/dragdrop/js/DDOnTop.js | 49 + .../yui/examples/dragdrop/js/DDPlayer.js | 164 + .../yui/examples/dragdrop/js/DDResize.js | 46 + .../yui/examples/dragdrop/js/DDResize2.js | 106 + www/extras/yui/examples/dragdrop/js/DDSwap.js | 170 + www/extras/yui/examples/dragdrop/js/color.js | 2 + www/extras/yui/examples/dragdrop/js/key.js | 34 + www/extras/yui/examples/dragdrop/js/log.js | 20 + www/extras/yui/examples/dragdrop/list.html | 213 + .../yui/examples/dragdrop/multihandle.html | 163 + www/extras/yui/examples/dragdrop/ontop.html | 205 + www/extras/yui/examples/dragdrop/proxy.html | 281 + www/extras/yui/examples/dragdrop/resize.html | 192 + www/extras/yui/examples/dragdrop/slider.html | 576 + .../yui/examples/dragdrop/targetable.html | 216 + www/extras/yui/examples/event/assets/code.css | 103 + .../event/assets/dpSyntaxHighlighter.js | 736 + .../examples/event/assets/eventdelegation.gif | Bin 0 -> 17196 bytes www/extras/yui/examples/event/assets/logo.gif | Bin 0 -> 705 bytes .../yui/examples/event/assets/screen.css | 112 + .../yui/examples/event/custom-event.html | 236 + .../yui/examples/event/event-delegation.html | 167 + www/extras/yui/examples/event/index.html | 33 + www/extras/yui/examples/event/simple.html | 122 + .../yui/examples/fonts/example_default.html | 69 + .../examples/fonts/example_fontfamily.html | 37 + .../yui/examples/fonts/example_fontsize.html | 37 + www/extras/yui/examples/fonts/index.html | 49 + .../examples/grids/example_doc-custom.html | 43 + .../yui/examples/grids/example_doc.html | 29 + .../yui/examples/grids/example_doc2.html | 29 + .../yui/examples/grids/example_doc3.html | 29 + www/extras/yui/examples/grids/example_g.html | 36 + www/extras/yui/examples/grids/example_g2.html | 46 + www/extras/yui/examples/grids/example_gb.html | 39 + www/extras/yui/examples/grids/example_gc.html | 36 + www/extras/yui/examples/grids/example_gd.html | 36 + www/extras/yui/examples/grids/example_ge.html | 36 + www/extras/yui/examples/grids/example_gf.html | 36 + www/extras/yui/examples/grids/example_t1.html | 29 + www/extras/yui/examples/grids/example_t2.html | 29 + www/extras/yui/examples/grids/example_t3.html | 29 + www/extras/yui/examples/grids/example_t4.html | 29 + www/extras/yui/examples/grids/example_t5.html | 29 + www/extras/yui/examples/grids/example_t6.html | 29 + www/extras/yui/examples/grids/example_t7.html | 29 + www/extras/yui/examples/grids/index.html | 77 + .../yui/examples/logger/autocomplete.html | 186 + .../yui/examples/logger/css/examples.css | 19 + www/extras/yui/examples/logger/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/logger/index.html | 29 + .../yui/examples/logger/js/animation-debug.js | 972 + .../examples/logger/js/autocomplete-debug.js | 2738 + .../yui/examples/logger/js/event-debug.js | 1180 + www/extras/yui/examples/logger/readlogs.html | 142 + .../yui/examples/logger/readlogscustom.html | 190 + www/extras/yui/examples/logger/writelogs.html | 175 + .../yui/examples/menu/applicationmenubar.html | 298 + www/extras/yui/examples/menu/contextmenu.html | 527 + www/extras/yui/examples/menu/example01.html | 115 + www/extras/yui/examples/menu/example02.html | 106 + www/extras/yui/examples/menu/example03.html | 127 + www/extras/yui/examples/menu/example04.html | 126 + www/extras/yui/examples/menu/example05.html | 130 + www/extras/yui/examples/menu/example06.html | 130 + www/extras/yui/examples/menu/example07.html | 201 + www/extras/yui/examples/menu/example08.html | 167 + www/extras/yui/examples/menu/example09.html | 197 + www/extras/yui/examples/menu/example10.html | 247 + www/extras/yui/examples/menu/example11.html | 124 + www/extras/yui/examples/menu/example12.html | 223 + www/extras/yui/examples/menu/example13.html | 276 + www/extras/yui/examples/menu/img/dolly.jpg | Bin 0 -> 4244 bytes www/extras/yui/examples/menu/img/grass.png | Bin 0 -> 25211 bytes www/extras/yui/examples/menu/index.html | 84 + .../yui/examples/menu/leftnavfromjs.html | 232 + .../examples/menu/leftnavfromjswithanim.html | 249 + .../yui/examples/menu/leftnavfrommarkup.html | 238 + .../menu/leftnavfrommarkupwithanim.html | 244 + .../yui/examples/menu/programsmenu.html | 402 + .../yui/examples/menu/topnavfromjs.html | 252 + .../examples/menu/topnavfromjswithanim.html | 364 + .../yui/examples/menu/topnavfrommarkup.html | 247 + .../menu/topnavfrommarkupwithanim.html | 370 + .../yui/examples/reset/example_default.html | 69 + www/extras/yui/examples/reset/index.html | 47 + www/extras/yui/examples/slider/basic.html | 220 + www/extras/yui/examples/slider/css/screen.css | 282 + www/extras/yui/examples/slider/img/bullet.gif | Bin 0 -> 172 bytes www/extras/yui/examples/slider/img/greybg.png | Bin 0 -> 197 bytes www/extras/yui/examples/slider/img/header.gif | Bin 0 -> 203 bytes www/extras/yui/examples/slider/img/hline.png | Bin 0 -> 416 bytes .../yui/examples/slider/img/horizBg.png | Bin 0 -> 519 bytes .../yui/examples/slider/img/horizSlider.png | Bin 0 -> 1115 bytes .../examples/slider/img/horizSlider_on.png | Bin 0 -> 1117 bytes www/extras/yui/examples/slider/img/hue.png | Bin 0 -> 1344 bytes www/extras/yui/examples/slider/img/logo.gif | Bin 0 -> 705 bytes www/extras/yui/examples/slider/img/lthumb.png | Bin 0 -> 1191 bytes .../yui/examples/slider/img/navHover2.png | Bin 0 -> 875 bytes .../yui/examples/slider/img/pickerbg.png | Bin 0 -> 12421 bytes .../yui/examples/slider/img/qbottom.png | Bin 0 -> 1351 bytes .../yui/examples/slider/img/qmiddle.png | Bin 0 -> 385 bytes www/extras/yui/examples/slider/img/qtop.png | Bin 0 -> 2030 bytes www/extras/yui/examples/slider/img/select.gif | Bin 0 -> 78 bytes www/extras/yui/examples/slider/img/select.png | Bin 0 -> 192 bytes www/extras/yui/examples/slider/img/vertBg.png | Bin 0 -> 572 bytes .../yui/examples/slider/img/vertSlider.png | Bin 0 -> 1112 bytes .../yui/examples/slider/img/vertSlider_on.png | Bin 0 -> 1160 bytes www/extras/yui/examples/slider/img/vline.png | Bin 0 -> 481 bytes www/extras/yui/examples/slider/index.html | 348 + www/extras/yui/examples/slider/js/color.js | 97 + www/extras/yui/examples/slider/js/key.js | 34 + www/extras/yui/examples/slider/js/log.js | 15 + www/extras/yui/examples/slider/js/logger.js | 1131 + www/extras/yui/examples/slider/rgb.html | 384 + www/extras/yui/examples/slider/rgb2.html | 281 + .../yui/examples/tabview/activation.html | 73 + .../yui/examples/tabview/add_events.html | 73 + www/extras/yui/examples/tabview/add_tabs.html | 81 + .../yui/examples/tabview/basic_from_js.html | 55 + .../examples/tabview/basic_from_markup.html | 65 + .../tabview/basic_from_partial_markup.html | 63 + .../yui/examples/tabview/css/example.css | 52 + .../yui/examples/tabview/css/module_tabs.css | 27 + .../yui/examples/tabview/css/round_tabs.css | 75 + .../yui/examples/tabview/custom_events.html | 70 + .../yui/examples/tabview/dynamic_from_js.html | 52 + .../examples/tabview/dynamic_from_markup.html | 44 + .../yui/examples/tabview/img/loading.gif | Bin 0 -> 729 bytes .../yui/examples/tabview/img/newcats_bkgd.gif | Bin 0 -> 93 bytes www/extras/yui/examples/tabview/img/ptr.gif | Bin 0 -> 261 bytes .../tabview/img/round_4px_trans_gray.gif | Bin 0 -> 463 bytes .../yui/examples/tabview/img/tab_left.gif | Bin 0 -> 129 bytes .../yui/examples/tabview/img/tab_right.gif | Bin 0 -> 491 bytes www/extras/yui/examples/tabview/index.html | 35 + www/extras/yui/examples/tabview/loading.html | 70 + .../yui/examples/tabview/module_tabs.html | 103 + .../examples/tabview/orientation_bottom.html | 78 + .../examples/tabview/orientation_left.html | 75 + .../examples/tabview/orientation_right.html | 76 + .../yui/examples/tabview/php/nonsense.php | 28 + .../yui/examples/tabview/remove_events.html | 74 + .../yui/examples/tabview/remove_tabs.html | 68 + .../examples/tabview/remove_tabs_icon.html | 90 + .../yui/examples/tabview/rounded_tabs.html | 69 + .../examples/tabview/stop_custom_events.html | 71 + .../yui/examples/tabview/transition.html | 90 + www/extras/yui/examples/treeview/anim.html | 208 + www/extras/yui/examples/treeview/check.html | 218 + .../yui/examples/treeview/css/check/tree.css | 1 + www/extras/yui/examples/treeview/css/code.css | 1 + .../examples/treeview/css/default/tree.css | 98 + .../treeview/css/default/tree.css.orig | 98 + .../examples/treeview/css/folders/tree.css | 55 + .../yui/examples/treeview/css/local/tree.css | 99 + .../yui/examples/treeview/css/menu/tree.css | 58 + .../yui/examples/treeview/css/multi/tree.css | 68 + .../yui/examples/treeview/css/screen.css | 1 + www/extras/yui/examples/treeview/default.html | 220 + www/extras/yui/examples/treeview/dynamic.html | 274 + www/extras/yui/examples/treeview/folders.html | 184 + www/extras/yui/examples/treeview/html.html | 209 + .../yui/examples/treeview/img/bullet.gif | Bin 0 -> 172 bytes .../examples/treeview/img/check/check0.gif | Bin 0 -> 608 bytes .../examples/treeview/img/check/check1.gif | Bin 0 -> 609 bytes .../examples/treeview/img/check/check2.gif | Bin 0 -> 622 bytes .../yui/examples/treeview/img/check/lm.gif | Bin 0 -> 94 bytes .../yui/examples/treeview/img/check/lmh.gif | Bin 0 -> 106 bytes .../yui/examples/treeview/img/check/ln.gif | Bin 0 -> 142 bytes .../examples/treeview/img/check/loading.gif | Bin 0 -> 2673 bytes .../yui/examples/treeview/img/check/lp.gif | Bin 0 -> 130 bytes .../yui/examples/treeview/img/check/lph.gif | Bin 0 -> 111 bytes .../yui/examples/treeview/img/check/tm.gif | Bin 0 -> 545 bytes .../yui/examples/treeview/img/check/tmh.gif | Bin 0 -> 563 bytes .../yui/examples/treeview/img/check/tn.gif | Bin 0 -> 504 bytes .../yui/examples/treeview/img/check/tp.gif | Bin 0 -> 539 bytes .../yui/examples/treeview/img/check/tph.gif | Bin 0 -> 568 bytes .../yui/examples/treeview/img/check/vline.gif | Bin 0 -> 503 bytes .../yui/examples/treeview/img/default/lm.gif | Bin 0 -> 94 bytes .../yui/examples/treeview/img/default/lmh.gif | Bin 0 -> 106 bytes .../yui/examples/treeview/img/default/ln.gif | Bin 0 -> 142 bytes .../examples/treeview/img/default/loading.gif | Bin 0 -> 2673 bytes .../yui/examples/treeview/img/default/lp.gif | Bin 0 -> 130 bytes .../yui/examples/treeview/img/default/lph.gif | Bin 0 -> 111 bytes .../yui/examples/treeview/img/default/tm.gif | Bin 0 -> 545 bytes .../yui/examples/treeview/img/default/tmh.gif | Bin 0 -> 563 bytes .../yui/examples/treeview/img/default/tn.gif | Bin 0 -> 504 bytes .../yui/examples/treeview/img/default/tp.gif | Bin 0 -> 539 bytes .../yui/examples/treeview/img/default/tph.gif | Bin 0 -> 568 bytes .../examples/treeview/img/default/vline.gif | Bin 0 -> 503 bytes .../yui/examples/treeview/img/folders/lm.gif | Bin 0 -> 666 bytes .../yui/examples/treeview/img/folders/lmh.gif | Bin 0 -> 677 bytes .../yui/examples/treeview/img/folders/ln.gif | Bin 0 -> 142 bytes .../examples/treeview/img/folders/loading.gif | Bin 0 -> 2673 bytes .../yui/examples/treeview/img/folders/lp.gif | Bin 0 -> 641 bytes .../yui/examples/treeview/img/folders/lph.gif | Bin 0 -> 651 bytes .../yui/examples/treeview/img/folders/tm.gif | Bin 0 -> 1281 bytes .../yui/examples/treeview/img/folders/tmh.gif | Bin 0 -> 1295 bytes .../yui/examples/treeview/img/folders/tn.gif | Bin 0 -> 504 bytes .../yui/examples/treeview/img/folders/tp.gif | Bin 0 -> 1243 bytes .../yui/examples/treeview/img/folders/tph.gif | Bin 0 -> 1263 bytes .../examples/treeview/img/folders/vline.gif | Bin 0 -> 503 bytes .../yui/examples/treeview/img/greybg.png | Bin 0 -> 197 bytes .../yui/examples/treeview/img/header.gif | Bin 0 -> 203 bytes www/extras/yui/examples/treeview/img/logo.gif | Bin 0 -> 705 bytes .../examples/treeview/img/menu/collapse.gif | Bin 0 -> 56 bytes .../examples/treeview/img/menu/collapseh.gif | Bin 0 -> 67 bytes .../examples/treeview/img/menu/collapseon.gif | Bin 0 -> 64 bytes .../yui/examples/treeview/img/menu/dash.gif | Bin 0 -> 114 bytes .../yui/examples/treeview/img/menu/expand.gif | Bin 0 -> 57 bytes .../examples/treeview/img/menu/expandh.gif | Bin 0 -> 66 bytes .../examples/treeview/img/menu/expandon.gif | Bin 0 -> 65 bytes .../examples/treeview/img/menu/loading.gif | Bin 0 -> 2673 bytes .../yui/examples/treeview/img/navHover2.png | Bin 0 -> 875 bytes .../yui/examples/treeview/img/qbottom.png | Bin 0 -> 1351 bytes .../yui/examples/treeview/img/qmiddle.png | Bin 0 -> 385 bytes www/extras/yui/examples/treeview/img/qtop.png | Bin 0 -> 2030 bytes www/extras/yui/examples/treeview/index.html | 44 + .../examples/treeview/js/CheckOnClickNode.js | 23 + .../yui/examples/treeview/js/TaskNode.js | 275 + .../treeview/js/dpSyntaxHighlighter.js | 736 + www/extras/yui/examples/treeview/js/json.js | 150 + www/extras/yui/examples/treeview/js/key.js | 34 + www/extras/yui/examples/treeview/js/log.js | 15 + www/extras/yui/examples/treeview/menu.html | 242 + www/extras/yui/examples/treeview/multi.html | 185 + 1271 files changed, 539033 insertions(+) create mode 100644 www/extras/yui-ext/README.txt create mode 100644 www/extras/yui-ext/animator-lib.js create mode 100644 www/extras/yui-ext/basic-dialog.js create mode 100644 www/extras/yui-ext/basic-grid-lib.js create mode 100644 www/extras/yui-ext/build/Bench-min.js create mode 100644 www/extras/yui-ext/build/CSS-min.js create mode 100644 www/extras/yui-ext/build/CompositeElement-min.js create mode 100644 www/extras/yui-ext/build/Date-min.js create mode 100644 www/extras/yui-ext/build/DomHelper-min.js create mode 100644 www/extras/yui-ext/build/Element-min.js create mode 100644 www/extras/yui-ext/build/EventManager-min.js create mode 100644 www/extras/yui-ext/build/JSON-min.js create mode 100644 www/extras/yui-ext/build/MixedCollection-min.js create mode 100644 www/extras/yui-ext/build/State-min.js create mode 100644 www/extras/yui-ext/build/UpdateManager-min.js create mode 100644 www/extras/yui-ext/build/anim/Actor-min.js create mode 100644 www/extras/yui-ext/build/anim/Animator-min.js create mode 100644 www/extras/yui-ext/build/data/AbstractDataModel-min.js create mode 100644 www/extras/yui-ext/build/data/DefaultDataModel-min.js create mode 100644 www/extras/yui-ext/build/data/JSONDataModel-min.js create mode 100644 www/extras/yui-ext/build/data/LoadableDataModel-min.js create mode 100644 www/extras/yui-ext/build/data/XMLDataModel-min.js create mode 100644 www/extras/yui-ext/build/grid/AbstractColumnModel-min.js create mode 100644 www/extras/yui-ext/build/grid/DefaultColumnModel-min.js create mode 100644 www/extras/yui-ext/build/grid/EditorGrid-min.js create mode 100644 www/extras/yui-ext/build/grid/EditorSelectionModel-min.js create mode 100644 www/extras/yui-ext/build/grid/Grid-min.js create mode 100644 www/extras/yui-ext/build/grid/GridDD-min.js create mode 100644 www/extras/yui-ext/build/grid/GridView-min.js create mode 100644 www/extras/yui-ext/build/grid/PagedGridView-min.js create mode 100644 www/extras/yui-ext/build/grid/SelectionModel-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/CellEditor-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/CheckboxEditor-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/DateEditor-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/NumberEditor-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/SelectEditor-min.js create mode 100644 www/extras/yui-ext/build/grid/editor/TextEditor-min.js create mode 100644 www/extras/yui-ext/build/layout/BorderLayout-min.js create mode 100644 www/extras/yui-ext/build/layout/BorderLayoutRegions-min.js create mode 100644 www/extras/yui-ext/build/layout/ContentPanels-min.js create mode 100644 www/extras/yui-ext/build/layout/LayoutManager-min.js create mode 100644 www/extras/yui-ext/build/layout/LayoutRegion-min.js create mode 100644 www/extras/yui-ext/build/layout/LayoutStateManager-min.js create mode 100644 www/extras/yui-ext/build/layout/SplitLayoutRegion-min.js create mode 100644 www/extras/yui-ext/build/widgets/BasicDialog-min.js create mode 100644 www/extras/yui-ext/build/widgets/DatePicker-min.js create mode 100644 www/extras/yui-ext/build/widgets/Resizable-min.js create mode 100644 www/extras/yui-ext/build/widgets/SplitBar-min.js create mode 100644 www/extras/yui-ext/build/widgets/TabPanel-min.js create mode 100644 www/extras/yui-ext/build/widgets/TemplateView-min.js create mode 100644 www/extras/yui-ext/build/widgets/Toolbar-min.js create mode 100644 www/extras/yui-ext/build/yutil-min.js create mode 100644 www/extras/yui-ext/date-lib.js create mode 100644 www/extras/yui-ext/docs/index.html create mode 100644 www/extras/yui-ext/docs/output/AbstractColumnModel.js.html create mode 100644 www/extras/yui-ext/docs/output/AbstractDataModel.js.html create mode 100644 www/extras/yui-ext/docs/output/Actor.js.html create mode 100644 www/extras/yui-ext/docs/output/Animator.js.html create mode 100644 www/extras/yui-ext/docs/output/BasicDialog.js.html create mode 100644 www/extras/yui-ext/docs/output/Bench.js.html create mode 100644 www/extras/yui-ext/docs/output/BorderLayout.js.html create mode 100644 www/extras/yui-ext/docs/output/BorderLayoutRegions.js.html create mode 100644 www/extras/yui-ext/docs/output/CSS.js.html create mode 100644 www/extras/yui-ext/docs/output/CellEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/CheckboxEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/CompositeElement.js.html create mode 100644 www/extras/yui-ext/docs/output/ContentPanels.js.html create mode 100644 www/extras/yui-ext/docs/output/Date.js.html create mode 100644 www/extras/yui-ext/docs/output/DateEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/DatePicker.js.html create mode 100644 www/extras/yui-ext/docs/output/DefaultColumnModel.js.html create mode 100644 www/extras/yui-ext/docs/output/DefaultDataModel.js.html create mode 100644 www/extras/yui-ext/docs/output/DomHelper.js.html create mode 100644 www/extras/yui-ext/docs/output/EditorGrid.js.html create mode 100644 www/extras/yui-ext/docs/output/EditorSelectionModel.js.html create mode 100644 www/extras/yui-ext/docs/output/Element.js.html create mode 100644 www/extras/yui-ext/docs/output/EventManager.js.html create mode 100644 www/extras/yui-ext/docs/output/Function.html create mode 100644 www/extras/yui-ext/docs/output/Grid.js.html create mode 100644 www/extras/yui-ext/docs/output/GridDD.js.html create mode 100644 www/extras/yui-ext/docs/output/GridView.js.html create mode 100644 www/extras/yui-ext/docs/output/JSON.js.html create mode 100644 www/extras/yui-ext/docs/output/JSONDataModel.js.html create mode 100644 www/extras/yui-ext/docs/output/LayoutDragDropMgr.js.html create mode 100644 www/extras/yui-ext/docs/output/LayoutManager.js.html create mode 100644 www/extras/yui-ext/docs/output/LayoutRegion.js.html create mode 100644 www/extras/yui-ext/docs/output/LayoutRegionDD.js.html create mode 100644 www/extras/yui-ext/docs/output/LayoutStateManager.js.html create mode 100644 www/extras/yui-ext/docs/output/LoadableDataModel.js.html create mode 100644 www/extras/yui-ext/docs/output/LogMsg.html create mode 100644 www/extras/yui-ext/docs/output/LogReader.html create mode 100644 www/extras/yui-ext/docs/output/LogWriter.html create mode 100644 www/extras/yui-ext/docs/output/MixedCollection.js.html create mode 100644 www/extras/yui-ext/docs/output/NumberEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/PagedGridView.js.html create mode 100644 www/extras/yui-ext/docs/output/Resizable.js.html create mode 100644 www/extras/yui-ext/docs/output/SelectEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/SelectionModel.js.html create mode 100644 www/extras/yui-ext/docs/output/SplitBar.js.html create mode 100644 www/extras/yui-ext/docs/output/SplitLayoutRegion.js.html create mode 100644 www/extras/yui-ext/docs/output/State.js.html create mode 100644 www/extras/yui-ext/docs/output/TabPanel.js.html create mode 100644 www/extras/yui-ext/docs/output/TaskPanel.js.html create mode 100644 www/extras/yui-ext/docs/output/TemplateView.js.html create mode 100644 www/extras/yui-ext/docs/output/TextEditor.js.html create mode 100644 www/extras/yui-ext/docs/output/Toolbar.js.html create mode 100644 www/extras/yui-ext/docs/output/UpdateManager.js.html create mode 100644 www/extras/yui-ext/docs/output/XMLDataModel.js.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.Actor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.Animator.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.AnimatorComposite.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.Button.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.BorderLayout.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElement.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElementLite.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.ContentPanel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.Template.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.Element.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.EventManager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.EventObject.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.GridPanel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.JsonView.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.LayoutDialog.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.LayoutManager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.LayoutRegion.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.NestedLayoutPanel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.Resizable.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.BasicLayoutAdapter.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.SplitLayoutRegion.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.TabPanel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.TabPanelItem.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.Toolbar.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.ToolbarButton.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.BasicRenderer.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.View.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractColumnModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractDataModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.CellEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.CheckboxEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.DateEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultColumnModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultDataModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorAndSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorGrid.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.Grid.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridDD.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridView.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.JSONDataModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.LoadableDataModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.NumberEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.PagedGridView.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.SelectEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.SingleSelectionModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.TextEditor.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.grid.XMLDataModel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.state.CookieProvider.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.state.Manager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.state.Provider.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.Browser.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.CSS.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.Config.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.DelayedTask.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.JSON.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.MixedCollection.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.ext.util.Observable.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Anim.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.AnimMgr.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Attribute.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.AttributeProvider.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Bezier.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.ColorAnim.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Config.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Connect.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.CustomEvent.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.DD.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.DDProxy.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.DDTarget.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Dom.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.DragDrop.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.DragDropMgr.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Easing.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Element.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Event.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.KeyListener.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Motion.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Point.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Region.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Scroll.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.util.Subscriber.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.AutoComplete.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Calendar.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Calendar2up.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.CalendarGroup.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Calendar_Core.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.ContainerEffect.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenu.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenuItem.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSArray.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSFunction.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.DS_XHR.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.DataSource.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.DateMath.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Dialog.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.HTMLNode.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.LogMsg.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.LogReader.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.LogWriter.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Logger.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Menu.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuBarItem.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuItem.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuManager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuModule.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuModuleItem.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.MenuNode.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Menubar.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Module.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Node.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Overlay.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.OverlayManager.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Panel.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.RootNode.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.SimpleDialog.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Slider.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.SliderThumb.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TVAnim.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeIn.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeOut.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Tab.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TabView.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TextNode.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.Tooltip.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.TreeView.html create mode 100644 www/extras/yui-ext/docs/output/YAHOO.widget.YAHOO.widget.Calendar2up.html create mode 100644 www/extras/yui-ext/docs/output/animation.js.html create mode 100644 www/extras/yui-ext/docs/output/autocomplete.js.html create mode 100644 www/extras/yui-ext/docs/output/calendar.js.html create mode 100644 www/extras/yui-ext/docs/output/connection.js.html create mode 100644 www/extras/yui-ext/docs/output/container.js.html create mode 100644 www/extras/yui-ext/docs/output/container_core.js.html create mode 100644 www/extras/yui-ext/docs/output/dom.js.html create mode 100644 www/extras/yui-ext/docs/output/dragdrop.js.html create mode 100644 www/extras/yui-ext/docs/output/event.js.html create mode 100644 www/extras/yui-ext/docs/output/logger.js.html create mode 100644 www/extras/yui-ext/docs/output/menu.js.html create mode 100644 www/extras/yui-ext/docs/output/output.zip create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.AnimMgr.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Attribute.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.AttributeProvider.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Bezier.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.ColorAnim.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Config.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.CustomEvent.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.DD.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.DDProxy.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.DDTarget.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Dom.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.DragDrop.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.DragDropMgr.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Easing.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Element.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Event.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.KeyListener.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Motion.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Point.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Region.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Scroll.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.util.Subscriber.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.AutoComplete.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.CalendarGroup.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Calendar_Core.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.ContainerEffect.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenu.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenuItem.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.DateMath.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Dialog.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.HTMLNode.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Logger.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Menu.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuBarItem.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuItem.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuManager.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModule.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModuleItem.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuNode.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Menubar.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Node.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Overlay.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.OverlayManager.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Panel.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.RootNode.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.SimpleDialog.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.SliderThumb.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.TVAnim.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeIn.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeOut.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Tab.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.TextNode.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.Tooltip.html create mode 100644 www/extras/yui-ext/docs/output/output/YAHOO.widget.YAHOO.widget.Calendar2up.html create mode 100644 www/extras/yui-ext/docs/output/output/tree.html create mode 100644 www/extras/yui-ext/docs/output/slider.js.html create mode 100644 www/extras/yui-ext/docs/output/tabview.js.html create mode 100644 www/extras/yui-ext/docs/output/tree.html create mode 100644 www/extras/yui-ext/docs/output/treeview.js.html create mode 100644 www/extras/yui-ext/docs/output/utilities.js.html create mode 100644 www/extras/yui-ext/docs/output/yahoo-dom-event.js.html create mode 100644 www/extras/yui-ext/docs/output/yahoo.js.html create mode 100644 www/extras/yui-ext/docs/output/yutil.js.html create mode 100644 www/extras/yui-ext/docs/resources/block-bg.gif create mode 100644 www/extras/yui-ext/docs/resources/class.gif create mode 100644 www/extras/yui-ext/docs/resources/collapse-bg.gif create mode 100644 www/extras/yui-ext/docs/resources/cssQuery.js create mode 100644 www/extras/yui-ext/docs/resources/docs.css create mode 100644 www/extras/yui-ext/docs/resources/docs.gif create mode 100644 www/extras/yui-ext/docs/resources/docs.js create mode 100644 www/extras/yui-ext/docs/resources/example.gif create mode 100644 www/extras/yui-ext/docs/resources/folder.gif create mode 100644 www/extras/yui-ext/docs/resources/folder_open.gif create mode 100644 www/extras/yui-ext/docs/resources/forum.gif create mode 100644 www/extras/yui-ext/docs/resources/inherited.gif create mode 100644 www/extras/yui-ext/docs/resources/minus.gif create mode 100644 www/extras/yui-ext/docs/resources/pkg-closed.gif create mode 100644 www/extras/yui-ext/docs/resources/pkg-open.gif create mode 100644 www/extras/yui-ext/docs/resources/plus.gif create mode 100644 www/extras/yui-ext/docs/resources/print.css create mode 100644 www/extras/yui-ext/docs/resources/print.gif create mode 100644 www/extras/yui-ext/docs/resources/reset.css create mode 100644 www/extras/yui-ext/docs/resources/style.css create mode 100644 www/extras/yui-ext/docs/resources/tree-bg.gif create mode 100644 www/extras/yui-ext/docs/resources/welcome-bg.gif create mode 100644 www/extras/yui-ext/docs/resources/welcome.css create mode 100644 www/extras/yui-ext/docs/welcome.html create mode 100644 www/extras/yui-ext/editor-grid-lib.js create mode 100644 www/extras/yui-ext/examples/README.txt create mode 100644 www/extras/yui-ext/examples/dialog/blog.html create mode 100644 www/extras/yui-ext/examples/dialog/comments.txt create mode 100644 www/extras/yui-ext/examples/dialog/hello.html create mode 100644 www/extras/yui-ext/examples/dialog/hello.js create mode 100644 www/extras/yui-ext/examples/dialog/images/comment-bg.gif create mode 100644 www/extras/yui-ext/examples/dialog/images/comment.gif create mode 100644 www/extras/yui-ext/examples/dialog/images/warning.gif create mode 100644 www/extras/yui-ext/examples/dialog/layout.html create mode 100644 www/extras/yui-ext/examples/dialog/layout.js create mode 100644 www/extras/yui-ext/examples/dialog/post.css create mode 100644 www/extras/yui-ext/examples/dialog/post.js create mode 100644 www/extras/yui-ext/examples/dialog/post.php create mode 100644 www/extras/yui-ext/examples/examples.css create mode 100644 www/extras/yui-ext/examples/grid/PropsGrid.js create mode 100644 www/extras/yui-ext/examples/grid/array-grid.html create mode 100644 www/extras/yui-ext/examples/grid/array-grid.js create mode 100644 www/extras/yui-ext/examples/grid/custom-grid.html create mode 100644 www/extras/yui-ext/examples/grid/custom-grid.js create mode 100644 www/extras/yui-ext/examples/grid/edit-grid.html create mode 100644 www/extras/yui-ext/examples/grid/edit-grid.js create mode 100644 www/extras/yui-ext/examples/grid/paging-grid.html create mode 100644 www/extras/yui-ext/examples/grid/plants.xml create mode 100644 www/extras/yui-ext/examples/grid/sheldon.xml create mode 100644 www/extras/yui-ext/examples/grid/xml-grid.html create mode 100644 www/extras/yui-ext/examples/grid/xml-grid.js create mode 100644 www/extras/yui-ext/examples/info-bg.gif create mode 100644 www/extras/yui-ext/examples/layout/complex.html create mode 100644 www/extras/yui-ext/examples/layout/feed-proxy.php create mode 100644 www/extras/yui-ext/examples/layout/feed-viewer.css create mode 100644 www/extras/yui-ext/examples/layout/feed-viewer.html create mode 100644 www/extras/yui-ext/examples/layout/feed-viewer.js create mode 100644 www/extras/yui-ext/examples/layout/images/Thumbs.db create mode 100644 www/extras/yui-ext/examples/layout/images/add-feed.gif create mode 100644 www/extras/yui-ext/examples/layout/images/article.gif create mode 100644 www/extras/yui-ext/examples/layout/images/bullet.gif create mode 100644 www/extras/yui-ext/examples/layout/images/cancel.gif create mode 100644 www/extras/yui-ext/examples/layout/images/comment-bg.gif create mode 100644 www/extras/yui-ext/examples/layout/images/feed-item.gif create mode 100644 www/extras/yui-ext/examples/layout/images/grid-hrow.gif create mode 100644 www/extras/yui-ext/examples/layout/images/header-bar.gif create mode 100644 www/extras/yui-ext/examples/layout/images/header.gif create mode 100644 www/extras/yui-ext/examples/layout/images/myfeeds.gif create mode 100644 www/extras/yui-ext/examples/layout/images/new_tab.gif create mode 100644 www/extras/yui-ext/examples/layout/images/new_window.gif create mode 100644 www/extras/yui-ext/examples/layout/images/post-bg.gif create mode 100644 www/extras/yui-ext/examples/layout/images/preview.gif create mode 100644 www/extras/yui-ext/examples/layout/images/rss.gif create mode 100644 www/extras/yui-ext/examples/layout/images/signin.gif create mode 100644 www/extras/yui-ext/examples/layout/images/signout.gif create mode 100644 www/extras/yui-ext/examples/layout/images/suggested.gif create mode 100644 www/extras/yui-ext/examples/layout/images/toolbar.gif create mode 100644 www/extras/yui-ext/examples/layout/nested.html create mode 100644 www/extras/yui-ext/examples/layout/simple.html create mode 100644 www/extras/yui-ext/examples/resizable/basic.html create mode 100644 www/extras/yui-ext/examples/resizable/basic.js create mode 100644 www/extras/yui-ext/examples/resizable/sara.jpg create mode 100644 www/extras/yui-ext/examples/resizable/sara_and_zack.jpg create mode 100644 www/extras/yui-ext/examples/resizable/zack.jpg create mode 100644 www/extras/yui-ext/examples/tabs/ajax1.htm create mode 100644 www/extras/yui-ext/examples/tabs/ajax2.htm create mode 100644 www/extras/yui-ext/examples/tabs/tabs-example.css create mode 100644 www/extras/yui-ext/examples/tabs/tabs-example.js create mode 100644 www/extras/yui-ext/examples/tabs/tabs.html create mode 100644 www/extras/yui-ext/layout-lib.js create mode 100644 www/extras/yui-ext/resizable-lib.js create mode 100644 www/extras/yui-ext/resources/css/README.txt create mode 100644 www/extras/yui-ext/resources/css/basic-dialog.css create mode 100644 www/extras/yui-ext/resources/css/grid.css create mode 100644 www/extras/yui-ext/resources/css/layout.css create mode 100644 www/extras/yui-ext/resources/css/reset-min.css create mode 100644 www/extras/yui-ext/resources/css/resizable.css create mode 100644 www/extras/yui-ext/resources/css/tabs.css create mode 100644 www/extras/yui-ext/resources/css/toolbar.css create mode 100644 www/extras/yui-ext/resources/css/yui-ext.css create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/btn-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/close.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/close.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/dlg-bg.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/gray/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/hd-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/basic-dialog/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/grid/arrow-left-white.gif create mode 100644 www/extras/yui-ext/resources/images/grid/arrow-right-white.gif create mode 100644 www/extras/yui-ext/resources/images/grid/done.gif create mode 100644 www/extras/yui-ext/resources/images/grid/drop-no.gif create mode 100644 www/extras/yui-ext/resources/images/grid/drop-yes.gif create mode 100644 www/extras/yui-ext/resources/images/grid/footer-bg.gif create mode 100644 www/extras/yui-ext/resources/images/grid/grid-blue-hd.gif create mode 100644 www/extras/yui-ext/resources/images/grid/grid-blue-split.gif create mode 100644 www/extras/yui-ext/resources/images/grid/grid-loading.gif create mode 100644 www/extras/yui-ext/resources/images/grid/grid-split.gif create mode 100644 www/extras/yui-ext/resources/images/grid/grid-vista-hd.gif create mode 100644 www/extras/yui-ext/resources/images/grid/invalid_line.gif create mode 100644 www/extras/yui-ext/resources/images/grid/loading.gif create mode 100644 www/extras/yui-ext/resources/images/grid/mso-hd.gif create mode 100644 www/extras/yui-ext/resources/images/grid/nowait.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-first-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-first.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-last-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-last.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-next-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-next.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-prev-disabled.gif create mode 100644 www/extras/yui-ext/resources/images/grid/page-prev.gif create mode 100644 www/extras/yui-ext/resources/images/grid/pick-button.gif create mode 100644 www/extras/yui-ext/resources/images/grid/refresh.gif create mode 100644 www/extras/yui-ext/resources/images/grid/sort_asc.gif create mode 100644 www/extras/yui-ext/resources/images/grid/sort_desc.gif create mode 100644 www/extras/yui-ext/resources/images/grid/wait.gif create mode 100644 www/extras/yui-ext/resources/images/layout/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/layout/expand.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/collapse.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/expand.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/gradient-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/screenshot.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/layout/gray/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/layout/ns-collapse.gif create mode 100644 www/extras/yui-ext/resources/images/layout/ns-expand.gif create mode 100644 www/extras/yui-ext/resources/images/layout/panel-close.gif create mode 100644 www/extras/yui-ext/resources/images/layout/panel-title-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/panel-title-light-bg.gif create mode 100644 www/extras/yui-ext/resources/images/layout/tab-close-on.gif create mode 100644 www/extras/yui-ext/resources/images/layout/tab-close.gif create mode 100644 www/extras/yui-ext/resources/images/s.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/e-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/e-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/gray/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/ne-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/ne-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/nw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/nw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/s-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/s-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/se-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/se-handle.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/square.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/sw-handle-dark.gif create mode 100644 www/extras/yui-ext/resources/images/sizer/sw-handle.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/gray/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/gray/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/gray/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/gray/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/gray/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/tab-btm-inactive-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/tab-btm-inactive-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/tab-btm-left-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/tab-btm-right-bg.gif create mode 100644 www/extras/yui-ext/resources/images/tabs/tab-sprite.gif create mode 100644 www/extras/yui-ext/resources/images/toolbar/btn-over-bg.gif create mode 100644 www/extras/yui-ext/resources/images/toolbar/gray-bg.gif create mode 100644 www/extras/yui-ext/source/Bench.js create mode 100644 www/extras/yui-ext/source/CSS.js create mode 100644 www/extras/yui-ext/source/CompositeElement.js create mode 100644 www/extras/yui-ext/source/Date.js create mode 100644 www/extras/yui-ext/source/DomHelper.js create mode 100644 www/extras/yui-ext/source/Element.js create mode 100644 www/extras/yui-ext/source/EventManager.js create mode 100644 www/extras/yui-ext/source/JSON.js create mode 100644 www/extras/yui-ext/source/MixedCollection.js create mode 100644 www/extras/yui-ext/source/State.js create mode 100644 www/extras/yui-ext/source/UpdateManager.js create mode 100644 www/extras/yui-ext/source/anim/Actor.js create mode 100644 www/extras/yui-ext/source/anim/Animator.js create mode 100644 www/extras/yui-ext/source/data/AbstractDataModel.js create mode 100644 www/extras/yui-ext/source/data/DefaultDataModel.js create mode 100644 www/extras/yui-ext/source/data/JSONDataModel.js create mode 100644 www/extras/yui-ext/source/data/LoadableDataModel.js create mode 100644 www/extras/yui-ext/source/data/XMLDataModel.js create mode 100644 www/extras/yui-ext/source/grid/AbstractColumnModel.js create mode 100644 www/extras/yui-ext/source/grid/DefaultColumnModel.js create mode 100644 www/extras/yui-ext/source/grid/EditorGrid.js create mode 100644 www/extras/yui-ext/source/grid/EditorSelectionModel.js create mode 100644 www/extras/yui-ext/source/grid/Grid.js create mode 100644 www/extras/yui-ext/source/grid/GridDD.js create mode 100644 www/extras/yui-ext/source/grid/GridView.js create mode 100644 www/extras/yui-ext/source/grid/PagedGridView.js create mode 100644 www/extras/yui-ext/source/grid/SelectionModel.js create mode 100644 www/extras/yui-ext/source/grid/editor/CellEditor.js create mode 100644 www/extras/yui-ext/source/grid/editor/CheckboxEditor.js create mode 100644 www/extras/yui-ext/source/grid/editor/DateEditor.js create mode 100644 www/extras/yui-ext/source/grid/editor/NumberEditor.js create mode 100644 www/extras/yui-ext/source/grid/editor/SelectEditor.js create mode 100644 www/extras/yui-ext/source/grid/editor/TextEditor.js create mode 100644 www/extras/yui-ext/source/layout/BorderLayout.js create mode 100644 www/extras/yui-ext/source/layout/BorderLayoutRegions.js create mode 100644 www/extras/yui-ext/source/layout/ContentPanels.js create mode 100644 www/extras/yui-ext/source/layout/LayoutManager.js create mode 100644 www/extras/yui-ext/source/layout/LayoutRegion.js create mode 100644 www/extras/yui-ext/source/layout/LayoutStateManager.js create mode 100644 www/extras/yui-ext/source/layout/SplitLayoutRegion.js create mode 100644 www/extras/yui-ext/source/widgets/BasicDialog.js create mode 100644 www/extras/yui-ext/source/widgets/DatePicker.js create mode 100644 www/extras/yui-ext/source/widgets/Resizable.js create mode 100644 www/extras/yui-ext/source/widgets/SplitBar.js create mode 100644 www/extras/yui-ext/source/widgets/TabPanel.js create mode 100644 www/extras/yui-ext/source/widgets/TemplateView.js create mode 100644 www/extras/yui-ext/source/widgets/Toolbar.js create mode 100644 www/extras/yui-ext/source/yutil.js create mode 100644 www/extras/yui-ext/splitbar-lib.js create mode 100644 www/extras/yui-ext/state-manager-lib.js create mode 100644 www/extras/yui-ext/tabs-lib.js create mode 100644 www/extras/yui-ext/yui-ext-core-debug.js create mode 100644 www/extras/yui-ext/yui-ext-core.js create mode 100644 www/extras/yui-ext/yui-ext-debug.js create mode 100644 www/extras/yui-ext/yui-ext-nogrid.js create mode 100644 www/extras/yui-ext/yui-ext.js create mode 100644 www/extras/yui/README create mode 100644 www/extras/yui/build/animation/README create mode 100644 www/extras/yui/build/animation/animation-debug.js create mode 100644 www/extras/yui/build/animation/animation-min.js create mode 100644 www/extras/yui/build/animation/animation.js create mode 100644 www/extras/yui/build/autocomplete/README create mode 100644 www/extras/yui/build/autocomplete/autocomplete-debug.js create mode 100644 www/extras/yui/build/autocomplete/autocomplete-min.js create mode 100644 www/extras/yui/build/autocomplete/autocomplete.js create mode 100644 www/extras/yui/build/calendar/README create mode 100644 www/extras/yui/build/calendar/assets/calendar.css create mode 100644 www/extras/yui/build/calendar/assets/callt.gif create mode 100644 www/extras/yui/build/calendar/assets/calrt.gif create mode 100644 www/extras/yui/build/calendar/assets/calx.gif create mode 100644 www/extras/yui/build/calendar/calendar-debug.js create mode 100644 www/extras/yui/build/calendar/calendar-min.js create mode 100644 www/extras/yui/build/calendar/calendar.js create mode 100644 www/extras/yui/build/connection/README create mode 100644 www/extras/yui/build/connection/connection-debug.js create mode 100644 www/extras/yui/build/connection/connection-min.js create mode 100644 www/extras/yui/build/connection/connection.js create mode 100644 www/extras/yui/build/container/README create mode 100644 www/extras/yui/build/container/assets/alrt16_1.gif create mode 100644 www/extras/yui/build/container/assets/blck16_1.gif create mode 100644 www/extras/yui/build/container/assets/close12_1.gif create mode 100644 www/extras/yui/build/container/assets/container.css create mode 100644 www/extras/yui/build/container/assets/hlp16_1.gif create mode 100644 www/extras/yui/build/container/assets/info16_1.gif create mode 100644 www/extras/yui/build/container/assets/tip16_1.gif create mode 100644 www/extras/yui/build/container/assets/warn16_1.gif create mode 100644 www/extras/yui/build/container/container-debug.js create mode 100644 www/extras/yui/build/container/container-min.js create mode 100644 www/extras/yui/build/container/container.js create mode 100644 www/extras/yui/build/container/container_core-debug.js create mode 100644 www/extras/yui/build/container/container_core-min.js create mode 100644 www/extras/yui/build/container/container_core.js create mode 100644 www/extras/yui/build/dom/README create mode 100644 www/extras/yui/build/dom/dom-debug.js create mode 100644 www/extras/yui/build/dom/dom-min.js create mode 100644 www/extras/yui/build/dom/dom.js create mode 100644 www/extras/yui/build/dragdrop/README create mode 100644 www/extras/yui/build/dragdrop/dragdrop-debug.js create mode 100644 www/extras/yui/build/dragdrop/dragdrop-min.js create mode 100644 www/extras/yui/build/dragdrop/dragdrop.js create mode 100644 www/extras/yui/build/event/README create mode 100644 www/extras/yui/build/event/event-debug.js create mode 100644 www/extras/yui/build/event/event-min.js create mode 100644 www/extras/yui/build/event/event.js create mode 100644 www/extras/yui/build/fonts/README create mode 100644 www/extras/yui/build/fonts/fonts-min.css create mode 100644 www/extras/yui/build/fonts/fonts.css create mode 100644 www/extras/yui/build/grids/README create mode 100644 www/extras/yui/build/grids/grids-min.css create mode 100644 www/extras/yui/build/grids/grids.css create mode 100644 www/extras/yui/build/logger/README create mode 100644 www/extras/yui/build/logger/assets/logger.css create mode 100644 www/extras/yui/build/logger/logger-debug.js create mode 100644 www/extras/yui/build/logger/logger-min.js create mode 100644 www/extras/yui/build/logger/logger.js create mode 100644 www/extras/yui/build/menu/README create mode 100644 www/extras/yui/build/menu/assets/menu.css create mode 100644 www/extras/yui/build/menu/assets/menuarodwn8_dim_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuarodwn8_hov_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuarodwn8_nrm_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuarorght8_dim_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuarorght8_hov_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuarorght8_nrm_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuchk8_dim_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuchk8_hov_1.gif create mode 100644 www/extras/yui/build/menu/assets/menuchk8_nrm_1.gif create mode 100644 www/extras/yui/build/menu/menu-debug.js create mode 100644 www/extras/yui/build/menu/menu-min.js create mode 100644 www/extras/yui/build/menu/menu.js create mode 100644 www/extras/yui/build/reset-fonts-grids/README create mode 100644 www/extras/yui/build/reset-fonts-grids/reset-fonts-grids-min.css create mode 100644 www/extras/yui/build/reset-fonts-grids/reset-fonts-grids.css create mode 100644 www/extras/yui/build/reset/README create mode 100644 www/extras/yui/build/reset/reset-min.css create mode 100644 www/extras/yui/build/reset/reset.css create mode 100644 www/extras/yui/build/slider/README create mode 100644 www/extras/yui/build/slider/slider-debug.js create mode 100644 www/extras/yui/build/slider/slider-min.js create mode 100644 www/extras/yui/build/slider/slider.js create mode 100644 www/extras/yui/build/tabview/README create mode 100644 www/extras/yui/build/tabview/assets/border_tabs.css create mode 100644 www/extras/yui/build/tabview/assets/tabs.css create mode 100644 www/extras/yui/build/tabview/tabview-debug.js create mode 100644 www/extras/yui/build/tabview/tabview-min.js create mode 100644 www/extras/yui/build/tabview/tabview.js create mode 100644 www/extras/yui/build/treeview/README create mode 100644 www/extras/yui/build/treeview/assets/lm.gif create mode 100644 www/extras/yui/build/treeview/assets/lmh.gif create mode 100644 www/extras/yui/build/treeview/assets/ln.gif create mode 100644 www/extras/yui/build/treeview/assets/loading.gif create mode 100644 www/extras/yui/build/treeview/assets/lp.gif create mode 100644 www/extras/yui/build/treeview/assets/lph.gif create mode 100644 www/extras/yui/build/treeview/assets/tm.gif create mode 100644 www/extras/yui/build/treeview/assets/tmh.gif create mode 100644 www/extras/yui/build/treeview/assets/tn.gif create mode 100644 www/extras/yui/build/treeview/assets/tp.gif create mode 100644 www/extras/yui/build/treeview/assets/tph.gif create mode 100644 www/extras/yui/build/treeview/assets/tree.css create mode 100644 www/extras/yui/build/treeview/assets/vline.gif create mode 100644 www/extras/yui/build/treeview/treeview-debug.js create mode 100644 www/extras/yui/build/treeview/treeview-min.js create mode 100644 www/extras/yui/build/treeview/treeview.js create mode 100644 www/extras/yui/build/utilities/README create mode 100644 www/extras/yui/build/utilities/utilities.js create mode 100644 www/extras/yui/build/yahoo-dom-event/README create mode 100644 www/extras/yui/build/yahoo-dom-event/yahoo-dom-event.js create mode 100644 www/extras/yui/build/yahoo/README create mode 100644 www/extras/yui/build/yahoo/yahoo-debug.js create mode 100644 www/extras/yui/build/yahoo/yahoo-min.js create mode 100644 www/extras/yui/build/yahoo/yahoo.js create mode 100644 www/extras/yui/docs/Anim.js.html create mode 100644 www/extras/yui/docs/AnimMgr.js.html create mode 100644 www/extras/yui/docs/Attribute.js.html create mode 100644 www/extras/yui/docs/AttributeProvider.js.html create mode 100644 www/extras/yui/docs/AutoComplete.js.html create mode 100644 www/extras/yui/docs/Bezier.js.html create mode 100644 www/extras/yui/docs/Calendar.js.html create mode 100644 www/extras/yui/docs/CalendarGroup.js.html create mode 100644 www/extras/yui/docs/ColorAnim.js.html create mode 100644 www/extras/yui/docs/Config.js.html create mode 100644 www/extras/yui/docs/ContainerEffect.js.html create mode 100644 www/extras/yui/docs/CustomEvent.js.html create mode 100644 www/extras/yui/docs/DD.js.html create mode 100644 www/extras/yui/docs/DDProxy.js.html create mode 100644 www/extras/yui/docs/DDTarget.js.html create mode 100644 www/extras/yui/docs/DataSource.js.html create mode 100644 www/extras/yui/docs/DateMath.js.html create mode 100644 www/extras/yui/docs/Dialog.js.html create mode 100644 www/extras/yui/docs/Dom.js.html create mode 100644 www/extras/yui/docs/DragDrop.js.html create mode 100644 www/extras/yui/docs/DragDropMgr.js.html create mode 100644 www/extras/yui/docs/Easing.js.html create mode 100644 www/extras/yui/docs/Element.js.html create mode 100644 www/extras/yui/docs/Event.js.html create mode 100644 www/extras/yui/docs/EventProvider.js.html create mode 100644 www/extras/yui/docs/HTMLNode.js.html create mode 100644 www/extras/yui/docs/KeyListener.js.html create mode 100644 www/extras/yui/docs/Lang.js.html create mode 100644 www/extras/yui/docs/LogMsg.js.html create mode 100644 www/extras/yui/docs/LogReader.js.html create mode 100644 www/extras/yui/docs/LogWriter.js.html create mode 100644 www/extras/yui/docs/Logger.js.html create mode 100644 www/extras/yui/docs/MenuNode.js.html create mode 100644 www/extras/yui/docs/Module.js.html create mode 100644 www/extras/yui/docs/Motion.js.html create mode 100644 www/extras/yui/docs/Node.js.html create mode 100644 www/extras/yui/docs/Overlay.js.html create mode 100644 www/extras/yui/docs/OverlayManager.js.html create mode 100644 www/extras/yui/docs/Panel.js.html create mode 100644 www/extras/yui/docs/Region.js.html create mode 100644 www/extras/yui/docs/RootNode.js.html create mode 100644 www/extras/yui/docs/Scroll.js.html create mode 100644 www/extras/yui/docs/SimpleDialog.js.html create mode 100644 www/extras/yui/docs/Slider.js.html create mode 100644 www/extras/yui/docs/SliderThumb.js.html create mode 100644 www/extras/yui/docs/TVAnim.js.html create mode 100644 www/extras/yui/docs/TVFadeIn.js.html create mode 100644 www/extras/yui/docs/TVFadeOut.js.html create mode 100644 www/extras/yui/docs/Tab.js.html create mode 100644 www/extras/yui/docs/TabView.js.html create mode 100644 www/extras/yui/docs/TextNode.js.html create mode 100644 www/extras/yui/docs/Tooltip.js.html create mode 100644 www/extras/yui/docs/TreeView.js.html create mode 100644 www/extras/yui/docs/YAHOO.html create mode 100644 www/extras/yui/docs/YAHOO.js.html create mode 100644 www/extras/yui/docs/YAHOO.util.Anim.html create mode 100644 www/extras/yui/docs/YAHOO.util.AnimMgr.html create mode 100644 www/extras/yui/docs/YAHOO.util.Attribute.html create mode 100644 www/extras/yui/docs/YAHOO.util.AttributeProvider.html create mode 100644 www/extras/yui/docs/YAHOO.util.Bezier.html create mode 100644 www/extras/yui/docs/YAHOO.util.ColorAnim.html create mode 100644 www/extras/yui/docs/YAHOO.util.Config.html create mode 100644 www/extras/yui/docs/YAHOO.util.Connect.html create mode 100644 www/extras/yui/docs/YAHOO.util.CustomEvent.html create mode 100644 www/extras/yui/docs/YAHOO.util.DD.html create mode 100644 www/extras/yui/docs/YAHOO.util.DDProxy.html create mode 100644 www/extras/yui/docs/YAHOO.util.DDTarget.html create mode 100644 www/extras/yui/docs/YAHOO.util.Dom.html create mode 100644 www/extras/yui/docs/YAHOO.util.DragDrop.html create mode 100644 www/extras/yui/docs/YAHOO.util.DragDropMgr.ElementWrapper.html create mode 100644 www/extras/yui/docs/YAHOO.util.DragDropMgr.html create mode 100644 www/extras/yui/docs/YAHOO.util.Easing.html create mode 100644 www/extras/yui/docs/YAHOO.util.Element.html create mode 100644 www/extras/yui/docs/YAHOO.util.Event.html create mode 100644 www/extras/yui/docs/YAHOO.util.EventProvider.html create mode 100644 www/extras/yui/docs/YAHOO.util.KeyListener.html create mode 100644 www/extras/yui/docs/YAHOO.util.Motion.html create mode 100644 www/extras/yui/docs/YAHOO.util.Point.html create mode 100644 www/extras/yui/docs/YAHOO.util.Region.html create mode 100644 www/extras/yui/docs/YAHOO.util.Scroll.html create mode 100644 www/extras/yui/docs/YAHOO.util.Subscriber.html create mode 100644 www/extras/yui/docs/YAHOO.widget.AutoComplete.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Calendar.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Calendar2up.html create mode 100644 www/extras/yui/docs/YAHOO.widget.CalendarGroup.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Calendar_Core.html create mode 100644 www/extras/yui/docs/YAHOO.widget.ContainerEffect.html create mode 100644 www/extras/yui/docs/YAHOO.widget.ContextMenu.html create mode 100644 www/extras/yui/docs/YAHOO.widget.ContextMenuItem.html create mode 100644 www/extras/yui/docs/YAHOO.widget.DS_JSArray.html create mode 100644 www/extras/yui/docs/YAHOO.widget.DS_JSFunction.html create mode 100644 www/extras/yui/docs/YAHOO.widget.DS_XHR.html create mode 100644 www/extras/yui/docs/YAHOO.widget.DataSource.html create mode 100644 www/extras/yui/docs/YAHOO.widget.DateMath.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Dialog.html create mode 100644 www/extras/yui/docs/YAHOO.widget.HTMLNode.html create mode 100644 www/extras/yui/docs/YAHOO.widget.LogMsg.html create mode 100644 www/extras/yui/docs/YAHOO.widget.LogReader.html create mode 100644 www/extras/yui/docs/YAHOO.widget.LogWriter.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Logger.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Menu.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuBarItem.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuItem.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuManager.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuModule.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuModuleItem.html create mode 100644 www/extras/yui/docs/YAHOO.widget.MenuNode.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Menubar.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Module.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Node.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Overlay.html create mode 100644 www/extras/yui/docs/YAHOO.widget.OverlayManager.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Panel.html create mode 100644 www/extras/yui/docs/YAHOO.widget.RootNode.html create mode 100644 www/extras/yui/docs/YAHOO.widget.SimpleDialog.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Slider.html create mode 100644 www/extras/yui/docs/YAHOO.widget.SliderThumb.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TVAnim.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TVFadeIn.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TVFadeOut.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Tab.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TabView.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TextNode.html create mode 100644 www/extras/yui/docs/YAHOO.widget.Tooltip.html create mode 100644 www/extras/yui/docs/YAHOO.widget.TreeView.html create mode 100644 www/extras/yui/docs/assets/api-js create mode 100644 www/extras/yui/docs/assets/api.css create mode 100644 www/extras/yui/docs/assets/cheatsheets.zip create mode 100644 www/extras/yui/docs/assets/dpSyntaxHighlighter.css create mode 100644 www/extras/yui/docs/assets/dpSyntaxHighlighter.js create mode 100644 www/extras/yui/docs/assets/examples.css create mode 100644 www/extras/yui/docs/assets/logo.gif create mode 100644 www/extras/yui/docs/assets/reset-fonts-grids-min.css create mode 100644 www/extras/yui/docs/connection.js.html create mode 100644 www/extras/yui/docs/contextmenu.js.html create mode 100644 www/extras/yui/docs/contextmenuitem.js.html create mode 100644 www/extras/yui/docs/index.html create mode 100644 www/extras/yui/docs/index.json create mode 100644 www/extras/yui/docs/menu.js.html create mode 100644 www/extras/yui/docs/menubar.js.html create mode 100644 www/extras/yui/docs/menubaritem.js.html create mode 100644 www/extras/yui/docs/menuitem.js.html create mode 100644 www/extras/yui/docs/menumanager.js.html create mode 100644 www/extras/yui/docs/menumodule.js.html create mode 100644 www/extras/yui/docs/menumoduleitem.js.html create mode 100644 www/extras/yui/docs/module_animation.html create mode 100644 www/extras/yui/docs/module_autocomplete.html create mode 100644 www/extras/yui/docs/module_calendar.html create mode 100644 www/extras/yui/docs/module_connection.html create mode 100644 www/extras/yui/docs/module_container.html create mode 100644 www/extras/yui/docs/module_dom.html create mode 100644 www/extras/yui/docs/module_dragdrop.html create mode 100644 www/extras/yui/docs/module_event.html create mode 100644 www/extras/yui/docs/module_logger.html create mode 100644 www/extras/yui/docs/module_menu.html create mode 100644 www/extras/yui/docs/module_slider.html create mode 100644 www/extras/yui/docs/module_tabview.html create mode 100644 www/extras/yui/docs/module_treeview.html create mode 100644 www/extras/yui/docs/module_yahoo.html create mode 100644 www/extras/yui/docs/raw.json create mode 100644 www/extras/yui/examples/animation/anim_basic.html create mode 100644 www/extras/yui/examples/animation/anim_from.html create mode 100644 www/extras/yui/examples/animation/anim_size.html create mode 100644 www/extras/yui/examples/animation/anim_size_plus.html create mode 100644 www/extras/yui/examples/animation/anim_size_plus_alt.html create mode 100644 www/extras/yui/examples/animation/anim_units.html create mode 100644 www/extras/yui/examples/animation/colors.html create mode 100644 www/extras/yui/examples/animation/css/demo.css create mode 100644 www/extras/yui/examples/animation/easing.html create mode 100644 www/extras/yui/examples/animation/fade.html create mode 100644 www/extras/yui/examples/animation/img/logo.gif create mode 100644 www/extras/yui/examples/animation/index.html create mode 100644 www/extras/yui/examples/animation/motion_basic.html create mode 100644 www/extras/yui/examples/animation/motion_by.html create mode 100644 www/extras/yui/examples/animation/motion_control.html create mode 100644 www/extras/yui/examples/animation/motion_controls.html create mode 100644 www/extras/yui/examples/animation/motion_plus.html create mode 100644 www/extras/yui/examples/animation/scroll_by.html create mode 100644 www/extras/yui/examples/animation/scroll_horiz.html create mode 100644 www/extras/yui/examples/animation/scroll_vert.html create mode 100644 www/extras/yui/examples/autocomplete/css/examples.css create mode 100644 www/extras/yui/examples/autocomplete/customize.html create mode 100644 www/extras/yui/examples/autocomplete/flickr_xml.html create mode 100644 www/extras/yui/examples/autocomplete/img/logo.gif create mode 100644 www/extras/yui/examples/autocomplete/index.html create mode 100644 www/extras/yui/examples/autocomplete/js/json.js create mode 100644 www/extras/yui/examples/autocomplete/js/states_jsfunction.js create mode 100644 www/extras/yui/examples/autocomplete/php/flickr_proxy.php create mode 100644 www/extras/yui/examples/autocomplete/php/ysearch_flat.php create mode 100644 www/extras/yui/examples/autocomplete/php/ysearch_proxy.php create mode 100644 www/extras/yui/examples/autocomplete/states_jsarray.html create mode 100644 www/extras/yui/examples/autocomplete/states_jsfunction.html create mode 100644 www/extras/yui/examples/autocomplete/ysearch_flat.html create mode 100644 www/extras/yui/examples/autocomplete/ysearch_json.html create mode 100644 www/extras/yui/examples/autocomplete/ysearch_xml.html create mode 100644 www/extras/yui/examples/calendar/assets/style.css create mode 100644 www/extras/yui/examples/calendar/assets/yui.gif create mode 100644 www/extras/yui/examples/calendar/dual/1.html create mode 100644 www/extras/yui/examples/calendar/dual/2.html create mode 100644 www/extras/yui/examples/calendar/dual/solution.html create mode 100644 www/extras/yui/examples/calendar/events/1.html create mode 100644 www/extras/yui/examples/calendar/events/2.html create mode 100644 www/extras/yui/examples/calendar/events/solution.html create mode 100644 www/extras/yui/examples/calendar/formsel/1.html create mode 100644 www/extras/yui/examples/calendar/formsel/2.html create mode 100644 www/extras/yui/examples/calendar/formsel/solution.html create mode 100644 www/extras/yui/examples/calendar/formtxt/1.html create mode 100644 www/extras/yui/examples/calendar/formtxt/2.html create mode 100644 www/extras/yui/examples/calendar/formtxt/solution.html create mode 100644 www/extras/yui/examples/calendar/germany/1.html create mode 100644 www/extras/yui/examples/calendar/germany/2.html create mode 100644 www/extras/yui/examples/calendar/germany/solution.html create mode 100644 www/extras/yui/examples/calendar/index.html create mode 100644 www/extras/yui/examples/calendar/japan/1.html create mode 100644 www/extras/yui/examples/calendar/japan/2.html create mode 100644 www/extras/yui/examples/calendar/japan/solution.html create mode 100644 www/extras/yui/examples/calendar/minmax/1.html create mode 100644 www/extras/yui/examples/calendar/minmax/2.html create mode 100644 www/extras/yui/examples/calendar/minmax/solution.html create mode 100644 www/extras/yui/examples/calendar/multi/1.html create mode 100644 www/extras/yui/examples/calendar/multi/2.html create mode 100644 www/extras/yui/examples/calendar/multi/solution.html create mode 100644 www/extras/yui/examples/calendar/popup/1.html create mode 100644 www/extras/yui/examples/calendar/popup/2.html create mode 100644 www/extras/yui/examples/calendar/popup/solution.html create mode 100644 www/extras/yui/examples/calendar/quickstart/1.html create mode 100644 www/extras/yui/examples/calendar/quickstart/2.html create mode 100644 www/extras/yui/examples/calendar/quickstart/solution.html create mode 100644 www/extras/yui/examples/calendar/render/1.html create mode 100644 www/extras/yui/examples/calendar/render/2.html create mode 100644 www/extras/yui/examples/calendar/render/solution.html create mode 100644 www/extras/yui/examples/connection/abort.html create mode 100644 www/extras/yui/examples/connection/get.html create mode 100644 www/extras/yui/examples/connection/index.html create mode 100644 www/extras/yui/examples/connection/php/get.php create mode 100644 www/extras/yui/examples/connection/php/post.php create mode 100644 www/extras/yui/examples/connection/php/sync.php create mode 100644 www/extras/yui/examples/connection/php/weather.php create mode 100644 www/extras/yui/examples/connection/post.html create mode 100644 www/extras/yui/examples/connection/weather.html create mode 100644 www/extras/yui/examples/container/assets/get.php create mode 100644 www/extras/yui/examples/container/assets/img/aqua-bg.gif create mode 100644 www/extras/yui/examples/container/assets/img/aqua-hd-bg.gif create mode 100644 www/extras/yui/examples/container/assets/img/aqua-hd-close-over.gif create mode 100644 www/extras/yui/examples/container/assets/img/aqua-hd-close.gif create mode 100644 www/extras/yui/examples/container/assets/img/aqua-hd-lt.gif create mode 100644 www/extras/yui/examples/container/assets/img/aqua-hd-rt.gif create mode 100644 www/extras/yui/examples/container/assets/img/bg.png create mode 100644 www/extras/yui/examples/container/assets/img/ctx.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-bl.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-border-rt.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-br.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-brdr-lt.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-brdr-rt.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-close.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-ft.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-hd.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-tl.gif create mode 100644 www/extras/yui/examples/container/assets/img/xp-tr.gif create mode 100644 www/extras/yui/examples/container/assets/img/ybox-back.gif create mode 100644 www/extras/yui/examples/container/assets/img/ybox-close.gif create mode 100644 www/extras/yui/examples/container/assets/img/ybox-next.gif create mode 100644 www/extras/yui/examples/container/assets/post.php create mode 100644 www/extras/yui/examples/container/assets/somedata.php create mode 100644 www/extras/yui/examples/container/assets/style.css create mode 100644 www/extras/yui/examples/container/assets/yui.gif create mode 100644 www/extras/yui/examples/container/dialog/1.html create mode 100644 www/extras/yui/examples/container/dialog/2.html create mode 100644 www/extras/yui/examples/container/dialog/solution.html create mode 100644 www/extras/yui/examples/container/effect/1.html create mode 100644 www/extras/yui/examples/container/effect/2.html create mode 100644 www/extras/yui/examples/container/effect/solution.html create mode 100644 www/extras/yui/examples/container/index.html create mode 100644 www/extras/yui/examples/container/keylistener/1.html create mode 100644 www/extras/yui/examples/container/keylistener/2.html create mode 100644 www/extras/yui/examples/container/keylistener/solution.html create mode 100644 www/extras/yui/examples/container/module/1.html create mode 100644 www/extras/yui/examples/container/module/2.html create mode 100644 www/extras/yui/examples/container/module/solution.html create mode 100644 www/extras/yui/examples/container/overlay/1.html create mode 100644 www/extras/yui/examples/container/overlay/2.html create mode 100644 www/extras/yui/examples/container/overlay/solution.html create mode 100644 www/extras/yui/examples/container/overlaymanager/1.html create mode 100644 www/extras/yui/examples/container/overlaymanager/2.html create mode 100644 www/extras/yui/examples/container/overlaymanager/solution.html create mode 100644 www/extras/yui/examples/container/panel/1.html create mode 100644 www/extras/yui/examples/container/panel/2.html create mode 100644 www/extras/yui/examples/container/panel/solution.html create mode 100644 www/extras/yui/examples/container/panelphotobox/1.html create mode 100644 www/extras/yui/examples/container/panelphotobox/2.html create mode 100644 www/extras/yui/examples/container/panelphotobox/solution.html create mode 100644 www/extras/yui/examples/container/panelresize/1.html create mode 100644 www/extras/yui/examples/container/panelresize/2.html create mode 100644 www/extras/yui/examples/container/panelresize/solution.html create mode 100644 www/extras/yui/examples/container/panelskin/1.html create mode 100644 www/extras/yui/examples/container/panelskin/2.html create mode 100644 www/extras/yui/examples/container/panelskin/solution.html create mode 100644 www/extras/yui/examples/container/panelwait/1.html create mode 100644 www/extras/yui/examples/container/panelwait/2.html create mode 100644 www/extras/yui/examples/container/panelwait/solution.html create mode 100644 www/extras/yui/examples/container/simpledialog/1.html create mode 100644 www/extras/yui/examples/container/simpledialog/2.html create mode 100644 www/extras/yui/examples/container/simpledialog/solution.html create mode 100644 www/extras/yui/examples/container/tooltip/1.html create mode 100644 www/extras/yui/examples/container/tooltip/2.html create mode 100644 www/extras/yui/examples/container/tooltip/solution.html create mode 100644 www/extras/yui/examples/container/tooltipmulti/1.html create mode 100644 www/extras/yui/examples/container/tooltipmulti/2.html create mode 100644 www/extras/yui/examples/container/tooltipmulti/solution.html create mode 100644 www/extras/yui/examples/dom/addclass.html create mode 100644 www/extras/yui/examples/dom/css/dom.css create mode 100644 www/extras/yui/examples/dom/getelementsbyclassname.html create mode 100644 www/extras/yui/examples/dom/getstyle.html create mode 100644 www/extras/yui/examples/dom/getxy.html create mode 100644 www/extras/yui/examples/dom/hasclass.html create mode 100644 www/extras/yui/examples/dom/img/logo.gif create mode 100644 www/extras/yui/examples/dom/index.html create mode 100644 www/extras/yui/examples/dom/removeclass.html create mode 100644 www/extras/yui/examples/dom/setstyle.html create mode 100644 www/extras/yui/examples/dom/setxy.html create mode 100644 www/extras/yui/examples/dragdrop/circle.html create mode 100644 www/extras/yui/examples/dragdrop/css/ie.css create mode 100644 www/extras/yui/examples/dragdrop/css/screen.css create mode 100644 www/extras/yui/examples/dragdrop/drag.html create mode 100644 www/extras/yui/examples/dragdrop/grid.html create mode 100644 www/extras/yui/examples/dragdrop/img/GREYBG.PNG create mode 100644 www/extras/yui/examples/dragdrop/img/HEADER.GIF create mode 100644 www/extras/yui/examples/dragdrop/img/bullet.gif create mode 100644 www/extras/yui/examples/dragdrop/img/channel.png create mode 100644 www/extras/yui/examples/dragdrop/img/circle.gif create mode 100644 www/extras/yui/examples/dragdrop/img/grid.png create mode 100644 www/extras/yui/examples/dragdrop/img/hline.png create mode 100644 www/extras/yui/examples/dragdrop/img/horizBg.png create mode 100644 www/extras/yui/examples/dragdrop/img/horizSlider.png create mode 100644 www/extras/yui/examples/dragdrop/img/horizSlider_on.png create mode 100644 www/extras/yui/examples/dragdrop/img/hue.png create mode 100644 www/extras/yui/examples/dragdrop/img/logo.gif create mode 100644 www/extras/yui/examples/dragdrop/img/lthumb.png create mode 100644 www/extras/yui/examples/dragdrop/img/navHover2.png create mode 100644 www/extras/yui/examples/dragdrop/img/pickerbg.png create mode 100644 www/extras/yui/examples/dragdrop/img/qbottom.png create mode 100644 www/extras/yui/examples/dragdrop/img/qmiddle.png create mode 100644 www/extras/yui/examples/dragdrop/img/qtop.png create mode 100644 www/extras/yui/examples/dragdrop/img/select.gif create mode 100644 www/extras/yui/examples/dragdrop/img/select.png create mode 100644 www/extras/yui/examples/dragdrop/img/sortList.png create mode 100644 www/extras/yui/examples/dragdrop/img/sq1.png create mode 100644 www/extras/yui/examples/dragdrop/img/sq2.png create mode 100644 www/extras/yui/examples/dragdrop/img/sq3.png create mode 100644 www/extras/yui/examples/dragdrop/img/vertBg.png create mode 100644 www/extras/yui/examples/dragdrop/img/vertSlider.png create mode 100644 www/extras/yui/examples/dragdrop/img/vertSlider_on.png create mode 100644 www/extras/yui/examples/dragdrop/img/vline.png create mode 100644 www/extras/yui/examples/dragdrop/index.html create mode 100644 www/extras/yui/examples/dragdrop/interface.html create mode 100644 www/extras/yui/examples/dragdrop/js/DDList.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDMy.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDMy2.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDOnTop.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDPlayer.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDResize.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDResize2.js create mode 100644 www/extras/yui/examples/dragdrop/js/DDSwap.js create mode 100644 www/extras/yui/examples/dragdrop/js/color.js create mode 100644 www/extras/yui/examples/dragdrop/js/key.js create mode 100644 www/extras/yui/examples/dragdrop/js/log.js create mode 100644 www/extras/yui/examples/dragdrop/list.html create mode 100644 www/extras/yui/examples/dragdrop/multihandle.html create mode 100644 www/extras/yui/examples/dragdrop/ontop.html create mode 100644 www/extras/yui/examples/dragdrop/proxy.html create mode 100644 www/extras/yui/examples/dragdrop/resize.html create mode 100644 www/extras/yui/examples/dragdrop/slider.html create mode 100644 www/extras/yui/examples/dragdrop/targetable.html create mode 100644 www/extras/yui/examples/event/assets/code.css create mode 100644 www/extras/yui/examples/event/assets/dpSyntaxHighlighter.js create mode 100644 www/extras/yui/examples/event/assets/eventdelegation.gif create mode 100644 www/extras/yui/examples/event/assets/logo.gif create mode 100644 www/extras/yui/examples/event/assets/screen.css create mode 100644 www/extras/yui/examples/event/custom-event.html create mode 100644 www/extras/yui/examples/event/event-delegation.html create mode 100644 www/extras/yui/examples/event/index.html create mode 100644 www/extras/yui/examples/event/simple.html create mode 100644 www/extras/yui/examples/fonts/example_default.html create mode 100644 www/extras/yui/examples/fonts/example_fontfamily.html create mode 100644 www/extras/yui/examples/fonts/example_fontsize.html create mode 100644 www/extras/yui/examples/fonts/index.html create mode 100644 www/extras/yui/examples/grids/example_doc-custom.html create mode 100644 www/extras/yui/examples/grids/example_doc.html create mode 100644 www/extras/yui/examples/grids/example_doc2.html create mode 100644 www/extras/yui/examples/grids/example_doc3.html create mode 100644 www/extras/yui/examples/grids/example_g.html create mode 100644 www/extras/yui/examples/grids/example_g2.html create mode 100644 www/extras/yui/examples/grids/example_gb.html create mode 100644 www/extras/yui/examples/grids/example_gc.html create mode 100644 www/extras/yui/examples/grids/example_gd.html create mode 100644 www/extras/yui/examples/grids/example_ge.html create mode 100644 www/extras/yui/examples/grids/example_gf.html create mode 100644 www/extras/yui/examples/grids/example_t1.html create mode 100644 www/extras/yui/examples/grids/example_t2.html create mode 100644 www/extras/yui/examples/grids/example_t3.html create mode 100644 www/extras/yui/examples/grids/example_t4.html create mode 100644 www/extras/yui/examples/grids/example_t5.html create mode 100644 www/extras/yui/examples/grids/example_t6.html create mode 100644 www/extras/yui/examples/grids/example_t7.html create mode 100644 www/extras/yui/examples/grids/index.html create mode 100644 www/extras/yui/examples/logger/autocomplete.html create mode 100644 www/extras/yui/examples/logger/css/examples.css create mode 100644 www/extras/yui/examples/logger/img/logo.gif create mode 100644 www/extras/yui/examples/logger/index.html create mode 100644 www/extras/yui/examples/logger/js/animation-debug.js create mode 100644 www/extras/yui/examples/logger/js/autocomplete-debug.js create mode 100644 www/extras/yui/examples/logger/js/event-debug.js create mode 100644 www/extras/yui/examples/logger/readlogs.html create mode 100644 www/extras/yui/examples/logger/readlogscustom.html create mode 100644 www/extras/yui/examples/logger/writelogs.html create mode 100644 www/extras/yui/examples/menu/applicationmenubar.html create mode 100644 www/extras/yui/examples/menu/contextmenu.html create mode 100644 www/extras/yui/examples/menu/example01.html create mode 100644 www/extras/yui/examples/menu/example02.html create mode 100644 www/extras/yui/examples/menu/example03.html create mode 100644 www/extras/yui/examples/menu/example04.html create mode 100644 www/extras/yui/examples/menu/example05.html create mode 100644 www/extras/yui/examples/menu/example06.html create mode 100644 www/extras/yui/examples/menu/example07.html create mode 100644 www/extras/yui/examples/menu/example08.html create mode 100644 www/extras/yui/examples/menu/example09.html create mode 100644 www/extras/yui/examples/menu/example10.html create mode 100644 www/extras/yui/examples/menu/example11.html create mode 100644 www/extras/yui/examples/menu/example12.html create mode 100644 www/extras/yui/examples/menu/example13.html create mode 100644 www/extras/yui/examples/menu/img/dolly.jpg create mode 100644 www/extras/yui/examples/menu/img/grass.png create mode 100644 www/extras/yui/examples/menu/index.html create mode 100644 www/extras/yui/examples/menu/leftnavfromjs.html create mode 100644 www/extras/yui/examples/menu/leftnavfromjswithanim.html create mode 100644 www/extras/yui/examples/menu/leftnavfrommarkup.html create mode 100644 www/extras/yui/examples/menu/leftnavfrommarkupwithanim.html create mode 100644 www/extras/yui/examples/menu/programsmenu.html create mode 100644 www/extras/yui/examples/menu/topnavfromjs.html create mode 100644 www/extras/yui/examples/menu/topnavfromjswithanim.html create mode 100644 www/extras/yui/examples/menu/topnavfrommarkup.html create mode 100644 www/extras/yui/examples/menu/topnavfrommarkupwithanim.html create mode 100644 www/extras/yui/examples/reset/example_default.html create mode 100644 www/extras/yui/examples/reset/index.html create mode 100644 www/extras/yui/examples/slider/basic.html create mode 100644 www/extras/yui/examples/slider/css/screen.css create mode 100644 www/extras/yui/examples/slider/img/bullet.gif create mode 100644 www/extras/yui/examples/slider/img/greybg.png create mode 100644 www/extras/yui/examples/slider/img/header.gif create mode 100644 www/extras/yui/examples/slider/img/hline.png create mode 100644 www/extras/yui/examples/slider/img/horizBg.png create mode 100644 www/extras/yui/examples/slider/img/horizSlider.png create mode 100644 www/extras/yui/examples/slider/img/horizSlider_on.png create mode 100644 www/extras/yui/examples/slider/img/hue.png create mode 100644 www/extras/yui/examples/slider/img/logo.gif create mode 100644 www/extras/yui/examples/slider/img/lthumb.png create mode 100644 www/extras/yui/examples/slider/img/navHover2.png create mode 100644 www/extras/yui/examples/slider/img/pickerbg.png create mode 100644 www/extras/yui/examples/slider/img/qbottom.png create mode 100644 www/extras/yui/examples/slider/img/qmiddle.png create mode 100644 www/extras/yui/examples/slider/img/qtop.png create mode 100644 www/extras/yui/examples/slider/img/select.gif create mode 100644 www/extras/yui/examples/slider/img/select.png create mode 100644 www/extras/yui/examples/slider/img/vertBg.png create mode 100644 www/extras/yui/examples/slider/img/vertSlider.png create mode 100644 www/extras/yui/examples/slider/img/vertSlider_on.png create mode 100644 www/extras/yui/examples/slider/img/vline.png create mode 100644 www/extras/yui/examples/slider/index.html create mode 100644 www/extras/yui/examples/slider/js/color.js create mode 100644 www/extras/yui/examples/slider/js/key.js create mode 100644 www/extras/yui/examples/slider/js/log.js create mode 100644 www/extras/yui/examples/slider/js/logger.js create mode 100644 www/extras/yui/examples/slider/rgb.html create mode 100644 www/extras/yui/examples/slider/rgb2.html create mode 100644 www/extras/yui/examples/tabview/activation.html create mode 100644 www/extras/yui/examples/tabview/add_events.html create mode 100644 www/extras/yui/examples/tabview/add_tabs.html create mode 100644 www/extras/yui/examples/tabview/basic_from_js.html create mode 100644 www/extras/yui/examples/tabview/basic_from_markup.html create mode 100644 www/extras/yui/examples/tabview/basic_from_partial_markup.html create mode 100644 www/extras/yui/examples/tabview/css/example.css create mode 100644 www/extras/yui/examples/tabview/css/module_tabs.css create mode 100644 www/extras/yui/examples/tabview/css/round_tabs.css create mode 100644 www/extras/yui/examples/tabview/custom_events.html create mode 100644 www/extras/yui/examples/tabview/dynamic_from_js.html create mode 100644 www/extras/yui/examples/tabview/dynamic_from_markup.html create mode 100644 www/extras/yui/examples/tabview/img/loading.gif create mode 100644 www/extras/yui/examples/tabview/img/newcats_bkgd.gif create mode 100644 www/extras/yui/examples/tabview/img/ptr.gif create mode 100644 www/extras/yui/examples/tabview/img/round_4px_trans_gray.gif create mode 100644 www/extras/yui/examples/tabview/img/tab_left.gif create mode 100644 www/extras/yui/examples/tabview/img/tab_right.gif create mode 100644 www/extras/yui/examples/tabview/index.html create mode 100644 www/extras/yui/examples/tabview/loading.html create mode 100644 www/extras/yui/examples/tabview/module_tabs.html create mode 100644 www/extras/yui/examples/tabview/orientation_bottom.html create mode 100644 www/extras/yui/examples/tabview/orientation_left.html create mode 100644 www/extras/yui/examples/tabview/orientation_right.html create mode 100644 www/extras/yui/examples/tabview/php/nonsense.php create mode 100644 www/extras/yui/examples/tabview/remove_events.html create mode 100644 www/extras/yui/examples/tabview/remove_tabs.html create mode 100644 www/extras/yui/examples/tabview/remove_tabs_icon.html create mode 100644 www/extras/yui/examples/tabview/rounded_tabs.html create mode 100644 www/extras/yui/examples/tabview/stop_custom_events.html create mode 100644 www/extras/yui/examples/tabview/transition.html create mode 100644 www/extras/yui/examples/treeview/anim.html create mode 100644 www/extras/yui/examples/treeview/check.html create mode 100644 www/extras/yui/examples/treeview/css/check/tree.css create mode 100644 www/extras/yui/examples/treeview/css/code.css create mode 100644 www/extras/yui/examples/treeview/css/default/tree.css create mode 100644 www/extras/yui/examples/treeview/css/default/tree.css.orig create mode 100644 www/extras/yui/examples/treeview/css/folders/tree.css create mode 100644 www/extras/yui/examples/treeview/css/local/tree.css create mode 100644 www/extras/yui/examples/treeview/css/menu/tree.css create mode 100644 www/extras/yui/examples/treeview/css/multi/tree.css create mode 100644 www/extras/yui/examples/treeview/css/screen.css create mode 100644 www/extras/yui/examples/treeview/default.html create mode 100644 www/extras/yui/examples/treeview/dynamic.html create mode 100644 www/extras/yui/examples/treeview/folders.html create mode 100644 www/extras/yui/examples/treeview/html.html create mode 100644 www/extras/yui/examples/treeview/img/bullet.gif create mode 100644 www/extras/yui/examples/treeview/img/check/check0.gif create mode 100644 www/extras/yui/examples/treeview/img/check/check1.gif create mode 100644 www/extras/yui/examples/treeview/img/check/check2.gif create mode 100644 www/extras/yui/examples/treeview/img/check/lm.gif create mode 100644 www/extras/yui/examples/treeview/img/check/lmh.gif create mode 100644 www/extras/yui/examples/treeview/img/check/ln.gif create mode 100644 www/extras/yui/examples/treeview/img/check/loading.gif create mode 100644 www/extras/yui/examples/treeview/img/check/lp.gif create mode 100644 www/extras/yui/examples/treeview/img/check/lph.gif create mode 100644 www/extras/yui/examples/treeview/img/check/tm.gif create mode 100644 www/extras/yui/examples/treeview/img/check/tmh.gif create mode 100644 www/extras/yui/examples/treeview/img/check/tn.gif create mode 100644 www/extras/yui/examples/treeview/img/check/tp.gif create mode 100644 www/extras/yui/examples/treeview/img/check/tph.gif create mode 100644 www/extras/yui/examples/treeview/img/check/vline.gif create mode 100644 www/extras/yui/examples/treeview/img/default/lm.gif create mode 100644 www/extras/yui/examples/treeview/img/default/lmh.gif create mode 100644 www/extras/yui/examples/treeview/img/default/ln.gif create mode 100644 www/extras/yui/examples/treeview/img/default/loading.gif create mode 100644 www/extras/yui/examples/treeview/img/default/lp.gif create mode 100644 www/extras/yui/examples/treeview/img/default/lph.gif create mode 100644 www/extras/yui/examples/treeview/img/default/tm.gif create mode 100644 www/extras/yui/examples/treeview/img/default/tmh.gif create mode 100644 www/extras/yui/examples/treeview/img/default/tn.gif create mode 100644 www/extras/yui/examples/treeview/img/default/tp.gif create mode 100644 www/extras/yui/examples/treeview/img/default/tph.gif create mode 100644 www/extras/yui/examples/treeview/img/default/vline.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/lm.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/lmh.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/ln.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/loading.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/lp.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/lph.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/tm.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/tmh.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/tn.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/tp.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/tph.gif create mode 100644 www/extras/yui/examples/treeview/img/folders/vline.gif create mode 100644 www/extras/yui/examples/treeview/img/greybg.png create mode 100644 www/extras/yui/examples/treeview/img/header.gif create mode 100644 www/extras/yui/examples/treeview/img/logo.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/collapse.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/collapseh.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/collapseon.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/dash.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/expand.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/expandh.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/expandon.gif create mode 100644 www/extras/yui/examples/treeview/img/menu/loading.gif create mode 100644 www/extras/yui/examples/treeview/img/navHover2.png create mode 100644 www/extras/yui/examples/treeview/img/qbottom.png create mode 100644 www/extras/yui/examples/treeview/img/qmiddle.png create mode 100644 www/extras/yui/examples/treeview/img/qtop.png create mode 100644 www/extras/yui/examples/treeview/index.html create mode 100644 www/extras/yui/examples/treeview/js/CheckOnClickNode.js create mode 100644 www/extras/yui/examples/treeview/js/TaskNode.js create mode 100644 www/extras/yui/examples/treeview/js/dpSyntaxHighlighter.js create mode 100644 www/extras/yui/examples/treeview/js/json.js create mode 100644 www/extras/yui/examples/treeview/js/key.js create mode 100644 www/extras/yui/examples/treeview/js/log.js create mode 100644 www/extras/yui/examples/treeview/menu.html create mode 100644 www/extras/yui/examples/treeview/multi.html diff --git a/www/extras/yui-ext/README.txt b/www/extras/yui-ext/README.txt new file mode 100644 index 000000000..d570d3c60 --- /dev/null +++ b/www/extras/yui-ext/README.txt @@ -0,0 +1,12 @@ +yui-ext.js includes the entire library. + +yui-ext-debug.js is the entire library uncompressed. + +yui-ext-nogrid.js is the entire library except for the grid. + +All other files in this directory depend on yui-ext-core.js. + +editor-grid-lib.js includes everything in basic-grid-lib.js AND editing support. basic-grid-lib.js is NOT required for editor-grid-lib.js. + +If you have the JS Builder, you can create your own output files using yui-ext.jsb. + diff --git a/www/extras/yui-ext/animator-lib.js b/www/extras/yui-ext/animator-lib.js new file mode 100644 index 000000000..6c59d0181 --- /dev/null +++ b/www/extras/yui-ext/animator-lib.js @@ -0,0 +1,45 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.Actor=function(element,animator,selfCapture){this.el=YAHOO.ext.Element.get(element,true);YAHOO.ext.Actor.superclass.constructor.call(this,element,true);this.onCapture=new YAHOO.util.CustomEvent('Actor.onCapture');if(animator){animator.addActor(this);} +this.capturing=selfCapture;this.playlist=selfCapture?new YAHOO.ext.Animator.AnimSequence():null;};YAHOO.extendX(YAHOO.ext.Actor,YAHOO.ext.Element);YAHOO.ext.Actor.prototype.capture=function(action){if(this.playlist!=null){this.playlist.add(action);} +this.onCapture.fireDirect(this,action);return action;};YAHOO.ext.Actor.overrideAnimation=function(method,animParam,onParam){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);if(args[animParam]===true){return this.capture(new YAHOO.ext.Actor.AsyncAction(this,method,args,onParam));}else{return this.capture(new YAHOO.ext.Actor.Action(this,method,args));}};} +YAHOO.ext.Actor.overrideBasic=function(method){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.Action(this,method,args));};} +YAHOO.ext.Actor.prototype.setVisibilityMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode);YAHOO.ext.Actor.prototype.enableDisplayMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode);YAHOO.ext.Actor.prototype.focus=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus);YAHOO.ext.Actor.prototype.addClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass);YAHOO.ext.Actor.prototype.removeClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass);YAHOO.ext.Actor.prototype.replaceClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass);YAHOO.ext.Actor.prototype.setStyle=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle);YAHOO.ext.Actor.prototype.setLeft=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft);YAHOO.ext.Actor.prototype.setTop=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop);YAHOO.ext.Actor.prototype.setAbsolutePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned);YAHOO.ext.Actor.prototype.setRelativePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned);YAHOO.ext.Actor.prototype.clearPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning);YAHOO.ext.Actor.prototype.setPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning);YAHOO.ext.Actor.prototype.clip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip);YAHOO.ext.Actor.prototype.unclip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip);YAHOO.ext.Actor.prototype.clearOpacity=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity);YAHOO.ext.Actor.prototype.update=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update);YAHOO.ext.Actor.prototype.remove=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove);YAHOO.ext.Actor.prototype.fitToParent=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent);YAHOO.ext.Actor.prototype.appendChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild);YAHOO.ext.Actor.prototype.createChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild);YAHOO.ext.Actor.prototype.appendTo=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo);YAHOO.ext.Actor.prototype.insertBefore=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore);YAHOO.ext.Actor.prototype.insertAfter=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter);YAHOO.ext.Actor.prototype.wrap=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap);YAHOO.ext.Actor.prototype.replace=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace);YAHOO.ext.Actor.prototype.insertHtml=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml);YAHOO.ext.Actor.prototype.set=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set);YAHOO.ext.Actor.prototype.load=function(){if(!this.capturing){return YAHOO.ext.Actor.superclass.load.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.load,args,2));};YAHOO.ext.Actor.prototype.animate=function(args,duration,onComplete,easing,animType){if(!this.capturing){return YAHOO.ext.Actor.superclass.animate.apply(this,arguments);} +return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.animate,[args,duration,onComplete,easing,animType],2));};YAHOO.ext.Actor.prototype.setVisible=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible,1,3);YAHOO.ext.Actor.prototype.toggle=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle,0,2);YAHOO.ext.Actor.prototype.setXY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY,1,3);YAHOO.ext.Actor.prototype.setLocation=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation,2,4);YAHOO.ext.Actor.prototype.setWidth=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth,1,3);YAHOO.ext.Actor.prototype.setHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight,1,3);YAHOO.ext.Actor.prototype.setSize=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize,2,4);YAHOO.ext.Actor.prototype.setBounds=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds,4,6);YAHOO.ext.Actor.prototype.setOpacity=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity,1,3);YAHOO.ext.Actor.prototype.moveTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo,2,4);YAHOO.ext.Actor.prototype.move=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move,2,4);YAHOO.ext.Actor.prototype.alignTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo,3,5);YAHOO.ext.Actor.prototype.hide=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide,0,2);YAHOO.ext.Actor.prototype.show=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show,0,2);YAHOO.ext.Actor.prototype.setBox=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox,2,4);YAHOO.ext.Actor.prototype.autoHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight,0,2);YAHOO.ext.Actor.prototype.setX=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX,1,3);YAHOO.ext.Actor.prototype.setY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY,1,3);YAHOO.ext.Actor.prototype.startCapture=function(){this.capturing=true;this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.stopCapture=function(){this.capturing=false;};YAHOO.ext.Actor.prototype.clear=function(){this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.play=function(oncomplete){this.capturing=false;if(this.playlist){this.playlist.play(oncomplete);}};YAHOO.ext.Actor.prototype.addCall=function(fcn,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.Action(scope,fcn,args||[]));}};YAHOO.ext.Actor.prototype.addAsyncCall=function(fcn,callbackIndex,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.AsyncAction(scope,fcn,args||[],callbackIndex));}},YAHOO.ext.Actor.prototype.pause=function(seconds){this.capture(new YAHOO.ext.Actor.PauseAction(seconds));};YAHOO.ext.Actor.prototype.shake=function(){this.move('left',20,true,.05);this.move('right',40,true,.05);this.move('left',40,true,.05);this.move('right',20,true,.05);};YAHOO.ext.Actor.prototype.bounce=function(){this.move('up',20,true,.05);this.move('down',40,true,.05);this.move('up',40,true,.05);this.move('down',20,true,.05);};YAHOO.ext.Actor.prototype.blindShow=function(anchor,newSize,duration,easing){var size=newSize||this.getSize();this.clip();this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +this.unclip();return size;};YAHOO.ext.Actor.prototype.blindHide=function(anchor,duration,easing){var size=this.getSize();this.clip();anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.animate({width:{to:1},points:{by:[this.getWidth(),0]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;case'b':case'bottom':this.animate({height:{to:1},points:{by:[0,this.getHeight()]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;} +return size;};YAHOO.ext.Actor.prototype.slideShow=function(anchor,newSize,duration,easing,clearPositioning){var size=newSize||this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindShow(anchor,newSize,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'r':case'right':this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +if(clearPositioning!==false){this.addCall(child.setPositioning,[pos],child);} +this.unclip();return size;};YAHOO.ext.Actor.prototype.slideHide=function(anchor,duration,easing){var size=this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindHide(anchor,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;} +this.addCall(child.setPositioning,[pos],child);return size;};YAHOO.ext.Actor.prototype.squish=function(duration){var size=this.getSize();this.clip();this.setSize(1,1,true,duration||.5);this.setVisible(false);return size;};YAHOO.ext.Actor.prototype.appear=function(duration){this.setVisible(true,true,duration);};YAHOO.ext.Actor.prototype.fade=function(duration){this.setVisible(false,true,duration);};YAHOO.ext.Actor.prototype.switchOff=function(duration){this.clip();this.setVisible(false,true,.1);this.clearOpacity();this.setVisible(true);this.animate({height:{to:1},points:{by:[0,this.getHeight()/2]}},duration||.5,null,YAHOO.util.Easing.easeOut,YAHOO.util.Motion);this.setVisible(false);};YAHOO.ext.Actor.prototype.highlight=function(color,fromColor,duration,attribute){attribute=attribute||'background-color';var original=this.getStyle(attribute);fromColor=fromColor||((original&&original!=''&&original!='transparent')?original:'#FFFFFF');var cfg={};cfg[attribute]={to:color,from:fromColor};this.setVisible(true);this.animate(cfg,duration||.5,null,YAHOO.util.Easing.bounceOut,YAHOO.util.ColorAnim);this.setStyle(attribute,original);};YAHOO.ext.Actor.prototype.pulsate=function(count,duration){count=count||3;for(var i=0;i0){animFn.defer((duration/2)*1000,this);}else{if(typeof callback=='function'){callback();}}} +animFn.call(this);} +this.addAsyncCall(frameFn,0,null,this);};YAHOO.ext.Actor.Action=function(actor,method,args){this.actor=actor;this.method=method;this.args=args;} +YAHOO.ext.Actor.Action.prototype={play:function(onComplete){this.method.apply(this.actor||window,this.args);onComplete();}};YAHOO.ext.Actor.AsyncAction=function(actor,method,args,onIndex){YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this,actor,method,args);this.onIndex=onIndex;this.originalCallback=this.args[onIndex];} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction,YAHOO.ext.Actor.Action);YAHOO.ext.Actor.AsyncAction.prototype.play=function(onComplete){var callbackArg=this.originalCallback?this.originalCallback.createSequence(onComplete):onComplete;this.args[this.onIndex]=callbackArg;this.method.apply(this.actor,this.args);};YAHOO.ext.Actor.PauseAction=function(seconds){this.seconds=seconds;};YAHOO.ext.Actor.PauseAction.prototype={play:function(onComplete){setTimeout(onComplete,this.seconds*1000);}}; + +YAHOO.ext.Animator=function(){this.actors=[];this.playlist=new YAHOO.ext.Animator.AnimSequence();this.captureDelegate=this.capture.createDelegate(this);this.playDelegate=this.play.createDelegate(this);this.syncing=false;this.stopping=false;this.playing=false;for(var i=0;i=this.sequences.length&&this.onComplete){this.onComplete();}},stop:function(){for(var i=0;i0){this.body.addClass(this.tabPosition=='bottom'?'ytabs-bottom':'ytabs-top');this.tabs=new YAHOO.ext.TabPanel(this.body.dom,this.tabPosition=='bottom');for(var i=0,len=tabEls.length;i
 {0} 
');} +var btn=this.buttonTemplate.append(this.footer.dom,[config],true);var tbl=getEl(btn.dom.firstChild,true);if(this.minButtonWidth){if(tbl.getWidth()vw){x=vw-w;moved=true;} +if(y+h>vh){y=vh-h;moved=true;} +if(x<0){x=0;moved=true;} +if(y<0){y=0;moved=true;} +if(moved){this.xy=[x,y];if(this.isVisible()){this.el.setLocation(x,y);this.adjustAssets();}}}},onDrag:function(){if(!this.proxyDrag){this.xy=this.el.getXY();this.adjustAssets();}},adjustAssets:function(doShow){var x=this.xy[0],y=this.xy[1];var w=this.size.width,h=this.size.height;if(doShow===true){if(this.shadow){this.shadow.show();} +if(this.shim){this.shim.show();}} +if(this.shadow&&this.shadow.isVisible()){this.shadow.setBounds(x+this.shadowOffset,y+this.shadowOffset,w,h);} +if(this.shim&&this.shim.isVisible()){this.shim.setBounds(x,y,w,h);}},adjustViewport:function(w,h){if(!w||!h){w=YAHOO.util.Dom.getViewportWidth();h=YAHOO.util.Dom.getViewportHeight();} +this.viewSize=[w,h];if(this.modal&&this.mask.isVisible()){this.mask.setSize(w,h);this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(),YAHOO.util.Dom.getDocumentHeight());} +if(this.isVisible()){this.constrainXY();}},destroy:function(removeEl){YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport,this);if(this.tabs){this.tabs.destroy(removeEl);} +if(removeEl===true){this.el.update('');this.el.remove();} +YAHOO.ext.DialogManager.unregister(this);},startMove:function(){if(this.proxyDrag){this.proxy.show();} +if(this.constraintoviewport!==false){this.dd.constrainTo(document.body,{right:this.shadowOffset,bottom:this.shadowOffset});}},endMove:function(){if(!this.proxyDrag){YAHOO.util.DD.prototype.endDrag.apply(this.dd,arguments);}else{YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd,arguments);this.proxy.hide();} +this.refreshSize();this.adjustAssets();this.fireEvent('move',this,this.xy[0],this.xy[1])},toFront:function(){YAHOO.ext.DialogManager.bringToFront(this);return this;},toBack:function(){YAHOO.ext.DialogManager.sendToBack(this);return this;},center:function(){this.moveTo(this.el.getCenterXY(true));return this;},moveTo:function(x,y){this.xy=[x,y];if(this.isVisible()){this.el.setXY(this.xy);this.adjustAssets();} +return this;},isVisible:function(){return this.el.isVisible();},hide:function(callback){if(this.fireEvent('beforehide',this)===false) +return;if(this.shadow){this.shadow.hide();} +if(this.animateTarget){var b=getEl(this.animateTarget,true).getBox();this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height);this.el.hide();this.proxy.setBounds(b.x,b.y,b.width,b.height,true,.35,this.hideEl.createDelegate(this,[callback]));}else{this.el.hide();this.hideEl(callback);} +return this;},hideEl:function(callback){this.proxy.hide();if(this.modal){this.mask.hide();YAHOO.util.Dom.removeClass(document.body,'masked');} +this.fireEvent('hide',this);if(typeof callback=='function'){callback();}},hideAction:function(){this.setLeft('-10000px');this.setTop('-10000px');this.setStyle('visibility','hidden');},refreshSize:function(){this.size=this.el.getSize();this.xy=this.el.getXY();YAHOO.ext.state.Manager.set(this.el.id+'-state',this.el.getBox());},setZIndex:function(index){if(this.modal){this.mask.setStyle('z-index',index);} +if(this.shadow){this.shadow.setStyle('z-index',++index);} +if(this.shim){this.shim.setStyle('z-index',++index);} +this.el.setStyle('z-index',++index);if(this.proxy){this.proxy.setStyle('z-index',++index);} +if(this.resizer){this.resizer.proxy.setStyle('z-index',++index);} +this.lastZIndex=index;},getEl:function(){return this.el;}});YAHOO.ext.DialogManager=function(){var list={};var accessList=[];var front=null;var sortDialogs=function(d1,d2){return(!d1._lastAccess||d1._lastAccessthis.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; + +YAHOO.ext.Toolbar=function(container){this.el=getEl(container,true);var div=document.createElement('div');div.className='ytoolbar';var tb=document.createElement('table');tb.border=0;tb.cellPadding=0;tb.cellSpacing=0;div.appendChild(tb);var tbody=document.createElement('tbody');tb.appendChild(tbody);var tr=document.createElement('tr');tbody.appendChild(tr);this.el.dom.appendChild(div);this.tr=tr;};YAHOO.ext.Toolbar.prototype={add:function(){for(var i=0;i=pos&&x=this.grid.dataModel.getRowCount()){return null;} +return[colIndex,rowIndex];} +return null;},_adjustForScroll:function(){this.forceScrollUpdate();if(this.scrollbarMode==YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){var adjustment=0;if(this.wrap.clientWidth&&this.wrap.clientWidth!==0){adjustment=this.wrap.offsetWidth-this.wrap.clientWidth;} +this.hwrap.setWidth(this.wrap.offsetWidth-adjustment);}else{this.hwrap.setWidth(this.wrap.offsetWidth);} +this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(),this.wrap.clientWidth));},focusRow:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;try{row.childNodes.item(0).hideFocus=true;row.childNodes.item(0).focus();}catch(e){} +this.ensureVisible(row);this.wrap.scrollLeft=left;this.handleScroll();this.lastFocusedRow=row;},ensureVisible:function(row,disableDelay){if(!disableDelay){this.ensureVisibleTask.delay(50,this._ensureVisible,this,[row]);}else{this._ensureVisible(row);}},_ensureVisible:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;var rowTop=parseInt(row.offsetTop,10);var rowBottom=rowTop+row.offsetHeight;var clientTop=parseInt(this.wrap.scrollTop,10);var clientBottom=clientTop+this.wrap.clientHeight;if(rowTopclientBottom){this.wrap.scrollTop=rowBottom-this.wrap.clientHeight;} +this.wrap.scrollLeft=left;this.handleScroll();},updateColumns:function(){this.grid.stopEditing();var colModel=this.grid.colModel;var hcols=this.headers;var colCount=colModel.getColumnCount();var pos=0;var totalWidth=colModel.getTotalWidth();for(var i=0;i'+'{1}'+''+''}]});htemplate.compile();for(var i=0;i0){this.removeRows(0,count-1);}},query:function(spec,returnUnmatched){var d=this.data;var r=[];for(var i=0;iv2) +return dsc?-1:+1;return 0;};this.data.sort(fn);if(!suppressEvent){this.fireRowsSorted(columnIndex,direction);}},each:function(fn,scope){var d=this.data;for(var i=0,len=d.length;i0;},getTotalRowCount:function(){return this.totalCount||this.getRowCount();},getPageSize:function(){return this.pageSize;},getTotalPages:function(){if(this.getPageSize()==0||this.getTotalRowCount()==0){return 1;} +return Math.ceil(this.getTotalRowCount()/this.getPageSize());},initPaging:function(url,pageSize,baseParams){this.pageUrl=url;this.pageSize=pageSize;this.remoteSort=true;if(baseParams)this.baseParams=baseParams;},createParams:function(pageNum,sortColumn,sortDir){var params={},map=this.paramMap;for(var key in this.baseParams){if(typeof this.baseParams[key]!='function'){params[key]=this.baseParams[key];}} +params[map['page']]=pageNum;params[map['pageSize']]=this.getPageSize();params[map['sortColumn']]=(typeof sortColumn=='undefined'?'':sortColumn);params[map['sortDir']]=sortDir||'';return params;},loadPage:function(pageNum,callback,keepExisting){var sort=this.getSortState();var params=this.createParams(pageNum,sort.column,sort.direction);this.load(this.pageUrl,params,this.setLoadedPage.createDelegate(this,[pageNum,callback]),keepExisting?(pageNum-1)*this.pageSize:null);},applySort:function(suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this,arguments);}else if(!suppressEvent){var sort=this.getSortState();if(sort.column){this.fireRowsSorted(sort.column,sort.direction,true);}}},resetPaging:function(){this.loadedPage=1;},sort:function(sortInfo,columnIndex,direction,suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this,arguments);}else{this.sortInfo=sortInfo;this.sortColumn=columnIndex;this.sortDir=direction;var params=this.createParams(this.loadedPage,columnIndex,direction);this.load(this.pageUrl,params,this.fireRowsSorted.createDelegate(this,[columnIndex,direction,true]));}},load:function(url,params,callback,insertIndex){this.fireEvent('beforeload',this);if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var cb={success:this.processResponse,failure:this.processException,scope:this,argument:{callback:callback,insertIndex:insertIndex}};var method=params?'POST':'GET';YAHOO.util.Connect.asyncRequest(method,url,cb,params);},processResponse:function(response){var cb=response.argument.callback;var keepExisting=(typeof response.argument.insertIndex=='number');var insertIndex=response.argument.insertIndex;switch(this.dataType){case YAHOO.ext.grid.LoadableDataModel.XML:this.loadData(response.responseXML,cb,keepExisting,insertIndex);break;case YAHOO.ext.grid.LoadableDataModel.JSON:var rtext=response.responseText;try{while(rtext.substring(0,1)==" "){rtext=rtext.substring(1,rtext.length);} +if(rtext.indexOf("{")<0){throw"Invalid JSON response";} +if(rtext.indexOf("{}")===0){this.loadData({},response.argument.callback);return;} +var jsonObjRaw=eval("("+rtext+")");if(!jsonObjRaw){throw"Error evaling JSON response";} +this.loadData(jsonObjRaw,cb,keepExisting,insertIndex);}catch(e){this.fireLoadException(e,response);if(typeof callback=='function'){callback(this,false);}} +break;case YAHOO.ext.grid.LoadableDataModel.TEXT:this.loadData(response.responseText,cb,keepExisting,insertIndex);break;};},processException:function(response){this.fireLoadException(null,response);if(typeof response.argument.callback=='function'){response.argument.callback(this,false);}},fireLoadException:function(e,responseObj){this.onLoadException.fireDirect(this,e,responseObj);},fireLoadEvent:function(){this.fireEvent('load',this.loadedPage,this.getTotalPages());},addPreprocessor:function(columnIndex,fn){this.preprocessors[columnIndex]=fn;},getPreprocessor:function(columnIndex){return this.preprocessors[columnIndex];},removePreprocessor:function(columnIndex){this.preprocessors[columnIndex]=null;},addPostprocessor:function(columnIndex,fn){this.postprocessors[columnIndex]=fn;},getPostprocessor:function(columnIndex){return this.postprocessors[columnIndex];},removePostprocessor:function(columnIndex){this.postprocessors[columnIndex]=null;},loadData:function(data,callback,keepExisting,insertIndex){}});YAHOO.ext.grid.LoadableDataModel.XML='xml';YAHOO.ext.grid.LoadableDataModel.JSON='json';YAHOO.ext.grid.LoadableDataModel.TEXT='text'; + +YAHOO.ext.grid.XMLDataModel=function(schema,xml){YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this,YAHOO.ext.grid.LoadableDataModel.XML);this.schema=schema;this.xml=xml;if(xml){this.loadData(xml);} +this.idSeed=0;};YAHOO.extendX(YAHOO.ext.grid.XMLDataModel,YAHOO.ext.grid.LoadableDataModel,{getDocument:function(){return this.xml;},loadData:function(doc,callback,keepExisting,insertIndex){this.xml=doc;var idField=this.schema.id;var fields=this.schema.fields;if(this.schema.totalTag){this.totalCount=null;var totalNode=doc.getElementsByTagName(this.schema.totalTag);if(totalNode&&totalNode.item(0)&&totalNode.item(0).firstChild){var v=parseInt(totalNode.item(0).firstChild.nodeValue,10);if(!isNaN(v)){this.totalCount=v;}}} +var rowData=[];var nodes=doc.getElementsByTagName(this.schema.tagName);if(nodes&&nodes.length>0){for(var i=0;i0){return this.getNamedValue(node,name.substr(index+1),defaultValue);}}} +return nodeValue;},setNamedValue:function(node,name,value){if(!node||!name){return;} +var attrNode=node.attributes.getNamedItem(name);if(attrNode){attrNode.value=value;return;} +var childNode=node.getElementsByTagName(name);if(childNode&&childNode.item(0)&&childNode.item(0).firstChild){childNode.item(0).firstChild.nodeValue=value;}else{var index=name.indexOf(':');if(index>0){this.setNamedValue(node,name.substr(index+1),value);}}},setValueAt:function(value,rowIndex,colIndex){var node=this.data[rowIndex].node;if(node){var nodeValue=value;if(this.postprocessors[colIndex]){nodeValue=this.postprocessors[colIndex](value);} +this.setNamedValue(node,this.schema.fields[colIndex],nodeValue);} +YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this,value,rowIndex,colIndex);},getRowId:function(rowIndex){return this.data[rowIndex].id;},addRows:function(rowData){for(var j=0,len=rowData.length;j0){var ids=this.selectedRowIds.concat();this.clearSelections();this.selectRowsById(ids,true);}},selectRowsById:function(id,keepExisting){var rows=this.grid.getRowsById(id);if(!(rows instanceof Array)){this.selectRow(rows,keepExisting);return;} +this.selectRows(rows,keepExisting);},getCount:function(){return this.selectedRows.length;},selectFirstRow:function(){for(var j=0;j=0;j--){var row=this.grid.rows[j];if(this.isSelectable(row)){this.focusRow(row);this.setRowState(row,true,keepExisting);return;}}}},getSelectedRows:function(){return this.selectedRows;},getSelectedRowIds:function(){return this.selectedRowIds;},clearSelections:function(){if(this.isLocked())return;var oldSelections=this.selectedRows.concat();for(var j=0;j0;},isSelected:function(row){return row&&(row.selected===true||row.getAttribute('selected')=='true');},isSelectable:function(row){return row&&row.getAttribute('selectable')!='false';},rowClick:function(grid,rowIndex,e){if(this.isLocked())return;var row=grid.getRow(rowIndex);if(this.isSelectable(row)){if(e.shiftKey&&this.lastSelectedRow){var lastIndex=this.lastSelectedRow.rowIndex;this.selectRange(this.lastSelectedRow,row,e.ctrlKey);this.lastSelectedRow=this.grid.el.dom.rows[lastIndex];}else{this.focusRow(row);var rowState=e.ctrlKey?!this.isSelected(row):true;this.setRowState(row,rowState,e.hasModifier());}}},focusRow:function(row){this.grid.view.focusRow(row);},selectRow:function(row,keepExisting){this.setRowState(this.getRow(row),true,keepExisting);},selectRows:function(rows,keepExisting){if(!keepExisting){this.clearSelections();} +for(var i=0;i');} +return results;},show:function(){alert(this.toString());}}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/CSS-min.js b/www/extras/yui-ext/build/CSS-min.js new file mode 100644 index 000000000..053abd306 --- /dev/null +++ b/www/extras/yui-ext/build/CSS-min.js @@ -0,0 +1,16 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.util.CSS=new function(){var rules=null;var toCamel=function(property){var convert=function(prop){var test=/(-[a-z])/i.exec(prop);return prop.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());};while(property.indexOf('-')>-1){property=convert(property);} +return property;};this.getRules=function(refreshCache){if(rules==null||refreshCache){rules={};var ds=document.styleSheets;for(var i=0,len=ds.length;i=0;--j){rules[ssRules[j].selectorText]=ssRules[j];}}catch(e){}}} +return rules;};this.getRule=function(selector,refreshCache){var rs=this.getRules(refreshCache);if(!(selector instanceof Array)){return rs[selector];} +for(var i=0;i 0) {" +var regex="";var special=false;var ch='';for(var i=0;i 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" ++"{return new Date(y, m, d, h, i);}\n" ++"else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n" ++"{return new Date(y, m, d, h);}\n" ++"else if (y > 0 && m >= 0 && d > 0)\n" ++"{return new Date(y, m, d);}\n" ++"else if (y > 0 && m >= 0)\n" ++"{return new Date(y, m);}\n" ++"else if (y > 0)\n" ++"{return new Date(y);}\n" ++"}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(character,currentGroup){switch(character){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:0,c:null,s:"(?:\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+currentGroup+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+currentGroup+"], 10);\n" ++"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+currentGroup+"] == 'am') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+currentGroup+"] == 'AM') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(character)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+") ++String.leftPad(Math.floor(this.getTimezoneOffset()/60),2,"0") ++String.leftPad(this.getTimezoneOffset()%60,2,"0");};Date.prototype.getDayOfYear=function(){var num=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var i=0;i';} +return b;} +var createDom=function(o,parentNode){var el=d.createElement(o.tag);var useSet=el.setAttribute?true:false;for(var attr in o){if(attr=='tag'||attr=='children'||attr=='html'||attr=='style'||typeof o[attr]=='function')continue;if(attr=='cls'){el.className=o['cls'];}else{if(useSet)el.setAttribute(attr,o[attr]);else el[attr]=o[attr];}} +YAHOO.ext.DomHelper.applyStyles(el,o.style);if(o.children){for(var i=0,len=o.children.length;i'+html+'';node=tempTableEl.firstChild.firstChild.firstChild;}else{tempTableEl.innerHTML=''+html+'
';node=tempTableEl.firstChild.firstChild.firstChild.firstChild;} +if(where=='beforebegin'){el.parentNode.insertBefore(node,el);return node;}else if(where=='afterbegin'){el.insertBefore(node,el.firstChild);return node;}else if(where=='beforeend'){el.appendChild(node);return node;}else if(where=='afterend'){el.parentNode.insertBefore(node,el.nextSibling);return node;}} +this.insertHtml=function(where,el,html){where=where.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=='table'||tag=='tbody'||tag=='tr'){return insertIntoTable(tag,where,el,html);} +switch(where){case'beforebegin':el.insertAdjacentHTML(where,html);return el.previousSibling;case'afterbegin':el.insertAdjacentHTML(where,html);return el.firstChild;case'beforeend':el.insertAdjacentHTML(where,html);return el.lastChild;case'afterend':el.insertAdjacentHTML(where,html);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';} +var range=el.ownerDocument.createRange();var frag;switch(where){case'beforebegin':range.setStartBefore(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el);return el.previousSibling;case'afterbegin':if(el.firstChild){range.setStartBefore(el.firstChild);}else{range.selectNodeContents(el);range.collapse(true);} +frag=range.createContextualFragment(html);el.insertBefore(frag,el.firstChild);return el.firstChild;case'beforeend':if(el.lastChild){range.setStartAfter(el.lastChild);}else{range.selectNodeContents(el);range.collapse(false);} +frag=range.createContextualFragment(html);el.appendChild(frag);return el.lastChild;case'afterend':range.setStartAfter(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el.nextSibling);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';};this.insertBefore=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el);}else{var html=createHtml(o);newNode=this.insertHtml('beforeBegin',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.insertAfter=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el.nextSibling);}else{var html=createHtml(o);newNode=this.insertHtml('afterEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.append=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.appendChild(newNode);}else{var html=createHtml(o);newNode=this.insertHtml('beforeEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.overwrite=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML=createHtml(o);return returnElement?YAHOO.ext.Element.get(el.firstChild,true):el.firstChild;};this.createTemplate=function(o){var html=createHtml(o);return new YAHOO.ext.DomHelper.Template(html);};}();YAHOO.ext.DomHelper.Template=function(html){this.html=html;this.re=/\{(\w+)\}/g;};YAHOO.ext.DomHelper.Template.prototype={applyTemplate:function(values){if(this.compiled){return this.compiled(values);} +var empty='';var fn=function(match,index){if(typeof values[index]!='undefined'){return values[index];}else{return empty;}} +return this.html.replace(this.re,fn);},compile:function(){var html=this.html;var re=/\{(\w+)\}/g;var body=[];body.push("this.compiled = function(values){ return [");var result;var lastMatchEnd=0;while((result=re.exec(html))!=null){body.push("'",html.substring(lastMatchEnd,result.index),"', ");body.push("values['",html.substring(result.index+1,re.lastIndex-1),"'], ");lastMatchEnd=re.lastIndex;} +body.push("'",html.substr(lastMatchEnd),"'].join('');};");eval(body.join(''));},insertBefore:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeBegin',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},insertAfter:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('afterEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},append:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},overwrite:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML='';var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;}};YAHOO.ext.Template=YAHOO.ext.DomHelper.Template; \ No newline at end of file diff --git a/www/extras/yui-ext/build/Element-min.js b/www/extras/yui-ext/build/Element-min.js new file mode 100644 index 000000000..8460dc73a --- /dev/null +++ b/www/extras/yui-ext/build/Element-min.js @@ -0,0 +1,83 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.Element=function(element,forceNew){var dom=YAHOO.util.Dom.get(element);if(!dom){return null;} +if(!forceNew&&YAHOO.ext.Element.cache[dom.id]){return YAHOO.ext.Element.cache[dom.id];} +this.dom=dom;this.id=this.dom.id;this.visibilityMode=YAHOO.ext.Element.VISIBILITY;this.originalDisplay=YAHOO.util.Dom.getStyle(this.dom,'display')||'';if(this.autoDisplayMode){if(this.originalDisplay=='none'){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);}} +if(this.originalDisplay=='none'){this.originalDisplay='';} +this.defaultUnit='px';} +YAHOO.ext.Element.prototype={setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this;},enableDisplayMode:function(display){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);if(typeof display!='undefined')this.originalDisplay=display;return this;},animate:function(args,duration,onComplete,easing,animType){this.anim(args,duration,onComplete,easing,animType);return this;},anim:function(args,duration,onComplete,easing,animType){animType=animType||YAHOO.util.Anim;var anim=new animType(this.dom,args,duration||.35,easing||YAHOO.util.Easing.easeBoth);if(onComplete){if(!(onComplete instanceof Array)){anim.onComplete.subscribe(onComplete,this,true);}else{for(var i=0;icontainerBottom){c.scrollTop=childBottom-c.clientHeight;} +if(restorePos){c.setStyle('position',cp);} +return this;},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=='function'){onComplete();}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=='function')onComplete();}.createDelegate(this),easing);}}.createDelegate(this),0);return this;},isVisible:function(deep){var vis=YAHOO.util.Dom.getStyle(this.dom,'visibility')!='hidden'&&YAHOO.util.Dom.getStyle(this.dom,'display')!='none';if(!deep||!vis){return vis;} +var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'visibility')=='hidden'||YAHOO.util.Dom.getStyle(p,'display')=='none'){return false;} +p=p.parentNode;} +return true;},select:function(selector,unique){return YAHOO.ext.Element.select('#'+this.dom.id+' '+selector,unique);},initDD:function(group,config,overrides){var dd=new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDProxy:function(group,config,overrides){var dd=new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDTarget:function(group,config,overrides){var dd=new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},setVisible:function(visible,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}else{this.setOpacity(visible?0:1);YAHOO.util.Dom.setStyle(this.dom,'visibility','visible');if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(true);} +var args={opacity:{from:(visible?0:1),to:(visible?1:0)}};var anim=new YAHOO.util.Anim(this.dom,args,duration||.35,easing||(visible?YAHOO.util.Easing.easeIn:YAHOO.util.Easing.easeOut));anim.onComplete.subscribe((function(){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}).createDelegate(this));if(onComplete){anim.onComplete.subscribe(onComplete);} +anim.animate();} +return this;},isDisplayed:function(){return YAHOO.util.Dom.getStyle(this.dom,'display')!='none';},toggle:function(animate,duration,onComplete,easing){this.setVisible(!this.isVisible(),animate,duration,onComplete,easing);return this;},setDisplayed:function(value){if(typeof value=='boolean'){value=value?this.originalDisplay:'none';} +YAHOO.util.Dom.setStyle(this.dom,'display',value);return this;},focus:function(){try{this.dom.focus();}catch(e){} +return this;},addClass:function(className){YAHOO.util.Dom.addClass(this.dom,className);return this;},radioClass:function(className){var siblings=this.dom.parentNode.childNodes;for(var i=0;ithis.getWidth()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setHeight:function(height,animate,duration,onComplete,easing){height=this.adjustHeight(height);if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'height',this.addUnits(height));}else{this.anim({height:{to:height}},duration,onComplete,easing||(height>this.getHeight()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setSize:function(width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({width:{to:width},height:{to:height}},duration,onComplete,easing);} +return this;},setBounds:function(x,y,width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);this.setLocation(x,y);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({points:{to:[x,y]},width:{to:width},height:{to:height}},duration,onComplete,easing,YAHOO.util.Motion);} +return this;},setRegion:function(region,animate,duration,onComplete,easing){this.setBounds(region.left,region.top,region.right-region.left,region.bottom-region.top,animate,duration,onComplete,easing);return this;},addListener:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addHandler:function(eventName,stopPropagation,handler,scope,override){var fn=YAHOO.ext.Element.createStopHandler(stopPropagation,handler,scope||this,true);YAHOO.util.Event.addListener(this.dom,eventName,fn);return this;},on:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addManagedListener:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},mon:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},removeListener:function(eventName,handler,scope){YAHOO.util.Event.removeListener(this.dom,eventName,handler,scope||this);return this;},removeAllListeners:function(){YAHOO.util.Event.purgeElement(this.dom);return this;},setOpacity:function(opacity,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'opacity',opacity);}else{this.anim({opacity:{to:opacity}},duration,onComplete,easing);} +return this;},getLeft:function(local){if(!local){return this.getX();}else{return parseInt(this.getStyle('left'),10)||0;}},getRight:function(local){if(!local){return this.getX()+this.getWidth();}else{return(this.getLeft(true)+this.getWidth())||0;}},getTop:function(local){if(!local){return this.getY();}else{return parseInt(this.getStyle('top'),10)||0;}},getBottom:function(local){if(!local){return this.getY()+this.getHeight();}else{return(this.getTop(true)+this.getHeight())||0;}},setAbsolutePositioned:function(zIndex){this.setStyle('position','absolute');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},setRelativePositioned:function(zIndex){this.setStyle('position','relative');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},clearPositioning:function(){this.setStyle('position','');this.setStyle('left','');this.setStyle('right','');this.setStyle('top','');this.setStyle('bottom','');return this;},getPositioning:function(){return{'position':this.getStyle('position'),'left':this.getStyle('left'),'right':this.getStyle('right'),'top':this.getStyle('top'),'bottom':this.getStyle('bottom')};},getBorderWidth:function(side){return this.addStyles(side,YAHOO.ext.Element.borders);},getPadding:function(side){return this.addStyles(side,YAHOO.ext.Element.paddings);},setPositioning:function(positionCfg){if(positionCfg.position)this.setStyle('position',positionCfg.position);if(positionCfg.left)this.setLeft(positionCfg.left);if(positionCfg.right)this.setRight(positionCfg.right);if(positionCfg.top)this.setTop(positionCfg.top);if(positionCfg.bottom)this.setBottom(positionCfg.bottom);return this;},setLeftTop:function(left,top){this.dom.style.left=this.addUnits(left);this.dom.style.top=this.addUnits(top);return this;},move:function(direction,distance,animate,duration,onComplete,easing){var xy=this.getXY();direction=direction.toLowerCase();switch(direction){case'l':case'left':this.moveTo(xy[0]-distance,xy[1],animate,duration,onComplete,easing);break;case'r':case'right':this.moveTo(xy[0]+distance,xy[1],animate,duration,onComplete,easing);break;case't':case'top':case'up':this.moveTo(xy[0],xy[1]-distance,animate,duration,onComplete,easing);break;case'b':case'bottom':case'down':this.moveTo(xy[0],xy[1]+distance,animate,duration,onComplete,easing);break;} +return this;},clip:function(){if(!this.isClipped){this.isClipped=true;this.originalClip={'o':this.getStyle('overflow'),'x':this.getStyle('overflow-x'),'y':this.getStyle('overflow-y')};this.setStyle('overflow','hidden');this.setStyle('overflow-x','hidden');this.setStyle('overflow-y','hidden');} +return this;},unclip:function(){if(this.isClipped){this.isClipped=false;var o=this.originalClip;if(o.o){this.setStyle('overflow',o.o);} +if(o.x){this.setStyle('overflow-x',o.x);} +if(o.y){this.setStyle('overflow-y',o.y);}} +return this;},alignTo:function(element,position,offsets,animate,duration,onComplete,easing){var otherEl=getEl(element);if(!otherEl){return this;} +offsets=offsets||[0,0];var r=otherEl.getRegion();position=position.toLowerCase();switch(position){case'bl':this.moveTo(r.left+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'br':this.moveTo(r.right+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'tl':this.moveTo(r.left+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;case'tr':this.moveTo(r.right+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;} +return this;},clearOpacity:function(){if(window.ActiveXObject){this.dom.style.filter='';}else{this.dom.style.opacity='';this.dom.style['-moz-opacity']='';this.dom.style['-khtml-opacity']='';} +return this;},hide:function(animate,duration,onComplete,easing){this.setVisible(false,animate,duration,onComplete,easing);return this;},show:function(animate,duration,onComplete,easing){this.setVisible(true,animate,duration,onComplete,easing);return this;},addUnits:function(size){if(size===''||size=='auto'||typeof size=='undefined'){return size;} +if(typeof size=='number'||!YAHOO.ext.Element.unitPattern.test(size)){return size+this.defaultUnit;} +return size;},beginMeasure:function(){var el=this.dom;if(el.offsetWidth||el.offsetHeight){return this;} +var changed=[];var p=this.dom;while((!el.offsetWidth&&!el.offsetHeight)&&p&&p.tagName&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'display')=='none'){changed.push({el:p,visibility:YAHOO.util.Dom.getStyle(p,'visibility')});p.style.visibility='hidden';p.style.display='block';} +p=p.parentNode;} +this._measureChanged=changed;return this;},endMeasure:function(){var changed=this._measureChanged;if(changed){for(var i=0,len=changed.length;i';YAHOO.util.Event.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:)((\n|\r|.)*?)(?:<\/script>)/img;var srcRe=/\ssrc=[\'\"](.*)[\'\"]/i;var match;while(match=re.exec(html)){var srcMatch=match[0].match(srcRe);if(srcMatch&&srcMatch[1]){var s0=document.createElement("script");s0.src=srcMatch[1];hd.appendChild(s0);}else if(match[1]){eval(match[1]);}} +var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);} +if(typeof callback=='function'){callback();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img,'');return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new YAHOO.ext.UpdateManager(this);} +return this.updateManager;},unselectable:function(){this.dom.unselectable='on';this.swallowEvent('selectstart',true);this.applyStyles('-moz-user-select:none;-khtml-user-select:none;');return this;},getCenterXY:function(offsetScroll){var centerX=Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2);var centerY=Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2);if(!offsetScroll){return[centerX,centerY];}else{var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft||0;var scrollY=document.documentElement.scrollTop||document.body.scrollTop||0;return[centerX+scrollX,centerY+scrollY];}},center:function(centerIn){if(!centerIn){this.setXY(this.getCenterXY(true));}else{var box=YAHOO.ext.Element.get(centerIn).getBox();this.setXY([box.x+(box.width/2)-(this.getWidth()/2),box.y+(box.height/2)-(this.getHeight()/2)]);} +return this;},getChildrenByTagName:function(tagName){var children=this.dom.getElementsByTagName(tagName);var len=children.length;var ce=new Array(len);for(var i=0;i');YAHOO.util.Event.on('ie-deferred-loader','readystatechange',function(){if(this.readyState=='complete'){fireDocReady();}});}else if(YAHOO.ext.util.Browser.isSafari){docReadyProcId=setInterval(function(){var rs=document.readyState;if(rs=='loaded'||rs=='complete'){fireDocReady();}},10);} +YAHOO.util.Event.on(window,'load',fireDocReady);};this.wrap=function(fn,scope,override){var wrappedFn=function(e){YAHOO.ext.EventObject.setEvent(e);fn.call(override?scope||window:window,YAHOO.ext.EventObject,scope);};return wrappedFn;};this.addListener=function(element,eventName,fn,scope,override){var wrappedFn=this.wrap(fn,scope,override);YAHOO.util.Event.addListener(element,eventName,wrappedFn);return wrappedFn;};this.removeListener=function(element,eventName,wrappedFn){return YAHOO.util.Event.removeListener(element,eventName,wrappedFn);};this.on=this.addListener;this.onDocumentReady=function(fn,scope,override){if(!docReadyEvent){initDocReady();} +docReadyEvent.subscribe(fn,scope,override);} +this.onWindowResize=function(fn,scope,override){if(!resizeEvent){resizeEvent=new YAHOO.util.CustomEvent('windowresize');resizeTask=new YAHOO.ext.util.DelayedTask(function(){resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight());});YAHOO.util.Event.on(window,'resize',function(){resizeTask.delay(50);});} +resizeEvent.subscribe(fn,scope,override);},this.removeResizeListener=function(fn,scope){if(resizeEvent){resizeEvent.unsubscribe(fn,scope);}}};YAHOO.ext.EventObject=new function(){this.browserEvent=null;this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;this.BACKSPACE=8;this.TAB=9;this.RETURN=13;this.ESC=27;this.SPACE=32;this.PAGEUP=33;this.PAGEDOWN=34;this.END=35;this.HOME=36;this.LEFT=37;this.UP=38;this.RIGHT=39;this.DOWN=40;this.DELETE=46;this.F5=116;this.setEvent=function(e){this.browserEvent=e;if(e){this.button=e.button;this.shiftKey=e.shiftKey;this.ctrlKey=e.ctrlKey;this.altKey=e.altKey;}else{this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;}};this.stopEvent=function(){if(this.browserEvent){YAHOO.util.Event.stopEvent(this.browserEvent);}};this.preventDefault=function(){if(this.browserEvent){YAHOO.util.Event.preventDefault(this.browserEvent);}};this.isNavKeyPress=function(){return(this.browserEvent.keyCode&&this.browserEvent.keyCode>=33&&this.browserEvent.keyCode<=40);};this.stopPropagation=function(){if(this.browserEvent){YAHOO.util.Event.stopPropagation(this.browserEvent);}};this.getCharCode=function(){if(this.browserEvent){return YAHOO.util.Event.getCharCode(this.browserEvent);} +return null;};this.getKey=function(){if(this.browserEvent){return this.browserEvent.charCode||this.browserEvent.keyCode;} +return null;};this.getPageX=function(){if(this.browserEvent){return YAHOO.util.Event.getPageX(this.browserEvent);} +return null;};this.getPageY=function(){if(this.browserEvent){return YAHOO.util.Event.getPageY(this.browserEvent);} +return null;};this.getTime=function(){if(this.browserEvent){return YAHOO.util.Event.getTime(this.browserEvent);} +return null;};this.getXY=function(){if(this.browserEvent){return YAHOO.util.Event.getXY(this.browserEvent);} +return[];};this.getTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getTarget(this.browserEvent);} +return null;};this.findTarget=function(className,tagName){if(tagName)tagName=tagName.toLowerCase();if(this.browserEvent){function isMatch(el){if(!el){return false;} +if(className&&!YAHOO.util.Dom.hasClass(el,className)){return false;} +if(tagName&&el.tagName.toLowerCase()!=tagName){return false;} +return true;};var t=this.getTarget();if(!t||isMatch(t)){return t;} +var p=t.parentNode;var b=document.body;while(p&&p!=b){if(isMatch(p)){return p;} +p=p.parentNode;}} +return null;};this.getRelatedTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getRelatedTarget(this.browserEvent);} +return null;};this.getWheelDelta=function(){var e=this.browserEvent;var delta=0;if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera)delta=-delta;}else if(e.detail){delta=-e.detail/3;} +return delta;};this.hasModifier=function(){return this.ctrlKey||this.altKey||this.shiftKey;};}(); \ No newline at end of file diff --git a/www/extras/yui-ext/build/JSON-min.js b/www/extras/yui-ext/build/JSON-min.js new file mode 100644 index 000000000..3588004fd --- /dev/null +++ b/www/extras/yui-ext/build/JSON-min.js @@ -0,0 +1,21 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.util.JSON=new function(){var useHasOwn={}.hasOwnProperty?true:false;var validRE=/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;var pad=function(n){return n<10?'0'+n:n;};var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'};var encodeString=function(s){if(/["\\\x00-\x1f]/.test(s)){return'"'+s.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;} +c=b.charCodeAt();return'\\u00'+ +Math.floor(c/16).toString(16)+ +(c%16).toString(16);})+'"';} +return'"'+s+'"';};var encodeArray=function(o){var a=['['],b,i,l=o.length,v;for(i=0;i1||objs instanceof Array){var args=arguments.length>1?arguments:objs;for(var i=0,len=args.length;i=this.items.length){return this.add(o,key);} +this.items.splice(index,0,o);if(typeof key!='undefined'&&key!=null){this.items[key]=o;this.keys.splice(index,0,key);} +this.fireEvent('add',index,o,key);return o;},remove:function(o){var index=this.indexOf(o);this.items.splice(index,1);if(typeof this.keys[index]!='undefined'){var key=this.keys[index];this.keys.splice(index,1);delete this.items[key];} +this.fireEvent('remove',o);return o;},removeAt:function(index){this.items.splice(index,1);var key=this.keys[index];if(typeof key!='undefined'){this.keys.splice(index,1);delete this.items[key];} +this.fireEvent('remove',o,key);},removeKey:function(key){var o=this.items[key];var index=this.indexOf(o);this.items.splice(index,1);this.keys.splice(index,1);delete this.items[key];this.fireEvent('remove',o,key);},getCount:function(){return this.items.length;},indexOf:function(o){if(!this.items.indexOf){for(var i=0,len=this.items.length;iLoading...'};YAHOO.ext.UpdateManager.updateElement=function(el,url,params,options){var um=getEl(el,true).getUpdateManager();YAHOO.ext.util.Config.apply(um,options);um.update(url,params,options.callback);} +YAHOO.ext.UpdateManager.update=YAHOO.ext.UpdateManager.updateElement;YAHOO.ext.UpdateManager.BasicRenderer=function(){};YAHOO.ext.UpdateManager.BasicRenderer.prototype={render:function(el,response,updateManager,callback){el.update(response.responseText,updateManager.loadScripts,callback);}}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/anim/Actor-min.js b/www/extras/yui-ext/build/anim/Actor-min.js new file mode 100644 index 000000000..3ecfbb13b --- /dev/null +++ b/www/extras/yui-ext/build/anim/Actor-min.js @@ -0,0 +1,28 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.Actor=function(element,animator,selfCapture){this.el=YAHOO.ext.Element.get(element,true);YAHOO.ext.Actor.superclass.constructor.call(this,element,true);this.onCapture=new YAHOO.util.CustomEvent('Actor.onCapture');if(animator){animator.addActor(this);} +this.capturing=selfCapture;this.playlist=selfCapture?new YAHOO.ext.Animator.AnimSequence():null;};YAHOO.extendX(YAHOO.ext.Actor,YAHOO.ext.Element);YAHOO.ext.Actor.prototype.capture=function(action){if(this.playlist!=null){this.playlist.add(action);} +this.onCapture.fireDirect(this,action);return action;};YAHOO.ext.Actor.overrideAnimation=function(method,animParam,onParam){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);if(args[animParam]===true){return this.capture(new YAHOO.ext.Actor.AsyncAction(this,method,args,onParam));}else{return this.capture(new YAHOO.ext.Actor.Action(this,method,args));}};} +YAHOO.ext.Actor.overrideBasic=function(method){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.Action(this,method,args));};} +YAHOO.ext.Actor.prototype.setVisibilityMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode);YAHOO.ext.Actor.prototype.enableDisplayMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode);YAHOO.ext.Actor.prototype.focus=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus);YAHOO.ext.Actor.prototype.addClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass);YAHOO.ext.Actor.prototype.removeClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass);YAHOO.ext.Actor.prototype.replaceClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass);YAHOO.ext.Actor.prototype.setStyle=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle);YAHOO.ext.Actor.prototype.setLeft=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft);YAHOO.ext.Actor.prototype.setTop=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop);YAHOO.ext.Actor.prototype.setAbsolutePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned);YAHOO.ext.Actor.prototype.setRelativePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned);YAHOO.ext.Actor.prototype.clearPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning);YAHOO.ext.Actor.prototype.setPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning);YAHOO.ext.Actor.prototype.clip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip);YAHOO.ext.Actor.prototype.unclip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip);YAHOO.ext.Actor.prototype.clearOpacity=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity);YAHOO.ext.Actor.prototype.update=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update);YAHOO.ext.Actor.prototype.remove=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove);YAHOO.ext.Actor.prototype.fitToParent=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent);YAHOO.ext.Actor.prototype.appendChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild);YAHOO.ext.Actor.prototype.createChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild);YAHOO.ext.Actor.prototype.appendTo=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo);YAHOO.ext.Actor.prototype.insertBefore=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore);YAHOO.ext.Actor.prototype.insertAfter=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter);YAHOO.ext.Actor.prototype.wrap=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap);YAHOO.ext.Actor.prototype.replace=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace);YAHOO.ext.Actor.prototype.insertHtml=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml);YAHOO.ext.Actor.prototype.set=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set);YAHOO.ext.Actor.prototype.load=function(){if(!this.capturing){return YAHOO.ext.Actor.superclass.load.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.load,args,2));};YAHOO.ext.Actor.prototype.animate=function(args,duration,onComplete,easing,animType){if(!this.capturing){return YAHOO.ext.Actor.superclass.animate.apply(this,arguments);} +return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.animate,[args,duration,onComplete,easing,animType],2));};YAHOO.ext.Actor.prototype.setVisible=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible,1,3);YAHOO.ext.Actor.prototype.toggle=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle,0,2);YAHOO.ext.Actor.prototype.setXY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY,1,3);YAHOO.ext.Actor.prototype.setLocation=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation,2,4);YAHOO.ext.Actor.prototype.setWidth=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth,1,3);YAHOO.ext.Actor.prototype.setHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight,1,3);YAHOO.ext.Actor.prototype.setSize=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize,2,4);YAHOO.ext.Actor.prototype.setBounds=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds,4,6);YAHOO.ext.Actor.prototype.setOpacity=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity,1,3);YAHOO.ext.Actor.prototype.moveTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo,2,4);YAHOO.ext.Actor.prototype.move=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move,2,4);YAHOO.ext.Actor.prototype.alignTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo,3,5);YAHOO.ext.Actor.prototype.hide=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide,0,2);YAHOO.ext.Actor.prototype.show=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show,0,2);YAHOO.ext.Actor.prototype.setBox=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox,2,4);YAHOO.ext.Actor.prototype.autoHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight,0,2);YAHOO.ext.Actor.prototype.setX=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX,1,3);YAHOO.ext.Actor.prototype.setY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY,1,3);YAHOO.ext.Actor.prototype.startCapture=function(){this.capturing=true;this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.stopCapture=function(){this.capturing=false;};YAHOO.ext.Actor.prototype.clear=function(){this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.play=function(oncomplete){this.capturing=false;if(this.playlist){this.playlist.play(oncomplete);}};YAHOO.ext.Actor.prototype.addCall=function(fcn,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.Action(scope,fcn,args||[]));}};YAHOO.ext.Actor.prototype.addAsyncCall=function(fcn,callbackIndex,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.AsyncAction(scope,fcn,args||[],callbackIndex));}},YAHOO.ext.Actor.prototype.pause=function(seconds){this.capture(new YAHOO.ext.Actor.PauseAction(seconds));};YAHOO.ext.Actor.prototype.shake=function(){this.move('left',20,true,.05);this.move('right',40,true,.05);this.move('left',40,true,.05);this.move('right',20,true,.05);};YAHOO.ext.Actor.prototype.bounce=function(){this.move('up',20,true,.05);this.move('down',40,true,.05);this.move('up',40,true,.05);this.move('down',20,true,.05);};YAHOO.ext.Actor.prototype.blindShow=function(anchor,newSize,duration,easing){var size=newSize||this.getSize();this.clip();this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +this.unclip();return size;};YAHOO.ext.Actor.prototype.blindHide=function(anchor,duration,easing){var size=this.getSize();this.clip();anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.animate({width:{to:1},points:{by:[this.getWidth(),0]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;case'b':case'bottom':this.animate({height:{to:1},points:{by:[0,this.getHeight()]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;} +return size;};YAHOO.ext.Actor.prototype.slideShow=function(anchor,newSize,duration,easing,clearPositioning){var size=newSize||this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindShow(anchor,newSize,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'r':case'right':this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +if(clearPositioning!==false){this.addCall(child.setPositioning,[pos],child);} +this.unclip();return size;};YAHOO.ext.Actor.prototype.slideHide=function(anchor,duration,easing){var size=this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindHide(anchor,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;} +this.addCall(child.setPositioning,[pos],child);return size;};YAHOO.ext.Actor.prototype.squish=function(duration){var size=this.getSize();this.clip();this.setSize(1,1,true,duration||.5);this.setVisible(false);return size;};YAHOO.ext.Actor.prototype.appear=function(duration){this.setVisible(true,true,duration);};YAHOO.ext.Actor.prototype.fade=function(duration){this.setVisible(false,true,duration);};YAHOO.ext.Actor.prototype.switchOff=function(duration){this.clip();this.setVisible(false,true,.1);this.clearOpacity();this.setVisible(true);this.animate({height:{to:1},points:{by:[0,this.getHeight()/2]}},duration||.5,null,YAHOO.util.Easing.easeOut,YAHOO.util.Motion);this.setVisible(false);};YAHOO.ext.Actor.prototype.highlight=function(color,fromColor,duration,attribute){attribute=attribute||'background-color';var original=this.getStyle(attribute);fromColor=fromColor||((original&&original!=''&&original!='transparent')?original:'#FFFFFF');var cfg={};cfg[attribute]={to:color,from:fromColor};this.setVisible(true);this.animate(cfg,duration||.5,null,YAHOO.util.Easing.bounceOut,YAHOO.util.ColorAnim);this.setStyle(attribute,original);};YAHOO.ext.Actor.prototype.pulsate=function(count,duration){count=count||3;for(var i=0;i0){animFn.defer((duration/2)*1000,this);}else{if(typeof callback=='function'){callback();}}} +animFn.call(this);} +this.addAsyncCall(frameFn,0,null,this);};YAHOO.ext.Actor.Action=function(actor,method,args){this.actor=actor;this.method=method;this.args=args;} +YAHOO.ext.Actor.Action.prototype={play:function(onComplete){this.method.apply(this.actor||window,this.args);onComplete();}};YAHOO.ext.Actor.AsyncAction=function(actor,method,args,onIndex){YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this,actor,method,args);this.onIndex=onIndex;this.originalCallback=this.args[onIndex];} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction,YAHOO.ext.Actor.Action);YAHOO.ext.Actor.AsyncAction.prototype.play=function(onComplete){var callbackArg=this.originalCallback?this.originalCallback.createSequence(onComplete):onComplete;this.args[this.onIndex]=callbackArg;this.method.apply(this.actor,this.args);};YAHOO.ext.Actor.PauseAction=function(seconds){this.seconds=seconds;};YAHOO.ext.Actor.PauseAction.prototype={play:function(onComplete){setTimeout(onComplete,this.seconds*1000);}}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/anim/Animator-min.js b/www/extras/yui-ext/build/anim/Animator-min.js new file mode 100644 index 000000000..b785cc033 --- /dev/null +++ b/www/extras/yui-ext/build/anim/Animator-min.js @@ -0,0 +1,22 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.Animator=function(){this.actors=[];this.playlist=new YAHOO.ext.Animator.AnimSequence();this.captureDelegate=this.capture.createDelegate(this);this.playDelegate=this.play.createDelegate(this);this.syncing=false;this.stopping=false;this.playing=false;for(var i=0;i=this.sequences.length&&this.onComplete){this.onComplete();}},stop:function(){for(var i=0;i0){this.removeRows(0,count-1);}},query:function(spec,returnUnmatched){var d=this.data;var r=[];for(var i=0;iv2) +return dsc?-1:+1;return 0;};this.data.sort(fn);if(!suppressEvent){this.fireRowsSorted(columnIndex,direction);}},each:function(fn,scope){var d=this.data;for(var i=0,len=d.length;i0;},getTotalRowCount:function(){return this.totalCount||this.getRowCount();},getPageSize:function(){return this.pageSize;},getTotalPages:function(){if(this.getPageSize()==0||this.getTotalRowCount()==0){return 1;} +return Math.ceil(this.getTotalRowCount()/this.getPageSize());},initPaging:function(url,pageSize,baseParams){this.pageUrl=url;this.pageSize=pageSize;this.remoteSort=true;if(baseParams)this.baseParams=baseParams;},createParams:function(pageNum,sortColumn,sortDir){var params={},map=this.paramMap;for(var key in this.baseParams){if(typeof this.baseParams[key]!='function'){params[key]=this.baseParams[key];}} +params[map['page']]=pageNum;params[map['pageSize']]=this.getPageSize();params[map['sortColumn']]=(typeof sortColumn=='undefined'?'':sortColumn);params[map['sortDir']]=sortDir||'';return params;},loadPage:function(pageNum,callback,keepExisting){var sort=this.getSortState();var params=this.createParams(pageNum,sort.column,sort.direction);this.load(this.pageUrl,params,this.setLoadedPage.createDelegate(this,[pageNum,callback]),keepExisting?(pageNum-1)*this.pageSize:null);},applySort:function(suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this,arguments);}else if(!suppressEvent){var sort=this.getSortState();if(sort.column){this.fireRowsSorted(sort.column,sort.direction,true);}}},resetPaging:function(){this.loadedPage=1;},sort:function(sortInfo,columnIndex,direction,suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this,arguments);}else{this.sortInfo=sortInfo;this.sortColumn=columnIndex;this.sortDir=direction;var params=this.createParams(this.loadedPage,columnIndex,direction);this.load(this.pageUrl,params,this.fireRowsSorted.createDelegate(this,[columnIndex,direction,true]));}},load:function(url,params,callback,insertIndex){this.fireEvent('beforeload',this);if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var cb={success:this.processResponse,failure:this.processException,scope:this,argument:{callback:callback,insertIndex:insertIndex}};var method=params?'POST':'GET';YAHOO.util.Connect.asyncRequest(method,url,cb,params);},processResponse:function(response){var cb=response.argument.callback;var keepExisting=(typeof response.argument.insertIndex=='number');var insertIndex=response.argument.insertIndex;switch(this.dataType){case YAHOO.ext.grid.LoadableDataModel.XML:this.loadData(response.responseXML,cb,keepExisting,insertIndex);break;case YAHOO.ext.grid.LoadableDataModel.JSON:var rtext=response.responseText;try{while(rtext.substring(0,1)==" "){rtext=rtext.substring(1,rtext.length);} +if(rtext.indexOf("{")<0){throw"Invalid JSON response";} +if(rtext.indexOf("{}")===0){this.loadData({},response.argument.callback);return;} +var jsonObjRaw=eval("("+rtext+")");if(!jsonObjRaw){throw"Error evaling JSON response";} +this.loadData(jsonObjRaw,cb,keepExisting,insertIndex);}catch(e){this.fireLoadException(e,response);if(typeof callback=='function'){callback(this,false);}} +break;case YAHOO.ext.grid.LoadableDataModel.TEXT:this.loadData(response.responseText,cb,keepExisting,insertIndex);break;};},processException:function(response){this.fireLoadException(null,response);if(typeof response.argument.callback=='function'){response.argument.callback(this,false);}},fireLoadException:function(e,responseObj){this.onLoadException.fireDirect(this,e,responseObj);},fireLoadEvent:function(){this.fireEvent('load',this.loadedPage,this.getTotalPages());},addPreprocessor:function(columnIndex,fn){this.preprocessors[columnIndex]=fn;},getPreprocessor:function(columnIndex){return this.preprocessors[columnIndex];},removePreprocessor:function(columnIndex){this.preprocessors[columnIndex]=null;},addPostprocessor:function(columnIndex,fn){this.postprocessors[columnIndex]=fn;},getPostprocessor:function(columnIndex){return this.postprocessors[columnIndex];},removePostprocessor:function(columnIndex){this.postprocessors[columnIndex]=null;},loadData:function(data,callback,keepExisting,insertIndex){}});YAHOO.ext.grid.LoadableDataModel.XML='xml';YAHOO.ext.grid.LoadableDataModel.JSON='json';YAHOO.ext.grid.LoadableDataModel.TEXT='text'; \ No newline at end of file diff --git a/www/extras/yui-ext/build/data/XMLDataModel-min.js b/www/extras/yui-ext/build/data/XMLDataModel-min.js new file mode 100644 index 000000000..c7cbdffbc --- /dev/null +++ b/www/extras/yui-ext/build/data/XMLDataModel-min.js @@ -0,0 +1,24 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.grid.XMLDataModel=function(schema,xml){YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this,YAHOO.ext.grid.LoadableDataModel.XML);this.schema=schema;this.xml=xml;if(xml){this.loadData(xml);} +this.idSeed=0;};YAHOO.extendX(YAHOO.ext.grid.XMLDataModel,YAHOO.ext.grid.LoadableDataModel,{getDocument:function(){return this.xml;},loadData:function(doc,callback,keepExisting,insertIndex){this.xml=doc;var idField=this.schema.id;var fields=this.schema.fields;if(this.schema.totalTag){this.totalCount=null;var totalNode=doc.getElementsByTagName(this.schema.totalTag);if(totalNode&&totalNode.item(0)&&totalNode.item(0).firstChild){var v=parseInt(totalNode.item(0).firstChild.nodeValue,10);if(!isNaN(v)){this.totalCount=v;}}} +var rowData=[];var nodes=doc.getElementsByTagName(this.schema.tagName);if(nodes&&nodes.length>0){for(var i=0;i0){return this.getNamedValue(node,name.substr(index+1),defaultValue);}}} +return nodeValue;},setNamedValue:function(node,name,value){if(!node||!name){return;} +var attrNode=node.attributes.getNamedItem(name);if(attrNode){attrNode.value=value;return;} +var childNode=node.getElementsByTagName(name);if(childNode&&childNode.item(0)&&childNode.item(0).firstChild){childNode.item(0).firstChild.nodeValue=value;}else{var index=name.indexOf(':');if(index>0){this.setNamedValue(node,name.substr(index+1),value);}}},setValueAt:function(value,rowIndex,colIndex){var node=this.data[rowIndex].node;if(node){var nodeValue=value;if(this.postprocessors[colIndex]){nodeValue=this.postprocessors[colIndex](value);} +this.setNamedValue(node,this.schema.fields[colIndex],nodeValue);} +YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this,value,rowIndex,colIndex);},getRowId:function(rowIndex){return this.data[rowIndex].id;},addRows:function(rowData){for(var j=0,len=rowData.length;j=pos&&x=this.grid.dataModel.getRowCount()){return null;} +return[colIndex,rowIndex];} +return null;},_adjustForScroll:function(){this.forceScrollUpdate();if(this.scrollbarMode==YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){var adjustment=0;if(this.wrap.clientWidth&&this.wrap.clientWidth!==0){adjustment=this.wrap.offsetWidth-this.wrap.clientWidth;} +this.hwrap.setWidth(this.wrap.offsetWidth-adjustment);}else{this.hwrap.setWidth(this.wrap.offsetWidth);} +this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(),this.wrap.clientWidth));},focusRow:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;try{row.childNodes.item(0).hideFocus=true;row.childNodes.item(0).focus();}catch(e){} +this.ensureVisible(row);this.wrap.scrollLeft=left;this.handleScroll();this.lastFocusedRow=row;},ensureVisible:function(row,disableDelay){if(!disableDelay){this.ensureVisibleTask.delay(50,this._ensureVisible,this,[row]);}else{this._ensureVisible(row);}},_ensureVisible:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;var rowTop=parseInt(row.offsetTop,10);var rowBottom=rowTop+row.offsetHeight;var clientTop=parseInt(this.wrap.scrollTop,10);var clientBottom=clientTop+this.wrap.clientHeight;if(rowTopclientBottom){this.wrap.scrollTop=rowBottom-this.wrap.clientHeight;} +this.wrap.scrollLeft=left;this.handleScroll();},updateColumns:function(){this.grid.stopEditing();var colModel=this.grid.colModel;var hcols=this.headers;var colCount=colModel.getColumnCount();var pos=0;var totalWidth=colModel.getTotalWidth();for(var i=0;i'+'{1}'+''+''}]});htemplate.compile();for(var i=0;i0){var ids=this.selectedRowIds.concat();this.clearSelections();this.selectRowsById(ids,true);}},selectRowsById:function(id,keepExisting){var rows=this.grid.getRowsById(id);if(!(rows instanceof Array)){this.selectRow(rows,keepExisting);return;} +this.selectRows(rows,keepExisting);},getCount:function(){return this.selectedRows.length;},selectFirstRow:function(){for(var j=0;j=0;j--){var row=this.grid.rows[j];if(this.isSelectable(row)){this.focusRow(row);this.setRowState(row,true,keepExisting);return;}}}},getSelectedRows:function(){return this.selectedRows;},getSelectedRowIds:function(){return this.selectedRowIds;},clearSelections:function(){if(this.isLocked())return;var oldSelections=this.selectedRows.concat();for(var j=0;j0;},isSelected:function(row){return row&&(row.selected===true||row.getAttribute('selected')=='true');},isSelectable:function(row){return row&&row.getAttribute('selectable')!='false';},rowClick:function(grid,rowIndex,e){if(this.isLocked())return;var row=grid.getRow(rowIndex);if(this.isSelectable(row)){if(e.shiftKey&&this.lastSelectedRow){var lastIndex=this.lastSelectedRow.rowIndex;this.selectRange(this.lastSelectedRow,row,e.ctrlKey);this.lastSelectedRow=this.grid.el.dom.rows[lastIndex];}else{this.focusRow(row);var rowState=e.ctrlKey?!this.isSelected(row):true;this.setRowState(row,rowState,e.hasModifier());}}},focusRow:function(row){this.grid.view.focusRow(row);},selectRow:function(row,keepExisting){this.setRowState(this.getRow(row),true,keepExisting);},selectRows:function(rows,keepExisting){if(!keepExisting){this.clearSelections();} +for(var i=0;ithis.maxValue.getTime()){dom.title=this.maxText.replace('%0',this.formatDate(this.maxValue));this.element.addClass('ygrid-editor-invalid');return false;} +if(this.disabledDays){var day=value.getDay();for(var i=0;ithis.maxValue){dom.title=this.maxText.replace('%0',this.maxValue);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.NumberEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.NumberEditor.superclass.show.call(this);if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.NumberEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{var value=this.element.dom.value;if(value.length<1){return value;}else{return this.fixPrecision(this.parseValue(value));}}};YAHOO.ext.grid.NumberEditor.prototype.parseValue=function(value){return parseFloat(new String(value).replace(this.decimalSeparator,'.'));};YAHOO.ext.grid.NumberEditor.prototype.fixPrecision=function(value){if(!this.allowDecimals||this.decimalPrecision==-1||isNaN(value)||value==0||!value){return value;} +var scale=Math.pow(10,this.decimalPrecision+1);var fixed=this.decimalPrecisionFcn(value*scale);fixed=this.decimalPrecisionFcn(fixed/10);return fixed/(scale/10);};YAHOO.ext.grid.NumberEditor.prototype.allowBlank=true;YAHOO.ext.grid.NumberEditor.prototype.allowDecimals=true;YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator='.';YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision=2;YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn=Math.floor;YAHOO.ext.grid.NumberEditor.prototype.allowNegative=true;YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.NumberEditor.prototype.minValue=Number.NEGATIVE_INFINITY;YAHOO.ext.grid.NumberEditor.prototype.maxValue=Number.MAX_VALUE;YAHOO.ext.grid.NumberEditor.prototype.minText='The minimum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.maxText='The maximum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.NumberEditor.prototype.nanText='%0 is not a valid number';YAHOO.ext.grid.NumberEditor.prototype.validationDelay=100;YAHOO.ext.grid.NumberEditor.prototype.validator=function(){return true;}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/grid/editor/SelectEditor-min.js b/www/extras/yui-ext/build/grid/editor/SelectEditor-min.js new file mode 100644 index 000000000..7cabecfa7 --- /dev/null +++ b/www/extras/yui-ext/build/grid/editor/SelectEditor-min.js @@ -0,0 +1,8 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.grid.SelectEditor=function(element){element.hideFocus=true;YAHOO.ext.grid.SelectEditor.superclass.constructor.call(this,element);this.element.swallowEvent('click');};YAHOO.extendX(YAHOO.ext.grid.SelectEditor,YAHOO.ext.grid.CellEditor);YAHOO.ext.grid.SelectEditor.prototype.fitToCell=function(box){if(YAHOO.ext.util.Browser.isGecko){box.height-=3;} +this.element.setBox(box,true);}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/grid/editor/TextEditor-min.js b/www/extras/yui-ext/build/grid/editor/TextEditor-min.js new file mode 100644 index 000000000..9871264ef --- /dev/null +++ b/www/extras/yui-ext/build/grid/editor/TextEditor-min.js @@ -0,0 +1,13 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.grid.TextEditor=function(config){var element=document.createElement('input');element.type='text';element.className='ygrid-editor ygrid-text-editor';element.setAttribute('autocomplete','off');document.body.appendChild(element);YAHOO.ext.grid.TextEditor.superclass.constructor.call(this,element);YAHOO.ext.util.Config.apply(this,config);};YAHOO.extendX(YAHOO.ext.grid.TextEditor,YAHOO.ext.grid.CellEditor);YAHOO.ext.grid.TextEditor.prototype.validate=function(){var dom=this.element.dom;var value=dom.value;if(value.length<1){if(this.allowBlank){dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;}else{dom.title=this.blankText;this.element.addClass('ygrid-editor-invalid');return false;}} +if(value.lengththis.maxLength){dom.title=this.maxText.replace('%0',this.maxLength);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +if(this.regex&&!this.regex.test(value)){dom.title=this.regexText;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.TextEditor.prototype.initEvents=function(){YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this);var vtask=new YAHOO.ext.util.DelayedTask(this.validate,this);this.element.mon('keyup',vtask.delay.createDelegate(vtask,[this.validationDelay]));};YAHOO.ext.grid.TextEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.TextEditor.superclass.show.call(this);this.element.focus();if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.TextEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{return this.element.dom.value;}};YAHOO.ext.grid.TextEditor.prototype.allowBlank=true;YAHOO.ext.grid.TextEditor.prototype.minLength=0;YAHOO.ext.grid.TextEditor.prototype.maxLength=Number.MAX_VALUE;YAHOO.ext.grid.TextEditor.prototype.minText='The minimum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.maxText='The maximum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.TextEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.TextEditor.prototype.validator=function(){return true;};YAHOO.ext.grid.TextEditor.prototype.validationDelay=200;YAHOO.ext.grid.TextEditor.prototype.regex=null;YAHOO.ext.grid.TextEditor.prototype.regexText=''; \ No newline at end of file diff --git a/www/extras/yui-ext/build/layout/BorderLayout-min.js b/www/extras/yui-ext/build/layout/BorderLayout-min.js new file mode 100644 index 000000000..73d6c39d3 --- /dev/null +++ b/www/extras/yui-ext/build/layout/BorderLayout-min.js @@ -0,0 +1,19 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.BorderLayout=function(container,config){YAHOO.ext.BorderLayout.superclass.constructor.call(this,container);this.factory=config.factory||YAHOO.ext.BorderLayout.RegionFactory;this.hideOnLayout=config.hideOnLayout||false;for(var i=0,len=this.factory.validRegions.length;i0?title:" ");}},setActivePanel:function(panel){panel=this.getPanel(panel);if(this.activePanel&&this.activePanel!=panel){this.activePanel.setActiveState(false);} +this.activePanel=panel;panel.setActiveState(true);if(this.panelSize){panel.setSize(this.panelSize.width,this.panelSize.height);} +this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&panel.isClosable());this.updateTitle(panel.getTitle());this.fireEvent('panelactivated',this,panel);},showPanel:function(panel){if(panel=this.getPanel(panel)){if(this.tabs){this.tabs.activate(panel.getEl().id);}else{this.setActivePanel(panel);}} +return panel;},getActivePanel:function(){return this.activePanel;},validateVisibility:function(){if(this.panels.getCount()<1){this.updateTitle(' ');this.closeBtn.hide();this.hide();}else{if(!this.isVisible()){this.show();}}},add:function(panel){if(arguments.length>1){for(var i=0,len=arguments.length;i0){this.body.addClass(this.tabPosition=='bottom'?'ytabs-bottom':'ytabs-top');this.tabs=new YAHOO.ext.TabPanel(this.body.dom,this.tabPosition=='bottom');for(var i=0,len=tabEls.length;i
 {0} 
');} +var btn=this.buttonTemplate.append(this.footer.dom,[config],true);var tbl=getEl(btn.dom.firstChild,true);if(this.minButtonWidth){if(tbl.getWidth()vw){x=vw-w;moved=true;} +if(y+h>vh){y=vh-h;moved=true;} +if(x<0){x=0;moved=true;} +if(y<0){y=0;moved=true;} +if(moved){this.xy=[x,y];if(this.isVisible()){this.el.setLocation(x,y);this.adjustAssets();}}}},onDrag:function(){if(!this.proxyDrag){this.xy=this.el.getXY();this.adjustAssets();}},adjustAssets:function(doShow){var x=this.xy[0],y=this.xy[1];var w=this.size.width,h=this.size.height;if(doShow===true){if(this.shadow){this.shadow.show();} +if(this.shim){this.shim.show();}} +if(this.shadow&&this.shadow.isVisible()){this.shadow.setBounds(x+this.shadowOffset,y+this.shadowOffset,w,h);} +if(this.shim&&this.shim.isVisible()){this.shim.setBounds(x,y,w,h);}},adjustViewport:function(w,h){if(!w||!h){w=YAHOO.util.Dom.getViewportWidth();h=YAHOO.util.Dom.getViewportHeight();} +this.viewSize=[w,h];if(this.modal&&this.mask.isVisible()){this.mask.setSize(w,h);this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(),YAHOO.util.Dom.getDocumentHeight());} +if(this.isVisible()){this.constrainXY();}},destroy:function(removeEl){YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport,this);if(this.tabs){this.tabs.destroy(removeEl);} +if(removeEl===true){this.el.update('');this.el.remove();} +YAHOO.ext.DialogManager.unregister(this);},startMove:function(){if(this.proxyDrag){this.proxy.show();} +if(this.constraintoviewport!==false){this.dd.constrainTo(document.body,{right:this.shadowOffset,bottom:this.shadowOffset});}},endMove:function(){if(!this.proxyDrag){YAHOO.util.DD.prototype.endDrag.apply(this.dd,arguments);}else{YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd,arguments);this.proxy.hide();} +this.refreshSize();this.adjustAssets();this.fireEvent('move',this,this.xy[0],this.xy[1])},toFront:function(){YAHOO.ext.DialogManager.bringToFront(this);return this;},toBack:function(){YAHOO.ext.DialogManager.sendToBack(this);return this;},center:function(){this.moveTo(this.el.getCenterXY(true));return this;},moveTo:function(x,y){this.xy=[x,y];if(this.isVisible()){this.el.setXY(this.xy);this.adjustAssets();} +return this;},isVisible:function(){return this.el.isVisible();},hide:function(callback){if(this.fireEvent('beforehide',this)===false) +return;if(this.shadow){this.shadow.hide();} +if(this.animateTarget){var b=getEl(this.animateTarget,true).getBox();this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height);this.el.hide();this.proxy.setBounds(b.x,b.y,b.width,b.height,true,.35,this.hideEl.createDelegate(this,[callback]));}else{this.el.hide();this.hideEl(callback);} +return this;},hideEl:function(callback){this.proxy.hide();if(this.modal){this.mask.hide();YAHOO.util.Dom.removeClass(document.body,'masked');} +this.fireEvent('hide',this);if(typeof callback=='function'){callback();}},hideAction:function(){this.setLeft('-10000px');this.setTop('-10000px');this.setStyle('visibility','hidden');},refreshSize:function(){this.size=this.el.getSize();this.xy=this.el.getXY();YAHOO.ext.state.Manager.set(this.el.id+'-state',this.el.getBox());},setZIndex:function(index){if(this.modal){this.mask.setStyle('z-index',index);} +if(this.shadow){this.shadow.setStyle('z-index',++index);} +if(this.shim){this.shim.setStyle('z-index',++index);} +this.el.setStyle('z-index',++index);if(this.proxy){this.proxy.setStyle('z-index',++index);} +if(this.resizer){this.resizer.proxy.setStyle('z-index',++index);} +this.lastZIndex=index;},getEl:function(){return this.el;}});YAHOO.ext.DialogManager=function(){var list={};var accessList=[];var front=null;var sortDialogs=function(d1,d2){return(!d1._lastAccess||d1._lastAccess0){this.showPrevMonth();e.stopEvent();}else if(delta<0){this.showNextMonth();e.stopEvent();}},handleClick:function(e){var d=this.visibleDate;var t=e.getTarget();if(t&&t.className){switch(t.className){case'active':this.handleSelection(new Date(d.getFullYear(),d.getMonth(),parseInt(t.innerHTML)));break;case'prevday':var p=this.getPrevMonth(d);this.handleSelection(new Date(p.getFullYear(),p.getMonth(),parseInt(t.innerHTML)));break;case'nextday':var n=this.getNextMonth(d);this.handleSelection(new Date(n.getFullYear(),n.getMonth(),parseInt(t.innerHTML)));break;case'ypopcal-today':this.handleSelection(new Date());break;case'next-month':this.showNextMonth();break;case'prev-month':this.showPrevMonth();break;}} +e.stopEvent();},selectToday:function(){this.handleSelection(new Date());},handleSelection:function(date){this.selectedDate=date;this.callback(date);this.hide();},getPrevMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==0?new Date(--y,11,1):new Date(y,--m,1));},getNextMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==11?new Date(++y,0,1):new Date(y,++m,1));},getDaysInMonth:function(m,y){return(m==1||m==3||m==5||m==7||m==8||m==10||m==12)?31:(m==4||m==6||m==9||m==11)?30:this.isLeapYear(y)?29:28;},isLeapYear:function(y){return(((y%4)==0)&&((y%100)!=0)||((y%400)==0));},clearTime:function(date){if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0);} +return date;},refresh:function(){var d=this.visibleDate;this.buildInnerCal(d);this.calHead.update(this.monthNames[d.getMonth()]+' '+d.getFullYear());if(this.element.isVisible()){this.shadow.setRegion(this.element.getRegion());}}};YAHOO.ext.DatePicker.prototype.buildControl=function(parentElement){var c=document.createElement('div');c.style.position='absolute';c.style.visibility='hidden';document.body.appendChild(c);var html=''+'';c.innerHTML=html;this.shadow=getEl(c.childNodes[0],true);this.shadow.enableDisplayMode();this.element=getEl(c.childNodes[1],true);this.element.enableDisplayMode();document.body.appendChild(this.shadow.dom);document.body.appendChild(this.element.dom);document.body.removeChild(c);this.element.on("selectstart",function(){return false;});var tbody=this.element.dom.getElementsByTagName('tbody')[1];this.cells=tbody.getElementsByTagName('td');this.calHead=this.element.getChildrenByClassName('ypopcal-month','td')[0];this.element.mon('mousedown',this.handleClick,this,true);};YAHOO.ext.DatePicker.prototype.buildInnerCal=function(dateVal){var days=this.getDaysInMonth(dateVal.getMonth()+1,dateVal.getFullYear());var firstOfMonth=new Date(dateVal.getFullYear(),dateVal.getMonth(),1);var startingPos=firstOfMonth.getDay();if(startingPos==0)startingPos=7;var pm=this.getPrevMonth(dateVal);var prevStart=this.getDaysInMonth(pm.getMonth()+1,pm.getFullYear())-startingPos;var cells=this.cells;days+=startingPos;var day=86400000;var date=this.clearTime(new Date(pm.getFullYear(),pm.getMonth(),prevStart));var today=this.clearTime(new Date()).getTime();var sel=this.selectedDate?this.clearTime(this.selectedDate).getTime():today+1;var min=this.minDate?this.clearTime(this.minDate).getTime():Number.NEGATIVE_INFINITY;var max=this.maxDate?this.clearTime(this.maxDate).getTime():Number.POSITIVE_INFINITY;var ddMatch=this.disabledDatesRE;var ddText=this.disabledDatesText;var ddays=this.disabledDays;var ddaysText=this.disabledDaysText;var format=this.format;var setCellClass=function(cal,cell,d){cell.title='';var t=d.getTime();if(t==today){cell.className+=' today';cell.title=cal.todayText;} +if(t==sel){cell.className+=' selected';} +if(tmax){cell.className=' ypopcal-disabled';cell.title=cal.maxText;return;} +if(ddays){var day=d.getDay();for(var i=0;i0){if(m>(inc/2)){newValue=value+(inc-m);}else{newValue=value-m;}} +return Math.max(min,newValue);},resizeElement:function(){var box=this.proxy.getBox();this.el.setBox(box,false,this.animate,this.duration,null,this.easing);this.updateChildSize();this.proxy.hide();return box;},constrain:function(v,diff,m,mx){if(v-diffmx){diff=mx-v;} +return diff;},onMouseMove:function(e){if(this.enabled){try{var curSize=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=curSize.width,h=curSize.height;var ow=w,oh=h;var mw=this.minWidth,mh=this.minHeight;var mxw=this.maxWidth,mxh=this.maxHeight;var wi=this.widthIncrement;var hi=this.heightIncrement;var eventXY=e.getXY();var diffX=-(this.startPoint[0]-Math.max(this.minX,eventXY[0]));var diffY=-(this.startPoint[1]-Math.max(this.minY,eventXY[1]));var pos=this.activeHandle.position;switch(pos){case'east':w+=diffX;w=Math.min(Math.max(mw,w),mxw);break;case'south':h+=diffY;h=Math.min(Math.max(mh,h),mxh);break;case'southeast':w+=diffX;h+=diffY;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case'north':diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'west':diffX=this.constrain(w,diffX,mw,mxw);x+=diffX;w-=diffX;break;case'northeast':w+=diffX;w=Math.min(Math.max(mw,w),mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'northwest':diffX=this.constrain(w,diffX,mw,mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;x+=diffX;w-=diffX;break;case'southwest':diffX=this.constrain(w,diffX,mw,mxw);h+=diffY;h=Math.min(Math.max(mh,h),mxh);x+=diffX;w-=diffX;break;} +var sw=this.snap(w,wi,mw);var sh=this.snap(h,hi,mh);if(sw!=w||sh!=h){switch(pos){case'northeast':y-=sh-h;break;case'north':y-=sh-h;break;case'southwest':x-=sw-w;break;case'west':x-=sw-w;break;case'northwest':x-=sw-w;y-=sh-h;break;} +w=sw;h=sh;} +if(this.preserveRatio){switch(pos){case'southeast':case'east':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);break;case'south':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'northeast':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'north':var tw=w;w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);x+=(tw-w)/2;break;case'southwest':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);var tw=w;w=ow*(h/oh);x+=tw-w;break;case'west':var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);y+=(th-h)/2;var tw=w;w=ow*(h/oh);x+=tw-w;break;case'northwest':var tw=w;var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);y+=th-h;x+=tw-w;break;}} +this.proxy.setBounds(x,y,w,h);if(this.dynamic){this.resizeElement();}}catch(e){}}},handleOver:function(){if(this.enabled){this.el.addClass('yresizable-over');}},handleOut:function(){if(!this.resizing){this.el.removeClass('yresizable-over');}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;}});YAHOO.ext.Resizable.positions={n:'north',s:'south',e:'east',w:'west',se:'southeast',sw:'southwest',nw:'northwest',ne:'northeast'};YAHOO.ext.Resizable.Handle=function(rz,pos,disableTrackOver,transparent){if(!this.tpl){var tpl=YAHOO.ext.DomHelper.createTemplate({tag:'div',cls:'yresizable-handle yresizable-handle-{0}',html:' '});tpl.compile();YAHOO.ext.Resizable.Handle.prototype.tpl=tpl;} +this.position=pos;this.rz=rz;this.el=this.tpl.append(rz.el.dom,[this.position],true);this.el.unselectable();if(transparent){this.el.setOpacity(0);} +this.el.mon('mousedown',this.onMouseDown,this,true);if(!disableTrackOver){this.el.mon('mouseover',this.onMouseOver,this,true);this.el.mon('mouseout',this.onMouseOut,this,true);}};YAHOO.ext.Resizable.Handle.prototype={afterResize:function(rz){},onMouseDown:function(e){this.rz.onMouseDown(this,e);},onMouseOver:function(e){this.rz.handleOver(this,e);},onMouseOut:function(e){this.rz.handleOut(this,e);}}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/widgets/SplitBar-min.js b/www/extras/yui-ext/build/widgets/SplitBar-min.js new file mode 100644 index 000000000..7d75794ad --- /dev/null +++ b/www/extras/yui-ext/build/widgets/SplitBar-min.js @@ -0,0 +1,19 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +if(YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr.clickTimeThresh=350;} +YAHOO.ext.SplitBar=function(dragElement,resizingElement,orientation,placement){this.el=YAHOO.ext.Element.get(dragElement,true);this.el.dom.unselectable='on';this.resizingEl=YAHOO.ext.Element.get(resizingElement,true);this.orientation=orientation||YAHOO.ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.onMoved=new YAHOO.util.CustomEvent("SplitBarMoved",this);this.animate=false;this.useShim=false;this.shim=null;this.proxy=YAHOO.ext.SplitBar.createProxy(this.orientation);this.dd=new YAHOO.util.DDProxy(this.el.dom.id,"SplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.placement=placement||(this.el.getX()>this.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; \ No newline at end of file diff --git a/www/extras/yui-ext/build/widgets/TabPanel-min.js b/www/extras/yui-ext/build/widgets/TabPanel-min.js new file mode 100644 index 000000000..2ca9b74b0 --- /dev/null +++ b/www/extras/yui-ext/build/widgets/TabPanel-min.js @@ -0,0 +1,29 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.TabPanel=function(container,config){this.el=getEl(container,true);this.tabPosition='top';this.currentTabWidth=0;this.minTabWidth=40;this.maxTabWidth=250;this.preferredTabWidth=175;this.resizeTabs=false;this.monitorResize=true;if(config){if(typeof config=='boolean'){this.tabPosition=config?'bottom':'top';}else{YAHOO.ext.util.Config.apply(this,config);}} +if(this.tabPosition=='bottom'){this.bodyEl=getEl(this.createBody(this.el.dom));this.el.addClass('ytabs-bottom');} +this.stripWrap=getEl(this.createStrip(this.el.dom),true);this.stripEl=getEl(this.createStripList(this.stripWrap.dom),true);this.stripBody=getEl(this.stripWrap.dom.firstChild.firstChild,true);if(this.tabPosition!='bottom'){this.bodyEl=getEl(this.createBody(this.el.dom));this.el.addClass('ytabs-top');} +this.items=[];this.bodyEl.setStyle('position','relative');if(!this.items.indexOf){this.items.indexOf=function(o){for(var i=0,len=this.length;i1){var newTab=this.getNextAvailable(index);if(newTab)newTab.activate();} +tab.purgeListeners();this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);} +items.splice(index,1);delete this.items[tab.id];this.autoSizeTabs();},getNextAvailable:function(start){var items=this.items;var index=start;while(index=0){var item=items[--index];if(item&&!item.isHidden()){return item;}} +return null;},disableTab:function(id){var tab=this.items[id];if(tab&&this.active!=tab){tab.disable();}},enableTab:function(id){var tab=this.items[id];tab.enable();},activate:function(id){var tab=this.items[id];if(tab==this.active){return tab;} +var e={};this.fireEvent('beforetabchange',this,e,tab);if(e.cancel!==true&&!tab.disabled){if(this.active){this.active.hide();} +this.active=this.items[id];this.active.show();this.onTabChange.fireDirect(this,this.active);} +return tab;},getActiveTab:function(){return this.active;},syncHeight:function(targetHeight){var height=(targetHeight||this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb');var bm=this.bodyEl.getMargins();var newHeight=height-(this.stripWrap.getHeight())-(bm.top+bm.bottom);this.bodyEl.setHeight(newHeight);return newHeight;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var count=this.items.length;var vcount=count-this.hiddenCount;if(!this.resizeTabs||count<1||vcount<1||this.updating)return;var w=Math.max(this.el.getWidth()-this.cpad,10);var availWidth=Math.floor(w/vcount);var b=this.stripBody;if(b.getWidth()>w){var tabs=this.items;this.setTabWidth(Math.max(availWidth,this.minTabWidth));if(availWidth
';return strip.firstChild.firstChild.firstChild.firstChild;};YAHOO.ext.TabPanel.prototype.createBody=function(container){var body=document.createElement('div');YAHOO.util.Dom.generateId(body,'tab-body');YAHOO.util.Dom.addClass(body,'yui-ext-tabbody');container.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createItemBody=function(bodyEl,id){var body=YAHOO.util.Dom.get(id);if(!body){body=document.createElement('div');body.id=id;} +YAHOO.util.Dom.addClass(body,'yui-ext-tabitembody');bodyEl.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createStripElements=function(stripEl,text,closable){var td=document.createElement('td');stripEl.appendChild(td);if(closable){td.className="ytab-closable";if(!this.closeTpl){this.closeTpl=new YAHOO.ext.Template(''+'{text}'+'
 
');} +var el=this.closeTpl.overwrite(td,{'text':text});var close=el.getElementsByTagName('div')[0];var inner=el.getElementsByTagName('em')[0];return{'el':el,'close':close,'inner':inner};}else{if(!this.tabTpl){this.tabTpl=new YAHOO.ext.Template(''+'{text}');} +var el=this.tabTpl.overwrite(td,{'text':text});var inner=el.getElementsByTagName('em')[0];return{'el':el,'inner':inner};}}; \ No newline at end of file diff --git a/www/extras/yui-ext/build/widgets/TemplateView-min.js b/www/extras/yui-ext/build/widgets/TemplateView-min.js new file mode 100644 index 000000000..58b4fc1ce --- /dev/null +++ b/www/extras/yui-ext/build/widgets/TemplateView-min.js @@ -0,0 +1,23 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.View=function(container,tpl,dataModel,config){this.el=getEl(container,true);this.nodes=this.el.dom.childNodes;if(typeof tpl=='string'){tpl=new YAHOO.ext.Template(tpl);} +tpl.compile();this.tpl=tpl;this.setDataModel(dataModel);var CE=YAHOO.util.CustomEvent;this.events={'click':new CE('click'),'dblclick':new CE('dblclick'),'contextmenu':new CE('contextmenu'),'selectionchange':new CE('selectionchange')};this.el.mon("click",this.onClick,this,true);this.el.mon("dblclick",this.onDblClick,this,true);this.el.mon("contextmenu",this.onContextMenu,this,true);this.selectedClass='ydataview-selected';this.selections=[];this.lastSelection=null;this.jsonRoot=null;YAHOO.ext.util.Config.apply(this,config);if(this.renderUpdates||this.jsonRoot){var um=this.el.getUpdateManager();um.setRenderer(this);}};YAHOO.extendX(YAHOO.ext.View,YAHOO.ext.util.Observable,{getEl:function(){return this.el;},render:function(el,response){this.clearSelections();this.el.update('');var o;try{o=YAHOO.ext.util.JSON.decode(response.responseText);if(this.jsonRoot){o=eval('o.'+this.jsonRoot);}}catch(e){} +if(o&&o.length){this.html=[];for(var i=0,len=o.length;i=this.nodes.length-1){this.el.update('');}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){el.removeChild(this.nodes[startIndex]);} +this.updateIndexes(startIndex);}},insertNodes:function(dm,startIndex,endIndex){if(this.nodes.length==0){this.refresh();}else{this.clearSelections();var t=this.tpl;var before=this.nodes[startIndex];var dm=this.dataModel;if(before){for(var i=startIndex;i<=endIndex;i++){t.insertBefore(before,this.prepareData(dm.getRow(i),i));}}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){t.append(el,this.prepareData(dm.getRow(i),i));}} +this.updateIndexes(startIndex);}},updateIndexes:function(dm,startIndex,endIndex){var ns=this.nodes;startIndex=startIndex||0;endIndex=endIndex||ns.length-1;for(var i=startIndex;i<=endIndex;i++){ns[i].nodeIndex=i;}},setDataModel:function(dm){if(!dm)return;this.unplugDataModel(this.dataModel);this.dataModel=dm;dm.on('cellupdated',this.refreshNode,this,true);dm.on('datachanged',this.refresh,this,true);dm.on('rowsdeleted',this.deleteNodes,this,true);dm.on('rowsinserted',this.insertNodes,this,true);dm.on('rowsupdated',this.refreshNodes,this,true);dm.on('rowssorted',this.refresh,this,true);this.refresh();},unplugDataModel:function(dm){if(!dm)return;dm.removeListener('cellupdated',this.refreshNode,this);dm.removeListener('datachanged',this.refresh,this);dm.removeListener('rowsdeleted',this.deleteNodes,this);dm.removeListener('rowsinserted',this.insertNodes,this);dm.removeListener('rowsupdated',this.refreshNodes,this);dm.removeListener('rowssorted',this.refresh,this);this.dataModel=null;},findItemFromChild:function(node){var el=this.el.dom;if(!node||node.parentNode==el){return node;} +var p=node.parentNode;while(p&&p!=el){if(p.parentNode==el){return p;} +p=p.parentNode;} +return null;},onClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){var index=this.indexOf(item);this.onItemClick(item,index,e);this.fireEvent('click',this,index,item,e);}else{this.clearSelections();}},onContextMenu:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('contextmenu',this,this.indexOf(item),item,e);}},onDblClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('dblclick',this,this.indexOf(item),item,e);}},onItemClick:function(item,index,e){if(this.multiSelect||this.singleSelect){if(this.multiSelect&&e.shiftKey&&this.lastSelection){this.select(this.getNodes(this.indexOf(this.lastSelection),index),false);}else{this.select(item,this.multiSelect&&e.ctrlKey);this.lastSelection=item;}}},getSelectionCount:function(){return this.selections.length;},getSelectedNodes:function(){return this.selections;},getSelectedIndexes:function(){var indexes=[];for(var i=0,len=this.selections.length;i-1);this.isSafari=(ua.indexOf('webkit')>-1);this.isIE=(window.ActiveXObject);this.isIE7=(ua.indexOf('msie 7')>-1);this.isGecko=!this.isSafari&&(ua.indexOf('gecko')>-1);if(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1){this.isWindows=true;}else if(ua.indexOf("macintosh")!=-1){this.isMac=true;}}();YAHOO.print=function(arg1,arg2,etc){if(!YAHOO.ext._console){var cs=YAHOO.ext.DomHelper.insertBefore(document.body.firstChild,{tag:'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;'+'background:white;position:absolute;right:5px;top:5px;'+'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'},true);new YAHOO.ext.Resizable(cs,{transparent:true,handles:'all',pinned:true,adjustments:[0,0],wrap:true,draggable:(YAHOO.util.DD?true:false)});cs.on('dblclick',cs.hide);YAHOO.ext._console=cs;} +var msg='';for(var i=0,len=arguments.length;i';} +YAHOO.ext._console.dom.innerHTML=msg+YAHOO.ext._console.dom.innerHTML;YAHOO.ext._console.dom.scrollTop=0;YAHOO.ext._console.show();};YAHOO.printf=function(format,arg1,arg2,etc){var args=Array.prototype.slice.call(arguments,1);YAHOO.print(format.replace(/\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g,function(m,a1,a2,a3){if(m.chatAt=='{'){return m.slice(1,-1);} +var rpl=args[a1];if(a3){var f=eval(a3);rpl=f(rpl);} +return rpl?rpl:'';}));} +YAHOO.util.CustomEvent.prototype.fireDirect=function(){var len=this.subscribers.length;for(var i=0;i 0) {" +var regex="";var special=false;var ch='';for(var i=0;i 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" ++"{return new Date(y, m, d, h, i);}\n" ++"else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n" ++"{return new Date(y, m, d, h);}\n" ++"else if (y > 0 && m >= 0 && d > 0)\n" ++"{return new Date(y, m, d);}\n" ++"else if (y > 0 && m >= 0)\n" ++"{return new Date(y, m);}\n" ++"else if (y > 0)\n" ++"{return new Date(y);}\n" ++"}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(character,currentGroup){switch(character){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:0,c:null,s:"(?:\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+currentGroup+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+currentGroup+"], 10);\n" ++"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+currentGroup+"] == 'am') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+currentGroup+"] == 'AM') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(character)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+") ++String.leftPad(Math.floor(this.getTimezoneOffset()/60),2,"0") ++String.leftPad(this.getTimezoneOffset()%60,2,"0");};Date.prototype.getDayOfYear=function(){var num=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var i=0;i + + + yui-ext Documentation Center + + + +
+
Loading...
+
+ + + + + + + + + + +
+ + Documentation Home

Examples and Demos

+ +
+Help Forums +
+ +Help Forums + + + + diff --git a/www/extras/yui-ext/docs/output/AbstractColumnModel.js.html b/www/extras/yui-ext/docs/output/AbstractColumnModel.js.html new file mode 100644 index 000000000..acf0ebafd --- /dev/null +++ b/www/extras/yui-ext/docs/output/AbstractColumnModel.js.html @@ -0,0 +1,131 @@ +AbstractColumnModel.js
/**
+ * @class YAHOO.ext.grid.AbstractColumnModel
+ * @extends YAHOO.ext.util.Observable
+ * This abstract class defines the ColumnModel interface and provides default implementations of the events required by the Grid. 
+ * @constructor
+*/
+YAHOO.ext.grid.AbstractColumnModel = function(){
+	// legacy events
+	this.onWidthChange = new YAHOO.util.CustomEvent('widthChanged');
+    this.onHeaderChange = new YAHOO.util.CustomEvent('headerChanged');
+	this.onHiddenChange = new YAHOO.util.CustomEvent('hiddenChanged');
+    
+    this.events = {
+        /**
+	     * @event widthchange
+	     * Fires when the width of a column changes
+	     * @param {ColumnModel} this
+	     * @param {Number} columnIndex The column index
+	     * @param {Number} newWidth The new width
+	     */
+	    'widthchange': this.onWidthChange,
+        /**
+	     * @event headerchange
+	     * Fires when the text of a header changes 
+	     * @param {ColumnModel} this
+	     * @param {Number} columnIndex The column index
+	     * @param {Number} newText The new header text
+	     */
+	    'headerchange': this.onHeaderChange,
+        /**
+	     * @event hiddenchange
+	     * Fires when a column is hidden or "unhidden"
+	     * @param {ColumnModel} this
+	     * @param {Number} columnIndex The column index
+	     * @param {Number} hidden true if hidden, false otherwise
+	     */
+	    'hiddenchange': this.onHiddenChange
+    };
+};
+
+YAHOO.ext.grid.AbstractColumnModel.prototype = {
+	fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    
+    fireWidthChange : function(colIndex, newWidth){
+		this.onWidthChange.fireDirect(this, colIndex, newWidth);
+	},
+	
+	fireHeaderChange : function(colIndex, newHeader){
+		this.onHeaderChange.fireDirect(this, colIndex, newHeader);
+	},
+	
+	fireHiddenChange : function(colIndex, hidden){
+		this.onHiddenChange.fireDirect(this, colIndex, hidden);
+	},
+	
+	/**
+     * Interface method - Returns the number of columns.
+     * @return {Number}
+     */
+    getColumnCount : function(){
+        return 0;
+    },
+    
+    /**
+     * Interface method - Returns true if the specified column is sortable.
+     * @param {Number} col The column index
+     * @return {Boolean}
+     */
+    isSortable : function(col){
+        return false;
+    },
+    
+    /**
+     * Interface method - Returns true if the specified column is hidden.
+     * @param {Number} col The column index
+     * @return {Boolean}
+     */
+    isHidden : function(col){
+        return false;
+    },
+    
+    /**
+     * Interface method - Returns the sorting comparison function defined for the column (defaults to sortTypes.none).
+     * @param {Number} col The column index
+     * @return {Function}
+     */
+    getSortType : function(col){
+        return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none;
+    },
+    
+    /**
+     * Interface method - Returns the rendering (formatting) function defined for the column.
+     * @param {Number} col The column index
+     * @return {Function}
+     */
+    getRenderer : function(col){
+        return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer;
+    },
+    
+    /**
+     * Interface method - Returns the width for the specified column.
+     * @param {Number} col The column index
+     * @return {Number}
+     */
+    getColumnWidth : function(col){
+        return 0;
+    },
+    
+    /**
+     * Interface method - Returns the total width of all columns.
+     * @return {Number}
+     */
+    getTotalWidth : function(){
+        return 0;
+    },
+    
+    /**
+     * Interface method - Returns the header for the specified column.
+     * @param {Number} col The column index
+     * @return {String}
+     */
+    getColumnHeader : function(col){
+        return '';
+    }
+};
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/AbstractDataModel.js.html b/www/extras/yui-ext/docs/output/AbstractDataModel.js.html new file mode 100644 index 000000000..410e3d97c --- /dev/null +++ b/www/extras/yui-ext/docs/output/AbstractDataModel.js.html @@ -0,0 +1,226 @@ +AbstractDataModel.js
/**
+ * @class YAHOO.ext.grid.AbstractDataModel
+ * @extends YAHOO.ext.util.Observable
+ * This abstract class provides default implementations of the events required by the Grid. 
+ It takes care of the creating the CustomEvents and provides some convenient methods for firing the events. <br><br>
+ * @constructor
+*/
+YAHOO.ext.grid.AbstractDataModel = function(){
+    /** Fires when a cell is updated - fireDirect sig: (this, rowIndex, columnIndex)
+     * @private
+     * @type YAHOO.util.CustomEvent
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onCellUpdated = new YAHOO.util.CustomEvent('onCellUpdated');
+    /** Fires when all data needs to be revalidated - fireDirect sig: (thisd)
+     * @private
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onTableDataChanged = new YAHOO.util.CustomEvent('onTableDataChanged');
+    /** Fires when rows are deleted - fireDirect sig: (this, firstRowIndex, lastRowIndex)
+     * @private
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onRowsDeleted = new YAHOO.util.CustomEvent('onRowsDeleted');
+    /** Fires when a rows are inserted - fireDirect sig: (this, firstRowIndex, lastRowIndex)
+     * @private
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onRowsInserted = new YAHOO.util.CustomEvent('onRowsInserted');
+    /** Fires when a rows are updated - fireDirect sig: (this, firstRowIndex, lastRowIndex)
+     * @private
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onRowsUpdated = new YAHOO.util.CustomEvent('onRowsUpdated');
+    /** Fires when a sort has reordered the rows - fireDirect sig: (this, sortColumnIndex, 
+     * @private
+     * sortDirection = 'ASC' or 'DESC')
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     */
+    this.onRowsSorted = new YAHOO.util.CustomEvent('onRowsSorted');
+    
+    this.events = {
+      /**
+       * @event cellupdated
+       * Fires when a cell is updated
+       * @param {DataModel} this
+       * @param {Number} rowIndex
+       * @param {Number} columnIndex
+       */
+      'cellupdated' : this.onCellUpdated,
+      /**
+       * @event datachanged
+       * Fires when the entire data structure has changed
+       * @param {DataModel} this
+       */
+      'datachanged' : this.onTableDataChanged,
+      /**
+       * @event rowsdeleted
+       * Fires  when a range of rows have been deleted
+       * @param {DataModel} this
+       * @param {Number} firstRowIndex
+       * @param {Number} lastRowIndex
+       */
+      'rowsdeleted' : this.onRowsDeleted,
+      /**
+       * @event rowsinserted
+       * Fires when a range of rows have been inserted
+       * @param {DataModel} this
+       * @param {Number} firstRowIndex
+       * @param {Number} lastRowIndex
+       */
+      'rowsinserted' : this.onRowsInserted,
+      /**
+       * @event rowsupdated
+       * Fires when a range of rows have been updated
+       * @param {DataModel} this
+       * @param {Number} firstRowIndex
+       * @param {Number} lastRowIndex
+       */
+      'rowsupdated' : this.onRowsUpdated,
+      /**
+       * @event rowssorted
+       * Fires when the data has been sorted
+       * @param {DataModel} this
+       */
+      'rowssorted' : this.onRowsSorted
+    };
+};
+
+YAHOO.ext.grid.AbstractDataModel.prototype = {
+    
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    
+    /**
+     *  Notifies listeners that the value of the cell at [row, col] has been updated
+     * @deprecated
+     * @private
+     */
+    fireCellUpdated : function(row, col){
+        this.onCellUpdated.fireDirect(this, row, col);
+    },
+    
+    /**
+     *  Notifies listeners that all data for the grid may have changed - use as a last resort. This 
+     * also wipes out all selections a user might have made.
+     * @deprecated
+     * @private
+     */
+    fireTableDataChanged : function(){
+        this.onTableDataChanged.fireDirect(this);
+    },
+    
+    /**
+     *  Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been deleted
+     * @deprecated
+     * @private
+     */
+    fireRowsDeleted : function(firstRow, lastRow){
+        this.onRowsDeleted.fireDirect(this, firstRow, lastRow);
+    },
+    
+    /**
+     *  Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been inserted
+     * @deprecated
+     * @private
+     */
+    fireRowsInserted : function(firstRow, lastRow){
+        this.onRowsInserted.fireDirect(this, firstRow, lastRow);
+    },
+    
+    /**
+     *  Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been updated
+     * @deprecated
+     * @private
+     */
+    fireRowsUpdated : function(firstRow, lastRow){
+        this.onRowsUpdated.fireDirect(this, firstRow, lastRow);
+    },
+    
+    /**
+     *  Notifies listeners that rows have been sorted and any indexes may be invalid
+     * @deprecated
+     * @private
+     */
+    fireRowsSorted : function(sortColumnIndex, sortDir, noRefresh){
+        this.onRowsSorted.fireDirect(this, sortColumnIndex, sortDir, noRefresh);
+    },
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method.
+     * See {@link YAHOO.ext.DefaultDataModel#sort} for an example implementation.
+    * @private
+      */
+    sort : function(sortInfo, columnIndex, direction, suppressEvent){
+    	
+    },
+    
+    /**
+     * Interface method to supply info regarding the Grid's current sort state - if overridden,
+     * this should return an object like this {column: this.sortColumn, direction: this.sortDir}.
+     * @return {Object} 
+    * @private
+      */
+    getSortState : function(){
+    	return {column: this.sortColumn, direction: this.sortDir};
+    },
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method.
+     * See {@link YAHOO.ext.DefaultDataModel} for an example implementation.
+     * @private
+     */
+    getRowCount : function(){
+    	
+    },
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method to support virtual row counts.
+     * @private
+     */
+    getTotalRowCount : function(){
+    	return this.getRowCount();
+    },
+    
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method.
+     * See {@link YAHOO.ext.DefaultDataModel} for an example implementation.
+    * @private
+      */
+    getRowId : function(rowIndex){
+    	
+    },
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method.
+     * See {@link YAHOO.ext.DefaultDataModel} for an example implementation.
+     * @private
+     */
+    getValueAt : function(rowIndex, colIndex){
+    	
+    },
+    
+    /**
+     * Empty interface method - Classes which extend AbstractDataModel should implement this method.
+     * See {@link YAHOO.ext.DefaultDataModel} for an example implementation.
+     * @private
+     */
+    setValueAt : function(value, rowIndex, colIndex){
+    	
+    },
+    
+    isPaged : function(){
+        return false;
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Actor.js.html b/www/extras/yui-ext/docs/output/Actor.js.html new file mode 100644 index 000000000..a2654420a --- /dev/null +++ b/www/extras/yui-ext/docs/output/Actor.js.html @@ -0,0 +1,758 @@ +Actor.js
+/**
+ * @class YAHOO.ext.Actor
+ * Provides support for syncing and chaining of Element Yahoo! UI based animation and some common effects. Actors support "self-play" without an Animator.<br><br>
+ * <b>Note: Along with the animation methods defined below, this class inherits and captures all of the "set" or animation methods of {@link YAHOO.ext.Element}. "get" methods are not captured and execute immediately.</b>
+ * <br><br>Usage:<br>
+ * <pre><code>
+ * var actor = new YAHOO.ext.Actor('myElementId');
+ * actor.startCapture(true);
+ * actor.moveTo(100, 100, true);
+ * actor.squish();
+ * actor.play();
+ * <br>
+ * // or to start capturing immediately, with no Animator (the null second param)
+ * <br>
+ * var actor = new YAHOO.ext.Actor('myElementId', null, true);
+ * actor.moveTo(100, 100, true);
+ * actor.squish();
+ * actor.play();
+ * </code></pre>
+ * @extends YAHOO.ext.Element
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.Anim
+ * @requires YAHOO.util.ColorAnim
+ * @requires YAHOO.util.Motion
+ * @className YAHOO.ext.Actor
+ * @constructor
+ * Create new Actor.
+ * @param {String/HTMLElement} el The dom element or element id 
+ * @param {<i>YAHOO.ext.Animator</i>} animator (optional) The Animator that will capture this Actor's actions
+ * @param {<i>Boolean</i>} selfCapture (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false)
+ */
+YAHOO.ext.Actor = function(element, animator, selfCapture){
+    this.el = YAHOO.ext.Element.get(element, true); // cache el object for playback
+    YAHOO.ext.Actor.superclass.constructor.call(this, element, true);
+    this.onCapture = new YAHOO.util.CustomEvent('Actor.onCapture');
+    if(animator){
+        /**
+        * The animator used to sync this actor with other actors
+        * @member YAHOO.ext.Actor
+        */
+        animator.addActor(this);
+    }
+    /**
+    * Whether this actor is currently capturing
+    * @member YAHOO.ext.Actor
+    */
+    this.capturing = selfCapture;
+    this.playlist = selfCapture ? new YAHOO.ext.Animator.AnimSequence() : null;
+};
+
+YAHOO.extendX(YAHOO.ext.Actor, YAHOO.ext.Element);
+
+/**
+ * Captures an action for this actor. Generally called internally but can be called directly.
+ * @param {YAHOO.ext.Actor.Action} action
+ */
+YAHOO.ext.Actor.prototype.capture = function(action){
+    if(this.playlist != null){
+        this.playlist.add(action);
+    }
+    this.onCapture.fireDirect(this, action);
+    return action;
+};
+
+/** @ignore */
+YAHOO.ext.Actor.overrideAnimation = function(method, animParam, onParam){
+    return function(){
+        if(!this.capturing){
+            return method.apply(this, arguments);
+        }
+        var args = Array.prototype.slice.call(arguments, 0);
+        if(args[animParam] === true){
+            return this.capture(new YAHOO.ext.Actor.AsyncAction(this, method, args, onParam));
+        }else{
+            return this.capture(new YAHOO.ext.Actor.Action(this, method, args));
+        }
+    };
+}
+
+/** @ignore */
+YAHOO.ext.Actor.overrideBasic = function(method){
+    return function(){
+        if(!this.capturing){
+            return method.apply(this, arguments);
+        }
+        var args = Array.prototype.slice.call(arguments, 0);
+        return this.capture(new YAHOO.ext.Actor.Action(this, method, args));
+    };
+}
+
+// All of these methods below are marked "ignore" because JSDoc treats them as fields, not function. How brilliant. The Element methods are documented anyway though.
+/** Capturing override - See {@link YAHOO.ext.Element#setVisibilityMode} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setVisibilityMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode);
+/** Capturing override - See {@link YAHOO.ext.Element#enableDisplayMode} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.enableDisplayMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode);
+/** Capturing override - See {@link YAHOO.ext.Element#focus} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.focus = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus);
+/** Capturing override - See {@link YAHOO.ext.Element#addClass} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.addClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass);
+/** Capturing override - See {@link YAHOO.ext.Element#removeClass} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.removeClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass);
+/** Capturing override - See {@link YAHOO.ext.Element#replaceClass} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.replaceClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass);
+/** Capturing override - See {@link YAHOO.ext.Element#setStyle} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setStyle = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle);
+/** Capturing override - See {@link YAHOO.ext.Element#setLeft} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setLeft = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft);
+/** Capturing override - See {@link YAHOO.ext.Element#setTop} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setTop = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop);
+/** Capturing override - See {@link YAHOO.ext.Element#setAbsolutePositioned} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setAbsolutePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned);
+/** Capturing override - See {@link YAHOO.ext.Element#setRelativePositioned} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setRelativePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned);
+/** Capturing override - See {@link YAHOO.ext.Element#clearPositioning} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.clearPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning);
+/** Capturing override - See {@link YAHOO.ext.Element#setPositioning} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning);
+/** Capturing override - See {@link YAHOO.ext.Element#clip} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.clip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip);
+/** Capturing override - See {@link YAHOO.ext.Element#unclip} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.unclip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip);
+/** Capturing override - See {@link YAHOO.ext.Element#clearOpacity} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.clearOpacity = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity);
+/** Capturing override - See {@link YAHOO.ext.Element#update} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.update = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update);
+/** Capturing override - See {@link YAHOO.ext.Element#remove} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.remove = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove);
+YAHOO.ext.Actor.prototype.fitToParent = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent);
+YAHOO.ext.Actor.prototype.appendChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild);
+YAHOO.ext.Actor.prototype.createChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild);
+YAHOO.ext.Actor.prototype.appendTo = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo);
+YAHOO.ext.Actor.prototype.insertBefore = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore);
+YAHOO.ext.Actor.prototype.insertAfter = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter);
+YAHOO.ext.Actor.prototype.wrap = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap);
+YAHOO.ext.Actor.prototype.replace = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace);
+YAHOO.ext.Actor.prototype.insertHtml = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml);
+YAHOO.ext.Actor.prototype.set = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set);
+
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#load} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.load = function(){
+   if(!this.capturing){
+        return YAHOO.ext.Actor.superclass.load.apply(this, arguments);
+   }
+   var args = Array.prototype.slice.call(arguments, 0);
+   return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.load, 
+        args, 2));
+};
+
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#animate} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.animate = function(args, duration, onComplete, easing, animType){
+    if(!this.capturing){
+        return YAHOO.ext.Actor.superclass.animate.apply(this, arguments);
+    }
+    return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.animate, 
+        [args, duration, onComplete, easing, animType], 2));
+};
+
+/** Capturing and animation syncing override - See {@link YAHOO.ext.Element#setVisible} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setVisible = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible, 1, 3);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#toggle} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.toggle = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle, 0, 2);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setXY} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setXY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY, 1, 3);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setLocation} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setLocation = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation, 2, 4);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setWidth} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setWidth = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth, 1, 3);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setHeight} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight, 1, 3);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setSize} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setSize = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize, 2, 4);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setBounds} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setBounds = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds, 4, 6);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setOpacity} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setOpacity = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity, 1, 3);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#moveTo} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.moveTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo, 2, 4);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#move} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.move = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move, 2, 4);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#alignTo} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.alignTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo, 3, 5);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#hide} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.hide = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide, 0, 2);
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#show} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.show = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show, 0, 2);
+
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setBox} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setBox = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox, 2, 4);
+
+/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#autoHeight} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.autoHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight, 0, 2);
+/** Capturing override - See {@link YAHOO.ext.Element#setX} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setX = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX, 1, 3);
+/** Capturing override - See {@link YAHOO.ext.Element#setY} for method details.
+ * @method */
+YAHOO.ext.Actor.prototype.setY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY, 1, 3);
+
+/**
+ * Start self capturing calls on this Actor. All subsequent calls are captured and executed when play() is called.
+ */
+YAHOO.ext.Actor.prototype.startCapture = function(){
+    this.capturing = true;
+    this.playlist = new YAHOO.ext.Animator.AnimSequence();
+ };
+ 
+ /**
+ * Stop self capturing calls on this Actor.
+ */
+ YAHOO.ext.Actor.prototype.stopCapture = function(){
+     this.capturing = false;
+ };
+
+/**
+ * Clears any calls that have been self captured.
+ */
+YAHOO.ext.Actor.prototype.clear = function(){
+    this.playlist = new YAHOO.ext.Animator.AnimSequence();
+};
+
+/**
+ * Starts playback of self captured calls.
+ * @param {<i>Function</i>} oncomplete (optional) Callback to execute when playback has completed
+ */
+YAHOO.ext.Actor.prototype.play = function(oncomplete){
+    this.capturing = false;
+    if(this.playlist){
+        this.playlist.play(oncomplete);
+    }
+ };
+
+/**
+ * Capture a function call.
+ * @param {Function} fcn The function to call
+ * @param {<i>Array</i>} args (optional) The arguments to call the function with
+ * @param {<i>Object</i>} scope (optional) The scope of the function
+ */
+YAHOO.ext.Actor.prototype.addCall = function(fcn, args, scope){
+    if(!this.capturing){
+        fcn.apply(scope || this, args || []);
+    }else{
+        this.capture(new YAHOO.ext.Actor.Action(scope, fcn, args || []));
+    }
+};
+
+/**
+ * Capture an async function call.
+ * @param {Function} fcn The function to call
+ * @param {Number} callbackIndex The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED.
+ * @param {<i>Array</i>} args The arguments to call the function with
+ * @param {<i>Object</i>} scope (optional) The scope of the function
+ */
+YAHOO.ext.Actor.prototype.addAsyncCall = function(fcn, callbackIndex, args, scope){
+    if(!this.capturing){
+        fcn.apply(scope || this, args || []);
+    }else{
+       this.capture(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex));
+    }
+ },
+ 
+/**
+ * Capture a pause (in seconds).
+ * @param {Number} seconds The seconds to pause
+ */
+YAHOO.ext.Actor.prototype.pause = function(seconds){
+    this.capture(new YAHOO.ext.Actor.PauseAction(seconds));
+ };
+ 
+/**
+* Shake this element from side to side
+*/
+YAHOO.ext.Actor.prototype.shake = function(){
+    this.move('left', 20, true, .05);
+    this.move('right', 40, true, .05);
+    this.move('left', 40, true, .05);
+    this.move('right', 20, true, .05);
+};
+
+/**
+* Bounce this element from up and down
+*/
+YAHOO.ext.Actor.prototype.bounce = function(){
+    this.move('up', 20, true, .05);
+    this.move('down', 40, true, .05);
+    this.move('up', 40, true, .05);
+    this.move('down', 20, true, .05);
+};
+
+/**
+* Show the element using a "blinds" effect
+* @param {String} anchor The part of the element that it should appear to exapand from. 
+                        The short/long options currently are t/top, l/left
+* @param {<i>Number</i>} newSize (optional) The size to animate to. (Default to current size)
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut)
+*/
+YAHOO.ext.Actor.prototype.blindShow = function(anchor, newSize, duration, easing){
+    var size = newSize || this.getSize();
+    this.clip();
+    this.setVisible(true);
+    anchor = anchor.toLowerCase();
+    switch(anchor){
+        case 't':
+        case 'top':
+            this.setHeight(1);
+            this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+        case 'l':
+        case 'left':
+            this.setWidth(1);
+            this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+    }
+    this.unclip();
+    return size;
+};
+
+/**
+* Hide the element using a "blinds" effect
+* @param {String} anchor The part of the element that it should appear to collapse to.
+                        The short/long options are t/top, l/left, b/bottom, r/right.
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+*/
+YAHOO.ext.Actor.prototype.blindHide = function(anchor, duration, easing){
+    var size = this.getSize();
+    this.clip();
+    anchor = anchor.toLowerCase();
+    switch(anchor){
+        case 't':
+        case 'top':
+            this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+        case 'l':
+        case 'left':
+            this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+        case 'r':
+        case 'right':
+            this.animate({width: {to: 1}, points: {by: [this.getWidth(), 0]}}, 
+            duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion);
+            this.setVisible(false);
+        break;
+        case 'b':
+        case 'bottom':
+            this.animate({height: {to: 1}, points: {by: [0, this.getHeight()]}}, 
+            duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion);
+            this.setVisible(false);
+        break;
+    }
+    return size;
+};
+
+/**
+* Show the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindShow effect is rendered. 
+* @param {String} anchor The part of the element that it should appear to slide from. 
+                        The short/long options currently are t/top, l/left
+* @param {<i>Number</i>} newSize (optional) The size to animate to. (Default to current size)
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOuth)
+*/
+YAHOO.ext.Actor.prototype.slideShow = function(anchor, newSize, duration, easing, clearPositioning){
+    var size = newSize || this.getSize();
+    this.clip();
+    var firstChild = this.dom.firstChild;
+    if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { // can't do a slide with only a textnode
+        this.blindShow(anchor, newSize, duration, easing);
+        return;
+    }
+    var child = YAHOO.ext.Element.get(firstChild, true);
+    var pos = child.getPositioning();
+    this.addCall(child.setAbsolutePositioned, null, child);
+    this.setVisible(true);
+    anchor = anchor.toLowerCase();
+    switch(anchor){
+        case 't':
+        case 'top':
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['top', ''], child);
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['bottom', '0px'], child);
+            this.setHeight(1);
+            this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+        case 'l':
+        case 'left':
+            this.addCall(child.setStyle, ['left', ''], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.addCall(child.setStyle, ['right', '0px'], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.setWidth(1);
+            this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+        case 'r':
+        case 'right':
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.setWidth(1);
+            this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+        case 'b':
+        case 'bottom':
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.setHeight(1);
+            this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut);
+        break;
+    }
+    if(clearPositioning !== false){
+      this.addCall(child.setPositioning, [pos], child);
+    }
+    this.unclip();
+    return size;
+};
+
+/**
+* Hide the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindHide effect is rendered. 
+* @param {String} anchor The part of the element that it should appear to slide to.
+                        The short/long options are t/top, l/left, b/bottom, r/right.
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+*/
+YAHOO.ext.Actor.prototype.slideHide = function(anchor, duration, easing){
+    var size = this.getSize();
+    this.clip();
+    var firstChild = this.dom.firstChild;
+    if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { // can't do a slide with only a textnode
+        this.blindHide(anchor, duration, easing);
+        return;
+    }
+    var child = YAHOO.ext.Element.get(firstChild, true);
+    var pos = child.getPositioning();
+    this.addCall(child.setAbsolutePositioned, null, child);
+    anchor = anchor.toLowerCase();
+    switch(anchor){
+        case 't':
+        case 'top':
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['top', ''], child);
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['bottom', '0px'], child);
+            this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+        case 'l':
+        case 'left':
+            this.addCall(child.setStyle, ['left', ''], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.addCall(child.setStyle, ['right', '0px'], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+        case 'r':
+        case 'right':
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+        case 'b':
+        case 'bottom':
+            this.addCall(child.setStyle, ['right', ''], child);
+            this.addCall(child.setStyle, ['top', '0px'], child);
+            this.addCall(child.setStyle, ['left', '0px'], child);
+            this.addCall(child.setStyle, ['bottom', ''], child);
+            this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn);
+            this.setVisible(false);
+        break;
+    }
+    this.addCall(child.setPositioning, [pos], child);
+    return size;
+};
+
+/**
+* Hide the element by "squishing" it into the corner
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.squish = function(duration){
+    var size = this.getSize();
+    this.clip();
+    this.setSize(1, 1, true, duration || .5);
+    this.setVisible(false);
+    return size;
+};
+
+/**
+* Fade an element in
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.appear = function(duration){
+    this.setVisible(true, true, duration);
+};
+
+/**
+* Fade an element out
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.fade = function(duration){
+    this.setVisible(false, true, duration);
+};
+
+/**
+* Blink the element as if it was clicked and then collapse on it's center
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.switchOff = function(duration){
+    this.clip();
+    this.setVisible(false, true, .1);
+    this.clearOpacity();
+    this.setVisible(true);
+    this.animate({height: {to: 1}, points: {by: [0, this.getHeight()/2]}}, 
+            duration || .5, null, YAHOO.util.Easing.easeOut, YAHOO.util.Motion);
+    this.setVisible(false);
+};
+
+/**
+* Highlight the element using a background color (or passed attribute) animation
+* @param {String} color (optional) The color to use for the highlight
+* @param {<i>String</i>} fromColor (optional) If the element does not currently have a background color, you will need to pass in a color to animate from
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>String</i>} attribute (optional) Specify a CSS attribute to use other than background color - camelCase
+*/
+YAHOO.ext.Actor.prototype.highlight = function(color, fromColor, duration, attribute){
+    attribute = attribute || 'background-color';
+    var original = this.getStyle(attribute);
+    fromColor = fromColor || ((original && original != '' && original != 'transparent') ? original : '#FFFFFF');
+    var cfg = {};
+    cfg[attribute] = {to: color, from: fromColor};
+    this.setVisible(true);
+    this.animate(cfg, duration || .5, null, YAHOO.util.Easing.bounceOut, YAHOO.util.ColorAnim);
+    this.setStyle(attribute, original);
+};
+
+/**
+* Fade the element in and out the specified amount of times
+* @param {<i>Number</i>} count (optional) How many times to pulse (Defaults to 3)
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.pulsate = function(count, duration){
+    count = count || 3;
+    for(var i = 0; i < count; i++){
+        this.toggle(true, duration || .25);
+        this.toggle(true, duration || .25);
+    }
+};
+
+/**
+* Fade the element as it is falling from it's current position
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+*/
+YAHOO.ext.Actor.prototype.dropOut = function(duration){
+    this.animate({opacity: {to: 0}, points: {by: [0, this.getHeight()]}}, 
+            duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion);
+    this.setVisible(false);
+};
+
+/**
+* Hide the element in a way that it appears as if it is flying off the screen
+* @param {String} anchor The part of the page that the element should appear to move to. 
+                        The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, 
+                        tr/top-right, bl/bottom-left or br/bottom-right.
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+*/
+YAHOO.ext.Actor.prototype.moveOut = function(anchor, duration, easing){
+    var Y = YAHOO.util;
+    var vw = Y.Dom.getViewportWidth();
+    var vh = Y.Dom.getViewportHeight();
+    var cpoints = this.getCenterXY()
+    var centerX = cpoints[0];
+    var centerY = cpoints[1];
+    var anchor = anchor.toLowerCase();
+    var p;
+    switch(anchor){
+        case 't':
+        case 'top':
+            p = [centerX, -this.getHeight()];
+        break;
+        case 'l':
+        case 'left':
+            p = [-this.getWidth(), centerY];
+        break;
+        case 'r':
+        case 'right':
+            p = [vw+this.getWidth(), centerY];
+        break;
+        case 'b':
+        case 'bottom':
+            p = [centerX, vh+this.getHeight()];
+        break;
+        case 'tl':
+        case 'top-left':
+            p = [-this.getWidth(), -this.getHeight()];
+        break;
+        case 'bl':
+        case 'bottom':
+            p = [-this.getWidth(), vh+this.getHeight()];
+        break;
+        case 'br':
+        case 'bottom-right':
+            p = [vw+this.getWidth(), vh+this.getHeight()];
+        break;
+        case 'tr':
+        case 'top-right':
+            p = [vw+this.getWidth(), -this.getHeight()];
+        break;
+    }
+    this.moveTo(p[0], p[1], true, duration || .35, null, easing || Y.Easing.easeIn);
+    this.setVisible(false);
+};
+
+/**
+* Show the element in a way that it appears as if it is flying onto the screen
+* @param {String} anchor The part of the page that the element should appear to move from. 
+                        The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, 
+                        tr/top-right, bl/bottom-left or br/bottom-right.
+* @param {<i>Array</i>} to (optional) Array of x and y position to move to like [x, y] (Defaults to center screen)
+* @param {<i>Float</i>} duration (optional) How long the effect lasts (in seconds)
+* @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut)
+*/
+YAHOO.ext.Actor.prototype.moveIn = function(anchor, to, duration, easing){
+    to = to || this.getCenterXY();
+    this.moveOut(anchor, .01);
+    this.setVisible(true);
+    this.setXY(to, true, duration || .35, null, easing || YAHOO.util.Easing.easeOut);
+};
+/**
+* Show a ripple of exploding, attenuating borders to draw attention to an Element.
+* @param {<i>Number<i>} color (optional) The color of the border.
+* @param {<i>Number</i>} count (optional) How many ripples.
+* @param {<i>Float</i>} duration (optional) How long each ripple takes to expire
+*/
+YAHOO.ext.Actor.prototype.frame = function(color, count, duration){
+    color = color || "red";
+    count = count || 3;
+    duration = duration || .5;
+    var frameFn = function(callback){
+        var box = this.getBox();
+        var animFn = function(){ 
+            var proxy = this.createProxy({
+                 tag:"div",
+                 style:{
+                    visbility:"hidden",
+                    position:"absolute",
+                    zIndex:this.getStyle("zIndex"),
+                    border:"0px solid " + color
+                 }
+              });
+            var scale = proxy.isBorderBox() ? 2 : 1;
+            proxy.animate({
+                top:{from:box.y, to:box.y - 20},
+                left:{from:box.x, to:box.x - 20},
+                borderWidth:{from:0, to:10},
+                opacity:{from:1, to:0},
+                height:{from:box.height, to:(box.height + (20*scale))},
+                width:{from:box.width, to:(box.width + (20*scale))}
+            }, duration, function(){
+                proxy.remove();
+            });
+            if(--count > 0){
+                 animFn.defer((duration/2)*1000, this);
+            }else{
+                if(typeof callback == 'function'){
+                    callback();
+                }
+            }
+       }
+       animFn.call(this);
+   }
+   this.addAsyncCall(frameFn, 0, null, this);
+};
+
+YAHOO.ext.Actor.Action = function(actor, method, args){
+      this.actor = actor;
+      this.method = method;
+      this.args = args;
+  }
+  
+YAHOO.ext.Actor.Action.prototype = {
+    play : function(onComplete){
+        this.method.apply(this.actor || window, this.args);
+        onComplete();
+    }  
+};
+
+
+YAHOO.ext.Actor.AsyncAction = function(actor, method, args, onIndex){
+    YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this, actor, method, args);
+    this.onIndex = onIndex;
+    this.originalCallback = this.args[onIndex];
+}
+YAHOO.extendX(YAHOO.ext.Actor.AsyncAction, YAHOO.ext.Actor.Action);
+
+YAHOO.ext.Actor.AsyncAction.prototype.play = function(onComplete){
+    var callbackArg = this.originalCallback ? 
+                        this.originalCallback.createSequence(onComplete) : onComplete;
+    this.args[this.onIndex] = callbackArg;
+    this.method.apply(this.actor, this.args);
+};
+
+
+YAHOO.ext.Actor.PauseAction = function(seconds){
+    this.seconds = seconds;
+};
+YAHOO.ext.Actor.PauseAction.prototype = {
+    play : function(onComplete){
+        setTimeout(onComplete, this.seconds * 1000);
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Animator.js.html b/www/extras/yui-ext/docs/output/Animator.js.html new file mode 100644 index 000000000..e6cb06074 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Animator.js.html @@ -0,0 +1,483 @@ +Animator.js
/**
+ * @class YAHOO.ext.Animator
+ * Provides support for syncing animations for multiple {@link YAHOO.ext.Actor}s.<br><br>
+* <br><br>This example can be seen in action <a href="http://www.jackslocum.com/yui/2006/08/19/a-splitbar-component-for-yahoo-ui/" target="_new">here</a> 
+* by clicking on "Click here and I will point it out" at the end of the first paragraph.<br>
+ * <pre><code>
+var animator = new YAHOO.ext.Animator();
+var cursor = new YAHOO.ext.Actor('cursor-img', animator);
+var click = new YAHOO.ext.Actor('click-img', animator);
+var resize = new YAHOO.ext.Actor('resize-img', animator);
+
+// start capturing
+animator.startCapture();
+
+// these animations will be run in sequence
+cursor.show();
+cursor.moveTo(500,400);
+cursor.moveTo(20, getEl('navbar').getY()+10, true, .75);
+click.show();
+click.alignTo(cursor, 'tl', [-4, -4]);
+
+// Add an async function call, pass callback to argument 1
+animator.addAsyncCall(Blog.navbar.undockDelegate, 1);
+
+// pause .5 seconds
+animator.pause(.5);
+
+// again, these animations will be run in sequence
+click.hide(true, .7);
+cursor.alignTo('splitter', 'tr', [0, +100], true, 1);
+resize.alignTo('splitter', 'tr', [-12, +100]);
+
+// start sync block: these animations will run at the same time
+animator.beginSync();
+cursor.hide();
+resize.show();
+animator.endSync();
+
+// play the captured animation sequences, call myCallback when done
+animator.play(myCallback);
+ * </code></pre>
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.Anim
+ * @requires YAHOO.util.ColorAnim
+ * @requires YAHOO.util.Motion
+ * @constructor
+ * @param {String/HTMLElement} el The dom element or element id 
+ * @param {<i>YAHOO.ext.Animator</i>} animator (optional) The Animator that will capture this Actor's actions
+ * @param {<i>Boolean</i>} selfCapture (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false)
+ */ 
+ YAHOO.ext.Animator = function(/*Actors...*/){
+    this.actors = [];
+    this.playlist = new YAHOO.ext.Animator.AnimSequence();
+    this.captureDelegate = this.capture.createDelegate(this);
+    this.playDelegate = this.play.createDelegate(this);
+    this.syncing = false;
+    this.stopping = false;
+    this.playing = false;
+    for(var i = 0; i < arguments.length; i++){
+        this.addActor(arguments[i]);
+    }
+ };
+ 
+ YAHOO.ext.Animator.prototype = {
+ 
+     capture : function(actor, action){
+        if(this.syncing){
+            if(!this.syncMap[actor.id]){
+                this.syncMap[actor.id] = new YAHOO.ext.Animator.AnimSequence();
+            }
+            this.syncMap[actor.id].add(action);
+        }else{
+            this.playlist.add(action);
+        }
+    },
+    
+    /**
+      * Add an actor. The actor is also set to capturing = true.
+      * @param {YAHOO.ext.Actor} actor
+      */
+     addActor : function(actor){
+        actor.onCapture.subscribe(this.captureDelegate);
+        this.actors.push(actor);
+    },
+    
+    
+    /**
+      * Start capturing actions on the added actors. 
+      * @param {<i>Boolean</i>} clearPlaylist Whether to also create a new playlist
+      */
+     startCapture : function(clearPlaylist){
+        for(var i = 0; i < this.actors.length; i++){
+            var a = this.actors[i];
+            if(!this.isCapturing(a)){
+                a.onCapture.subscribe(this.captureDelegate);
+            }
+            a.capturing = true;
+        }
+        if(clearPlaylist){
+            this.playlist = new YAHOO.ext.Animator.AnimSequence();
+        }
+     },
+     
+     /**
+      * Checks whether this animator is listening to a specific actor.
+      * @param {YAHOO.ext.Actor} actor
+      */
+     isCapturing : function(actor){
+        var subscribers = actor.onCapture.subscribers;
+        if(subscribers){
+            for(var i = 0; i < subscribers.length; i++){
+                if(subscribers[i] && subscribers[i].contains(this.captureDelegate)){
+                    return true;
+                }
+            }
+        }
+        return false;
+     },
+     
+     /**
+      * Stop capturing on all added actors.
+      */
+     stopCapture : function(){
+         for(var i = 0; i < this.actors.length; i++){
+            var a = this.actors[i];
+            a.onCapture.unsubscribe(this.captureDelegate);
+            a.capturing = false;
+         }
+     },
+     
+     /**
+     * Start a multi-actor sync block. By default all animations are run in sequence. While in the sync block
+     * each actor's own animations will still be sequenced, but all actors will animate at the same time. 
+     */
+    beginSync : function(){
+        this.syncing = true;
+        this.syncMap = {};
+     },
+     
+     /**
+     * End the multi-actor sync block
+     */
+    endSync : function(){
+         this.syncing = false;
+         var composite = new YAHOO.ext.Animator.CompositeSequence();
+         for(key in this.syncMap){
+             if(typeof this.syncMap[key] != 'function'){
+                composite.add(this.syncMap[key]);
+             }
+         }
+         this.playlist.add(composite);
+         this.syncMap = null;
+     },
+     
+    /**
+     * Starts playback of the playlist, also stops any capturing. To start capturing again call {@link #startCapture}.
+     * @param {<i>Function</i>} oncomplete (optional) Callback to execute when playback has completed
+     */
+    play : function(oncomplete){
+        if(this.playing) return; // can't play the same animation twice at once
+        this.stopCapture();
+        this.playlist.play(oncomplete);
+    },
+    
+    /**
+     * Stop at the next available stopping point
+     */
+    stop : function(){
+        this.playlist.stop();
+    },
+    
+    /**
+     * Check if this animator is currently playing
+     */
+    isPlaying : function(){
+        return this.playlist.isPlaying();
+    },
+    /**
+     * Clear the playlist
+     */
+    clear : function(){
+        this.playlist = new YAHOO.ext.Animator.AnimSequence();
+     },
+     
+    /**
+     * Add a function call to the playlist.
+     * @param {Function} fcn The function to call
+     * @param {<i>Array</i>} args The arguments to call the function with
+     * @param {<i>Object</i>} scope (optional) The scope of the function
+     */
+     addCall : function(fcn, args, scope){
+        this.playlist.add(new YAHOO.ext.Actor.Action(scope, fcn, args || []));
+     },
+     
+     /**
+     * Add an async function call to the playlist.
+     * @param {Function} fcn The function to call
+     * @param {Number} callbackIndex The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED.
+     * @param {<i>Array</i>} args The arguments to call the function with
+     * @param {<i>Object</i>} scope (optional) The scope of the function
+     */
+    addAsyncCall : function(fcn, callbackIndex, args, scope){
+        this.playlist.add(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex));
+     },
+     
+     /**
+     * Add a pause to the playlist (in seconds)
+     * @param {Number} seconds The number of seconds to pause.
+     */
+    pause : function(seconds){
+        this.playlist.add(new YAHOO.ext.Actor.PauseAction(seconds));
+     }
+     
+  };
+/**
+ * Static function to build a AnimatorComposite from a css selector (requires YAHOO.ext.Element.selectorFunction be defined)
+ * @param {String/Array} selector The css selector or an array of nodes to animate
+ * @method @static
+ */
+YAHOO.ext.Animator.select = function(selector){
+    var els;
+    if(typeof selector == 'string'){
+        els = YAHOO.ext.Element.selectorFunction(selector);
+    }else if(selector instanceof Array){
+        els = selector;
+    }else{
+        throw 'Invalid selector';
+    }
+    return new YAHOO.ext.AnimatorComposite(els);
+};
+var getActors = YAHOO.ext.Animator.select;
+
+/**
+ * @class YAHOO.ext.AnimatorComposite
+ * Composite class with synchronized animations. This is the class returned by getActors(selector) or YAHOO.ext.Animator.select().
+ */
+YAHOO.ext.AnimatorComposite = function(els){
+    this.animator = new YAHOO.ext.Animator();
+    this.addElements(els);
+    this.syncAnims = true;
+};
+YAHOO.ext.AnimatorComposite.prototype = {
+    isComposite: true,
+    /**
+    * Adds elements to this composite.
+    * @param {Array} els An array of elements to add
+    * @return {AnimatorComposite} this
+    */
+    addElements : function(els){
+        if(!els) return this;
+        var anim = this.animator;
+        for(var i = 0, len = els.length; i < len; i++) {
+        	anim.addActor(new YAHOO.ext.Actor(els[i]));
+        }
+        anim.startCapture();
+        return this;
+    },
+    /**
+    * Operations called after sequence() will be performed one by one on each element in this composite.
+    * @return {AnimatorComposite} this
+    */
+    sequence : function(){
+        this.syncAnims = false;
+        return this;
+    },
+    /**
+    * Operations called after sync() will be performed at the same time on each element in this composite.
+    * @return {AnimatorComposite} this
+    */
+    sync : function(){
+        this.syncAnims = true;
+        return this;
+    },
+    invoke : function(fn, args){
+        var els = this.animator.actors;
+        if(this.syncAnims) this.animator.beginSync();
+        for(var i = 0, len = els.length; i < len; i++) {
+            YAHOO.ext.Actor.prototype[fn].apply(els[i], args);
+        }
+        if(this.syncAnims) this.animator.endSync();
+        return this;
+    },
+    /**
+    * Play the actions queued in this composite.
+    * @param {Function} callback (optional) callback is called when all animations have compelted
+    * @return {AnimatorComposite} this
+    */
+    play : function(callback){
+        this.animator.play(callback);
+        return this;
+    },
+    /**
+    * Clear all actions in the queue.
+    * @param {Function} callback (optional) callback is called when all animations have compelted
+    * @return {AnimatorComposite} this
+    */
+    reset : function(callback){
+        this.animator.startCapture(true);
+        return this;
+    },
+    /**
+     * Add a pause
+     * @param {Number} seconds
+    * @return {AnimatorComposite} this
+     */
+    pause : function(seconds){
+        this.animator.pause(seconds);
+        return this;
+    },
+    /**
+    * Get the YAHOO.ext.Animator that controls the animations for this composite.
+    * @return {YAHOO.ext.Animator}
+    */
+    getAnimator : function(){
+        return this.animator;
+    },
+    /**
+    * Calls the passed function passing (el, this, index) for each element in this composite.
+    * @param {Function} fn The function to call
+    * @param {Object} scope (optional) The <i>this</i> object (defaults to the element)
+    * @return {AnimatorComposite} this
+    */
+    each : function(fn, scope){
+        var els = this.animator.actors;
+        if(this.syncAnims) this.animator.beginSync();
+        for(var i = 0, len = els.length; i < len; i++){
+            fn.call(scope || els[i], els[i], this, i);
+        }
+        if(this.syncAnims) this.animator.endSync();
+        return this;
+    },
+    /**
+     * Add a function call to the playlist.
+     * @param {Function} fcn The function to call
+     * @param {<i>Array</i>} args (optional) The arguments to call the function with
+     * @param {<i>Object</i>} scope (optional) The scope of the function
+     * @return {AnimatorComposite} this
+     */
+     addCall : function(fcn, args, scope){
+        this.animator.addCall(fcn, args, scope);
+        return this;
+    },
+    /**
+     * Add an async function call to the playlist.
+     * @param {Function} fcn The function to call
+     * @param {Number} callbackIndex The index of the callback parameter on the passed function. <b>A CALLBACK IS REQUIRED</b>.
+     * @param {<i>Array</i>} args (optional) The arguments to call the function with
+     * @param {<i>Object</i>} scope (optional) The scope of the function
+     * @return {AnimatorComposite} this
+    */
+    addAsyncCall : function(fcn, callbackIndex, args, scope){
+        this.animator.addAsyncCall(fcn, callbackIndex, args, scope);
+        return this;
+    }
+};
+for(var fnName in YAHOO.ext.Actor.prototype){
+    if(typeof YAHOO.ext.Actor.prototype[fnName] == 'function'){
+        YAHOO.ext.CompositeElement.createCall(YAHOO.ext.AnimatorComposite.prototype, fnName);
+    }
+}
+
+
+YAHOO.ext.Animator.AnimSequence = function(){
+    this.actions = [];
+    this.nextDelegate = this.next.createDelegate(this);
+    this.playDelegate = this.play.createDelegate(this);
+    this.oncomplete = null;
+    this.playing = false;
+    this.stopping = false;
+    this.actionIndex = -1;
+ };
+ 
+ YAHOO.ext.Animator.AnimSequence.prototype = {
+ 
+    add : function(action){
+        this.actions.push(action);
+    },
+    
+    next : function(){
+        if(this.stopping){
+            this.playing = false;
+            if(this.oncomplete){
+                this.oncomplete(this, false);
+            }
+            return;
+        }
+        var nextAction = this.actions[++this.actionIndex];
+        if(nextAction){
+            nextAction.play(this.nextDelegate);
+        }else{
+            this.playing = false;
+            if(this.oncomplete){
+                this.oncomplete(this, true);
+            }
+        }
+    },
+    
+    play : function(oncomplete){
+        if(this.playing) return; // can't play the same sequence twice at once
+        this.oncomplete = oncomplete;
+        this.stopping = false;
+        this.playing = true;
+        this.actionIndex = -1;
+        this.next();
+    },
+    
+    stop : function(){
+        this.stopping = true;
+    },
+    
+    isPlaying : function(){
+        return this.playing;
+    },
+    
+    clear : function(){
+        this.actions = [];
+    },
+     
+    addCall : function(fcn, args, scope){
+        this.actions.push(new YAHOO.ext.Actor.Action(scope, fcn, args || []));
+     },
+     
+     addAsyncCall : function(fcn, callbackIndex, args, scope){
+        this.actions.push(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex));
+     },
+     
+     pause : function(seconds){
+        this.actions.push(new YAHOO.ext.Actor.PauseAction(seconds));
+     }
+     
+  };
+
+YAHOO.ext.Animator.CompositeSequence = function(){
+    this.sequences = [];
+    this.completed = 0;
+    this.trackDelegate = this.trackCompletion.createDelegate(this);
+}
+
+YAHOO.ext.Animator.CompositeSequence.prototype = {
+    add : function(sequence){
+        this.sequences.push(sequence);
+    },
+    
+    play : function(onComplete){
+        this.completed = 0;
+        if(this.sequences.length < 1){
+            if(onComplete)onComplete();
+            return;
+        }
+        this.onComplete = onComplete;
+        for(var i = 0; i < this.sequences.length; i++){
+            this.sequences[i].play(this.trackDelegate);
+        }
+    },
+    
+    trackCompletion : function(){
+        ++this.completed;
+        if(this.completed >= this.sequences.length && this.onComplete){
+            this.onComplete();
+        }
+    },
+    
+    stop : function(){
+        for(var i = 0; i < this.sequences.length; i++){
+            this.sequences[i].stop();
+        }
+    },
+    
+    isPlaying : function(){
+        for(var i = 0; i < this.sequences.length; i++){
+            if(this.sequences[i].isPlaying()){
+                return true;
+            }
+        }
+        return false;
+    }
+};
+
+
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BasicDialog.js.html b/www/extras/yui-ext/docs/output/BasicDialog.js.html new file mode 100644 index 000000000..d1136b7b5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/BasicDialog.js.html @@ -0,0 +1,789 @@ +BasicDialog.js
/**
+ * @class YAHOO.ext.BasicDialog
+ * @extends YAHOO.ext.util.Observable
+ * Lightweight Dialog Class.
+ * 
+ * The code below lists all configuration options along with the default value.
+ * If the default value is what you want you can leave it out:
+ * <pre><code>
+  var dlg = new YAHOO.ext.BasicDialog('element-id', {
+       width: auto,
+       height: auto,
+       x: 200, //(defaults to center screen if blank)
+       y: 500, //(defaults to center screen if blank)
+       animateTarget: null,// (no animation) This is the id or element to animate from
+       resizable: true,
+       minHeight: 80,
+       minWidth: 200,
+       modal: false,
+       autoScroll: true,
+       closable: true,
+       constraintoviewport: true,
+       draggable: true,
+       autoTabs: false, (if true searches child nodes for elements with class ydlg-tab and converts them to tabs)
+       proxyDrag: false, (drag a proxy element rather than the dialog itself)
+       fixedcenter: false,
+       shadow: false,
+       minButtonWidth: 75 
+  });
+  </code></pre>
+ * @constructor
+ * Create a new BasicDialog.
+ * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element
+ * @param {Object} config configuration options
+ */
+YAHOO.ext.BasicDialog = function(el, config){
+    this.el = getEl(el, true);
+    this.id = this.el.id;
+    this.el.addClass('ydlg');
+    this.shadowOffset = 3;
+    this.minHeight = 80;
+    this.minWidth = 200;
+    this.minButtonWidth = 75;
+    
+    YAHOO.ext.util.Config.apply(this, config);
+    
+    this.proxy = this.el.createProxy('ydlg-proxy');
+    this.proxy.enableDisplayMode('block');
+    this.proxy.setOpacity(.5);
+    
+    if(config.width){
+        this.el.setWidth(config.width);
+    }
+    if(config.height){
+        this.el.setHeight(config.height);
+    }
+    this.size = this.el.getSize();
+    if(typeof config.x != 'undefined' && typeof config.y != 'undefined'){
+        this.xy = [config.x,config.y];
+    }else{
+        this.xy = this.el.getCenterXY(true);
+    }
+    // find the header, body and footer
+    var cn = this.el.dom.childNodes;
+    for(var i = 0, len = cn.length; i < len; i++) {
+    	var node = cn[i];
+    	if(node && node.nodeType == 1){
+    	    if(YAHOO.util.Dom.hasClass(node, 'ydlg-hd')){
+    	        this.header = getEl(node, true);
+    	    }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-bd')){
+    	        this.body = getEl(node, true);
+    	    }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-ft')){
+    	        /**
+                 * The footer element
+                 * @type YAHOO.ext.Element
+                 */
+                this.footer = getEl(node, true);
+    	    }
+    	}
+    }
+    
+    var dh = YAHOO.ext.DomHelper;
+    if(!this.header){
+        /**
+         * The header element
+         * @type YAHOO.ext.Element
+         */
+        this.header = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-hd'}, true);
+    }
+    if(!this.body){
+        /**
+         * The body element
+         * @type YAHOO.ext.Element
+         */
+        this.body = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-bd'}, true);
+    }
+    // wrap the header for special rendering
+    var hl = dh.insertBefore(this.header.dom, {tag: 'div', cls:'ydlg-hd-left'});
+    var hr = dh.append(hl, {tag: 'div', cls:'ydlg-hd-right'});
+    hr.appendChild(this.header.dom);
+    
+    // wrap the body and footer for special rendering
+    this.bwrap = dh.insertBefore(this.body.dom, {tag: 'div', cls:'ydlg-dlg-body'}, true);
+    this.bwrap.dom.appendChild(this.body.dom);
+    if(this.footer) this.bwrap.dom.appendChild(this.footer.dom);
+    
+    if(this.autoScroll !== false && !this.autoTabs){
+        this.body.setStyle('overflow', 'auto');
+    }
+    if(this.closable !== false){
+        this.el.addClass('ydlg-closable');
+        this.close = dh.append(this.el.dom, {tag: 'div', cls:'ydlg-close'}, true);
+        this.close.mon('click', function(){
+            this.hide();
+        }, this, true);
+    }
+    if(this.resizable !== false){
+        this.el.addClass('yresizable-pinned');
+        this.el.addClass('ydlg-resizable');
+        this.resizer = new YAHOO.ext.Resizable(this.el, {
+            minWidth: this.minWidth || 80, 
+            minHeight:this.minHeight || 80, 
+            disableTrackOver:true, 
+            multiDirectional: true
+        });
+        this.resizer.proxy.setStyle('z-index', parseInt(this.el.getStyle('z-index'),10)+1);
+        this.resizer.on('beforeresize', this.beforeResize, this, true);
+        this.resizer.delayedListener('resize', this.onResize, this, true);
+    }
+    if(this.draggable !== false){
+        this.el.addClass('ydlg-draggable');
+        if (!this.proxyDrag) {
+            var dd = new YAHOO.util.DD(this.el.dom, 'WindowDrag');
+        }
+        else {
+            var dd = new YAHOO.util.DDProxy(this.el.dom, 'WindowDrag', {dragElId: this.proxy.id});
+        }
+        dd.setHandleElId(this.header.id);
+        dd.endDrag = this.endMove.createDelegate(this);
+        dd.startDrag = this.startMove.createDelegate(this);
+        dd.onDrag = this.adjustShadow.createDelegate(this);
+        this.dd = dd;
+    }
+    if(this.modal){
+        this.mask = dh.append(document.body, {tag: 'div', cls:'ydlg-mask'}, true);
+        this.mask.originalDisplay = 'block';
+        this.mask.enableDisplayMode();
+    }
+    if(this.shadow){
+        this.shadow = dh.append(document.body, {tag: 'div', cls:'ydlg-shadow'}, true);
+        this.shadow.setOpacity(.3);
+        this.shadow.setAbsolutePositioned(10000);
+        this.shadow.enableDisplayMode('block');
+        this.shadow.hide();
+    }
+    if(this.autoTabs){
+        var tabEls = YAHOO.util.Dom.getElementsByClassName('ydlg-tab', 'div', this.el.dom);
+        if(tabEls.length > 0){
+            this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
+            this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
+            for(var i = 0, len = tabEls.length; i < len; i++) {
+            	var tabEl = tabEls[i];
+            	this.tabs.addTab(YAHOO.util.Dom.generateId(tabEl), tabEl.title);
+            	tabEl.title = '';
+            }
+            this.tabs.activate(tabEls[0].id);
+        }
+    }
+    this.syncBodyHeight();
+    this.events = {
+        /**
+         * @event keydown
+         * Fires when a key is pressed
+         * @param {YAHOO.ext.BasicDialog} this
+         * @param {YAHOO.ext.EventObject} e
+         */
+        'keydown' : new YAHOO.util.CustomEvent('keydown'),
+        /**
+         * @event move
+         * Fires when this dialog is moved by the user.
+         * @param {YAHOO.ext.BasicDialog} this
+         * @param {Number} x The new page X
+         * @param {Number} y The new page Y
+         */
+        'move' : new YAHOO.util.CustomEvent('move'),
+        /**
+         * @event resize
+         * Fires when this dialog is resized by the user.
+         * @param {YAHOO.ext.BasicDialog} this
+         * @param {Number} width The new width
+         * @param {Number} height The new height
+         */
+        'resize' : new YAHOO.util.CustomEvent('resize'),
+        /**
+         * @event beforehide
+         * Fires before this dialog is hidden.
+         * @param {YAHOO.ext.BasicDialog} this
+         */
+        'beforehide' : new YAHOO.util.CustomEvent('beforehide'),
+        /**
+         * @event hide
+         * Fires when this dialog is hidden.
+         * @param {YAHOO.ext.BasicDialog} this
+         */
+        'hide' : new YAHOO.util.CustomEvent('hide'),
+        /**
+         * @event beforeshow
+         * Fires before this dialog is shown.
+         * @param {YAHOO.ext.BasicDialog} this
+         */
+        'beforeshow' : new YAHOO.util.CustomEvent('beforeshow'),
+        /**
+         * @event show
+         * Fires when this dialog is shown.
+         * @param {YAHOO.ext.BasicDialog} this
+         */
+        'show' : new YAHOO.util.CustomEvent('show')
+    };
+    this.el.mon('keydown', this.onKeyDown, this, true);
+    YAHOO.ext.EventManager.onWindowResize(this.adjustViewport, this, true);
+    this.el.setDisplayed(false);
+    this.defaultButton = null;
+};
+
+YAHOO.extendX(YAHOO.ext.BasicDialog, YAHOO.ext.util.Observable, {
+    beforeResize : function(){
+        this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40);
+    },
+    
+    onResize : function(){
+        this.refreshSize();
+        this.syncBodyHeight();
+        this.adjustShadow();
+        this.fireEvent('resize', this, this.size.width, this.size.height);
+    },
+    
+    onKeyDown : function(e){
+        this.fireEvent('keydown', this, e);
+    },
+    
+    /**
+     * Adds a key listener for when this dialog is displayed
+     * @param {Number/Array/Object} key Either the numeric key code, array of key codes or an object with the following options: 
+     *                                  {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}
+     * @param {Function} fn The function to call
+     * @param {Object} scope (optional) The scope of the function
+     */
+    addKeyListener : function(key, fn, scope){
+        var keyCode, shift, ctrl, alt;
+        if(typeof key == 'object'){
+            keyCode = key['key'];
+            shift = key['shift'];
+            ctrl = key['ctrl'];
+            alt = key['alt'];
+        }else{
+            keyCode = key;
+        }
+        var handler = function(dlg, e){
+            if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) &&  (!alt || e.altKey)){
+                var k = e.getKey();
+                if(keyCode instanceof Array){
+                    for(var i = 0, len = keyCode.length; i < len; i++){
+                        if(keyCode[i] == k){
+                          fn.call(scope || window, dlg, k, e);
+                          return;
+                        }
+                    }
+                }else{
+                    if(k == keyCode){
+                        fn.call(scope || window, dlg, k, e);
+                    }
+                }
+            }
+        };
+        this.on('keydown', handler);
+    },
+    
+    /**
+     * Returns the TabPanel component (if autoTabs)
+     * @return {YAHOO.ext.TabPanel}
+     */
+    getTabs : function(){
+        if(!this.tabs){
+            this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top');
+            this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom');
+        }
+        return this.tabs;    
+    },
+    
+    /**
+     * Adds a button.
+     * @param {String/Object} config A string becomes the button text, an object is expected to be a valid YAHOO.ext.DomHelper element config
+     * @param {Function} handler The function called when the button is clicked
+     * @param {Object} scope (optional) The scope of the handler function
+     * @return {YAHOO.ext.BasicDialog.Button}
+     */
+    addButton : function(config, handler, scope){
+        var dh = YAHOO.ext.DomHelper;
+        if(!this.footer){
+            this.footer = dh.append(this.bwrap.dom, {tag: 'div', cls:'ydlg-ft'}, true);
+        }
+        var btn;
+        if(typeof config == 'string'){
+            if(!this.buttonTemplate){
+                // hideous table template
+                this.buttonTemplate = new YAHOO.ext.DomHelper.Template('<a href="#" class="ydlg-button-focus"><table border="0" cellpadding="0" cellspacing="0" class="ydlg-button-wrap"><tbody><tr><td class="ydlg-button-left">&#160;</td><td class="ydlg-button-center" unselectable="on">{0}</td><td class="ydlg-button-right">&#160;</td></tr></tbody></table></a>');
+            }
+            var btn = this.buttonTemplate.append(this.footer.dom, [config], true);
+            var tbl = getEl(btn.dom.firstChild, true);
+            if(this.minButtonWidth){
+                 tbl.beginMeasure();
+                 if(tbl.getWidth() < this.minButtonWidth){
+                       tbl.setWidth(this.minButtonWidth);
+                 }
+                 tbl.endMeasure();
+            }
+        }else{
+            btn = dh.append(this.footer.dom, config, true);
+        }
+        var bo = new YAHOO.ext.BasicDialog.Button(btn, handler, scope);
+        this.syncBodyHeight();
+        if(!this.buttons){
+            this.buttons = [];
+        }
+        this.buttons.push(bo);
+        return bo;
+    },
+    
+    /**
+     * Sets the default button to be focused when the dialog is displayed
+     * @param {YAHOO.ext.BasicDialog.Button} btn The button object returned by addButton
+     */
+    setDefaultButton : function(btn){
+        this.defaultButton = btn;  
+    },
+    
+    getHeaderFooterHeight : function(safe){
+        if(safe)this.el.beginMeasure();
+        var height = 0;
+        if(this.header){
+           height += this.header.getHeight();
+        }
+        if(this.footer){
+            var fm = this.footer.getMargins();
+            height += (this.footer.getHeight()+fm.top+fm.bottom);
+        }
+        if(safe)this.el.endMeasure();
+        height += this.bwrap.getPadding('tb')+this.bwrap.getBorderWidth('tb');
+        return height;
+    },
+    
+    syncBodyHeight : function(){
+        this.el.beginMeasure();
+        var height = this.size.height - this.getHeaderFooterHeight(false);
+        var bm = this.body.getMargins();
+        this.body.setHeight(height-(bm.top+bm.bottom));
+        if(this.tabs){
+            this.tabs.syncHeight();
+        }
+        this.bwrap.setHeight(this.size.height-this.header.getHeight());
+        // 11/07/06 jvs update to set fixed width for IE7
+        this.body.setWidth(this.el.getWidth(true)-this.bwrap.getBorderWidth('lr')-this.bwrap.getPadding('lr'));
+        this.el.endMeasure();
+    },
+    
+    /**
+     * Restores the previous state of the dialog if YAHOO.ext.state is configured
+     */
+    restoreState : function(){
+        var box = YAHOO.ext.state.Manager.get(this.el.id + '-state');
+        if(box && box.width){
+            this.xy = [box.x, box.y];
+            this.size = box;
+            this.el.setLocation(box.x, box.y);
+            this.resizer.resizeTo(box.width, box.height);
+            this.adjustViewport();
+        }else{
+            this.resizer.resizeTo(this.size.width, this.size.height);
+            this.adjustViewport();
+        }
+    },
+    
+    beforeShow : function(){
+        if(this.fixedcenter) {
+            this.el.beginMeasure();
+            this.xy = this.el.getCenterXY(true);
+            this.el.endMeasure();
+        }
+        if(this.modal){
+            YAHOO.util.Dom.addClass(document.body, 'masked');
+            this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
+            this.mask.show();
+        }
+                
+    },
+    
+    /**
+     * Shows the dialog.
+     * @param {String/HTMLElement/YAHOO.ext.Element} animateTarget (optional) Reset the animation target
+     */
+    show : function(animateTarget){
+        if (this.fireEvent('beforeshow', this) === false)
+            return;
+        
+        this.animateTarget = animateTarget || this.animateTarget;
+        if(!this.el.isVisible()){
+            this.beforeShow();
+            if(this.animateTarget){
+                var b = getEl(this.animateTarget, true).getBox();
+                this.proxy.show();
+                this.proxy.setSize(b.width, b.height);
+                this.proxy.setLocation(b.x, b.y);
+                this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, true, .35, this.showEl.createDelegate(this));
+            }else{
+                this.el.setDisplayed(true);
+                this.el.setXY(this.xy);
+                this.el.show();
+                var box = this.el.getBox();
+                if(this.shadow){
+                    this.shadow.show();
+                    this.shadow.setSize(box.width, box.height);
+                    this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
+                }
+                if(this.defaultButton) this.defaultButton.focus();
+                this.fireEvent('show', this);
+            }
+        }
+    },
+    
+    showEl : function(){
+        var box = this.proxy.getBox();
+        this.el.setDisplayed(true);
+        this.el.setBox(box);
+        this.el.show();
+        this.proxy.hide();
+        if(this.shadow){
+            this.shadow.show();
+            this.shadow.setSize(box.width, box.height);
+            this.shadow.setLocation(box.x + this.shadowOffset, box.y + this.shadowOffset);
+        }
+        if(this.defaultButton) this.defaultButton.focus();
+        this.fireEvent('show', this);
+    },
+    
+    adjustViewport : function(width, height){
+        this.viewSize = [width, height];
+        if(this.modal && this.mask.isVisible()){
+            this.mask.setSize(width, height); // first make sure the mask isn't causing overflow
+            this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
+        }
+        if(this.contraintoviewport !== false){
+            var moved = false;
+            if(this.xy[0] + this.size.width > this.viewSize[0]){
+                this.xy[0] = Math.max(0, this.viewSize[0] - this.size.width);
+                moved = true;
+            }
+            if(this.xy[1] + this.size.height > this.viewSize[1]){
+                this.xy[1] = Math.max(0, this.viewSize[1] - this.size.height);
+                moved = true;
+            }
+            if(moved){
+                this.el.setXY(this.xy);
+                this.adjustShadow();
+            }
+        }
+    },
+    
+    /**
+     * Destroys this dialog
+     * @param {Boolean} removeEl (optional) true to remove the element from the DOM
+     */
+    destroy : function(removeEl){
+        YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport, this);
+        if(this.tabs){
+            this.tabs.destroy(removeEl);
+        }
+        if(removeEl === true){
+            this.el.update('');
+            this.el.remove();
+        }
+    },
+    
+    adjustShadow : function(){
+        if(this.shadow && this.shadow.isVisible()){
+            var box = this.el.getBox();
+            box.x += this.shadowOffset;
+            box.y += this.shadowOffset;
+            this.shadow.setBox(box);
+        }
+    },
+    
+    startMove : function(){
+        if(this.proxyDrag){
+            this.proxy.show();
+        }
+        if(this.constraintoviewport !== false){
+            this.dd.resetConstraints();
+            this.viewSize = [YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight()];
+            this.dd.setXConstraint(this.xy[0], this.viewSize[0]-this.xy[0]-this.el.getWidth()-this.shadowOffset);
+            this.dd.setYConstraint(this.xy[1], this.viewSize[1]-this.xy[1]-this.el.getHeight()-this.shadowOffset);
+        }
+    },
+    
+    endMove : function(){
+        if(!this.proxyDrag){
+            YAHOO.util.DD.prototype.endDrag.apply(this.dd, arguments);
+        }else{
+            YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd, arguments);
+            this.proxy.setStyle('visibility', 'visible');
+            this.proxy.hide();
+        }
+        this.refreshSize();
+        this.adjustShadow();
+        this.fireEvent('move', this, this.xy[0], this.xy[1])
+    },
+   
+    
+    /**
+     * Returns true if the dialog is visible
+     * @return {Boolean}
+     */
+    isVisible : function(){
+        return this.el.isVisible();    
+    },
+    
+    beforeHide : function(){
+        if(this.modal){
+            this.mask.hide();
+            YAHOO.util.Dom.removeClass(document.body, 'masked');
+        }
+    },
+    
+    /**
+     * Hides the dialog.
+     * @param {Function} callback (optional) Function to call when the dialog is hidden
+     */
+    hide : function(callback){
+        if (this.fireEvent('beforehide', this) === false)
+            return;
+        
+        this.beforeHide();
+        if(this.shadow){
+            this.shadow.hide();
+        }
+        if(this.animateTarget){
+            var b = getEl(this.animateTarget, true).getBox();
+            this.proxy.show();
+            this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height);
+            this.el.setDisplayed(false);
+            this.el.hide();
+            this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, this.hideEl.createDelegate(this, [callback]));
+        }else{
+            this.proxy.hide();
+            this.el.setDisplayed(false);
+            this.el.hide();
+            this.fireEvent('hide', this);
+        }
+    },
+    
+    hideEl : function(callback){
+        this.proxy.hide();
+        this.fireEvent('hide', this);
+        if(typeof callback == 'function'){
+            callback();
+        }
+    },
+    
+    refreshSize : function(){
+        this.size = this.el.getSize();
+        this.xy = this.el.getXY();
+        YAHOO.ext.state.Manager.set(this.el.id + '-state', this.el.getBox());
+    },
+    
+    /**
+     * Returns the element for this dialog
+     * @return {YAHOO.ext.BasicDialog}
+     */
+    getEl : function(){
+        return this.el;
+    }
+});
+
+/**
+ * @class YAHOO.ext.LayoutDialog
+ * @extends YAHOO.ext.BasicDialog
+ * Dialog which provides adjustments for working with a layout in a Dialog. 
+ * Add your neccessary layout config options to the dialogs config.<br>
+ * Example Usage (including a nested layout):
+ * <pre><code>    if(!dialog){
+    dialog = new YAHOO.ext.LayoutDialog("download-dlg", { 
+            modal: true,
+            width:600,
+            height:450,
+            shadow:true,
+            minWidth:500,
+            minHeight:350,
+            autoTabs:true,
+            proxyDrag:true,
+            // layout config merges with the dialog config
+            center:{
+                tabPosition: 'top',
+                alwaysShowTabs: true
+            }
+    });
+    dialog.addKeyListener(27, dialog.hide, dialog);
+    dialog.setDefaultButton(dialog.addButton('Close', dialog.hide, dialog));
+    dialog.addButton('Build It!', this.getDownload, this);
+    
+    // we can even add nested layouts
+    var innerLayout = new YAHOO.ext.BorderLayout('dl-inner', {
+        east: {
+            initialSize: 200,
+            autoScroll:true,
+            split:true
+        },
+        center: {
+            autoScroll:true
+        }
+    });
+    innerLayout.beginUpdate();
+    innerLayout.add('east', new YAHOO.ext.ContentPanel('dl-details'));
+    innerLayout.add('center', new YAHOO.ext.ContentPanel('selection-panel'));
+    innerLayout.endUpdate(true);
+    
+    // when doing updates to the top level layout in a dialog, you need to 
+    // use dialog.beginUpdate()/endUpdate() instead of layout.beginUpdate()/endUpdate()
+    var layout = dialog.getLayout();
+    dialog.beginUpdate();
+    layout.add('center', new YAHOO.ext.ContentPanel('standard-panel', 
+                        {title: 'Download the Source', fitToFrame:true}));
+    layout.add('center', new YAHOO.ext.NestedLayoutPanel(innerLayout, 
+               {title: 'Build your own yui-ext.js'}));
+    layout.getRegion('center').showPanel(sp);
+    dialog.endUpdate();</code></pre>
+    * @constructor
+    * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element
+    * @param {Object} config configuration options
+  */
+YAHOO.ext.LayoutDialog = function(el, config){
+    config.autoTabs = false;
+    YAHOO.ext.LayoutDialog.superclass.constructor.call(this, el, config);
+    this.body.setStyle({overflow:'hidden', position:'relative'});
+    this.el.setDisplayed(true);
+    this.layout = new YAHOO.ext.BorderLayout(this.body.dom, config);
+    this.layout.monitorWindowResize = false;
+};
+YAHOO.extendX(YAHOO.ext.LayoutDialog, YAHOO.ext.BasicDialog, {
+    /**
+     * Ends update of the layout and resets display to none.
+     */
+    endUpdate : function(){
+        this.layout.endUpdate();
+        this.el.setDisplayed(false);
+    },
+    /**
+     * Begins an update of the layout and sets display to block and visibility to hidden.
+     */
+    beginUpdate : function(){
+        this.layout.beginUpdate();
+        this.el.setDisplayed(true);
+    },
+    /**
+     * Get the BorderLayout for this dialog
+     * @return {YAHOO.ext.BorderLayout} 
+     */
+    getLayout : function(){
+        return this.layout;
+    },
+    syncBodyHeight : function(){
+        YAHOO.ext.LayoutDialog.superclass.syncBodyHeight.call(this);
+        if(this.layout)this.layout.layout();
+    }
+});
+
+/**
+ * @class YAHOO.ext.BasicDialog.Button
+ * Button class returned by BasicDialog.addButton()
+ */
+YAHOO.ext.BasicDialog.Button = function(el, handler, scope){
+    this.el = el;
+    this.el.addClass('ydlg-button');
+    this.el.mon('click', this.onClick, this, true);
+    this.el.on('mouseover', this.onMouseOver, this, true);
+    this.el.on('mouseout', this.onMouseOut, this, true);
+    this.el.on('mousedown', this.onMouseDown, this, true);
+    this.el.on('mouseup', this.onMouseUp, this, true);
+    this.handler = handler;
+    this.scope = scope;
+    this.disabled = false;
+};
+
+YAHOO.ext.BasicDialog.Button.prototype = {
+    /**
+     * Returns the buttons element
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;  
+    },
+    
+    /**
+     * Sets this buttons click handler
+     * @param {Function} handler The function to call when the button is clicked
+     * @param {Object} scope (optional) Scope for the function passed above
+     */
+    setHandler : function(handler, scope){
+        this.handler = handler;
+        this.scope = scope;  
+    },
+    
+    /**
+     * Set this buttons text
+     * @param {String} text
+     */
+    setText : function(text){
+        this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text;    
+    },
+    
+    /**
+     * Show this button
+     */
+    show: function(){
+        this.el.setStyle('display', '');
+    },
+    
+    /**
+     * Hide this button
+     */
+    hide: function(){
+        this.el.setStyle('display', 'none'); 
+    },
+    
+    /**
+     * Convenience function for boolean show/hide
+     * @param {Boolean} visible true to show/false to hide
+     */
+    setVisible: function(visible){
+        if(visible) {
+            this.show();
+        }else{
+            this.hide();
+        }
+    },
+    
+    /**
+     * Focus the button
+     */
+    focus : function(){
+        this.el.focus();    
+    },
+    
+    /**
+     * Disable this button
+     */
+    disable : function(){
+        this.el.addClass('ydlg-button-disabled');
+        this.disabled = true;
+    },
+    
+    /**
+     * Enable this button
+     */
+    enable : function(){
+        this.el.removeClass('ydlg-button-disabled');
+        this.disabled = false;
+    },
+    
+    onClick : function(e){
+        e.preventDefault();
+        if(!this.disabled){
+            this.handler.call(this.scope || window);
+        }
+    },
+    onMouseOver : function(){
+        if(!this.disabled){
+            this.el.addClass('ydlg-button-over');
+        }
+    },
+    onMouseOut : function(){
+        this.el.removeClass('ydlg-button-over');
+    },
+    onMouseDown : function(){
+        if(!this.disabled){
+            this.el.addClass('ydlg-button-click');
+        }
+    },
+    onMouseUp : function(){
+        this.el.removeClass('ydlg-button-click');
+    }    
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Bench.js.html b/www/extras/yui-ext/docs/output/Bench.js.html new file mode 100644 index 000000000..6fb8d4f7f --- /dev/null +++ b/www/extras/yui-ext/docs/output/Bench.js.html @@ -0,0 +1,38 @@ +Bench.js
YAHOO.ext.util.Bench = function(){
+   this.timers = {};
+   this.lastKey = null;
+};
+YAHOO.ext.util.Bench.prototype = {
+   start : function(key){
+       this.lastKey = key;
+       this.timers[key] = {};
+       this.timers[key].startTime = new Date().getTime(); 
+   },
+   
+   stop : function(key){
+       key = key || this.lastKey;
+       this.timers[key].endTime = new Date().getTime(); 
+   },
+   
+   getElapsed : function(key){
+       key = key || this.lastKey;
+       return this.timers[key].endTime - this.timers[key].startTime;
+   },
+   
+   toString : function(html){
+       var results = "";
+       for(var key in this.timers){
+           if(typeof this.timers[key] != 'function'){
+               results += key + ":\t" + (this.getElapsed(key) / 1000) + " seconds\n";
+           }
+       }
+       if(html){
+           results = results.replace("\n", '<br>');
+       }
+       return results;
+   },
+   
+   show : function(){
+       alert(this.toString());
+   }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BorderLayout.js.html b/www/extras/yui-ext/docs/output/BorderLayout.js.html new file mode 100644 index 000000000..f13e43c8e --- /dev/null +++ b/www/extras/yui-ext/docs/output/BorderLayout.js.html @@ -0,0 +1,275 @@ +BorderLayout.js
/**
+ * @class YAHOO.ext.BorderLayout
+ * @extends YAHOO.ext.LayoutManager
+ * This class represents a common layout manager used in desktop applications. For screenshots and more details,
+ * please see: <br><br>
+ * <a href="http://www.jackslocum.com/yui/2006/10/19/cross-browser-web-20-layouts-with-yahoo-ui/">Cross Browser Layouts - Part 1</a><br>
+ * <a href="http://www.jackslocum.com/yui/2006/10/28/cross-browser-web-20-layouts-part-2-ajax-feed-viewer-20/">Cross Browser Layouts - Part 2</a><br><br>
+ * Example:
+ <pre><code>
+ var layout = new YAHOO.ext.BorderLayout(document.body, {
+    hideOnLayout: true,
+    north: {
+        initialSize: 25,
+        titlebar: false
+    },
+    west: {
+        split:true,
+        initialSize: 200,
+        minSize: 175,
+        maxSize: 400,
+        titlebar: true,
+        collapsible: true
+    },
+    east: {
+        split:true,
+        initialSize: 202,
+        minSize: 175,
+        maxSize: 400,
+        titlebar: true,
+        collapsible: true
+    },
+    south: {
+        split:true,
+        initialSize: 100,
+        minSize: 100,
+        maxSize: 200,
+        titlebar: true,
+        collapsible: true
+    },
+    center: {
+        titlebar: true,
+        autoScroll:true
+    }
+});
+
+// shorthand
+var CP = YAHOO.ext.ContentPanel;
+
+layout.beginUpdate();
+layout.add('north', new CP('north', 'North'));
+layout.add('south', new CP('south', {title: 'South', closable: true}));
+layout.add('west', new CP('west', {title: 'West'}));
+layout.add('east', new CP('autoTabs', {title: 'Auto Tabs', closable: true}));
+layout.add('center', new CP('center1', {title: 'Close Me', closable: true}));
+layout.add('center', new CP('center2', {title: 'Center Panel', closable: false}));
+layout.getRegion('center').showPanel('center1');
+layout.endUpdate();
+</code></pre>
+* @constructor
+* Create a new BorderLayout
+* @param {String/HTMLElement/Element} container The container this layout is bound to
+* @param {Object} config Configuration options
+ */
+YAHOO.ext.BorderLayout = function(container, config){
+    YAHOO.ext.BorderLayout.superclass.constructor.call(this, container);
+    this.factory = config.factory || YAHOO.ext.BorderLayout.RegionFactory;
+    /** 
+     * True to hide the center panel while performing layouts. This helps when the center region contains 
+     * heavy components such as a yui-ext grid. 
+     * @type Boolean
+     */
+    this.hideOnLayout = config.hideOnLayout || false;
+    for(var i = 0, len = this.factory.validRegions.length; i < len; i++) {
+    	var target = this.factory.validRegions[i];
+    	if(config[target]){
+    	    this.addRegion(target, config[target]);
+    	}
+    }
+    //this.dragOverDelegate = YAHOO.ext.EventManager.wrap(this.onDragOver, this, true);
+};
+
+YAHOO.extendX(YAHOO.ext.BorderLayout, YAHOO.ext.LayoutManager, {
+    /**
+     * Creates and adds a new region if it doesn't already exist.
+     * @param {String} target The target region key (north, south, east, west or center).
+     * @param {Object} config The regions config object
+     * @return {BorderLayoutRegion} The new region
+     */
+    addRegion : function(target, config){
+        if(!this.regions[target]){
+            var r = this.factory.create(target, this, config);
+    	    this.regions[target] = r;
+    	    r.on('visibilitychange', this.layout, this, true);
+            r.on('paneladded', this.layout, this, true);
+            r.on('panelremoved', this.layout, this, true);
+            r.on('invalidated', this.layout, this, true);
+            r.on('resized', this.onRegionResized, this, true);
+            r.on('collapsed', this.onRegionCollapsed, this, true);
+            r.on('expanded', this.onRegionExpanded, this, true);
+        }
+        return this.regions[target];
+    },
+    
+    /**
+     * Performs a layout update.
+     */
+    layout : function(){
+        if(this.updating) return;
+        //var bench = new YAHOO.ext.util.Bench();
+	    //bench.start('Layout...');
+        var size = this.getViewSize();
+        var w = size.width, h = size.height;
+        var centerW = w, centerH = h, centerY = 0, centerX = 0;
+        var x = 0, y = 0;
+        
+        var rs = this.regions;
+        var n = rs['north'], s = rs['south'], west = rs['west'], e = rs['east'], c = rs['center'];
+        if(this.hideOnLayout){
+            c.el.setStyle('display', 'none');
+        }
+        if(n && n.isVisible()){
+            var b = n.getBox();
+            var m = n.getMargins();
+            b.width = w - (m.left+m.right);
+            b.x = m.left;
+            b.y = m.top;
+            centerY = b.height + b.y + m.bottom;
+            centerH -= centerY;
+            n.updateBox(this.safeBox(b));
+        }
+        if(s && s.isVisible()){
+            var b = s.getBox();
+            var m = s.getMargins();
+            b.width = w - (m.left+m.right);
+            b.x = m.left;
+            var totalHeight = (b.height + m.top + m.bottom);
+            b.y = h - totalHeight + m.top;
+            centerH -= totalHeight;
+            s.updateBox(this.safeBox(b));
+        }
+        if(west && west.isVisible()){
+            var b = west.getBox();
+            var m = west.getMargins();
+            b.height = centerH - (m.top+m.bottom);
+            b.x = m.left;
+            b.y = centerY + m.top;
+            var totalWidth = (b.width + m.left + m.right);
+            centerX += totalWidth;
+            centerW -= totalWidth;
+            west.updateBox(this.safeBox(b));
+        }
+        if(e && e.isVisible()){
+            var b = e.getBox();
+            var m = e.getMargins();
+            b.height = centerH - (m.top+m.bottom);
+            var totalWidth = (b.width + m.left + m.right);
+            b.x = w - totalWidth + m.left;
+            b.y = centerY + m.top;
+            centerW -= totalWidth;
+            e.updateBox(this.safeBox(b));
+        }
+        if(c){
+            var m = c.getMargins();
+            var centerBox = {
+                x: centerX + m.left,
+                y: centerY + m.top,
+                width: centerW - (m.left+m.right),
+                height: centerH - (m.top+m.bottom)
+            };
+            if(this.hideOnLayout){
+                c.el.setStyle('display', 'block');
+            }
+            c.updateBox(this.safeBox(centerBox));
+        }
+        //this.el.repaint();
+        this.fireEvent('layout', this);
+        //bench.stop();
+	    //alert(bench.toString());
+    },
+    
+    safeBox : function(box){
+        box.width = Math.max(0, box.width);
+        box.height = Math.max(0, box.height);
+        return box;
+    },
+    
+    /**
+     * Adds a ContentPanel (or subclass) to this layout.
+     * @param {String} target The target region key (north, south, east, west or center).
+     * @param {YAHOO.ext.ContentPanel} panel The panel to add
+     * @return {YAHOO.ext.ContentPanel} The added panel
+     */
+    add : function(target, panel){
+        target = target.toLowerCase();
+        return this.regions[target].add(panel);
+    },
+    
+    /**
+     * Adds a ContentPanel (or subclass) to this layout.
+     * @param {String} target The target region key (north, south, east, west or center).
+     * @param {Number/String/YAHOO.ext.ContentPanel} panel The index, id or panel to remove
+     * @return {YAHOO.ext.ContentPanel} The removed panel
+     */
+    remove : function(target, panel){
+        target = target.toLowerCase();
+        return this.regions[target].remove(panel);
+    },
+    
+    /**
+     * Searches all regions for a panel with the specified id
+     * @param {String} panelId
+     * @return {YAHOO.ext.ContentPanel} The panel or null if it wasn't found
+     */
+    findPanel : function(panelId){
+        var rs = this.regions;
+        for(var target in rs){
+            if(typeof rs[target] != 'function'){
+                var p = rs[target].getPanel(panelId);
+                if(p){
+                    return p;
+                }
+            }
+        }
+        return null;
+    },
+    
+    /**
+     * Searches all regions for a panel with the specified id and activates (shows) it.
+     * @param {String/ContentPanel} panelId The panels id or the panel itself
+     * @return {YAHOO.ext.ContentPanel} The shown panel or null
+     */
+    showPanel : function(panelId) {
+      var rs = this.regions;
+      for(var target in rs){
+         var r = rs[target];
+         if(typeof r != 'function'){
+            if(r.hasPanel(panelId)){
+               return r.showPanel(panelId);
+            }
+         }
+      }
+      return null;
+   },
+   
+   /**
+     * Restores this layouts state using YAHOO.ext.state.Manager or the state provided by the passed provider.
+     * @param {YAHOO.ext.state.Provider} provider (optional) An alternate state provider
+     */
+    restoreState : function(provider){
+        if(!provider){
+            provider = YAHOO.ext.state.Manager;
+        }
+        var sm = new YAHOO.ext.LayoutStateManager();
+        sm.init(this, provider);
+    }
+});
+
+YAHOO.ext.BorderLayout.RegionFactory = {};
+YAHOO.ext.BorderLayout.RegionFactory.validRegions = ['north','south','east','west','center'];
+YAHOO.ext.BorderLayout.RegionFactory.create = function(target, mgr, config){
+    target = target.toLowerCase();
+    switch(target){
+        case 'north':
+            return new YAHOO.ext.NorthLayoutRegion(mgr, config);
+        case 'south':
+            return new YAHOO.ext.SouthLayoutRegion(mgr, config);
+        case 'east':
+            return new YAHOO.ext.EastLayoutRegion(mgr, config);
+        case 'west':
+            return new YAHOO.ext.WestLayoutRegion(mgr, config);
+        case 'center':
+            return new YAHOO.ext.CenterLayoutRegion(mgr, config);
+    }
+    throw 'Layout region "'+target+'" not supported.';
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/BorderLayoutRegions.js.html b/www/extras/yui-ext/docs/output/BorderLayoutRegions.js.html new file mode 100644 index 000000000..34492f92d --- /dev/null +++ b/www/extras/yui-ext/docs/output/BorderLayoutRegions.js.html @@ -0,0 +1,208 @@ +BorderLayoutRegions.js
/*
+ * These classes are private internal classes
+ */
+YAHOO.ext.CenterLayoutRegion = function(mgr, config){
+    YAHOO.ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, 'center');
+    this.visible = true;
+    this.minWidth = config.minWidth || 20;
+    this.minHeight = config.minHeight || 20;
+};
+
+YAHOO.extendX(YAHOO.ext.CenterLayoutRegion, YAHOO.ext.LayoutRegion, {
+    hide : function(){
+        // center panel can't be hidden
+    },
+    
+    show : function(){
+        // center panel can't be hidden
+    },
+    
+    getMinWidth: function(){
+        return this.minWidth;
+    },
+    
+    getMinHeight: function(){
+        return this.minHeight;
+    }
+});
+
+
+YAHOO.ext.NorthLayoutRegion = function(mgr, config){
+    YAHOO.ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, 'north', 'n-resize');
+    if(this.split){
+        this.split.placement = YAHOO.ext.SplitBar.TOP;
+        this.split.orientation = YAHOO.ext.SplitBar.VERTICAL;
+        this.split.el.addClass('ylayout-split-v');
+    }
+    if(typeof config.initialSize != 'undefined'){
+        this.el.setHeight(config.initialSize);
+    }
+};
+YAHOO.extendX(YAHOO.ext.NorthLayoutRegion, YAHOO.ext.SplitLayoutRegion, {
+    getBox : function(){
+        if(this.collapsed){
+            return this.collapsedEl.getBox();
+        }
+        var box = this.el.getBox();
+        if(this.split){
+            box.height += this.split.el.getHeight();
+        }
+        return box;
+    },
+    
+    updateBox : function(box){
+        if(this.split && !this.collapsed){
+            box.height -= this.split.el.getHeight();
+            this.split.el.setLeft(box.x);
+            this.split.el.setTop(box.y+box.height);
+            this.split.el.setWidth(box.width);
+        }
+        if(this.collapsed){
+            this.el.setWidth(box.width);
+            var bodyWidth = box.width - this.el.getBorderWidth('rl');
+            this.bodyEl.setWidth(bodyWidth);
+            if(this.activePanel && this.panelSize){
+                this.activePanel.setSize(bodyWidth, this.panelSize.height);
+            }
+        }
+        YAHOO.ext.NorthLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+YAHOO.ext.SouthLayoutRegion = function(mgr, config){
+    YAHOO.ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, 'south', 's-resize');
+    if(this.split){
+        this.split.placement = YAHOO.ext.SplitBar.BOTTOM;
+        this.split.orientation = YAHOO.ext.SplitBar.VERTICAL;
+        this.split.el.addClass('ylayout-split-v');
+    }
+    if(typeof config.initialSize != 'undefined'){
+        this.el.setHeight(config.initialSize);
+    }
+};
+YAHOO.extendX(YAHOO.ext.SouthLayoutRegion, YAHOO.ext.SplitLayoutRegion, {
+    getBox : function(){
+        if(this.collapsed){
+            return this.collapsedEl.getBox();
+        }
+        var box = this.el.getBox();
+        if(this.split){
+            var sh = this.split.el.getHeight();
+            box.height += sh;
+            box.y -= sh;
+        }
+        return box;
+    },
+    
+    updateBox : function(box){
+        if(this.split && !this.collapsed){
+            var sh = this.split.el.getHeight();
+            box.height -= sh;
+            box.y += sh;
+            this.split.el.setLeft(box.x);
+            this.split.el.setTop(box.y-sh);
+            this.split.el.setWidth(box.width);
+        }
+        if(this.collapsed){
+            this.el.setWidth(box.width);
+            var bodyWidth = box.width - this.el.getBorderWidth('rl');
+            this.bodyEl.setWidth(bodyWidth);
+            if(this.activePanel && this.panelSize){
+                this.activePanel.setSize(bodyWidth, this.panelSize.height);
+            }
+        }
+        YAHOO.ext.SouthLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+YAHOO.ext.EastLayoutRegion = function(mgr, config){
+    YAHOO.ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, 'east', 'e-resize');
+    if(this.split){
+        this.split.placement = YAHOO.ext.SplitBar.RIGHT;
+        this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL;
+        this.split.el.addClass('ylayout-split-h');
+    }
+    if(typeof config.initialSize != 'undefined'){
+        this.el.setWidth(config.initialSize);
+    }
+};
+YAHOO.extendX(YAHOO.ext.EastLayoutRegion, YAHOO.ext.SplitLayoutRegion, {
+    getBox : function(){
+        if(this.collapsed){
+            return this.collapsedEl.getBox();
+        }
+        var box = this.el.getBox();
+        if(this.split){
+            var sw = this.split.el.getWidth();
+            box.width += sw;
+            box.x -= sw;
+        }
+        return box;
+    },
+    
+    updateBox : function(box){
+        if(this.split && !this.collapsed){
+            var sw = this.split.el.getWidth();
+            box.width -= sw;
+            this.split.el.setLeft(box.x);
+            this.split.el.setTop(box.y);
+            this.split.el.setHeight(box.height);
+            box.x += sw;
+        }
+        if(this.collapsed){
+            this.el.setHeight(box.height);
+            var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height;
+            bodyHeight -= this.el.getBorderWidth('tb');
+            this.bodyEl.setHeight(bodyHeight);
+            if(this.activePanel && this.panelSize){
+                this.activePanel.setSize(this.panelSize.width, bodyHeight);
+            }
+        }
+        YAHOO.ext.EastLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+
+YAHOO.ext.WestLayoutRegion = function(mgr, config){
+    YAHOO.ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, 'west', 'w-resize');
+    if(this.split){
+        this.split.placement = YAHOO.ext.SplitBar.LEFT;
+        this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL;
+        this.split.el.addClass('ylayout-split-h');
+    }
+    if(typeof config.initialSize != 'undefined'){
+        this.el.setWidth(config.initialSize);
+    }
+};
+YAHOO.extendX(YAHOO.ext.WestLayoutRegion, YAHOO.ext.SplitLayoutRegion, {
+    getBox : function(){
+        if(this.collapsed){
+            return this.collapsedEl.getBox();
+        }
+        var box = this.el.getBox();
+        if(this.split){
+            box.width += this.split.el.getWidth();
+        }
+        return box;
+    },
+    
+    updateBox : function(box){
+        if(this.split && !this.collapsed){
+            var sw = this.split.el.getWidth();
+            box.width -= sw;
+            this.split.el.setLeft(box.x+box.width);
+            this.split.el.setTop(box.y);
+            this.split.el.setHeight(box.height);
+        }
+        if(this.collapsed){
+            this.el.setHeight(box.height);
+            var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height;
+            bodyHeight -= this.el.getBorderWidth('tb');
+            this.bodyEl.setHeight(bodyHeight);
+            if(this.activePanel && this.panelSize){
+                this.activePanel.setSize(this.panelSize.width, bodyHeight);
+            }
+        }
+        YAHOO.ext.WestLayoutRegion.superclass.updateBox.call(this, box);
+    }
+});
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CSS.js.html b/www/extras/yui-ext/docs/output/CSS.js.html new file mode 100644 index 000000000..0761c4076 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CSS.js.html @@ -0,0 +1,152 @@ +CSS.js
/**
+ * @class YAHOO.ext.util.CSS
+ * Class for manipulating CSS Rules
+ * @singleton
+ */
+YAHOO.ext.util.CSS = new function(){
+	var rules = null;
+   	
+   	var toCamel = function(property) {
+      var convert = function(prop) {
+         var test = /(-[a-z])/i.exec(prop);
+         return prop.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase());
+      };
+      while(property.indexOf('-') > -1) {
+         property = convert(property);
+      }
+      return property;
+   };
+   
+   /**
+    * Gets all css rules for the document
+    * @param {Boolean} refreshCache true to refresh the internal cache
+    * @return {Object} An object (hash) of rules indexed by selector
+    */
+   this.getRules = function(refreshCache){
+   		if(rules == null || refreshCache){
+   			rules = {};
+   			var ds = document.styleSheets;
+   			for(var i =0, len = ds.length; i < len; i++){
+   			    try{
+    		        var ss = ds[i];
+    		        var ssRules = ss.cssRules || ss.rules;
+    		        for(var j = ssRules.length-1; j >= 0; --j){
+    		        	rules[ssRules[j].selectorText] = ssRules[j];
+    		        }
+   			    }catch(e){} // try catch for cross domain access issue
+	        }
+   		}
+   		return rules;
+   	};
+   	
+   	/**
+    * Gets an an individual CSS rule by selector(s)
+    * @param {String/Array} selector The CSS selector or an array of selectors to try. The first selector that is found is returned.
+    * @param {Boolean} refreshCache true to refresh the internal cache
+    * @return {CSSRule} The CSS rule or null if one is not found
+    */
+   this.getRule = function(selector, refreshCache){
+   		var rs = this.getRules(refreshCache);
+   		if(!(selector instanceof Array)){
+   		    return rs[selector];
+   		}
+   		for(var i = 0; i < selector.length; i++){
+			if(rs[selector[i]]){
+				return rs[selector[i]];
+			}
+		}
+		return null;
+   	};
+   	
+   	
+   	/**
+    * Updates a rule property
+    * @param {String/Array} selector If it's an array it tries each selector until it finds one. Stops immediately once one is found.
+    * @param {String} property The css property
+    * @param {String} value The new value for the property
+    * @return {Boolean} true if a rule was found and updated 
+    */
+   this.updateRule = function(selector, property, value){
+   		if(!(selector instanceof Array)){
+   			var rule = this.getRule(selector);
+   			if(rule){
+   				rule.style[toCamel(property)] = value;
+   				return true;
+   			}
+   		}else{
+   			for(var i = 0; i < selector.length; i++){
+   				if(this.updateRule(selector[i], property, value)){
+   					return true;
+   				}
+   			}
+   		}
+   		return false;
+   	};
+   	
+   	/**
+    * Applies a rule to an element without adding the class
+    * @param {HTMLElement} el The element
+    * @param {String/Array} selector If it's an array it tries each selector until it finds one. Stops immediately once one is found.
+    * @return {Boolean} true if a rule was found and applied 
+    */
+   this.apply = function(el, selector){
+   		if(!(selector instanceof Array)){
+   			var rule = this.getRule(selector);
+   			if(rule){
+   			    var s = rule.style;
+   				for(var key in s){
+   				    if(typeof s[key] != 'function'){
+       					if(s[key] && String(s[key]).indexOf(':') < 0 && s[key] != 'false'){
+       						try{el.style[key] = s[key];}catch(e){}
+       					}
+   				    }
+   				}
+   				return true;
+   			}
+   		}else{
+   			for(var i = 0; i < selector.length; i++){
+   				if(this.apply(el, selector[i])){
+   					return true;
+   				}
+   			}
+   		}
+   		return false;
+   	};
+   	
+   	this.applyFirst = function(el, id, selector){
+   		var selectors = [
+   			'#' + id + ' ' + selector,
+   			selector
+   		];
+   		return this.apply(el, selectors);
+   	};
+   	
+   	this.revert = function(el, selector){
+   		if(!(selector instanceof Array)){
+   			var rule = this.getRule(selector);
+   			if(rule){
+   				for(key in rule.style){
+   					if(rule.style[key] && String(rule.style[key]).indexOf(':') < 0 && rule.style[key] != 'false'){
+   						try{el.style[key] = '';}catch(e){}
+   					}
+   				}
+   				return true;
+   			}
+   		}else{
+   			for(var i = 0; i < selector.length; i++){
+   				if(this.revert(el, selector[i])){
+   					return true;
+   				}
+   			}
+   		}
+   		return false;
+   	};
+   	
+   	this.revertFirst = function(el, id, selector){
+   		var selectors = [
+   			'#' + id + ' ' + selector,
+   			selector
+   		];
+   		return this.revert(el, selectors);
+   	};
+}();

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CellEditor.js.html b/www/extras/yui-ext/docs/output/CellEditor.js.html new file mode 100644 index 000000000..a4f99fcf5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CellEditor.js.html @@ -0,0 +1,91 @@ +CellEditor.js
/**
+ * @class YAHOO.ext.grid.CellEditor
+ * Base class for all EditorGrid editors
+ */
+YAHOO.ext.grid.CellEditor = function(element){
+    this.colIndex = null;
+    this.rowIndex = null;
+    this.grid = null;
+    this.editing = false;
+    this.originalValue = null;
+    this.element = getEl(element, true);
+    this.element.addClass('ygrid-editor');
+    this.element.dom.tabIndex = 1;
+    this.initialized = false;
+    this.callback = null;
+};
+
+YAHOO.ext.grid.CellEditor.prototype = {
+    init : function(grid, bodyElement, callback){
+        // there's no way for the grid to know if multiple columns 
+        // share the same editor so it will try to initialize the 
+        // same one over and over
+        if(this.initialized) return;
+        this.initialized = true;
+        this.callback = callback;
+        this.grid = grid;
+        bodyElement.appendChild(this.element.dom);
+        this.initEvents();
+    },
+    
+    initEvents : function(){
+        var stopOnEnter = function(e){
+            if(e.browserEvent.keyCode == e.RETURN){
+                this.stopEditing(true);
+            }else if(e.browserEvent.keyCode == e.ESC){
+                this.setValue(this.originalValue);
+                this.stopEditing(true);
+            }
+        }
+        this.element.mon('keydown', stopOnEnter, this, true);
+        this.element.on('blur', this.stopEditing, this, true);
+    },
+
+    startEditing : function(value, row, cell){
+        this.originalValue = value;
+        this.rowIndex = row.rowIndex;
+        this.colIndex = cell.columnIndex;
+        this.cell = cell;
+        this.setValue(value);
+        var cellbox = getEl(cell, true).getBox();
+        this.fitToCell(cellbox);
+        this.editing = true;
+        this.show();
+    },
+     
+    stopEditing : function(focusCell){
+         if(this.editing){
+             this.editing = false;
+             var newValue = this.getValue();
+             this.hide();
+             //if(focusCell){try{this.cell.focus();}catch(e){}}; // try to give the cell focus so keyboard nav still works
+             if(this.originalValue != newValue){
+                this.callback(newValue, this.rowIndex, this.colIndex);
+             }
+         }
+     },
+     
+    setValue : function(value){
+        this.element.dom.value = value;
+    },
+    
+    getValue : function(){
+        return this.element.dom.value;
+    },
+    
+    fitToCell : function(box){
+        this.element.setBox(box, true);
+    },
+    
+    show : function(){
+        this.element.show();
+        this.element.focus();
+    },
+    
+    hide : function(){
+        try{
+            this.element.dom.blur();
+        }catch(e){}
+        this.element.hide();
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CheckboxEditor.js.html b/www/extras/yui-ext/docs/output/CheckboxEditor.js.html new file mode 100644 index 000000000..0294d5e00 --- /dev/null +++ b/www/extras/yui-ext/docs/output/CheckboxEditor.js.html @@ -0,0 +1,60 @@ +CheckboxEditor.js
/**
+ * @class YAHOO.ext.grid.CheckboxEditor
+ * @extends YAHOO.ext.grid.CellEditor
+Provides a checkbox for editing boolean values. It currently has no configuration options.<br><br>
+For more information on using this editor, see <a href="http://www.jackslocum.com/yui/2006/09/10/adding-built-in-editing-support-to-the-yahoo-ui-extensions-grid/">this blog post</a>.
+* @constructor
+* Create a new CheckboxEditor
+ */
+YAHOO.ext.grid.CheckboxEditor = function(){
+    var div = document.createElement('span');
+    div.className = 'ygrid-editor ygrid-checkbox-editor';
+    var cb = document.createElement('input');
+    cb.type = 'checkbox';
+    cb.setAttribute('autocomplete', 'off');
+    div.appendChild(cb);
+    document.body.appendChild(div);
+    YAHOO.ext.grid.CheckboxEditor.superclass.constructor.call(this, div);
+    div.tabIndex = '';
+    cb.tabIndex = 1;
+    this.cb = getEl(cb, true);
+};
+
+YAHOO.extendX(YAHOO.ext.grid.CheckboxEditor, YAHOO.ext.grid.CellEditor);
+
+YAHOO.ext.grid.CheckboxEditor.prototype.fitToCell = function(box){
+    this.element.setBox(box, true);
+};
+
+YAHOO.ext.grid.CheckboxEditor.prototype.setValue = function(value){
+     this.cb.dom.checked = (value === true || value === 'true' || value === 1 || value === '1');
+};
+
+YAHOO.ext.grid.CheckboxEditor.prototype.getValue = function(){
+     return this.cb.dom.checked;
+};
+
+YAHOO.ext.grid.CheckboxEditor.prototype.show = function(){
+    this.element.show();
+    this.cb.focus();
+};
+
+YAHOO.ext.grid.CheckboxEditor.prototype.initEvents = function(){
+    var stopOnEnter = function(e){
+        if(e.browserEvent.keyCode == e.RETURN){
+            this.stopEditing(true);
+        }else if(e.browserEvent.keyCode == e.ESC){
+            this.setValue(this.originalValue);
+            this.stopEditing(true);
+        }
+    }
+    this.cb.mon('keydown', stopOnEnter, this, true);
+    this.cb.on('blur', this.stopEditing, this, true);
+};
+
+YAHOO.ext.grid.CheckboxEditor.prototype.hide = function(){
+    try{
+        this.cb.dom.blur();
+    }catch(e){}
+    this.element.hide();
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/CompositeElement.js.html b/www/extras/yui-ext/docs/output/CompositeElement.js.html new file mode 100644 index 000000000..41376dd1b --- /dev/null +++ b/www/extras/yui-ext/docs/output/CompositeElement.js.html @@ -0,0 +1,140 @@ +CompositeElement.js
/**
+ * @class YAHOO.ext.CompositeElement
+ * Standard composite class. Creates a YAHOO.ext.Element for every element in the collection.
+ * <br><br>
+ * <b>NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element
+ * actions will be performed on all the elements in this collection.</b>
+ * <br><br>
+ * All methods return <i>this</i> and can be chained.
+ <pre><code>
+ var els = getEls('#some-el div.some-class');
+ // or
+ var els = YAHOO.ext.Element.select('#some-el div.some-class');
+ els.setWidth(100); // all elements become 100 width
+ els.hide(true); // all elements fade out and hide
+ // or
+ els.setWidth(100).hide(true);
+ </code></pre>
+ */
+YAHOO.ext.CompositeElement = function(els){
+    this.elements = [];
+    this.addElements(els);
+};
+YAHOO.ext.CompositeElement.prototype = {
+    isComposite: true,
+    addElements : function(els){
+        if(!els) return this;
+        var yels = this.elements;
+        var index = yels.length-1;
+        for(var i = 0, len = els.length; i < len; i++) {
+        	yels[++index] = getEl(els[i], true);
+        }
+        return this;
+    },
+    invoke : function(fn, args){
+        var els = this.elements;
+        for(var i = 0, len = els.length; i < len; i++) {
+        	YAHOO.ext.Element.prototype[fn].apply(els[i], args);
+        }
+        return this;
+    },
+    /**
+    * Adds elements to this composite.
+    * @param {String/Array} els A string CSS selector, an array of elements or an element
+    * @return {CompositeElement} this
+    */
+    add : function(els){
+        if(typeof els == 'string'){
+            this.addElements(YAHOO.ext.Element.selectorFunction(string));
+        }else if(els instanceof Array){
+            this.addElements(els);
+        }else{
+            this.addElements([els]);
+        }
+        return this;
+    },
+    /**
+    * Calls the passed function passing (el, this, index) for each element in this composite.
+    * @param {Function} fn The function to call
+    * @param {Object} scope (optional) The <i>this</i> object (defaults to the element)
+    * @return {CompositeElement} this
+    */
+    each : function(fn, scope){
+        var els = this.elements;
+        for(var i = 0, len = els.length; i < len; i++){
+            fn.call(scope || els[i], els[i], this, i);
+        }
+        return this;
+    }
+};
+/**
+ * @class YAHOO.ext.CompositeElementLite
+ * @extends YAHOO.ext.CompositeElement
+ * Flyweight composite class. Reuses the same YAHOO.ext.Element for element operations.
+ * <br><br>
+ * <b>NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element
+ * actions will be performed on all the elements in this collection.</b>
+ */
+YAHOO.ext.CompositeElementLite = function(els){
+    YAHOO.ext.CompositeElementLite.superclass.constructor.call(this, els);
+    this.el = YAHOO.ext.Element.get(this.elements[0], true);
+};
+YAHOO.extendX(YAHOO.ext.CompositeElementLite, YAHOO.ext.CompositeElement, {
+    addElements : function(els){
+        if(els){
+            this.elements = this.elements.concat(els);
+        }
+        return this;
+    },
+    invoke : function(fn, args){
+        var els = this.elements;
+        var el = this.el;
+        for(var i = 0, len = els.length; i < len; i++) {
+            el.dom = els[i];
+        	YAHOO.ext.Element.prototype[fn].apply(el, args);
+        }
+        return this;
+    }
+});
+YAHOO.ext.CompositeElement.createCall = function(proto, fnName){
+    if(!proto[fnName]){
+        proto[fnName] = function(){
+            return this.invoke(fnName, arguments);  
+        };
+    }
+};
+for(var fnName in YAHOO.ext.Element.prototype){
+    if(typeof YAHOO.ext.Element.prototype[fnName] == 'function'){
+        YAHOO.ext.CompositeElement.createCall(YAHOO.ext.CompositeElement.prototype, fnName);
+    }
+}
+if(typeof cssQuery == 'function'){// Dean Edwards cssQuery
+    YAHOO.ext.Element.selectorFunction = cssQuery;
+}else if(typeof document.getElementsBySelector == 'function'){ // Simon Willison's getElementsBySelector
+    YAHOO.ext.Element.selectorFunction = document.getElementsBySelector.createDelegate(document);
+}
+/**
+ * @member YAHOO.ext.Element
+* Selects elements based on the passed CSS selector to enable working on them as 1.
+* @param {String/Array} selector The CSS selector or an array of elements
+* @param {Boolean} unique (optional) true to create a unique YAHOO.ext.Element for each element (defaults to a shared flyweight object)
+* @return {CompositeElementLite/CompositeElement}
+* @method @static
+*/
+YAHOO.ext.Element.select = function(selector, unique){
+    var els;
+    if(typeof selector == 'string'){
+        els = YAHOO.ext.Element.selectorFunction(selector);
+    }else if(selector instanceof Array){
+        els = selector;
+    }else{
+        throw 'Invalid selector';
+    }
+    if(unique === true){
+        return new YAHOO.ext.CompositeElement(els);
+    }else{
+        return new YAHOO.ext.CompositeElementLite(els);
+    }
+};
+
+var getEls = YAHOO.ext.Element.select;

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/ContentPanels.js.html b/www/extras/yui-ext/docs/output/ContentPanels.js.html new file mode 100644 index 000000000..ad1e9fce4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/ContentPanels.js.html @@ -0,0 +1,296 @@ +ContentPanels.js
/**
+ * @class YAHOO.ext.ContentPanel
+ * @extends YAHOO.ext.util.Observable
+ * A basic ContentPanel element.
+ * @constructor
+ * Create a new ContentPanel.
+ * @param {String/HTMLElement/Element} el The container element for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ * @param {String} content (optional) Set the HTML content for this panel
+ */
+YAHOO.ext.ContentPanel = function(el, config, content){
+    YAHOO.ext.ContentPanel.superclass.constructor.call(this);
+    this.el = getEl(el, true);
+    if(!this.el && config && config.autoCreate){
+        if(typeof config.autoCreate == 'object'){
+            if(!config.autoCreate.id){
+                config.autoCreate.id = el;
+            }
+            this.el = YAHOO.ext.DomHelper.append(document.body,
+                        config.autoCreate, true);
+        }else{
+            this.el = YAHOO.ext.DomHelper.append(document.body,
+                        {tag: 'div', cls: 'ylayout-inactive-content', id: el}, true);
+        }
+    }
+    this.closable = false;
+    this.loaded = false;
+    this.active = false;
+    if(typeof config == 'string'){
+        this.title = config;
+    }else{
+        YAHOO.ext.util.Config.apply(this, config);
+    }
+    if(this.resizeEl){
+        this.resizeEl = getEl(this.resizeEl, true);
+    }else{
+        this.resizeEl = this.el;
+    }
+    this.events = {
+        /**
+         * @event activate
+         * Fires when this panel is activated. 
+         * @param {YAHOO.ext.ContentPanel} this
+         */
+        'activate' : new YAHOO.util.CustomEvent('activate'),
+        /**
+         * @event deactivate
+         * Fires when this panel is activated. 
+         * @param {YAHOO.ext.ContentPanel} this
+         */
+        'deactivate' : new YAHOO.util.CustomEvent('deactivate') 
+    };
+    if(content){
+        this.setContent(content);
+    }
+};
+
+YAHOO.extendX(YAHOO.ext.ContentPanel, YAHOO.ext.util.Observable, {
+    setRegion : function(region){
+        this.region = region;
+        if(region){
+           this.el.replaceClass('ylayout-inactive-content', 'ylayout-active-content'); 
+        }else{
+           this.el.replaceClass('ylayout-active-content', 'ylayout-inactive-content'); 
+        } 
+    },
+    
+    /**
+     * Returns the toolbar for this Panel if one was configured
+     * @return {YAHOO.ext.Toolbar} 
+     */
+    getToolbar : function(){
+        return this.toolbar;
+    },
+    
+    setActiveState : function(active){
+        this.active = active;
+        if(!active){
+            this.fireEvent('deactivate', this);
+        }else{
+            this.fireEvent('activate', this);
+        }
+    },
+    
+    /**
+     * Updates this panel's element
+     * @param {String} content The new content
+     * @param {<i>Boolean</i>} loadScripts (optional) true to look for and process scripts
+    */
+    setContent : function(content, loadScripts){
+        this.el.update(content, loadScripts);
+    },
+    
+    /**
+     * Get the {@link YAHOO.ext.UpdateManager} for this panel. Enables you to perform Ajax updates.
+     * @return {YAHOO.ext.UpdateManager} The UpdateManager
+     */
+    getUpdateManager : function(){
+        return this.el.getUpdateManager();
+    },
+    
+    /**
+     * Set a URL to be used to load the content for this panel.
+     * @param {String/Function} url The url to load the content from or a function to call to get the url
+     * @param {<i>String/Object</i>} params (optional) The string params for the update call or an object of the params. See {@link YAHOO.ext.UpdateManager#update} for more details. (Defaults to null)
+     * @param {<i>Boolean</i>} loadOnce (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this panel is activated. (Defaults to false)
+     * @return {YAHOO.ext.UpdateManager} The UpdateManager
+     */
+    setUrl : function(url, params, loadOnce){
+        if(this.refreshDelegate){
+            this.removeListener('activate', this.refreshDelegate);
+        }
+        this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]);
+        this.on('activate', this._handleRefresh.createDelegate(this, [url, params, loadOnce]));
+        return this.el.getUpdateManager();
+    },
+    
+    _handleRefresh : function(url, params, loadOnce){
+        if(!loadOnce || !this.loaded){
+            var updater = this.el.getUpdateManager();
+            updater.update(url, params, this._setLoaded.createDelegate(this));
+        }
+    },
+    
+    _setLoaded : function(){
+        this.loaded = true;
+    }, 
+    
+    /**
+     * Returns this panel's id
+     * @return {String} 
+     */
+    getId : function(){
+        return this.el.id;
+    },
+    
+    /**
+     * Returns this panel's element
+     * @return {YAHOO.ext.Element} 
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    adjustForComponents : function(width, height){
+        if(this.toolbar){
+            height -= this.toolbar.getEl().getHeight();
+        }
+        return {'width': width, 'height': height};
+    },
+    
+    setSize : function(width, height){
+        if(this.fitToFrame){
+            var size = this.adjustForComponents(width, height);
+            this.resizeEl.setSize(size.width, size.height);
+        }
+    },
+    
+    /**
+     * Returns this panel's title
+     * @return {String} 
+     */
+    getTitle : function(){
+        return this.title;
+    },
+    
+    /**
+     * Set this panel's title
+     * @param {String} title
+     */
+    setTitle : function(title){
+        this.title = title;
+        if(this.region){
+            this.region.updatePanelTitle(this, title);
+        }
+    },
+    
+    /**
+     * Returns true is this panel was configured to be closable
+     * @return {Boolean} 
+     */
+    isClosable : function(){
+        return this.closable;
+    },
+    
+    beforeSlide : function(){
+        this.el.clip();
+        this.resizeEl.clip();
+    },
+    
+    afterSlide : function(){
+        this.el.unclip();
+        this.resizeEl.unclip();
+    },
+    
+    /**
+     * Destroys this panel
+     */
+    destroy : function(){
+        this.el.removeAllListeners();
+        var tempEl = document.createElement('span');
+        tempEl.appendChild(this.el.dom);
+        tempEl.innerHTML = '';
+        this.el = null;
+    }
+});
+
+/**
+ * @class YAHOO.ext.GridPanel
+ * @extends YAHOO.ext.ContentPanel
+ * @constructor
+ * Create a new GridPanel.
+ * @param {YAHOO.ext.grid.Grid} grid The grid for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+YAHOO.ext.GridPanel = function(grid, config){
+    this.wrapper = YAHOO.ext.DomHelper.append(document.body, // wrapper for IE7 strict & safari scroll issue
+        {tag: 'div', cls: 'ylayout-grid-wrapper ylayout-inactive-content'}, true);
+    this.wrapper.dom.appendChild(grid.container.dom);
+    YAHOO.ext.GridPanel.superclass.constructor.call(this, this.wrapper, config);
+    if(this.toolbar){
+        this.toolbar.el.insertBefore(this.wrapper.dom.firstChild);
+    }
+    grid.monitorWindowResize = false; // turn off autosizing
+    grid.autoHeight = false;
+    grid.autoWidth = false;
+    this.grid = grid;
+    this.grid.container.replaceClass('ylayout-inactive-content', 'ylayout-component-panel');
+};
+
+YAHOO.extendX(YAHOO.ext.GridPanel, YAHOO.ext.ContentPanel, {
+    getId : function(){
+        return this.grid.id;
+    },
+    
+    /**
+     * Returns the grid for this panel
+     * @return {YAHOO.ext.grid.Grid} 
+     */
+    getGrid : function(){
+        return this.grid;    
+    },
+    
+    setSize : function(width, height){
+        var grid = this.grid;
+        var size = this.adjustForComponents(width, height);
+        grid.container.setSize(size.width, size.height);
+        grid.autoSize();
+    },
+    
+    beforeSlide : function(){
+        this.grid.getView().wrapEl.clip();
+    },
+    
+    afterSlide : function(){
+        this.grid.getView().wrapEl.unclip();
+    },
+    
+    destroy : function(){
+        this.grid.getView().unplugDataModel(this.grid.getDataModel());
+        this.grid.container.removeAllListeners();
+        YAHOO.ext.GridPanel.superclass.destroy.call(this);
+    }
+});
+
+
+/**
+ * @class YAHOO.ext.NestedLayoutPanel
+ * @extends YAHOO.ext.ContentPanel
+ * @constructor
+ * Create a new NestedLayoutPanel.
+ * @param {YAHOO.ext.BorderLayout} layout The layout for this panel
+ * @param {String/Object} config A string to set only the title or a config object
+ */
+YAHOO.ext.NestedLayoutPanel = function(layout, config){
+    YAHOO.ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config);
+    layout.monitorWindowResize = false; // turn off autosizing
+    this.layout = layout;
+    this.layout.getEl().addClass('ylayout-nested-layout');
+};
+
+YAHOO.extendX(YAHOO.ext.NestedLayoutPanel, YAHOO.ext.ContentPanel, {
+    setSize : function(width, height){
+        var size = this.adjustForComponents(width, height);
+        this.layout.getEl().setSize(size.width, size.height);
+        this.layout.layout();
+    },
+    
+    /**
+     * Returns the nested BorderLayout for this panel
+     * @return {YAHOO.ext.BorderLayout} 
+     */
+    getLayout : function(){
+        return this.layout;
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Date.js.html b/www/extras/yui-ext/docs/output/Date.js.html new file mode 100644 index 000000000..74bda34fe --- /dev/null +++ b/www/extras/yui-ext/docs/output/Date.js.html @@ -0,0 +1,409 @@ +Date.js
/*
+ * All the Date functions below are the excellent work of Baron Schwartz
+ * They generate precompiled functions from date formats instead of parsing and processing
+ * the format everytime you do something with a date.
+ */
+// holder
+/** @ignore */
+Date.parseFunctions = {count:0};
+/** @ignore */
+Date.parseRegexes = [];
+/** @ignore */
+Date.formatFunctions = {count:0};
+
+/**
+ * Formats a date given to the supplied format - the format syntax is the same as <a href="http://www.php.net/date">PHP's date() function</a>.
+ */
+Date.prototype.dateFormat = function(format) {
+    if (Date.formatFunctions[format] == null) {
+        Date.createNewFormat(format);
+    }
+    var func = Date.formatFunctions[format];
+    return this[func]();
+};
+
+/**
+ * Same as {@link #dateFormat}
+ */
+Date.prototype.format = Date.prototype.dateFormat;
+
+/** @ignore */
+Date.createNewFormat = function(format) {
+    var funcName = "format" + Date.formatFunctions.count++;
+    Date.formatFunctions[format] = funcName;
+    var code = "Date.prototype." + funcName + " = function(){return ";
+    var special = false;
+    var ch = '';
+    for (var i = 0; i < format.length; ++i) {
+        ch = format.charAt(i);
+        if (!special && ch == "\\") {
+            special = true;
+        }
+        else if (special) {
+            special = false;
+            code += "'" + String.escape(ch) + "' + ";
+        }
+        else {
+            code += Date.getFormatCode(ch);
+        }
+    }
+    eval(code.substring(0, code.length - 3) + ";}");
+};
+
+/** @ignore */
+Date.getFormatCode = function(character) {
+    switch (character) {
+    case "d":
+        return "String.leftPad(this.getDate(), 2, '0') + ";
+    case "D":
+        return "Date.dayNames[this.getDay()].substring(0, 3) + ";
+    case "j":
+        return "this.getDate() + ";
+    case "l":
+        return "Date.dayNames[this.getDay()] + ";
+    case "S":
+        return "this.getSuffix() + ";
+    case "w":
+        return "this.getDay() + ";
+    case "z":
+        return "this.getDayOfYear() + ";
+    case "W":
+        return "this.getWeekOfYear() + ";
+    case "F":
+        return "Date.monthNames[this.getMonth()] + ";
+    case "m":
+        return "String.leftPad(this.getMonth() + 1, 2, '0') + ";
+    case "M":
+        return "Date.monthNames[this.getMonth()].substring(0, 3) + ";
+    case "n":
+        return "(this.getMonth() + 1) + ";
+    case "t":
+        return "this.getDaysInMonth() + ";
+    case "L":
+        return "(this.isLeapYear() ? 1 : 0) + ";
+    case "Y":
+        return "this.getFullYear() + ";
+    case "y":
+        return "('' + this.getFullYear()).substring(2, 4) + ";
+    case "a":
+        return "(this.getHours() < 12 ? 'am' : 'pm') + ";
+    case "A":
+        return "(this.getHours() < 12 ? 'AM' : 'PM') + ";
+    case "g":
+        return "((this.getHours() %12) ? this.getHours() % 12 : 12) + ";
+    case "G":
+        return "this.getHours() + ";
+    case "h":
+        return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + ";
+    case "H":
+        return "String.leftPad(this.getHours(), 2, '0') + ";
+    case "i":
+        return "String.leftPad(this.getMinutes(), 2, '0') + ";
+    case "s":
+        return "String.leftPad(this.getSeconds(), 2, '0') + ";
+    case "O":
+        return "this.getGMTOffset() + ";
+    case "T":
+        return "this.getTimezone() + ";
+    case "Z":
+        return "(this.getTimezoneOffset() * -60) + ";
+    default:
+        return "'" + String.escape(character) + "' + ";
+    };
+};
+
+/**
+ * Parses a date given the supplied format - the format syntax is the same as <a href="http://www.php.net/date">PHP's date() function</a>.
+ */
+Date.parseDate = function(input, format) {
+    if (Date.parseFunctions[format] == null) {
+        Date.createParser(format);
+    }
+    var func = Date.parseFunctions[format];
+    return Date[func](input);
+};
+
+/** @ignore */
+Date.createParser = function(format) {
+    var funcName = "parse" + Date.parseFunctions.count++;
+    var regexNum = Date.parseRegexes.length;
+    var currentGroup = 1;
+    Date.parseFunctions[format] = funcName;
+
+    var code = "Date." + funcName + " = function(input){\n"
+        + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n"
+        + "var d = new Date();\n"
+        + "y = d.getFullYear();\n"
+        + "m = d.getMonth();\n"
+        + "d = d.getDate();\n"
+        + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n"
+        + "if (results && results.length > 0) {"
+    var regex = "";
+
+    var special = false;
+    var ch = '';
+    for (var i = 0; i < format.length; ++i) {
+        ch = format.charAt(i);
+        if (!special && ch == "\\") {
+            special = true;
+        }
+        else if (special) {
+            special = false;
+            regex += String.escape(ch);
+        }
+        else {
+            obj = Date.formatCodeToRegex(ch, currentGroup);
+            currentGroup += obj.g;
+            regex += obj.s;
+            if (obj.g && obj.c) {
+                code += obj.c;
+            }
+        }
+    }
+
+    code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n"
+        + "{return new Date(y, m, d, h, i, s);}\n"
+        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n"
+        + "{return new Date(y, m, d, h, i);}\n"
+        + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n"
+        + "{return new Date(y, m, d, h);}\n"
+        + "else if (y > 0 && m >= 0 && d > 0)\n"
+        + "{return new Date(y, m, d);}\n"
+        + "else if (y > 0 && m >= 0)\n"
+        + "{return new Date(y, m);}\n"
+        + "else if (y > 0)\n"
+        + "{return new Date(y);}\n"
+        + "}return null;}";
+
+    Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$");
+    eval(code);
+};
+
+/** @ignore */
+Date.formatCodeToRegex = function(character, currentGroup) {
+    switch (character) {
+    case "D":
+        return {g:0,
+        c:null,
+        s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};
+    case "j":
+    case "d":
+        return {g:1,
+            c:"d = parseInt(results[" + currentGroup + "], 10);\n",
+            s:"(\\d{1,2})"};
+    case "l":
+        return {g:0,
+            c:null,
+            s:"(?:" + Date.dayNames.join("|") + ")"};
+    case "S":
+        return {g:0,
+            c:null,
+            s:"(?:st|nd|rd|th)"};
+    case "w":
+        return {g:0,
+            c:null,
+            s:"\\d"};
+    case "z":
+        return {g:0,
+            c:null,
+            s:"(?:\\d{1,3})"};
+    case "W":
+        return {g:0,
+            c:null,
+            s:"(?:\\d{2})"};
+    case "F":
+        return {g:1,
+            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n",
+            s:"(" + Date.monthNames.join("|") + ")"};
+    case "M":
+        return {g:1,
+            c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n",
+            s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};
+    case "n":
+    case "m":
+        return {g:1,
+            c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n",
+            s:"(\\d{1,2})"};
+    case "t":
+        return {g:0,
+            c:null,
+            s:"\\d{1,2}"};
+    case "L":
+        return {g:0,
+            c:null,
+            s:"(?:1|0)"};
+    case "Y":
+        return {g:1,
+            c:"y = parseInt(results[" + currentGroup + "], 10);\n",
+            s:"(\\d{4})"};
+    case "y":
+        return {g:1,
+            c:"var ty = parseInt(results[" + currentGroup + "], 10);\n"
+                + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",
+            s:"(\\d{1,2})"};
+    case "a":
+        return {g:1,
+            c:"if (results[" + currentGroup + "] == 'am') {\n"
+                + "if (h == 12) { h = 0; }\n"
+                + "} else { if (h < 12) { h += 12; }}",
+            s:"(am|pm)"};
+    case "A":
+        return {g:1,
+            c:"if (results[" + currentGroup + "] == 'AM') {\n"
+                + "if (h == 12) { h = 0; }\n"
+                + "} else { if (h < 12) { h += 12; }}",
+            s:"(AM|PM)"};
+    case "g":
+    case "G":
+    case "h":
+    case "H":
+        return {g:1,
+            c:"h = parseInt(results[" + currentGroup + "], 10);\n",
+            s:"(\\d{1,2})"};
+    case "i":
+        return {g:1,
+            c:"i = parseInt(results[" + currentGroup + "], 10);\n",
+            s:"(\\d{2})"};
+    case "s":
+        return {g:1,
+            c:"s = parseInt(results[" + currentGroup + "], 10);\n",
+            s:"(\\d{2})"};
+    case "O":
+        return {g:0,
+            c:null,
+            s:"[+-]\\d{4}"};
+    case "T":
+        return {g:0,
+            c:null,
+            s:"[A-Z]{3}"};
+    case "Z":
+        return {g:0,
+            c:null,
+            s:"[+-]\\d{1,5}"};
+    default:
+        return {g:0,
+            c:null,
+            s:String.escape(character)};
+    }
+};
+
+Date.prototype.getTimezone = function() {
+    return this.toString().replace(
+        /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace(
+        /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3");
+};
+
+Date.prototype.getGMTOffset = function() {
+    return (this.getTimezoneOffset() > 0 ? "-" : "+")
+        + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0")
+        + String.leftPad(this.getTimezoneOffset() % 60, 2, "0");
+};
+
+Date.prototype.getDayOfYear = function() {
+    var num = 0;
+    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
+    for (var i = 0; i < this.getMonth(); ++i) {
+        num += Date.daysInMonth[i];
+    }
+    return num + this.getDate() - 1;
+};
+
+Date.prototype.getWeekOfYear = function() {
+    // Skip to Thursday of this week
+    var now = this.getDayOfYear() + (4 - this.getDay());
+    // Find the first Thursday of the year
+    var jan1 = new Date(this.getFullYear(), 0, 1);
+    var then = (7 - jan1.getDay() + 4);
+    document.write(then);
+    return String.leftPad(((now - then) / 7) + 1, 2, "0");
+};
+
+Date.prototype.isLeapYear = function() {
+    var year = this.getFullYear();
+    return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year)));
+};
+
+Date.prototype.getFirstDayOfMonth = function() {
+    var day = (this.getDay() - (this.getDate() - 1)) % 7;
+    return (day < 0) ? (day + 7) : day;
+};
+
+Date.prototype.getLastDayOfMonth = function() {
+    var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7;
+    return (day < 0) ? (day + 7) : day;
+};
+
+Date.prototype.getDaysInMonth = function() {
+    Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28;
+    return Date.daysInMonth[this.getMonth()];
+};
+
+/** @ignore */
+Date.prototype.getSuffix = function() {
+    switch (this.getDate()) {
+        case 1:
+        case 21:
+        case 31:
+            return "st";
+        case 2:
+        case 22:
+            return "nd";
+        case 3:
+        case 23:
+            return "rd";
+        default:
+            return "th";
+    }
+};
+
+/** @ignore */
+Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
+
+/**
+ * Override these values for international dates, for example...
+ * Date.monthNames = ['JanInYourLang', 'FebInYourLang', ...];
+ */
+Date.monthNames =
+   ["January",
+    "February",
+    "March",
+    "April",
+    "May",
+    "June",
+    "July",
+    "August",
+    "September",
+    "October",
+    "November",
+    "December"];
+    
+/**
+ * Override these values for international dates, for example...
+ * Date.dayNames = ['SundayInYourLang', 'MondayInYourLang', ...];
+ */
+Date.dayNames =
+   ["Sunday",
+    "Monday",
+    "Tuesday",
+    "Wednesday",
+    "Thursday",
+    "Friday",
+    "Saturday"];
+
+/** @ignore */
+Date.y2kYear = 50;
+
+/** @ignore */
+Date.monthNumbers = {
+    Jan:0,
+    Feb:1,
+    Mar:2,
+    Apr:3,
+    May:4,
+    Jun:5,
+    Jul:6,
+    Aug:7,
+    Sep:8,
+    Oct:9,
+    Nov:10,
+    Dec:11};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DateEditor.js.html b/www/extras/yui-ext/docs/output/DateEditor.js.html new file mode 100644 index 000000000..77d54a51b --- /dev/null +++ b/www/extras/yui-ext/docs/output/DateEditor.js.html @@ -0,0 +1,268 @@ +DateEditor.js
/**
+ * @class YAHOO.ext.grid.DateEditor
+ * @extends YAHOO.ext.grid.CellEditor
+Provides a date editor field, and optionally a DatePicker. The DateEditor provides a method to override (showCalendar) if you don't want to use the built in DatePicker control. The reason I chose to use my own DatePicker control rather than the nice YUI Calendar component is my control was very easy to override events to make it work well with the grid. It's also only 5k compressed, while the YUI Calendar is 40k compressed. The DatePicker supports left/right keys to move months, up/down keys to move years and the mouse wheel to quickly go through the months. The DateEditor supports the following configuration options:
+<ul class="list">
+<li><i>format</i> - The date format for the editor. The format is identical to <a href="http://www.php.net/date">PHP date()</a> and text is allowed. Credit for that goes to <a style="font-weight:normal;" href="http://www.xaprb.com/blog/2006/05/14/javascript-date-formatting-benchmarks/">this fantastic date library</a>. This format is for the editor only and doesn't affect the rendering of the cell when not in edit mode. Your rendering function can use any date format it wants.</li>
+<li><i>minValue</i> - The minimum allowed date. Can be either a Javascript date object or a string date in the specified format.</li>
+<li><i>maxValue</i> - The maximum allowed date. Can be either a Javascript date object or a string date in the specified format.</li>
+<li><i>minText</i> - The tooltip to display when the date in the cell is before minValue.</li>
+<li><i>maxText</i> - The tooltip to display when the date in the cell is after maxValue.</li>
+<li><i>invalidText</i> - The text to display when the date in the field is invalid (for example: 02/31/06)</li>
+<li><i>disabledDays</i> - An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday.</li>
+<li><i>disabledDaysText</i> - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled day.</li>
+<li><i>disabledDates</i> - An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so they are very powerful. For example, ["03/08/2003", "09/16/2003"] would disable those dates, but ["03/08", "09/16"] would disable them for every year. If you are using short years, you will want to use ^ to tell the regular expression to only match the beginning like ["^03/08"]. To disable March of 2006: ["03/../2006"] or every March ["^03"]. In order to support regular expressions, if you are using a date format that has "." in it, you will have to  escape the dot when restricting dates. For example: ["03\\.08\\.03"].</li>
+<li><i>disabledDatesText</i> - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled date.</li>
+<li><i>allowBlank</i> - True if the cell is allowed to be empty.</li>
+<li><i>blankText</i> - The tooltip (error message) to display when the cell is empty and is not allowed to be.</li>
+<li><i>validator</i> - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.</li>
+<li><i>validationDelay</i> - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).</li>
+</ul>
+For more information on using this editor, see <a href="http://www.jackslocum.com/yui/2006/09/10/adding-built-in-editing-support-to-the-yahoo-ui-extensions-grid/">this blog post</a>.
+* @constructor
+* Create a new DateEditor
+* @param {Object} config
+ */
+YAHOO.ext.grid.DateEditor = function(config){
+    var div = document.createElement('span');
+    div.className = 'ygrid-editor ygrid-editor-container';
+    
+    var element = document.createElement('input');
+    element.type = 'text';
+    element.tabIndex = 1;
+    element.setAttribute('autocomplete', 'off');
+    div.appendChild(element);
+    
+    var pick = document.createElement('span');
+    pick.className = 'pick-button';
+    div.appendChild(pick);
+    
+    document.body.appendChild(div);
+    
+    this.div = getEl(div, true);
+    this.element = getEl(element, true);
+    this.pick = getEl(pick, true);
+    
+    this.colIndex = null;
+    this.rowIndex = null;
+    this.grid = null;
+    this.editing = false;
+    this.originalValue = null;
+    this.initialized = false;
+    this.callback = null;
+    
+    this.cal = null;
+    this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true);
+    
+    YAHOO.ext.util.Config.apply(this, config);
+    if(typeof this.minValue == 'string') this.minValue = this.parseDate(this.minValue);
+    if(typeof this.maxValue == 'string') this.maxValue = this.parseDate(this.maxValue);
+    this.ddMatch = /ddnone/;
+    if(this.disabledDates){
+        var dd = this.disabledDates;
+        var re = "(?:";
+        for(var i = 0; i < dd.length; i++){
+            re += dd[i];
+            if(i != dd.length-1) re += "|";
+        }
+        this.ddMatch = new RegExp(re + ")");
+    }
+};
+
+YAHOO.ext.grid.DateEditor.prototype = {
+    init : function(grid, bodyElement, callback){
+        if(this.initialized) return;
+        
+        this.initialized = true;
+        this.callback = callback;
+        this.grid = grid;
+        bodyElement.appendChild(this.div.dom);
+        this.initEvents();
+    },
+    
+    initEvents : function(){
+         var stopOnEnter = function(e){
+            if(e.browserEvent.keyCode == e.RETURN){
+                this.stopEditing(true);
+            }else if(e.browserEvent.keyCode == e.ESC){
+                this.setValue(this.originalValue);
+                this.stopEditing(true);
+            }
+        }
+        this.element.mon('keydown', stopOnEnter, this, true);
+        var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this);
+        this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay]));
+        this.pick.on('click', this.showCalendar, this, true);
+    },
+    
+    startEditing : function(value, row, cell){
+        this.originalValue = value;
+        this.rowIndex = row.rowIndex;
+        this.colIndex = cell.columnIndex;
+        this.cell = cell;
+        this.setValue(value);
+        this.validate();
+        var cellbox = getEl(cell, true).getBox();
+        this.div.setBox(cellbox, true);
+        this.element.setWidth(cellbox.width-this.pick.getWidth());
+        this.editing = true;
+        YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler);
+        this.show();
+    },
+     
+     stopEditing : function(focusCell){
+         if(this.editing){
+             YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler);
+             this.editing = false;
+             var newValue = this.getValue();
+             this.hide();
+             //if(focusCell){try{this.cell.focus();}catch(e){}}// try to give the cell focus so keyboard nav still works
+             if(this.originalValue != newValue){
+                this.callback(newValue, this.rowIndex, this.colIndex);
+             }
+         }
+     },
+    
+    setValue : function(value){
+        this.element.dom.value = this.formatDate(value);
+        this.validate();
+    },
+    
+    getValue : function(){
+        if(!this.validate()){
+           return this.originalValue;
+       }else{
+           var value = this.element.dom.value;
+           if(value.length < 1){
+               return value;
+           } else{
+               return this.parseDate(value);
+           }
+       }   
+    },
+    
+    show : function() {
+        this.div.show();
+        this.element.focus();
+        this.validate();
+    },
+    
+    hide : function(){
+        try{
+            this.element.dom.blur();
+        }catch(e){}
+        this.div.hide();
+    },
+    
+    validate : function(){
+        var dom = this.element.dom;
+        var value = dom.value;
+        if(value.length < 1){ // if it's blank
+             if(this.allowBlank){
+                 dom.title = '';
+                 this.element.removeClass('ygrid-editor-invalid');
+                 return true;
+             }else{
+                 dom.title = this.blankText;
+                 this.element.addClass('ygrid-editor-invalid');
+                 return false;
+             }
+        }
+        value = this.parseDate(value);
+        if(!value){
+            dom.title = this.invalidText.replace('%0', dom.value).replace('%1', this.format);
+            this.element.addClass('ygrid-editor-invalid');
+            return false;
+        }
+        var time = value.getTime();
+        if(this.minValue && time < this.minValue.getTime()){
+            dom.title = this.minText.replace('%0', this.formatDate(this.minValue));
+            this.element.addClass('ygrid-editor-invalid');
+            return false;
+        }
+        if(this.maxValue && time > this.maxValue.getTime()){
+            dom.title = this.maxText.replace('%0', this.formatDate(this.maxValue));
+            this.element.addClass('ygrid-editor-invalid');
+            return false;
+        }
+        if(this.disabledDays){
+            var day = value.getDay();
+            for(var i = 0; i < this.disabledDays.length; i++) {
+            	if(day === this.disabledDays[i]){
+            	    dom.title = this.disabledDaysText;
+                    this.element.addClass('ygrid-editor-invalid');
+                    return false;
+            	}
+            }
+        }
+        var fvalue = this.formatDate(value);
+        if(this.ddMatch.test(fvalue)){
+            dom.title = this.disabledDatesText.replace('%0', fvalue);
+            this.element.addClass('ygrid-editor-invalid');
+            return false;
+        }
+        var msg = this.validator(value);
+        if(msg !== true){
+            dom.title = msg;
+            this.element.addClass('ygrid-editor-invalid');
+            return false;
+        }
+        dom.title = '';
+        this.element.removeClass('ygrid-editor-invalid');
+        return true;
+    },
+    
+    handleMouseDown : function(e){
+        var t = e.getTarget();
+        var dom = this.div.dom;
+        if(t != dom && !YAHOO.util.Dom.isAncestor(dom, t)){
+            this.stopEditing();
+        }
+    },
+    
+    showCalendar : function(value){
+        if(this.cal == null){
+            this.cal = new YAHOO.ext.DatePicker(this.div.dom.parentNode.parentNode);
+        }
+        this.cal.minDate = this.minValue;
+        this.cal.maxDate = this.maxValue;
+        this.cal.disabledDatesRE = this.ddMatch;
+        this.cal.disabledDatesText = this.disabledDatesText;
+        this.cal.disabledDays = this.disabledDays;
+        this.cal.disabledDaysText = this.disabledDaysText;
+        this.cal.format = this.format;
+        if(this.minValue){
+            this.cal.minText = this.minText.replace('%0', this.formatDate(this.minValue));
+        }
+        if(this.maxValue){
+            this.cal.maxText = this.maxText.replace('%0', this.formatDate(this.maxValue));
+        }
+        var r = this.div.getRegion();
+        this.cal.show(r.left, r.bottom, this.getValue(), this.setValue.createDelegate(this));
+    },
+    
+    parseDate : function(value){
+        if(!value || value instanceof Date) return value;
+        return Date.parseDate(value, this.format);
+    },
+    
+    formatDate : function(date){
+        if(!date || !(date instanceof Date)) return date;
+        return date.format(this.format);
+    }
+};
+
+YAHOO.ext.grid.DateEditor.prototype.format = 'm/d/y';
+YAHOO.ext.grid.DateEditor.prototype.disabledDays = null;
+YAHOO.ext.grid.DateEditor.prototype.disabledDaysText = '';
+YAHOO.ext.grid.DateEditor.prototype.disabledDates = null;
+YAHOO.ext.grid.DateEditor.prototype.disabledDatesText = '';
+YAHOO.ext.grid.DateEditor.prototype.allowBlank = true;
+YAHOO.ext.grid.DateEditor.prototype.minValue = null;
+YAHOO.ext.grid.DateEditor.prototype.maxValue = null;
+YAHOO.ext.grid.DateEditor.prototype.minText = 'The date in this field must be after %0';
+YAHOO.ext.grid.DateEditor.prototype.maxText = 'The date in this field must be before %0';
+YAHOO.ext.grid.DateEditor.prototype.blankText = 'This field cannot be blank';
+YAHOO.ext.grid.DateEditor.prototype.invalidText = '%0 is not a valid date - it must be in the format %1';
+YAHOO.ext.grid.DateEditor.prototype.validationDelay = 200;
+YAHOO.ext.grid.DateEditor.prototype.validator = function(){return true;};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DatePicker.js.html b/www/extras/yui-ext/docs/output/DatePicker.js.html new file mode 100644 index 000000000..b204d6341 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DatePicker.js.html @@ -0,0 +1,343 @@ +DatePicker.js
YAHOO.ext.DatePicker = function(id, parentElement){
+    this.id = id;
+    this.selectedDate = new Date();
+    this.visibleDate = new Date();
+    this.element = null;
+    this.shadow = null;
+    this.callback = null;
+    this.buildControl(parentElement || document.body);
+    this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true);
+    this.keyDownHandler = YAHOO.ext.EventManager.wrap(this.handleKeyDown, this, true);
+    this.wheelHandler = YAHOO.ext.EventManager.wrap(this.handleMouseWheel, this, true);
+};
+
+YAHOO.ext.DatePicker.prototype = {
+    show : function(x, y, value, callback){
+        this.hide();
+        this.selectedDate = value;
+        this.visibleDate = value;
+        this.callback = callback;
+        this.refresh();
+        this.element.show();
+        this.element.setXY(this.constrainToViewport ? this.constrainXY(x, y) : [x, y]);
+        this.shadow.show();
+        this.shadow.setRegion(this.element.getRegion());
+        this.element.dom.tabIndex = 1;
+        this.element.focus();
+        YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler);
+        YAHOO.util.Event.on(document, "keydown", this.keyDownHandler);
+        YAHOO.util.Event.on(document, "mousewheel", this.wheelHandler);
+        YAHOO.util.Event.on(document, "DOMMouseScroll", this.wheelHandler);
+    },
+    
+    constrainXY : function(x, y){
+        var w = YAHOO.util.Dom.getViewportWidth();
+        var h = YAHOO.util.Dom.getViewportHeight();
+        var size = this.element.getSize();
+        return [
+            Math.min(w-size.width, x),
+            Math.min(h-size.height, y)
+        ];
+    },
+    
+    hide : function(){
+        this.shadow.hide();
+        this.element.hide();
+        YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler);
+        YAHOO.util.Event.removeListener(document, "keydown", this.keyDownHandler);
+        YAHOO.util.Event.removeListener(document, "mousewheel", this.wheelHandler);
+        YAHOO.util.Event.removeListener(document, "DOMMouseScroll", this.wheelHandler);
+    },
+    
+    setSelectedDate : function(date){
+        this.selectedDate = date;
+    },
+    
+    getSelectedDate : function(){
+        return this.selectedDate;
+    },
+    
+    showPrevMonth : function(){
+        this.visibleDate = this.getPrevMonth(this.visibleDate);
+        this.refresh();
+    },
+    
+    showNextMonth : function(){
+        this.visibleDate = this.getNextMonth(this.visibleDate);
+        this.refresh();
+    },
+    
+    showPrevYear : function(){
+        var d = this.visibleDate;
+        this.visibleDate = new Date(d.getFullYear()-1, d.getMonth(), d.getDate());
+        this.refresh();
+    },
+    
+    showNextYear : function(){
+        var d = this.visibleDate;
+        this.visibleDate = new Date(d.getFullYear()+1, d.getMonth(), d.getDate());
+        this.refresh();
+    },
+    
+    handleMouseDown : function(e){
+        var target = e.getTarget();
+        if(target != this.element.dom && !YAHOO.util.Dom.isAncestor(this.element.dom, target)){
+            this.hide();
+        }
+    },
+    
+    handleKeyDown : function(e){
+        switch(e.browserEvent.keyCode){
+            case e.LEFT:
+                this.showPrevMonth();
+                e.stopEvent();
+            break;
+            case e.RIGHT:
+                this.showNextMonth();
+                e.stopEvent();
+            break;
+            case e.DOWN:
+                this.showPrevYear();
+                e.stopEvent();
+            break;
+            case e.UP:
+                this.showNextYear();
+                e.stopEvent();
+            break;
+        }
+    },
+    
+    handleMouseWheel : function(e){
+        var delta = e.getWheelDelta();
+        if(delta > 0){
+            this.showPrevMonth();
+            e.stopEvent();
+        } else if(delta < 0){
+            this.showNextMonth();
+            e.stopEvent();
+        }
+    },
+    
+    handleClick : function(e){
+        var d = this.visibleDate;
+        var t = e.getTarget();
+        if(t && t.className){
+            switch(t.className){
+                case 'active':
+                    this.handleSelection(new Date(d.getFullYear(), d.getMonth(), parseInt(t.innerHTML)));
+                break;
+                case 'prevday':
+                    var p = this.getPrevMonth(d);
+                    this.handleSelection(new Date(p.getFullYear(), p.getMonth(), parseInt(t.innerHTML)));
+                break;
+                case 'nextday':
+                    var n = this.getNextMonth(d);
+                    this.handleSelection(new Date(n.getFullYear(), n.getMonth(), parseInt(t.innerHTML)));
+                break;
+                case 'ypopcal-today':
+                    this.handleSelection(new Date());
+                break;
+                case 'next-month':
+                    this.showNextMonth();
+                break;
+                case 'prev-month':
+                    this.showPrevMonth();
+                break;
+            }   
+        }
+        e.stopEvent();
+    },
+    
+    selectToday : function(){
+        this.handleSelection(new Date());
+    },
+    
+    handleSelection: function(date){
+        this.selectedDate = date;
+        this.callback(date);
+        this.hide();    
+    },
+    
+    getPrevMonth : function(d){
+        var m = d.getMonth();var y = d.getFullYear();
+        return (m == 0 ? new Date(--y, 11, 1) : new Date(y, --m, 1));
+    },
+    
+    getNextMonth : function(d){
+        var m = d.getMonth();var y = d.getFullYear();
+        return (m == 11 ? new Date(++y, 0, 1) : new Date(y, ++m, 1));
+    },
+    
+    getDaysInMonth : function(m, y){
+        return (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) ? 31 : (m == 4 || m == 6 || m == 9 || m == 11) ? 30 : this.isLeapYear(y) ? 29 : 28;
+    },
+    
+    isLeapYear : function(y){
+        return (((y % 4) == 0) && ((y % 100) != 0) || ((y % 400) == 0));
+    },
+    
+    clearTime : function(date){
+        if(date){
+            date.setHours(0);
+            date.setMinutes(0);
+            date.setSeconds(0);
+            date.setMilliseconds(0);
+        }
+        return date;
+    },
+    
+    refresh : function(){
+        var d = this.visibleDate;
+        this.buildInnerCal(d);
+        this.calHead.update(this.monthNames[d.getMonth()] + ' ' + d.getFullYear());
+        if(this.element.isVisible()){
+            this.shadow.setRegion(this.element.getRegion());
+        }
+    }
+};
+
+/**
+ * This code is not pretty, but it is fast!
+ * @ignore
+ */ 
+YAHOO.ext.DatePicker.prototype.buildControl = function(parentElement){
+    var c = document.createElement('div');
+    c.style.position = 'absolute';
+    c.style.visibility = 'hidden';
+    document.body.appendChild(c);
+    var html = '<iframe id="'+this.id+'_shdw" frameborder="0" style="position:absolute; z-index:2000; display:none; top:0px; left:0px;" class="ypopcal-shadow"></iframe>' +
+    '<div hidefocus="true" class="ypopcal" id="'+this.id+'" style="-moz-outline:none; position:absolute; z-index:2001; display:none; top:0px; left:0px;">' +
+    '<table class="ypopcal-head" border=0 cellpadding=0 cellspacing=0><tbody><tr><td class="ypopcal-arrow"><div class="prev-month">&#160;</div></td><td class="ypopcal-month">&#160;</td><td class="ypopcal-arrow"><div class="next-month">&#160;</div></td></tr></tbody></table>' +
+    '<center><div class="ypopcal-inner">';
+    html += "<table border=0 cellpadding=2 cellspacing=0 class=\"ypopcal-table\"><thead><tr class=\"ypopcal-daynames\">";
+    var names = this.dayNames;
+    for(var i = 0; i < names.length; i++){
+        html += '<td>' + names[i].substr(0, 1) + '</td>';
+    }
+    html+= "</tr></thead><tbody><tr>";
+    for(var i = 0; i < 42; i++) {
+        if(i % 7 == 0 && i != 0){
+            html += '</tr><tr>';
+        }
+        html += "<td>&nbsp;</td>";
+    }
+    html += "</tr></tbody></table>";
+    html += '</div><button class="ypopcal-today" style="margin-top:2px;">'+this.todayText+'</button></center></div>';
+    c.innerHTML = html;
+    this.shadow = getEl(c.childNodes[0], true);
+    this.shadow.enableDisplayMode();
+    this.element = getEl(c.childNodes[1], true);
+    this.element.enableDisplayMode();
+    document.body.appendChild(this.shadow.dom);
+    document.body.appendChild(this.element.dom);
+    document.body.removeChild(c);
+    this.element.on("selectstart", function(){return false;});
+    var tbody = this.element.dom.getElementsByTagName('tbody')[1];
+    this.cells = tbody.getElementsByTagName('td');
+    this.calHead = this.element.getChildrenByClassName('ypopcal-month', 'td')[0];
+    this.element.mon('mousedown', this.handleClick, this, true);
+};
+
+YAHOO.ext.DatePicker.prototype.buildInnerCal = function(dateVal){
+    var days = this.getDaysInMonth(dateVal.getMonth() + 1, dateVal.getFullYear());
+    var firstOfMonth = new Date(dateVal.getFullYear(), dateVal.getMonth(), 1);
+    var startingPos = firstOfMonth.getDay();
+    if(startingPos == 0) startingPos = 7;
+    var pm = this.getPrevMonth(dateVal);
+    var prevStart = this.getDaysInMonth(pm.getMonth()+1, pm.getFullYear())-startingPos;
+    var cells = this.cells;
+    days += startingPos;
+    
+    // convert everything to numbers so it's fast
+    var day = 86400000;
+    var date = this.clearTime(new Date(pm.getFullYear(), pm.getMonth(), prevStart));
+    var today = this.clearTime(new Date()).getTime();
+    var sel = this.selectedDate ? this.clearTime(this.selectedDate).getTime() : today + 1; //today +1 will never match anything
+    var min = this.minDate ? this.clearTime(this.minDate).getTime() : Number.NEGATIVE_INFINITY;
+    var max = this.maxDate ? this.clearTime(this.maxDate).getTime() : Number.POSITIVE_INFINITY;
+    var ddMatch = this.disabledDatesRE;
+    var ddText = this.disabledDatesText;
+    var ddays = this.disabledDays;
+    var ddaysText = this.disabledDaysText;
+    var format = this.format;
+    
+    var setCellClass = function(cal, cell, d){
+        cell.title = '';
+        var t = d.getTime();
+        if(t == today){
+            cell.className += ' today';
+            cell.title = cal.todayText;
+        }
+        if(t == sel){
+            cell.className += ' selected';
+        }
+        // disabling
+        if(t < min) {
+            cell.className = ' ypopcal-disabled';
+            cell.title = cal.minText;
+            return;
+        }
+        if(t > max) {
+            cell.className = ' ypopcal-disabled';
+            cell.title = cal.maxText;
+            return;
+        }
+        if(ddays){
+            var day = d.getDay();
+            for(var i = 0; i < ddays.length; i++) {
+            	if(day === ddays[i]){
+            	    cell.title = ddaysText;
+                    cell.className = ' ypopcal-disabled';
+                    return;
+                }
+            }
+        }
+        if(ddMatch && format){
+            var fvalue = d.format(format);
+            if(ddMatch.test(fvalue)){
+                cell.title = ddText.replace('%0', fvalue);
+                cell.className = ' ypopcal-disabled';
+                return;
+            }
+        }
+    };
+    
+    var i = 0;
+    for(; i < startingPos; i++) {
+        cells[i].innerHTML = (++prevStart);
+        date.setDate(date.getDate()+1);
+        cells[i].className = 'prevday';
+        setCellClass(this, cells[i], date);
+    }
+    for(; i < days; i++){
+        intDay = i - startingPos + 1;
+        cells[i].innerHTML = (intDay);
+        date.setDate(date.getDate()+1);
+        cells[i].className = 'active';
+        setCellClass(this, cells[i], date);
+    }
+    var extraDays = 0;
+    for(; i < 42; i++) {
+         cells[i].innerHTML = (++extraDays);
+         date.setDate(date.getDate()+1);
+         cells[i].className = 'nextday';
+         setCellClass(this, cells[i], date);
+    }
+};
+
+YAHOO.ext.DatePicker.prototype.todayText = "Today";
+YAHOO.ext.DatePicker.prototype.minDate = null;
+YAHOO.ext.DatePicker.prototype.maxDate = null;
+YAHOO.ext.DatePicker.prototype.minText = "This date is before the minimum date";
+YAHOO.ext.DatePicker.prototype.maxText = "This date is after the maximum date";
+YAHOO.ext.DatePicker.prototype.format = 'm/d/y';
+YAHOO.ext.DatePicker.prototype.disabledDays = null;
+YAHOO.ext.DatePicker.prototype.disabledDaysText = '';
+YAHOO.ext.DatePicker.prototype.disabledDatesRE = null;
+YAHOO.ext.DatePicker.prototype.disabledDatesText = '';
+YAHOO.ext.DatePicker.prototype.constrainToViewport = true;
+
+
+YAHOO.ext.DatePicker.prototype.monthNames = Date.monthNames;
+
+YAHOO.ext.DatePicker.prototype.dayNames = Date.dayNames;

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DefaultColumnModel.js.html b/www/extras/yui-ext/docs/output/DefaultColumnModel.js.html new file mode 100644 index 000000000..91e6918e1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DefaultColumnModel.js.html @@ -0,0 +1,306 @@ +DefaultColumnModel.js
/**
+ * @class YAHOO.ext.grid.DefaultColumnModel
+ * @extends YAHOO.ext.grid.AbstractColumnModel
+ * This is the default implementation of a ColumnModel used by the Grid. It defines
+ * the columns in the grid.
+ * <br>Usage:<br>
+ <pre><code>
+ var sort = YAHOO.ext.grid.DefaultColumnModel.sortTypes;
+ var myColumns = [
+	{header: "Ticker", width: 60, sortable: true, sortType: sort.asUCString}, 
+	{header: "Company Name", width: 150, sortable: true, sortType: sort.asUCString}, 
+	{header: "Market Cap.", width: 100, sortable: true, sortType: sort.asFloat}, 
+	{header: "$ Sales", width: 100, sortable: true, sortType: sort.asFloat, renderer: money}, 
+	{header: "Employees", width: 100, sortable: true, sortType: sort.asFloat}
+ ];
+ var colModel = new YAHOO.ext.grid.DefaultColumnModel(myColumns);
+ </code></pre>
+ * @constructor
+ * @param {Object} config The config object
+*/
+YAHOO.ext.grid.DefaultColumnModel = function(config){
+	YAHOO.ext.grid.DefaultColumnModel.superclass.constructor.call(this);
+    /**
+     * The config passed into the constructor
+     */
+    this.config = config;
+    
+    /**
+     * The width of columns which have no width specified (defaults to 100)
+     * @type Number
+     */
+    this.defaultWidth = 100;
+    /**
+     * Default sortable of columns which have no sortable specified (defaults to false)
+     * @type Boolean
+     */
+    this.defaultSortable = false;
+};
+YAHOO.extendX(YAHOO.ext.grid.DefaultColumnModel, YAHOO.ext.grid.AbstractColumnModel, {
+    
+    /**
+     * Returns the number of columns.
+     * @return {Number}
+     */
+    getColumnCount : function(){
+        return this.config.length;
+    },
+        
+    /**
+     * Returns true if the specified column is sortable.
+     * @param {Number} col The column index
+     * @return {Boolean}
+     */
+    isSortable : function(col){
+        if(typeof this.config[col].sortable == 'undefined'){
+            return this.defaultSortable;
+        }
+        return this.config[col].sortable;
+    },
+        
+    /**
+     * Returns the sorting comparison function defined for the column (defaults to sortTypes.none).
+     * @param {Number} col The column index
+     * @return {Function}
+     */
+    getSortType : function(col){
+        if(!this.dataMap){
+            // build a lookup so we don't search every time
+            var map = [];
+            for(var i = 0, len = this.config.length; i < len; i++){
+                map[this.getDataIndex(i)] = i;
+            }
+            this.dataMap = map;
+        }
+        col = this.dataMap[col];
+        if(!this.config[col].sortType){
+            return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none;
+        }
+        return this.config[col].sortType;
+    },
+        
+    /**
+     * Sets the sorting comparison function for a column.
+     * @param {Number} col The column index
+     * @param {Function} fn
+     */
+    setSortType : function(col, fn){
+        this.config[col].sortType = fn;
+    },
+        
+    
+    /**
+     * Returns the rendering (formatting) function defined for the column.
+     * @param {Number} col The column index
+     * @return {Function}
+     */
+    getRenderer : function(col){
+        if(!this.config[col].renderer){
+            return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer;
+        }
+        return this.config[col].renderer;
+    },
+        
+    /**
+     * Sets the rendering (formatting) function for a column.
+     * @param {Number} col The column index
+     * @param {Function} fn
+     */
+    setRenderer : function(col, fn){
+        this.config[col].renderer = fn;
+    },
+        
+    /**
+     * Returns the width for the specified column.
+     * @param {Number} col The column index
+     * @return {Number}
+     */
+    getColumnWidth : function(col){
+        return this.config[col].width || this.defaultWidth;
+    },
+        
+    /**
+     * Sets the width for a column.
+     * @param {Number} col The column index
+     * @param {Number} width The new width
+     */
+    setColumnWidth : function(col, width, suppressEvent){
+        this.config[col].width = width;
+        this.totalWidth = null;
+        if(!suppressEvent){
+             this.onWidthChange.fireDirect(this, col, width);
+        }
+    },
+        
+    /**
+     * Returns the total width of all columns.
+     * @param {Boolean} includeHidden True to include hidden column widths
+     * @return {Number}
+     */
+    getTotalWidth : function(includeHidden){
+        if(!this.totalWidth){
+            this.totalWidth = 0;
+            for(var i = 0; i < this.config.length; i++){
+                if(includeHidden || !this.isHidden(i)){
+                    this.totalWidth += this.getColumnWidth(i);
+                }
+            }
+        }
+        return this.totalWidth;
+    },
+        
+    /**
+     * Returns the header for the specified column.
+     * @param {Number} col The column index
+     * @return {String}
+     */
+    getColumnHeader : function(col){
+        return this.config[col].header;
+    },
+         
+    /**
+     * Sets the header for a column.
+     * @param {Number} col The column index
+     * @param {String} header The new header
+     */
+    setColumnHeader : function(col, header){
+        this.config[col].header = header;
+        this.onHeaderChange.fireDirect(this, col, header);
+    },
+    /**
+     * Returns the dataIndex for the specified column.
+     * @param {Number} col The column index
+     * @return {Number}
+     */
+    getDataIndex : function(col){
+        if(typeof this.config[col].dataIndex != 'number'){
+            return col;
+        }
+        return this.config[col].dataIndex;
+    },
+         
+    /**
+     * Sets the dataIndex for a column.
+     * @param {Number} col The column index
+     * @param {Number} dataIndex The new dataIndex
+     */
+    setDataIndex : function(col, dataIndex){
+        this.config[col].dataIndex = dataIndex;
+    },
+    /**
+     * Returns true if the cell is editable.
+     * @param {Number} colIndex The column index
+     * @param {Number} rowIndex The row index
+     * @return {Boolean}
+     */
+    isCellEditable : function(colIndex, rowIndex){
+        return this.config[colIndex].editable || (typeof this.config[colIndex].editable == 'undefined' && this.config[colIndex].editor);
+    },
+    
+    /**
+     * Returns the editor defined for the cell/column.
+     * @param {Number} colIndex The column index
+     * @param {Number} rowIndex The row index
+     * @return {Object}
+     */
+    getCellEditor : function(colIndex, rowIndex){
+        return this.config[colIndex].editor;
+    },
+       
+    /**
+     * Sets if a column is editable.
+     * @param {Number} col The column index
+     * @param {Boolean} editable True if the column is editable
+     */
+    setEditable : function(col, editable){
+        this.config[col].editable = editable;
+    },
+    
+    
+    /**
+     * Returns true if the column is hidden.
+     * @param {Number} colIndex The column index
+     * @return {Boolean}
+     */
+    isHidden : function(colIndex){
+        return this.config[colIndex].hidden;
+    },
+    
+    
+    /**
+     * Returns true if the column width cannot be changed
+     */
+    isFixed : function(colIndex){
+        return this.config[colIndex].fixed;
+    },
+    
+    /**
+     * Returns true if the column cannot be resized
+     */
+    isResizable : function(colIndex){
+        return this.config[colIndex].resizable !== false;
+    },
+    /**
+     * Sets if a column is hidden.
+     * @param {Number} colIndex The column index
+     */
+    setHidden : function(colIndex, hidden){
+        this.config[colIndex].hidden = hidden;
+        this.totalWidth = null;
+        this.fireHiddenChange(colIndex, hidden);
+    },
+    
+    /**
+     * Sets the editor for a column.
+     * @param {Number} col The column index
+     * @param {Object} editor The editor object
+     */
+    setEditor : function(col, editor){
+        this.config[col].editor = editor;
+    }
+});
+
+/**
+ * Defines the default sorting (casting?) comparison functions used when sorting data:
+ * <br>&nbsp;&nbsp;sortTypes.none - sorts data as it is without casting or parsing (the default)
+ * <br>&nbsp;&nbsp;sortTypes.asUCString - case insensitive string
+ * <br>&nbsp;&nbsp;sortTypes.asDate - attempts to parse data as a date
+ * <br>&nbsp;&nbsp;sortTypes.asFloat
+ * <br>&nbsp;&nbsp;sortTypes.asInt
+ * @static
+ */
+YAHOO.ext.grid.DefaultColumnModel.sortTypes = {
+    none : function(s) {
+    	return s;
+    },
+
+    asUCString : function(s) {
+    	return String(s).toUpperCase();
+    },
+    
+    asDate : function(s) {
+        if(s instanceof Date){
+            return s.getTime();
+        }
+    	return Date.parse(String(s));
+    },
+    
+    asFloat : function(s) {
+    	var val = parseFloat(String(s).replace(/,/g, ''));
+        if(isNaN(val)) val = 0;
+    	return val;
+    },
+    
+    asInt : function(s) {
+        var val = parseInt(String(s).replace(/,/g, ''));
+        if(isNaN(val)) val = 0;
+    	return val;
+    }
+};
+
+YAHOO.ext.grid.DefaultColumnModel.defaultRenderer = function(value){
+	if(typeof value == 'string' && value.length < 1){
+	    return '&#160;';
+	}
+	return value;
+}

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DefaultDataModel.js.html b/www/extras/yui-ext/docs/output/DefaultDataModel.js.html new file mode 100644 index 000000000..5d51b90e6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DefaultDataModel.js.html @@ -0,0 +1,337 @@ +DefaultDataModel.js
+/**
+ * @class YAHOO.ext.grid.DefaultDataModel
+ * This is the default implementation of a DataModel used by the Grid. It works 
+ * with multi-dimensional array based data. Using the event system in the base class 
+ * {@link YAHOO.ext.grid.AbstractDataModel}, all updates to this DataModel are automatically
+ * reflected in the user interface.
+ * <br>Usage:<br>
+ * <pre><code>
+ * var myData = [
+	["MSFT","Microsoft Corporation", "314,571.156", "32,187.000", "55000"],
+	["ORCL", "Oracle Corporation", "62,615.266", "9,519.000", "40650"]
+ * ];
+ * var dataModel = new YAHOO.ext.grid.DefaultDataModel(myData);
+ * </code></pre>
+ * @extends YAHOO.ext.grid.AbstractDataModel
+ * @constructor
+ * @param {Array} data 
+*/
+YAHOO.ext.grid.DefaultDataModel = function(data){
+    YAHOO.ext.grid.DefaultDataModel.superclass.constructor.call(this);
+    /**@private*/
+    this.data = data;
+};
+YAHOO.extendX(YAHOO.ext.grid.DefaultDataModel, YAHOO.ext.grid.AbstractDataModel, {
+    /**
+     * Returns the number of rows in the dataset
+     * @return {Number}
+     */
+    getRowCount : function(){
+        return this.data.length;
+    },
+        
+    /**
+     * Returns the ID of the specified row. By default it return the value of the first column. 
+     * Override to provide more advanced ID handling. 
+     * @return {Number}
+     */
+    getRowId : function(rowIndex){
+        return this.data[rowIndex][0];
+    },
+    
+    /**
+     * Returns the column data for the specified row. 
+     * @return {Array}
+     */
+    getRow : function(rowIndex){
+        return this.data[rowIndex];
+    },
+    
+    /**
+     * Returns the column data for the specified rows as a 
+     * multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. 
+     * @param {Array} indexes The row indexes to fetch
+     * @return {Array}
+     */
+    getRows : function(indexes){
+        var data = this.data;
+        var r = [];
+        for(var i = 0; i < indexes.length; i++){
+           r.push(data[indexes[i]]);
+        }
+        return r;
+    },
+    
+    /**
+     * Returns the value at the specified data position
+     * @param {Number} rowIndex
+     * @param {Number} colIndex
+     * @return {Object}
+     */
+    getValueAt : function(rowIndex, colIndex){
+    	return this.data[rowIndex][colIndex];
+    },
+    
+    /**
+     * Sets the specified value at the specified data position
+     * @param {Object} value The new value
+     * @param {Number} rowIndex
+     * @param {Number} colIndex
+     */
+    setValueAt: function(value, rowIndex, colIndex){
+        this.data[rowIndex][colIndex] = value;
+        this.fireCellUpdated(rowIndex, colIndex);
+    },
+    
+    /**
+     * @private
+     * Removes the specified range of rows.
+     * @param {Number} startIndex
+     * @param {<i>Number</i>} endIndex (optional) Defaults to startIndex
+     */
+    removeRows: function(startIndex, endIndex){
+        endIndex = endIndex || startIndex;
+        this.data.splice(startIndex, endIndex-startIndex+1);
+        this.fireRowsDeleted(startIndex, endIndex);
+    },
+    
+    /**
+     * Remove a row.
+     * @param {Number} index
+     */
+    removeRow: function(index){
+        this.data.splice(index, 1);
+        this.fireRowsDeleted(index, index);
+    },
+    
+    /**
+     * @private
+     * Removes all rows.
+     */
+    removeAll: function(){
+    	var count = this.getRowCount();
+    	if(count > 0){
+        	this.removeRows(0, count-1);
+    	}
+    },
+    
+    /**
+     * Query the DataModel rows by the filters defined in spec, for example...
+     * <pre><code>
+     * // column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
+     * dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
+     * </code></pre> 
+     * @param {Object} spec The spec is generally an object literal consisting of
+     * column index and filter type. The filter type can be a string/number (exact match),
+     * a regular expression to test using String.search() or a function to call. If it's a function, 
+     * it will be called with the value for the specified column and an array of the all column 
+     * values for that row: yourFcn(value, columnData). If it returns anything other than true, 
+     * the row is not a match. If you have modified Object.prototype this method may fail.
+     * @param {Boolean} returnUnmatched True to return rows which <b>don't</b> match the query instead
+     * of rows that do match
+     * @return {Array} An array of row indexes that match
+     */
+    query: function(spec, returnUnmatched){
+        var d = this.data;
+        var r = [];
+        for(var i = 0; i < d.length; i++){
+            var row = d[i];
+            var isMatch = true;
+            for(var col in spec){
+                //if(typeof spec[col] != 'function'){
+                    if(!isMatch) continue;
+                    var filter = spec[col];
+                    switch(typeof filter){
+                        case 'string':
+                        case 'number':
+                        case 'boolean':
+                          if(row[col] != filter){
+                              isMatch = false;
+                          }
+                        break;
+                        case 'function':
+                          if(!filter(row[col], row)){
+                              isMatch = false;
+                          }
+                        break;
+                        case 'object':
+                           if(filter instanceof RegExp){
+                               if(String(row[col]).search(filter) === -1){
+                                   isMatch = false;
+                               }
+                           }
+                        break;
+                    }
+                //}
+            }
+            if(isMatch && !returnUnmatched){
+                r.push(i);
+            }else if(!isMatch && returnUnmatched){
+                r.push(i);
+            }
+        }
+        return r;
+    },
+    
+    /**
+     * Filter the DataModel rows by the query defined in spec, see {@link #query} for more details 
+     * on the query spec.
+     * @param {Object} query The query spec {@link #query}
+     * @return {Number} The number of rows removed
+     */
+    filter: function(query){
+        var matches = this.query(query, true);
+        var data = this.data;
+        // go thru the data setting matches to deleted
+        // while not disturbing row indexes
+        for(var i = 0; i < matches.length; i++){ 
+            data[matches[i]]._deleted = true;
+        }
+        for(var i = 0; i < data.length; i++){
+            while(data[i] && data[i]._deleted === true){
+                this.removeRow(i);
+            }
+        }
+        return matches.length;
+    },
+    
+    /**
+     * Adds a row to the dataset.
+     * @param {Array} cellValues The array of values for the new row
+     * @return {Number} The index of the added row
+     */
+    addRow: function(cellValues){
+        this.data.push(cellValues);
+        var newIndex = this.data.length-1;
+        this.fireRowsInserted(newIndex, newIndex);
+        this.applySort();
+        return newIndex;
+    },
+    
+    /**
+     * @private
+     * Adds a set of rows.
+     * @param {Array} rowData This should be an array of arrays like the constructor takes
+     */
+    addRows: function(rowData){
+        this.data = this.data.concat(rowData);
+        var firstIndex = this.data.length-rowData.length;
+        this.fireRowsInserted(firstIndex, firstIndex+rowData.length-1);
+        this.applySort();
+    },
+    
+    /**
+     * Inserts a row a the specified location in the dataset.
+     * @param {Number} index The index where the row should be inserted
+     * @param {Array} cellValues The array of values for the new row
+     * @return {Number} The index the row was inserted in
+     */
+    insertRow: function(index, cellValues){
+        this.data.splice(index, 0, cellValues);
+        this.fireRowsInserted(index, index);
+        this.applySort();
+        return index;
+    },
+    
+    /**
+     * @private
+     * Inserts a set of rows.
+     * @param {Number} index The index where the rows should be inserted
+     * @param {Array} rowData This should be an array of arrays like the constructor takes
+     */
+    insertRows: function(index, rowData){
+        /*
+        if(index == this.data.length){ // try these two first since they are faster
+            this.data = this.data.concat(rowData);
+        }else if(index == 0){
+            this.data = rowData.concat(this.data);
+        }else{
+            var newData = this.data.slice(0, index);
+            newData.concat(rowData);
+            newData.concat(this.data.slice(index));
+            this.data = newData;
+        }*/
+        var args = rowData.concat();
+        args.splice(0, 0, index, 0);
+        this.data.splice.apply(this.data, args);
+        this.fireRowsInserted(index, index+rowData.length-1);
+        this.applySort();
+    },
+    
+    /**
+     * Applies the last used sort to the current data.
+     */
+    applySort: function(suppressEvent){
+    	if(typeof this.sortColumn != 'undefined'){
+    		this.sort(this.sortInfo, this.sortColumn, this.sortDir, suppressEvent);
+    	}
+    },
+    
+    /**
+     * Sets the default sort info. Note: this function does not actually apply the sort.
+     * @param {Function/Object} sortInfo A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like 
+     *                                               a grid column model. 
+     * @param {Number} columnIndex The column index to sort by
+     * @param {String} direction The direction of the sort ('DESC' or 'ASC')
+     */
+    setDefaultSort: function(sortInfo, columnIndex, direction){
+        this.sortInfo = sortInfo;
+        this.sortColumn = columnIndex;
+        this.sortDir = direction;
+    },
+    /**
+     * Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel.
+     * @param {Function/Object} sortInfo A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like 
+     *                                               a grid column model. 
+     * @param {Number} columnIndex The column index to sort by
+     * @param {String} direction The direction of the sort ('DESC' or 'ASC')
+     */
+    sort: function(sortInfo, columnIndex, direction, suppressEvent){
+        // store these so we can maintain sorting when we load new data
+        this.sortInfo = sortInfo;
+        this.sortColumn = columnIndex;
+        this.sortDir = direction;
+        
+        var dsc = (direction && direction.toUpperCase() == 'DESC');
+        var sortType = null;
+        if(sortInfo != null){
+            if(typeof sortInfo == 'function'){
+                sortType = sortInfo;
+            }else if(typeof sortInfo == 'object'){
+                sortType = sortInfo.getSortType(columnIndex);;
+            }
+        }
+        var fn = function(cells, cells2){
+            var v1 = sortType ? sortType(cells[columnIndex], cells) : cells[columnIndex];
+            var v2 = sortType ? sortType(cells2[columnIndex], cells2) : cells2[columnIndex];
+            if(v1 < v2)
+    			return dsc ? +1 : -1;
+    		if(v1 > v2)
+    			return dsc ? -1 : +1;
+    	    return 0;
+        };
+        this.data.sort(fn);
+        if(!suppressEvent){
+           this.fireRowsSorted(columnIndex, direction);
+        }
+    },
+    
+    /**
+     * Calls passed function with each rows data - if the function returns false it stops.
+     * @param {Function} fn
+     * @param {Object} scope (optional)
+     */ 
+    each: function(fn, scope){
+        var d = this.data;
+        for(var i = 0, len = d.length; i < len; i++){
+            if(fn.call(scope || window, d[i], i) === false) break;
+        }
+    }
+});
+
+/**
+ * Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+ * @static
+ */
+YAHOO.ext.grid.DefaultDataModel.sortTypes = YAHOO.ext.grid.DefaultColumnModel.sortTypes;

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/DomHelper.js.html b/www/extras/yui-ext/docs/output/DomHelper.js.html new file mode 100644 index 000000000..934e0f017 --- /dev/null +++ b/www/extras/yui-ext/docs/output/DomHelper.js.html @@ -0,0 +1,400 @@ +DomHelper.js
/**
+ * @class YAHOO.ext.DomHelper
+ * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM. 
+ * For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>.
+ * @singleton
+ */
+YAHOO.ext.DomHelper = new function(){
+    /**@private*/
+    var d = document;
+    var tempTableEl = null;
+    /** True to force the use of DOM instead of html fragments @type Boolean */
+    this.useDom = false;
+    var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;
+    /**
+     * Applies a style specification to an element
+     * @param {String/HTMLElement} el The element to apply styles to
+     * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
+     * a function which returns such a specification.
+     */
+    this.applyStyles = function(el, styles){
+        if(styles){
+           var D = YAHOO.util.Dom;
+           if (typeof styles == "string"){
+               var re = /\s?([a-z\-]*)\:([^;]*);?/gi;
+               var matches;
+               while ((matches = re.exec(styles)) != null){
+                   D.setStyle(el, matches[1], matches[2]);
+               }
+            }else if (typeof styles == "object"){
+               for (var style in styles){
+                  D.setStyle(el, style, styles[style]);
+               }
+            }else if (typeof styles == "function"){
+                YAHOO.ext.DomHelper.applyStyles(el, styles.call());
+            }
+        }
+    }; 
+    
+    // build as innerHTML where available
+    /** @ignore */
+    var createHtml = function(o){
+        var b = '';
+        b += '<' + o.tag;
+        for(var attr in o){
+            if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue;
+            if(attr == 'style'){
+                var s = o['style'];
+                if(typeof s == 'function'){
+                    s = s.call();
+                }
+                if(typeof s == 'string'){
+                    b += ' style="' + s + '"';
+                }else if(typeof s == 'object'){
+                    b += ' style="';
+                    for(var key in s){
+                        if(typeof s[key] != 'function'){
+                            b += key + ':' + s[key] + ';';
+                        }
+                    }
+                    b += '"';
+                }
+            }else{
+                if(attr == 'cls'){
+                    b += ' class="' + o['cls'] + '"';
+                }else if(attr == 'htmlFor'){
+                    b += ' for="' + o['htmlFor'] + '"';
+                }else{
+                    b += ' ' + attr + '="' + o[attr] + '"';
+                }
+            }
+        }
+        if(emptyTags.test(o.tag)){
+            b += ' />';
+        }else{
+            b += '>';
+            if(o.children){
+                for(var i = 0, len = o.children.length; i < len; i++) {
+                    b += createHtml(o.children[i], b);
+                }
+            }
+            if(o.html){
+                b += o.html;
+            }
+            b += '</' + o.tag + '>';
+        }
+        return b;
+    }
+    
+    // build as dom
+    /** @ignore */
+    var createDom = function(o, parentNode){
+        var el = d.createElement(o.tag);
+        var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute
+        for(var attr in o){
+            if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue;
+            if(attr=='cls'){
+                el.className = o['cls'];
+            }else{
+                if(useSet) el.setAttribute(attr, o[attr]);
+                else el[attr] = o[attr];
+            }
+        }
+        YAHOO.ext.DomHelper.applyStyles(el, o.style);
+        if(o.children){
+            for(var i = 0, len = o.children.length; i < len; i++) {
+             	createDom(o.children[i], el);
+            }
+        }
+        if(o.html){
+            el.innerHTML = o.html;
+        }
+        if(parentNode){
+           parentNode.appendChild(el);
+        }
+        return el;
+    };
+    
+    /**
+     * @ignore
+     * Nasty code for IE's broken table implementation 
+     */
+    var insertIntoTable = function(tag, where, el, html){
+        if(!tempTableEl){
+            tempTableEl = document.createElement('div');
+        }
+        var node;
+        if(tag == 'table' || tag == 'tbody'){
+           tempTableEl.innerHTML = '<table><tbody>'+html+'</tbody></table>';
+           node = tempTableEl.firstChild.firstChild.firstChild;
+        }else{
+           tempTableEl.innerHTML = '<table><tbody><tr>'+html+'</tr></tbody></table>';
+           node = tempTableEl.firstChild.firstChild.firstChild.firstChild;
+        }
+        if(where == 'beforebegin'){
+            el.parentNode.insertBefore(node, el);
+            return node;
+        }else if(where == 'afterbegin'){
+            el.insertBefore(node, el.firstChild);
+            return node;
+        }else if(where == 'beforeend'){
+            el.appendChild(node);
+            return node;
+        }else if(where == 'afterend'){
+            el.parentNode.insertBefore(node, el.nextSibling);
+            return node;
+        }
+    } 
+    
+    /**
+     * Inserts an HTML fragment into the Dom
+     * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
+     * @param {HTMLElement} el The context element
+     * @param {String} html The HTML fragmenet
+     * @return {HTMLElement} The new node
+     */
+    this.insertHtml = function(where, el, html){
+        where = where.toLowerCase();
+        if(el.insertAdjacentHTML){
+            var tag = el.tagName.toLowerCase();
+            if(tag == 'table' || tag == 'tbody' || tag == 'tr'){
+               return insertIntoTable(tag, where, el, html);
+            }
+            if(where == 'beforebegin'){
+                el.insertAdjacentHTML(where, html);
+                return el.previousSibling;
+            }else if(where == 'afterbegin'){
+                el.insertAdjacentHTML(where, html);
+                return el.firstChild;
+            }else if(where == 'beforeend'){
+                el.insertAdjacentHTML(where, html);
+                return el.lastChild;
+            }else if(where == 'afterend'){
+                el.insertAdjacentHTML(where, html);
+                return el.nextSibling;
+            }
+            throw 'Illegal insertion point -> "' + where + '"';
+        }
+        var range = el.ownerDocument.createRange();
+        var frag;
+        if(where == 'beforebegin'){
+            range.setStartBefore(el);
+            frag = range.createContextualFragment(html);
+            el.parentNode.insertBefore(frag, el);
+            return el.previousSibling;
+        }else if(where == 'afterbegin'){
+            range.selectNodeContents(el);
+            range.collapse(true);
+            frag = range.createContextualFragment(html);
+            el.insertBefore(frag, el.firstChild);
+            return el.firstChild;
+        }else if(where == 'beforeend'){
+            range.selectNodeContents(el);
+            range.collapse(false);
+            frag = range.createContextualFragment(html);
+            el.appendChild(frag);
+            return el.lastChild;
+        }else if(where == 'afterend'){
+            range.setStartAfter(el);
+            frag = range.createContextualFragment(html);
+            el.parentNode.insertBefore(frag, el.nextSibling);
+            return el.nextSibling;
+        }else{
+            throw 'Illegal insertion point -> "' + where + '"';
+        } 
+    };
+    
+    /**
+     * Creates new Dom element(s) and inserts them before el
+     * @param {HTMLElement} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    this.insertBefore = function(el, o, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode;
+        if(this.useDom){
+            newNode = createDom(o, null);
+            el.parentNode.insertBefore(newNode, el);
+        }else{
+            var html = createHtml(o);
+            newNode = this.insertHtml('beforeBegin', el, html);
+        }
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    };
+    
+    /**
+     * Creates new Dom element(s) and inserts them after el
+     * @param {HTMLElement} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    this.insertAfter = function(el, o, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode;
+        if(this.useDom){
+            newNode = createDom(o, null);
+            el.parentNode.insertBefore(newNode, el.nextSibling);
+        }else{
+            var html = createHtml(o);
+            newNode = this.insertHtml('afterEnd', el, html);
+        }
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    };
+    
+    /**
+     * Creates new Dom element(s) and appends them to el
+     * @param {HTMLElement} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    this.append = function(el, o, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode;
+        if(this.useDom){
+            newNode = createDom(o, null);
+            el.appendChild(newNode);
+        }else{
+            var html = createHtml(o);
+            newNode = this.insertHtml('beforeEnd', el, html);
+        }
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    };
+    
+    /**
+     * Creates new Dom element(s) and overwrites the contents of el with them
+     * @param {HTMLElement} el The context element
+     * @param {Object} o The Dom object spec (and children)
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    this.overwrite = function(el, o, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        el.innerHTML = createHtml(o);
+        return returnElement ? YAHOO.ext.Element.get(el.firstChild, true) : el.firstChild;
+    };
+    
+    /**
+     * Creates a new YAHOO.ext.DomHelper.Template from the Dom object spec 
+     * @param {Object} o The Dom object spec (and children)
+     * @return {YAHOO.ext.DomHelper.Template} The new template
+     */
+    this.createTemplate = function(o){
+        var html = createHtml(o);
+        return new YAHOO.ext.DomHelper.Template(html);
+    };
+}();
+
+/**
+* @class YAHOO.ext.DomHelper.Template
+* Represents an HTML fragment template.
+* For more information see <a href="http://www.jackslocum.com/yui/2006/10/06/domhelper-create-elements-using-dom-html-fragments-or-templates/">this blog post with examples</a>. 
+* <br>
+* <b>This class is also available as YAHOO.ext.Template</b>.
+* @constructor
+* @param {String} html The HTML fragment
+*/
+YAHOO.ext.DomHelper.Template = function(html){
+    /**@private*/
+    this.html = html;
+    /**@private*/
+    this.re = /\{(\w+)\}/g;
+};
+YAHOO.ext.DomHelper.Template.prototype = {
+    /**
+     * Returns an HTML fragment of this template with the specified values applied
+     * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @return {String}
+     */
+    applyTemplate : function(values){
+        if(this.compiled){
+            return this.compiled(values);
+        }
+        var empty = '';
+        var fn = function(match, index){
+            if(typeof values[index] != 'undefined'){
+                return values[index];
+            }else{
+                return empty;
+            }
+        }
+        return this.html.replace(this.re, fn);
+    },
+    
+    /**
+     * Compiles the template into an internal function, eliminating the RegEx overhead
+     */
+    compile : function(){
+        var html = this.html;
+        var re = /\{(\w+)\}/g;
+        var body = [];
+        body.push("this.compiled = function(values){ return ");
+        var result;
+        var lastMatchEnd = 0;
+        while ((result = re.exec(html)) != null){
+            body.push("'", html.substring(lastMatchEnd, result.index), "' + ");
+            body.push("values['", html.substring(result.index+1,re.lastIndex-1), "'] + ");
+            lastMatchEnd = re.lastIndex;
+        }
+        body.push("'", html.substr(lastMatchEnd), "';};");
+        eval(body.join(''));
+    },
+   
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) before el
+     * @param {HTMLElement} el The context element
+     * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertBefore: function(el, values, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode = YAHOO.ext.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values));
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    },
+    
+    /**
+     * Applies the supplied values to the template and inserts the new node(s) after el
+     * @param {HTMLElement} el The context element
+     * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    insertAfter : function(el, values, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode = YAHOO.ext.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values));
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    },
+    
+    /**
+     * Applies the supplied values to the template and append the new node(s) to el
+     * @param {HTMLElement} el The context element
+     * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    append : function(el, values, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    },
+    
+    /**
+     * Applies the supplied values to the template and overwrites the content of el with the new node(s)
+     * @param {HTMLElement} el The context element
+     * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+     * @param {<i>Boolean</i>} returnElement (optional) true to return a YAHOO.ext.Element
+     * @return {HTMLElement} The new node
+     */
+    overwrite : function(el, values, returnElement){
+        el = YAHOO.util.Dom.get(el);
+        el.innerHTML = '';
+        var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values));
+        return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode;
+    }
+};
+
+YAHOO.ext.Template = YAHOO.ext.DomHelper.Template;

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/EditorGrid.js.html b/www/extras/yui-ext/docs/output/EditorGrid.js.html new file mode 100644 index 000000000..2b42f5bb7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/EditorGrid.js.html @@ -0,0 +1,16 @@ +EditorGrid.js
/**
+ * @class YAHOO.ext.grid.EditorGrid
+ * @extends YAHOO.ext.grid.Grid
+ * Shortcut class for creating and editable grid.
+ * @param {String/HTMLElement/YAHOO.ext.Element} container The element into which this grid will be rendered - 
+ * The container MUST have some type of size defined for the grid to fill. The container will be 
+ * automatically set to position relative if it isn't already.
+ * @param {Object} dataModel The data model to bind to
+ * @param {Object} colModel The column model with info about this grid's columns
+ */
+YAHOO.ext.grid.EditorGrid = function(container, dataModel, colModel){
+    YAHOO.ext.grid.EditorGrid.superclass.constructor.call(this, container, dataModel, 
+                      colModel, new YAHOO.ext.grid.EditorSelectionModel());
+    this.container.addClass('yeditgrid');
+};
+YAHOO.extendX(YAHOO.ext.grid.EditorGrid, YAHOO.ext.grid.Grid);

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/EditorSelectionModel.js.html b/www/extras/yui-ext/docs/output/EditorSelectionModel.js.html new file mode 100644 index 000000000..b75a6d4dd --- /dev/null +++ b/www/extras/yui-ext/docs/output/EditorSelectionModel.js.html @@ -0,0 +1,182 @@ +EditorSelectionModel.js
+/**
+ @class YAHOO.ext.grid.EditorSelectionModel
+ * Extends {@link YAHOO.ext.grid.DefaultSelectionModel} to enable cell navigation. <br><br> 
+ @extends YAHOO.ext.grid.DefaultSelectionModel
+ @constructor
+ */
+YAHOO.ext.grid.EditorSelectionModel = function(){
+    YAHOO.ext.grid.EditorSelectionModel.superclass.constructor.call(this);
+    /** Number of clicks to activate a cell (for editing) - valid values are 1 or 2
+     * @type Number */
+    this.clicksToActivateCell = 1;
+    this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate');
+};
+
+YAHOO.extendX(YAHOO.ext.grid.EditorSelectionModel, YAHOO.ext.grid.DefaultSelectionModel);
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.disableArrowNavigation = false;
+YAHOO.ext.grid.EditorSelectionModel.prototype.controlForArrowNavigation = false;
+
+/** @ignore */
+YAHOO.ext.grid.EditorSelectionModel.prototype.initEvents = function(){
+    this.grid.addListener("cellclick", this.onCellClick, this, true);
+    this.grid.addListener("celldblclick", this.onCellDblClick, this, true);
+    this.grid.addListener("keydown", this.keyDown, this, true);
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.onCellClick = function(grid, rowIndex, colIndex){
+    if(this.clicksToActivateCell == 1){
+        var row = this.grid.getRow(rowIndex);
+        var cell = row.childNodes[colIndex];
+        if(cell){
+            this.activate(row, cell);
+        }
+    }
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.activate = function(row, cell){
+    this.fireEvent('cellactivate', this, row, cell);
+    this.grid.doEdit(row, cell);
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){
+    if(this.clicksToActivateCell == 2){
+        var row = this.grid.getRow(rowIndex);
+        var cell = row.childNodes[colIndex];
+        if(cell){
+            this.activate(row, cell);
+        }
+    }
+};
+
+/** @ignore */
+YAHOO.ext.grid.EditorSelectionModel.prototype.setRowState = function(row, selected){
+    YAHOO.ext.grid.EditorSelectionModel.superclass.setRowState.call(this, row, false, false);
+};
+/** @ignore */
+YAHOO.ext.grid.EditorSelectionModel.prototype.focusRow = function(row, selected){
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellAfter = function(cell, spanRows){
+    var g = this.grid;
+    var next = g.getCellAfter(cell);
+    while(next && !g.colModel.isCellEditable(next.columnIndex)){
+        next = g.getCellAfter(next);
+    }
+    if(!next && spanRows){
+        var row = g.getRowAfter(g.getRowFromChild(cell));
+        if(row){
+            next = g.getFirstCell(row);
+            if(!g.colModel.isCellEditable(next.columnIndex)){
+                next = this.getEditorCellAfter(next);
+            }
+        }
+    }
+    return next;
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellBefore = function(cell, spanRows){
+    var g = this.grid;
+    var prev = g.getCellBefore(cell);
+    while(prev && !g.colModel.isCellEditable(prev.columnIndex)){
+        prev = g.getCellBefore(prev);
+    }
+    if(!prev && spanRows){
+        var row = g.getRowBefore(g.getRowFromChild(cell));
+        if(row){
+            prev = g.getLastCell(row);
+            if(!g.colModel.isCellEditable(prev.columnIndex)){
+               prev = this.getEditorCellBefore(prev);
+            }
+        }
+    }
+    return prev;
+};
+
+YAHOO.ext.grid.EditorSelectionModel.prototype.allowArrowNav = function(e){
+    return (!this.disableArrowNavigation && (!this.controlForArrowNavigation || e.ctrlKey));
+}
+/** @ignore */
+YAHOO.ext.grid.EditorSelectionModel.prototype.keyDown = function(e){
+    var g = this.grid, cm = g.colModel, cell = g.getEditingCell();
+    if(!cell) return;
+    var newCell;
+    switch(e.browserEvent.keyCode){
+         case e.TAB:
+             if(e.shiftKey){
+                 newCell = this.getEditorCellBefore(cell, true);
+             }else{
+                 newCell = this.getEditorCellAfter(cell, true);
+             }
+             e.preventDefault();
+         break;
+         case e.DOWN:
+             if(this.allowArrowNav(e)){
+                 var next = g.getRowAfter(g.getRowFromChild(cell));
+                 if(next){
+                     newCell = next.childNodes[cell.columnIndex];
+                 }
+             }
+         break;
+         case e.UP:
+             if(this.allowArrowNav(e)){
+                 var prev = g.getRowBefore(g.getRowFromChild(cell));
+                 if(prev){
+                     newCell = prev.childNodes[cell.columnIndex];
+                 }
+             }
+         break;
+         case e.RETURN:
+             if(e.shiftKey){
+                 var prev = g.getRowBefore(g.getRowFromChild(cell));
+                 if(prev){
+                     newCell = prev.childNodes[cell.columnIndex];
+                 }
+             }else{
+                 var next = g.getRowAfter(g.getRowFromChild(cell));
+                 if(next){
+                     newCell = next.childNodes[cell.columnIndex];
+                 }
+             }
+         break;
+         case e.RIGHT:
+             if(this.allowArrowNav(e)){
+                 newCell = this.getEditorCellAfter(cell);
+             }
+         break;
+         case e.LEFT:
+             if(this.allowArrowNav(e)){
+                 newCell = this.getEditorCellBefore(cell);
+             }
+         break;
+    };
+    if(newCell){
+        this.activate(g.getRowFromChild(newCell), newCell);
+        e.stopEvent();
+    }
+};
+
+/**
+ * @class YAHOO.ext.grid.EditorAndSelectionModel
+ */
+YAHOO.ext.grid.EditorAndSelectionModel = function(){
+    YAHOO.ext.grid.EditorAndSelectionModel.superclass.constructor.call(this);
+    this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate');
+};
+
+YAHOO.extendX(YAHOO.ext.grid.EditorAndSelectionModel, YAHOO.ext.grid.DefaultSelectionModel);
+
+YAHOO.ext.grid.EditorAndSelectionModel.prototype.initEvents = function(){
+    YAHOO.ext.grid.EditorAndSelectionModel.superclass.initEvents.call(this);
+    this.grid.addListener("celldblclick", this.onCellDblClick, this, true);
+};
+
+YAHOO.ext.grid.EditorAndSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){
+    var row = this.grid.getRow(rowIndex);
+    var cell = row.childNodes[colIndex];
+    if(cell){
+        this.fireEvent('cellactivate', this, row, cell);
+        this.grid.doEdit(row, cell);
+    }
+}; 

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Element.js.html b/www/extras/yui-ext/docs/output/Element.js.html new file mode 100644 index 000000000..ee2821ca6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Element.js.html @@ -0,0 +1,1807 @@ +Element.js
/**
+ * @class YAHOO.ext.Element
+ * Wraps around a DOM element and provides convenient access to Yahoo 
+ * UI library functionality (and more).<br><br>
+ * Usage:<br>
+ * <pre><code>
+ * var el = YAHOO.ext.Element.get('myElementId');
+ * // or the shorter
+ * var el = getEl('myElementId');
+ * </code></pre>
+ * Using YAHOO.ext.Element.get() instead of calling the constructor directly ensures you get the same object 
+ * each call instead of constructing a new one.<br><br>
+ * For working with collections of Elements, see <a href="YAHOO.ext.CompositeElement.html">YAHOO.ext.CompositeElement</a>
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.Anim (optional) to support animation
+ * @requires YAHOO.util.Motion (optional) to support animation
+ * @requires YAHOO.util.Easing (optional) to support animation
+ * @constructor Create a new Element directly.
+ * @param {String/HTMLElement} element
+ * @param {<i>Boolean</i>} forceNew (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class).
+ */
+YAHOO.ext.Element = function(element, forceNew){
+    var dom = YAHOO.util.Dom.get(element);
+    if(!dom){ // invalid id/element
+        return null;
+    }
+    if(!forceNew && YAHOO.ext.Element.cache[dom.id]){ // element object already exists
+        return YAHOO.ext.Element.cache[dom.id];
+    }
+    /**
+     * The DOM element
+     * @type HTMLElement
+     */
+    this.dom = dom;
+    
+    /**
+     * The DOM element ID
+     * @type String
+     */
+    this.id = this.dom.id;
+    /**
+     * @private the current visibility mode
+     */
+    this.visibilityMode = YAHOO.ext.Element.VISIBILITY;
+    
+    
+    /**
+     * The element's default display mode @type String
+     */
+    this.originalDisplay = YAHOO.util.Dom.getStyle(this.dom, 'display') || '';
+    if(this.autoDisplayMode){
+        if(this.originalDisplay == 'none'){
+            this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);
+        }
+    }
+    if(this.originalDisplay == 'none'){
+        this.originalDisplay = '';
+    }
+    
+    /**
+     * The default unit to append to CSS values where a unit isn't provided (Defaults to px).
+     * @type String
+     */
+    this.defaultUnit = 'px';
+}
+
+YAHOO.ext.Element.prototype = {    
+    /**
+     * Sets the elements visibility mode. When setVisible() is called it
+     * will use this to determine whether to set the visibility or the display property.
+     * @param visMode Element.VISIBILITY or Element.DISPLAY
+     * @return {YAHOO.ext.Element} this
+     */
+    setVisibilityMode : function(visMode){
+        this.visibilityMode = visMode;
+        return this;
+    },
+    
+    /**
+     * Convenience method for setVisibilityMode(Element.DISPLAY)
+     * @param {String} display (optional) What to set display to when visible
+     * @return {YAHOO.ext.Element} this
+     */
+    enableDisplayMode : function(display){
+        this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);
+        if(typeof display != 'undefined') this.originalDisplay = display;
+        return this;
+    },
+    
+    /**
+     * Perform Yahoo UI animation on this element. 
+     * @param {Object} args The YUI animation control args
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @param {<i>Function</i>} animType (optional) YAHOO.util.Anim subclass to use. For example: YAHOO.util.Motion
+     * @return {YAHOO.ext.Element} this
+     */
+    animate : function(args, duration, onComplete, easing, animType){
+        this.anim(args, duration, onComplete, easing, animType);
+        return this;
+    },
+    
+    /**
+     * @private Internal animation call
+     */
+    anim : function(args, duration, onComplete, easing, animType){
+        animType = animType || YAHOO.util.Anim;
+        var anim = new animType(this.dom, args, duration || .35, 
+                easing || YAHOO.util.Easing.easeBoth);
+        if(onComplete){
+            if(!(onComplete instanceof Array)){
+                anim.onComplete.subscribe(onComplete, this, true);
+            }else{
+                for(var i = 0; i < onComplete.length; i++){
+                    var fn = onComplete[i];
+                    if(fn) anim.onComplete.subscribe(fn, this, true);
+                }
+            }
+        }
+        anim.animate();
+    },
+    
+    /**
+     * Scrolls this element into view within the passed container.
+     * @param {<i>String/HTMLElement/Element</i>} container (optional) The container element to scroll (defaults to document.body)
+     * @return {YAHOO.ext.Element} this
+     */
+    scrollIntoView : function(container){
+        var c = getEl(container || document.body, true);
+        var cp = c.getStyle('position');
+        var restorePos = false;
+        if(cp != 'relative' && cp != 'absolute'){
+            c.setStyle('position', 'relative');
+            restorePos = true;
+        }
+        var el = this.dom;
+        var childTop = parseInt(el.offsetTop, 10);
+        var childBottom = childTop + el.offsetHeight;
+        var containerTop = parseInt(c.scrollTop, 10); // parseInt for safari bug
+        var containerBottom = containerTop + c.clientHeight;
+        if(childTop < containerTop){
+        	c.scrollTop = childTop;
+        }else if(childBottom > containerBottom){
+            c.scrollTop = childBottom-c.clientHeight;
+        }
+        if(restorePos){
+            c.setStyle('position', cp);
+        }
+        return this;
+    },
+        
+    /** 
+     * Measures the elements content height and updates height to match. Note, this function uses setTimeout and 
+     * the new height may not be available immediately.
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>Float</i>} duration (optional) Length of the animation. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+     * @return {YAHOO.ext.Element} this
+     */
+    autoHeight : function(animate, duration, onComplete, easing){
+        var oldHeight = this.getHeight();
+        this.clip();
+        this.setHeight(1); // force clipping
+        setTimeout(function(){
+            var height = parseInt(this.dom.scrollHeight, 10); // parseInt for Safari
+            if(!animate){
+                this.setHeight(height);
+                this.unclip();
+            }else{
+                this.setHeight(oldHeight); // restore original height
+                this.setHeight(height, animate, duration, function(){
+                    this.unclip();
+                    if(typeof onComplete == 'function') onComplete();
+                }.createDelegate(this), easing);
+            }
+        }.createDelegate(this), 0);
+        return this;
+    },
+    
+    /**
+     * Checks whether the element is currently visible using both visibility and display properties.
+     * @param {<i>Boolean</i>} deep True to walk the dom and see if parent elements are hidden.
+     * @return {Boolean} true if the element is currently visible 
+     */
+    isVisible : function(deep) {
+        var vis = YAHOO.util.Dom.getStyle(this.dom, 'visibility') != 'hidden' 
+               && YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none';
+        if(!deep || !vis){
+            return vis;
+        }
+        var p = this.dom.parentNode;
+        while(p && p.tagName.toLowerCase() != 'body'){
+            if(YAHOO.util.Dom.getStyle(p, 'visibility') == 'hidden' || YAHOO.util.Dom.getStyle(p, 'display') == 'none'){
+                return false;
+            }
+            p = p.parentNode;
+        }
+        return true;
+    },
+    
+    /**
+     * Selects child nodes based on the passed CSS selector (the selector should not contain an id)
+     * @param {String} selector The CSS selector
+     * @param {Boolean} unique true to create a unique YAHOO.ext.Element for each child (defaults to a shared flyweight object)
+     * @return {CompositeElement/CompositeElementLite} The composite element
+     */
+    select : function(selector, unique){
+        return YAHOO.ext.Element.select('#' + this.dom.id + ' ' + selector, unique);  
+    },
+    
+    /**
+     * Initializes a YAHOO.util.DD object for this element.
+     * @param {String} group The group the DD object is member of
+     * @param {Object} config The DD config object
+     * @param {Object} overrides An object containing methods to override/implement on the DD object
+     * @return {YAHOO.util.DD} The DD object
+     */
+    initDD : function(group, config, overrides){
+        var dd = new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom), group, config);
+        return YAHOO.ext.util.Config.apply(dd, overrides);
+    },
+   
+    /**
+     * Initializes a YAHOO.util.DDProxy object for this element.
+     * @param {String} group The group the DDProxy object is member of
+     * @param {Object} config The DDProxy config object
+     * @param {Object} overrides An object containing methods to override/implement on the DDProxy object
+     * @return {YAHOO.util.DDProxy} The DDProxy object
+     */
+    initDDProxy : function(group, config, overrides){
+        var dd = new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom), group, config);
+        return YAHOO.ext.util.Config.apply(dd, overrides);
+    },
+   
+    /**
+     * Initializes a YAHOO.util.DDTarget object for this element.
+     * @param {String} group The group the DDTarget object is member of
+     * @param {Object} config The DDTarget config object
+     * @param {Object} overrides An object containing methods to override/implement on the DDTarget object
+     * @return {YAHOO.util.DDTarget} The DDTarget object
+     */
+    initDDTarget : function(group, config, overrides){
+        var dd = new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom), group, config);
+        return YAHOO.ext.util.Config.apply(dd, overrides);
+    },
+   
+    /**
+     * Sets the visibility of the element (see details). If the visibilityMode is set to Element.DISPLAY, it will use 
+     * the display property to hide the element, otherwise it uses visibility. The default is to hide and show using the visibility property.
+     * @param {Boolean} visible Whether the element is visible
+     * @param {<i>Boolean</i>} animate (optional) Fade the element in or out (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the fade effect lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+     * @return {YAHOO.ext.Element} this
+     */
+     setVisible : function(visible, animate, duration, onComplete, easing){
+        //if(this.isVisible() == visible) return; // nothing to do
+        if(!animate || !YAHOO.util.Anim){
+            if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){
+                this.setDisplayed(visible);
+            }else{
+                YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden');
+            }
+        }else{
+            // make sure they can see the transition
+            this.setOpacity(visible?0:1);
+            YAHOO.util.Dom.setStyle(this.dom, 'visibility', 'visible');
+            if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){
+                this.setDisplayed(true);
+            }
+            var args = {opacity: { from: (visible?0:1), to: (visible?1:0) }};
+            var anim = new YAHOO.util.Anim(this.dom, args, duration || .35, 
+                easing || (visible ? YAHOO.util.Easing.easeIn : YAHOO.util.Easing.easeOut));
+            anim.onComplete.subscribe((function(){
+                if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){
+                    this.setDisplayed(visible);
+                }else{
+                    YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden');
+                }
+            }).createDelegate(this));
+            if(onComplete){
+                anim.onComplete.subscribe(onComplete);
+            }
+            anim.animate();
+        }
+        return this;
+    },
+    
+    /**
+     * Returns true if display is not "none"
+     * @return {Boolean}
+     */
+    isDisplayed : function() {
+        return YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none';
+    },
+    
+    /**
+     * Toggles the elements visibility or display, depending on visibility mode.
+     * @param {<i>Boolean</i>} animate (optional) Fade the element in or out (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the fade effect lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+     * @return {YAHOO.ext.Element} this
+     */
+    toggle : function(animate, duration, onComplete, easing){
+        this.setVisible(!this.isVisible(), animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+     * Sets the css display. Uses originalDisplay if value is a boolean true.
+     * @param {Boolean} value Boolean to display the element using it's default display or a string to set the display directly
+     * @return {YAHOO.ext.Element} this
+     */
+    setDisplayed : function(value) {
+        if(typeof value == 'boolean'){
+           value = value ? this.originalDisplay : 'none';
+        }
+        YAHOO.util.Dom.setStyle(this.dom, 'display', value);
+        return this;
+    },
+    
+    /**
+     * Tries to focus the element. Any exceptions are caught.
+     * @return {YAHOO.ext.Element} this
+     */
+    focus : function() {
+        try{
+            this.dom.focus();
+        }catch(e){}
+        return this;
+    },
+    
+    /**
+     * Add a CSS class to the element.
+     * @param {String} className The CSS class to add
+     * @return {YAHOO.ext.Element} this
+     */
+    addClass : function(className){
+        YAHOO.util.Dom.addClass(this.dom, className);
+        return this;
+    },
+    
+    /**
+     * Adds the passed className to this element and removes the class from all siblings
+     * @param {String} className The className to add
+     * @return {YAHOO.ext.Element} this
+     */
+    radioClass : function(className){
+        var siblings = this.dom.parentNode.childNodes;
+        for(var i = 0; i < siblings.length; i++) {
+        	var s = siblings[i];
+        	if(s.nodeType == 1){
+        	    YAHOO.util.Dom.removeClass(s, className);
+        	}
+        }
+        YAHOO.util.Dom.addClass(this.dom, className);
+        return this;
+    },
+    /**
+     * Removes a CSS class from the element.
+     * @param {String} className The CSS class to remove
+     * @return {YAHOO.ext.Element} this
+     */
+    removeClass : function(className){
+        YAHOO.util.Dom.removeClass(this.dom, className);
+        return this;
+    },
+    
+    /**
+     * Toggles (adds or removes) the passed class.
+     * @param {String} className
+     * @return {YAHOO.ext.Element} this
+     */
+    toggleClass : function(className){
+        if(YAHOO.util.Dom.hasClass(this.dom, className)){
+            YAHOO.util.Dom.removeClass(this.dom, className);
+        }else{
+            YAHOO.util.Dom.addClass(this.dom, className);
+        }
+        return this;
+    },
+    
+    /**
+     * Checks if a CSS class is in use by the element.
+     * @param {String} className The CSS class to check
+     * @return {Boolean} true or false
+     */
+    hasClass : function(className){
+        return YAHOO.util.Dom.hasClass(this.dom, className);
+    },
+    
+    /**
+     * Replaces a CSS class on the element with another.
+     * @param {String} oldClassName The CSS class to replace
+     * @param {String} newClassName The replacement CSS class
+     * @return {YAHOO.ext.Element} this
+     */
+    replaceClass : function(oldClassName, newClassName){
+        YAHOO.util.Dom.replaceClass(this.dom, oldClassName, newClassName);
+        return this;
+    },
+    
+    /**
+       * Normalizes currentStyle and ComputedStyle.
+       * @param {String} property The style property whose value is returned.
+       * @return {String} The current value of the style property for this element.
+       */
+    getStyle : function(name){
+        return YAHOO.util.Dom.getStyle(this.dom, name);
+    },
+    
+    /**
+       * Wrapper for setting style properties, also takes single object parameter of multiple styles
+       * @param {String/Object} property The style property to be set or an object of multiple styles.
+       * @param {String} val (optional) The value to apply to the given property or null if an object was passed.
+       * @return {YAHOO.ext.Element} this
+     */
+    setStyle : function(name, value){
+        if(typeof name == 'string'){
+            YAHOO.util.Dom.setStyle(this.dom, name, value);
+        }else{
+            var D = YAHOO.util.Dom;
+            for(var style in name){
+                if(typeof name[style] != 'function'){
+                   D.setStyle(this.dom, style, name[style]);
+                }
+            }
+        }
+        return this;
+    },
+    
+    /**
+     * More flexible version of {@link #setStyle} for setting style properties.
+     * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or
+     * a function which returns such a specification.
+     * @return {YAHOO.ext.Element} this
+     */
+    applyStyles : function(style){
+        YAHOO.ext.DomHelper.applyStyles(this.dom, style);
+        return this;
+    },
+    
+    /**
+       * Gets the current X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+       @ return {Number} The X position of the element
+       */
+    getX : function(){
+        return YAHOO.util.Dom.getX(this.dom);
+    },
+    
+    /**
+       * Gets the current Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+       @ return {Number} The Y position of the element
+       */
+    getY : function(){
+        return YAHOO.util.Dom.getY(this.dom);
+    },
+    
+    /**
+       * Gets the current position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+       @ return {Array} The XY position of the element
+       */
+    getXY : function(){
+        return YAHOO.util.Dom.getXY(this.dom);
+    },
+    
+    /**
+       * Sets the X position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+       @param {Number} The X position of the element
+      * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    setX : function(x, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setX(this.dom, x);
+        }else{
+            this.setXY([x, this.getY()], animate, duration, onComplete, easing);
+        }
+        return this;
+    },
+    
+    /**
+       * Sets the Y position of the element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+       @param {Number} The Y position of the element
+      * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+      */
+    setY : function(y, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setY(this.dom, y);
+        }else{
+            this.setXY([this.getX(), y], animate, duration, onComplete, easing);
+        }
+        return this;
+    },
+    
+    /**
+     * Set the element's left position directly using CSS style (instead of setX())
+     * @param {String} left The left CSS property value
+     * @return {YAHOO.ext.Element} this
+     */
+    setLeft : function(left){
+        YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(left));
+        return this;
+    },
+    
+    /**
+     * Set the element's top position directly using CSS style (instead of setY())
+     * @param {String} top The top CSS property value
+     * @return {YAHOO.ext.Element} this
+     */
+    setTop : function(top){
+        YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(top));
+        return this;
+    },
+    
+    /**
+     * Set the element's css right style
+     * @param {String} right The right CSS property value
+     * @return {YAHOO.ext.Element} this
+     */
+    setRight : function(right){
+        YAHOO.util.Dom.setStyle(this.dom, 'right', this.addUnits(right));
+        return this;
+    },
+    
+    /**
+     * Set the element's css bottom style
+     * @param {String} bottom The bottom CSS property value
+     * @return {YAHOO.ext.Element} this
+     */
+    setBottom : function(bottom){
+        YAHOO.util.Dom.setStyle(this.dom, 'bottom', this.addUnits(bottom));
+        return this;
+    },
+    
+    /**
+     * Set the position of the element in page coordinates, regardless of how the element is positioned.
+     * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+     * @param {Array} pos Contains X & Y [x, y] values for new position (coordinates are page-based)
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+      * @return {YAHOO.ext.Element} this
+       */
+    setXY : function(pos, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setXY(this.dom, pos);
+        }else{
+            this.anim({points: {to: pos}}, duration, onComplete, easing, YAHOO.util.Motion);
+        }
+        return this;
+    },
+    
+    /**
+     * Set the position of the element in page coordinates, regardless of how the element is positioned.
+     * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+     * @param {Number} x X value for new position (coordinates are page-based)
+     * @param {Number} y Y value for new position (coordinates are page-based)
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    setLocation : function(x, y, animate, duration, onComplete, easing){
+        this.setXY([x, y], animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+     * Set the position of the element in page coordinates, regardless of how the element is positioned.
+     * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
+     * @param {Number} x X value for new position (coordinates are page-based)
+     * @param {Number} y Y value for new position (coordinates are page-based)
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    moveTo : function(x, y, animate, duration, onComplete, easing){
+        //YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(x));
+        //YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(y));
+        this.setXY([x, y], animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+       * Returns the region of the given element.
+       * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
+       * @return {Region} A YAHOO.util.Region containing "top, left, bottom, right" member data.
+       */
+    getRegion : function(){
+        return YAHOO.util.Dom.getRegion(this.dom);
+    },
+    
+    /**
+     * Returns the offset height of the element
+     * @param {Boolean} contentHeight (optional) true to get the height minus borders and padding
+     * @return {Number} The element's height
+     */
+    getHeight : function(contentHeight){
+        var h = this.dom.offsetHeight;
+        return contentHeight !== true ? h : h-this.getBorderWidth('tb')-this.getPadding('tb');
+    },
+    
+    /**
+     * Returns the offset width of the element
+     * @param {Boolean} contentWidth (optional) true to get the width minus borders and padding
+     * @return {Number} The element's width
+     */
+    getWidth : function(contentWidth){
+        var w = this.dom.offsetWidth;
+        return contentWidth !== true ? w : w-this.getBorderWidth('lr')-this.getPadding('lr');
+    },
+    
+    /**
+     * Returns the size of the element
+     * @param {Boolean} contentSize (optional) true to get the width/size minus borders and padding
+     * @return {Object} An object containing the element's size {width: (element width), height: (element height)}
+     */
+    getSize : function(contentSize){
+        return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)};
+    },
+    
+    /** @private */
+    adjustWidth : function(width){
+        if(typeof width == 'number'){
+            if(this.autoBoxAdjust && !this.isBorderBox()){
+               width -= (this.getBorderWidth('lr') + this.getPadding('lr'));
+            }
+            if(width < 0){
+                width = 0;
+            }
+        }
+        return width;
+    },
+    
+    /** @private */
+    adjustHeight : function(height){
+        if(typeof height == 'number'){
+           if(this.autoBoxAdjust && !this.isBorderBox()){
+               height -= (this.getBorderWidth('tb') + this.getPadding('tb'));
+           }
+           if(height < 0){
+               height = 0;
+           }
+        }
+        return height;
+    },
+    
+    /**
+     * Set the width of the element
+     * @param {Number} width The new width
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if width is larger or YAHOO.util.Easing.easeIn if it is smaller)
+     * @return {YAHOO.ext.Element} this
+     */
+    setWidth : function(width, animate, duration, onComplete, easing){
+        width = this.adjustWidth(width);
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setStyle(this.dom, 'width', this.addUnits(width));
+        }else{
+            this.anim({width: {to: width}}, duration, onComplete, 
+                easing || (width > this.getWidth() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn));
+        }
+        return this;
+    },
+    
+    /**
+     * Set the height of the element
+     * @param {Number} height The new height
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller)
+     * @return {YAHOO.ext.Element} this
+     */
+     setHeight : function(height, animate, duration, onComplete, easing){
+        height = this.adjustHeight(height);
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setStyle(this.dom, 'height', this.addUnits(height));
+        }else{
+            this.anim({height: {to: height}}, duration, onComplete,  
+                   easing || (height > this.getHeight() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn));
+        }
+        return this;
+    },
+    
+    /**
+     * Set the size of the element. If animation is true, both width an height will be animated concurrently.
+     * @param {Number} width The new width
+     * @param {Number} height The new height
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+     setSize : function(width, height, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            this.setWidth(width);
+            this.setHeight(height);
+        }else{
+            width = this.adjustWidth(width); height = this.adjustHeight(height);
+            this.anim({width: {to: width}, height: {to: height}}, duration, onComplete, easing);
+        }
+        return this;
+    },
+    
+    /**
+     * Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated concurrently.
+     * @param {Number} x X value for new position (coordinates are page-based)
+     * @param {Number} y Y value for new position (coordinates are page-based)
+     * @param {Number} width The new width
+     * @param {Number} height The new height
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    setBounds : function(x, y, width, height, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            this.setWidth(width);
+            this.setHeight(height);
+            this.setLocation(x, y);
+        }else{
+            width = this.adjustWidth(width); height = this.adjustHeight(height);
+            this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}}, duration, onComplete, easing, YAHOO.util.Motion);
+        }
+        return this;
+    },
+    
+    /**
+     * Sets the element's position and size the the specified region. If animation is true then width, height, x and y will be animated concurrently.
+     * @param {YAHOO.util.Region} region The region to fill
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    setRegion : function(region, animate, duration, onComplete, easing){
+        this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+     * Appends an event handler to this element
+     * @param {String}   eventName     The type of event to listen for
+     * @param {Function} handler        The method the event invokes
+     * @param {<i>Object</i>}   scope  (optional)  An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {<i>boolean</i>}  override (optional) If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {YAHOO.ext.Element} this
+     */
+    addListener : function(eventName, handler, scope, override){
+        YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true);
+        return this;
+    },
+    
+    /**
+     * Appends an event handler to this element. The difference between this function and addListener is this
+     * function prevents the default action, and if set stops propagation (bubbling) as well
+     * @param {String}   eventName     The type of event to listen for
+     * @param {Boolean}   stopPropagation     Whether to also stopPropagation (bubbling) 
+     * @param {Function} handler        The method the event invokes
+     * @param {<i>Object</i>}   scope  (optional)  An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {<i>boolean</i>}  override (optional) If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {YAHOO.ext.Element} this
+     */
+    addHandler : function(eventName, stopPropagation, handler, scope, override){
+        var fn = YAHOO.ext.Element.createStopHandler(stopPropagation, handler, scope || this, true);
+        YAHOO.util.Event.addListener(this.dom, eventName, fn);
+        return this;
+    },
+    
+    /**
+     * Appends an event handler to this element (Same as addListener)
+     * @param {String}   eventName     The type of event to listen for
+     * @param {Function} handler        The method the event invokes
+     * @param {<i>Object</i>}   scope (optional)   An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {<i>boolean</i>}  override (optional) If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {YAHOO.ext.Element} this
+     */
+    on : function(eventName, handler, scope, override){
+        YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true);
+        return this;
+    },
+    
+    /**
+     * Append a managed listener - See {@link YAHOO.ext.EventObject} for more details. Use mon() for a shorter version.
+     * @param {String}   eventName     The type of event to listen for
+     * @param {Function} fn        The method the event invokes
+     * @param {<i>Object</i>}   scope  (optional)  An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {<i>boolean</i>}  override (optional) If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {Function} The EventManager wrapped function that can be used to remove the listener
+     */
+    addManagedListener : function(eventName, fn, scope, override){
+        return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true);
+    },
+    
+    /** 
+     * Append a managed listener (shorthanded for {@link #addManagedListener}) 
+     * @param {String}   eventName     The type of event to listen for
+     * @param {Function} fn        The method the event invokes
+     * @param {<i>Object</i>}   scope  (optional)  An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {<i>boolean</i>}  override (optional) If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {Function} The EventManager wrapped function that can be used to remove the listener
+     */
+    mon : function(eventName, fn, scope, override){
+        return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true);
+    },
+    /**
+     * Removes an event handler from this element
+     * @param {String} sType the type of event to remove
+     * @param {Function} fn the method the event invokes
+     * @param {Object} scope
+     * @return {YAHOO.ext.Element} this
+     */
+    removeListener : function(eventName, handler, scope){
+        YAHOO.util.Event.removeListener(this.dom, eventName, handler, scope || this);
+        return this;
+    },
+    
+    /**
+     * Removes all previous added listeners from this element
+     * @return {YAHOO.ext.Element} this
+     */
+    removeAllListeners : function(){
+        YAHOO.util.Event.purgeElement(this.dom);
+        return this;
+    },
+    
+    
+    /**
+     * Set the opacity of the element
+     * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
+     * @param {<i>Boolean</i>} animate (optional) Animate (fade) the transition (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller)
+     * @return {YAHOO.ext.Element} this
+     */
+     setOpacity : function(opacity, animate, duration, onComplete, easing){
+        if(!animate || !YAHOO.util.Anim){
+            YAHOO.util.Dom.setStyle(this.dom, 'opacity', opacity);
+        }else{
+            this.anim({opacity: {to: opacity}}, duration, onComplete, easing);
+        }
+        return this;
+    },
+    
+    /**
+     * Gets the left X coordinate
+     * @param {Boolean} local True to get the local css position instead of page coordinate
+     * @return {Number}
+     */
+    getLeft : function(local){
+        if(!local){
+            return this.getX();
+        }else{
+            return parseInt(this.getStyle('left'), 10) || 0;
+        }
+    },
+    
+    /**
+     * Gets the right X coordinate of the element (element X position + element width)
+     * @param {Boolean} local True to get the local css position instead of page coordinate
+     * @return {Number}
+     */
+    getRight : function(local){
+        if(!local){
+            return this.getX() + this.getWidth();
+        }else{
+            return (this.getLeft(true) + this.getWidth()) || 0;
+        }
+    },
+    
+    /**
+     * Gets the top Y coordinate
+     * @param {Boolean} local True to get the local css position instead of page coordinate
+     * @return {Number}
+     */
+    getTop : function(local) {
+        if(!local){
+            return this.getY();
+        }else{
+            return parseInt(this.getStyle('top'), 10) || 0;
+        }
+    },
+    
+    /**
+     * Gets the bottom Y coordinate of the element (element Y position + element height)
+     * @param {Boolean} local True to get the local css position instead of page coordinate
+     * @return {Number}
+     */
+    getBottom : function(local){
+        if(!local){
+            return this.getY() + this.getHeight();
+        }else{
+            return (this.getTop(true) + this.getHeight()) || 0;
+        }
+    },
+    
+    /**
+    * Set the element as absolute positioned with the specified z-index
+    * @param {<i>Number</i>} zIndex (optional)
+    * @return {YAHOO.ext.Element} this
+     */
+    setAbsolutePositioned : function(zIndex){
+        this.setStyle('position', 'absolute');
+        if(zIndex){
+            this.setStyle('z-index', zIndex);
+        }
+        return this;
+    },
+    
+    /**
+    * Set the element as relative positioned with the specified z-index
+    * @param {<i>Number</i>} zIndex (optional)
+    * @return {YAHOO.ext.Element} this
+     */
+    setRelativePositioned : function(zIndex){
+        this.setStyle('position', 'relative');
+        if(zIndex){
+            this.setStyle('z-index', zIndex);
+        }
+        return this;
+    },
+    
+    /**
+    * Clear positioning back to the default when the document was loaded
+    * @return {YAHOO.ext.Element} this
+     */
+    clearPositioning : function(){
+        this.setStyle('position', '');
+        this.setStyle('left', '');
+        this.setStyle('right', '');
+        this.setStyle('top', '');
+        this.setStyle('bottom', '');
+        return this;
+    },
+    
+    /**
+    * Gets an object with all CSS positioning properties. Useful along with setPostioning to get 
+    * snapshot before performing an update and then restoring the element.
+    * @return {Object} 
+    */
+    getPositioning : function(){
+        return {
+            'position' : this.getStyle('position'),
+            'left' : this.getStyle('left'),
+            'right' : this.getStyle('right'),
+            'top' : this.getStyle('top'),
+            'bottom' : this.getStyle('bottom')
+        };
+    },
+    
+    /**
+     * Gets the width of the border(s) for the specified side(s)
+     * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example, 
+     * passing lr would get the border (l)eft width + the border (r)ight width.
+     * @return {Number} The width of the sides passed added together
+     */
+    getBorderWidth : function(side){
+        return this.addStyles(side, YAHOO.ext.Element.borders);
+    },
+    
+    /**
+     * Gets the width of the padding(s) for the specified side(s)
+     * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example, 
+     * passing lr would get the padding (l)eft + the padding (r)ight.
+     * @return {Number} The padding of the sides passed added together
+     */
+    getPadding : function(side){
+        return this.addStyles(side, YAHOO.ext.Element.paddings);
+    },
+    
+    /**
+    * Set positioning with an object returned by getPositioning().
+    * @param {Object} posCfg
+    * @return {YAHOO.ext.Element} this
+     */
+    setPositioning : function(positionCfg){
+        if(positionCfg.position)this.setStyle('position', positionCfg.position);
+        if(positionCfg.left)this.setLeft(positionCfg.left);
+        if(positionCfg.right)this.setRight(positionCfg.right);
+        if(positionCfg.top)this.setTop(positionCfg.top);
+        if(positionCfg.bottom)this.setBottom(positionCfg.bottom);
+        return this;
+    },
+    
+    
+    /**
+     * Quick set left and top adding default units
+     * @return {YAHOO.ext.Element} this
+     */
+     setLeftTop : function(left, top){
+        this.dom.style.left = this.addUnits(left);
+        this.dom.style.top = this.addUnits(top);
+        return this;
+    },
+    
+    /**
+     * Move this element relative to it's current position.
+     * @param {String} direction Possible values are: 'l','left' - 'r','right' - 't','top','up' - 'b','bottom','down'.
+     * @param {Number} distance How far to move the element in pixels
+     * @param {<i>Boolean</i>} animate (optional) Animate the movement (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. 
+     * @return {YAHOO.ext.Element} this
+     */
+     move : function(direction, distance, animate, duration, onComplete, easing){
+        var xy = this.getXY();
+        direction = direction.toLowerCase();
+        switch(direction){
+            case 'l':
+            case 'left':
+                this.moveTo(xy[0]-distance, xy[1], animate, duration, onComplete, easing);
+                break;
+           case 'r':
+           case 'right':
+                this.moveTo(xy[0]+distance, xy[1], animate, duration, onComplete, easing);
+                break;
+           case 't':
+           case 'top':
+           case 'up':
+                this.moveTo(xy[0], xy[1]-distance, animate, duration, onComplete, easing);
+                break;
+           case 'b':
+           case 'bottom':
+           case 'down':
+                this.moveTo(xy[0], xy[1]+distance, animate, duration, onComplete, easing);
+                break;
+        }
+        return this;
+    },
+    
+    /**
+     *  Store the current overflow setting and clip overflow on the element - use {@link #unclip} to remove
+     * @return {YAHOO.ext.Element} this
+     */
+    clip : function(){
+        if(!this.isClipped){
+           this.isClipped = true;
+           this.originalClip = {
+               'o': this.getStyle('overflow'), 
+               'x': this.getStyle('overflow-x'),
+               'y': this.getStyle('overflow-y')
+           };
+           this.setStyle('overflow', 'hidden');
+           this.setStyle('overflow-x', 'hidden');
+           this.setStyle('overflow-y', 'hidden');
+        }
+        return this;
+    },
+    
+    /**
+     *  Return clipping (overflow) to original clipping before clip() was called
+     * @return {YAHOO.ext.Element} this
+     */
+    unclip : function(){
+        if(this.isClipped){
+            this.isClipped = false;
+            var o = this.originalClip;
+            if(o.o){this.setStyle('overflow', o.o);}
+            if(o.x){this.setStyle('overflow-x', o.x);}
+            if(o.y){this.setStyle('overflow-y', o.y);}
+        }
+        return this;
+    },
+    
+    /**
+     * Align this element with another element.
+     * @param {String/HTMLElement/YAHOO.ext.Element} element The element to align to.
+     * @param {String} position The position to align to. Possible values are 'tl' - top left, 'tr' - top right, 'bl' - bottom left, and 'br' - bottom right. 
+     * @param {<i>Array</i>} offsets (optional) Offset the positioning by [x, y]
+     * @param {<i>Boolean</i>} animate (optional) Animate the movement (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. 
+     * @return {YAHOO.ext.Element} this
+     */
+     alignTo : function(element, position, offsets, animate, duration, onComplete, easing){
+        var otherEl = getEl(element);
+        if(!otherEl){
+            return this; // must not exist
+        }
+        offsets = offsets || [0, 0];
+        var r = otherEl.getRegion();
+        position = position.toLowerCase();
+        switch(position){
+           case 'bl':
+                this.moveTo(r.left + offsets[0], r.bottom + offsets[1], 
+                            animate, duration, onComplete, easing);
+                break;
+           case 'br':
+                this.moveTo(r.right + offsets[0], r.bottom + offsets[1], 
+                            animate, duration, onComplete, easing);
+                break;
+           case 'tl':
+                this.moveTo(r.left + offsets[0], r.top + offsets[1], 
+                            animate, duration, onComplete, easing);
+                break;
+           case 'tr':
+                this.moveTo(r.right + offsets[0], r.top + offsets[1], 
+                            animate, duration, onComplete, easing);
+                break;
+        }
+        return this;
+    },
+    
+    /**
+    * Clears any opacity settings from this element. Required in some cases for IE.
+    * @return {YAHOO.ext.Element} this
+     */
+    clearOpacity : function(){
+        if (window.ActiveXObject) {
+            this.dom.style.filter = '';
+        } else {
+            this.dom.style.opacity = '';
+            this.dom.style['-moz-opacity'] = '';
+            this.dom.style['-khtml-opacity'] = '';
+        }
+        return this;
+    },
+    
+    /**
+    * Hide this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}.
+    * @param {<i>Boolean</i>} animate (optional) Animate (fade) the transition (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+    * @return {YAHOO.ext.Element} this
+      */
+    hide : function(animate, duration, onComplete, easing){
+        this.setVisible(false, animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+    * Show this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}.
+    * @param {<i>Boolean</i>} animate (optional) Animate (fade in) the transition (Default is false)
+     * @param {<i>Float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    show : function(animate, duration, onComplete, easing){
+        this.setVisible(true, animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+     * @private Test if size has a unit, otherwise appends the default 
+     */
+    addUnits : function(size){
+        if(size === '' || size == 'auto' || typeof size == 'undefined'){
+            return size;
+        }
+        if(typeof size == 'number' || !YAHOO.ext.Element.unitPattern.test(size)){
+            return size + this.defaultUnit;
+        }
+        return size;
+    },
+    
+    /**
+     * Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
+     * @return {YAHOO.ext.Element} this
+     */
+    beginMeasure : function(){
+        var el = this.dom;
+        if(el.offsetWidth || el.offsetHeight){
+            return this; // offsets work already
+        }
+        var changed = [];
+        var p = this.dom; // start with this element
+        while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p.tagName.toLowerCase() != 'body'){
+            if(YAHOO.util.Dom.getStyle(p, 'display') == 'none'){
+                changed.push({el: p, visibility: YAHOO.util.Dom.getStyle(p, 'visibility')});
+                p.style.visibility = 'hidden';
+                p.style.display = 'block';
+            }
+            p = p.parentNode;
+        }
+        this._measureChanged = changed;
+        return this;
+               
+    },
+    
+    /**
+     * Restores displays to before beginMeasure was called
+     * @return {YAHOO.ext.Element} this
+     */
+    endMeasure : function(){
+        var changed = this._measureChanged;
+        if(changed){
+            for(var i = 0, len = changed.length; i < len; i++) {
+            	var r = changed[i];
+            	r.el.style.visibility = r.visibility;
+                r.el.style.display = 'none';
+            }
+            this._measureChanged = null;
+        }
+        return this;
+    },
+    
+    /**
+    * Update the innerHTML of this element, optionally searching for and processing scripts
+    * @param {String} html The new HTML
+    * @param {<i>Boolean</i>} loadScripts (optional) true to look for and process scripts
+    * @param {Function} callback For async script loading you can be noticed when the update completes
+    * @return {YAHOO.ext.Element} this
+     */
+    update : function(html, loadScripts, callback){
+        if(typeof html == 'undefined'){
+            html = '';
+        }
+        if(loadScripts !== true){
+            this.dom.innerHTML = html;
+            if(typeof callback == 'function'){
+                callback();
+            }
+            return this;
+        }
+        var id = YAHOO.util.Dom.generateId();
+        var dom = this.dom;
+        
+        html += '<span id="' + id + '"></span>';
+        
+        YAHOO.util.Event.onAvailable(id, function(){
+            var hd = document.getElementsByTagName("head")[0];
+            var re = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/img; 
+            var srcRe = /\ssrc=[\'\"](.*)[\'\"]/i;
+            var match;
+            while(match = re.exec(html)){
+                var srcMatch = match[0].match(srcRe);
+                if(srcMatch && srcMatch[1]){
+                   var s0 = document.createElement("script");
+                   s0.src = srcMatch[1];
+                   hd.appendChild(s0);
+                }else if(match[1]){
+                   eval(match[1]);
+                }                     
+            }
+            var el = document.getElementById(id);
+            if(el){el.parentNode.removeChild(el);}
+            if(typeof callback == 'function'){
+                callback();
+            }
+        });
+        dom.innerHTML = html.replace(/(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/img, '');
+        return this;
+    },
+    
+    /**
+     * Direct access to the UpdateManager update() method (takes the same parameters).
+     * @param {String/Function} url The url for this request or a function to call to get the url
+     * @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "param1=1&amp;param2=2" or an object {param1: 1, param2: 2}
+     * @param {<i>Function</i>} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     * @param {<i>Boolean</i>} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+     * @return {YAHOO.ext.Element} this
+     */
+    load : function(){
+        var um = this.getUpdateManager();
+        um.update.apply(um, arguments);
+        return this;
+    },
+    
+    /**
+    * Gets this elements UpdateManager
+    * @return {YAHOO.ext.UpdateManager} The UpdateManager
+    */
+    getUpdateManager : function(){
+        if(!this.updateManager){
+            this.updateManager = new YAHOO.ext.UpdateManager(this);
+        }
+        return this.updateManager;
+    },
+    
+    /**
+     * Disables text selection for this element (normalized across browsers)
+     * @return {YAHOO.ext.Element} this
+     */
+    unselectable : function(){
+        this.dom.unselectable = 'on';
+        this.swallowEvent('selectstart', true);
+        this.applyStyles('-moz-user-select:none;-khtml-user-select:none;');
+        return this;
+    },
+    
+    /**
+    * Calculates the x, y to center this element on the screen
+    * @param {Boolean} offsetScroll True to offset the documents current scroll position
+    * @return {Array} The x, y values [x, y]
+    */
+    getCenterXY : function(offsetScroll){
+        var centerX = Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2);
+        var centerY = Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2);
+        if(!offsetScroll){
+            return [centerX, centerY];
+        }else{
+            var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft || 0;
+            var scrollY = document.documentElement.scrollTop || document.body.scrollTop || 0;
+            return[centerX + scrollX, centerY + scrollY];
+        }
+    },
+    
+    /**
+    * Centers the Element in either the viewport, or another Element.
+    * @param {String/HTMLElement/YAHOO.ext.Element} centerIn (optional) The element in which to center the element.
+    */
+    center : function(centerIn) {
+        if(!centerIn){
+            this.setXY(this.getCenterXY(true));
+        }else{
+            var box = YAHOO.ext.Element.get(centerIn).getBox();
+            this.setXY([box.x + (box.width / 2) - (this.getWidth() / 2),
+                   box.y + (box.height / 2) - (this.getHeight() / 2)]);
+        }
+        return this;
+    },
+
+    /**
+    * Gets an array of child YAHOO.ext.Element objects by tag name
+    * @param {String} tagName
+    * @return {Array} The children
+    */
+    getChildrenByTagName : function(tagName){
+        var children = this.dom.getElementsByTagName(tagName);
+        var len = children.length;
+        var ce = new Array(len);
+        for(var i = 0; i < len; ++i){
+            ce[i] = YAHOO.ext.Element.get(children[i], true);
+        }
+        return ce;
+    },
+    
+    /**
+    * Gets an array of child YAHOO.ext.Element objects by class name and optional tagName
+    * @param {String} className
+    * @param {<i>String</i>} tagName (optional)
+    * @return {Array} The children
+    */
+    getChildrenByClassName : function(className, tagName){
+        var children = YAHOO.util.Dom.getElementsByClassName(className, tagName, this.dom);
+        var len = children.length;
+        var ce = new Array(len);
+        for(var i = 0; i < len; ++i){
+            ce[i] = YAHOO.ext.Element.get(children[i], true);
+        }
+        return ce;
+    },
+    
+    /**
+     * Tests various css rules/browsers to determine if this element uses a border box
+     * @return {Boolean}
+     */
+    isBorderBox : function(){
+        if(typeof this.bbox == 'undefined'){
+            var el = this.dom;
+            var b = YAHOO.ext.util.Browser;
+            var strict = YAHOO.ext.Strict;
+            this.bbox = ((b.isIE && !strict && el.style.boxSizing != 'content-box') || 
+               (b.isGecko && YAHOO.util.Dom.getStyle(el, "-moz-box-sizing") == 'border-box') || 
+               (!b.isSafari && YAHOO.util.Dom.getStyle(el, "box-sizing") == 'border-box'));
+        }
+        return this.bbox; 
+    },
+    
+    /**
+     * Return a box {x, y, width, height} that can be used to set another elements
+     * size/location to match this element. 
+     * @param {Boolean} contentBox (optional) If true a box for the content of the element is returned. 
+     * @param {Boolean} local (optional) If true the element's left and top are returned instead of page x/y.
+     * @return {Object}
+     */
+    getBox : function(contentBox, local){
+        var xy;
+        if(!local){
+            xy = this.getXY();
+        }else{
+            var left = parseInt(YAHOO.util.Dom.getStyle('left'), 10) || 0;
+            var top = parseInt(YAHOO.util.Dom.getStyle('top'), 10) || 0;
+            xy = [left, top];
+        }
+        var el = this.dom;
+        var w = el.offsetWidth;
+        var h = el.offsetHeight;
+        if(!contentBox){
+            return {x: xy[0], y: xy[1], width: w, height: h};
+        }else{
+            var l = this.getBorderWidth('l')+this.getPadding('l');
+            var r = this.getBorderWidth('r')+this.getPadding('r');
+            var t = this.getBorderWidth('t')+this.getPadding('t');
+            var b = this.getBorderWidth('b')+this.getPadding('b');
+            return {x: xy[0]+l, y: xy[1]+t, width: w-(l+r), height: h-(t+b)};
+        }
+    },
+    
+    /**
+     * Sets the element's box. Use getBox() on another element to get a box obj. If animate is true then width, height, x and y will be animated concurrently.
+     * @param {Object} box The box to fill {x, y, width, height}
+     * @param {<i>Boolean</i>} adjust (optional) Whether to adjust for box-model issues automatically
+     * @param {<i>Boolean</i>} animate (optional) Animate the transition (Default is false)
+     * @param {<i>float</i>} duration (optional) How long the animation lasts. (Defaults to .35 seconds)
+     * @param {<i>Function</i>} onComplete (optional) Function to call when animation completes.
+     * @param {<i>Function</i>} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+     * @return {YAHOO.ext.Element} this
+     */
+    setBox : function(box, adjust, animate, duration, onComplete, easing){
+        var w = box.width, h = box.height;
+        if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){
+           w -= (this.getBorderWidth('lr') + this.getPadding('lr'));
+           h -= (this.getBorderWidth('tb') + this.getPadding('tb'));
+        }
+        this.setBounds(box.x, box.y, w, h, animate, duration, onComplete, easing);
+        return this;
+    },
+    
+    /**
+     * Forces the browser to repaint this element
+     * @return {YAHOO.ext.Element} this
+     */
+     repaint : function(){
+        var dom = this.dom;
+        YAHOO.util.Dom.addClass(dom, 'yui-ext-repaint');
+        setTimeout(function(){
+            YAHOO.util.Dom.removeClass(dom, 'yui-ext-repaint');
+        }, 1);
+        return this;
+    },
+    
+    /**
+     * Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed, 
+     * then it returns the calculated width of the sides (see getPadding)
+     * @param {String} sides (optional) Any combination of l, r, t, b to get the sum of those sides
+     * @return {Object/Number}
+     */
+    getMargins : function(side){
+        if(!side){
+            return {
+                top: parseInt(this.getStyle('margin-top'), 10) || 0,
+                left: parseInt(this.getStyle('margin-left'), 10) || 0,
+                bottom: parseInt(this.getStyle('margin-bottom'), 10) || 0,
+                right: parseInt(this.getStyle('margin-right'), 10) || 0
+            };
+        }else{
+            return this.addStyles(side, YAHOO.ext.Element.margins);
+         }
+    },
+    
+    addStyles : function(sides, styles){
+        var val = 0;
+        for(var i = 0, len = sides.length; i < len; i++){
+             var w = parseInt(this.getStyle(styles[sides.charAt(i)]), 10);
+             if(!isNaN(w)) val += w;
+        }
+        return val;
+    },
+    
+    /**
+     * Creates a proxy element of this element
+     * @param {String/Object} config The class name of the proxy element or a DomHelper config object
+     * @param {<i>String/HTMLElement</i>} renderTo (optional) The element or element id to render the proxy to (defaults to document.body)
+     * @param {<i>Boolean</i>} matchBox (optional) True to align and size the proxy to this element now (defaults to false)
+     * @return {YAHOO.ext.Element} The new proxy element
+     */
+    createProxy : function(config, renderTo, matchBox){
+        if(renderTo){
+            renderTo = YAHOO.util.Dom.get(renderTo);
+        }else{
+            renderTo = document.body;
+        }
+        config = typeof config == 'object' ? 
+            config : {tag : 'div', cls: config};
+        var proxy = YAHOO.ext.DomHelper.append(renderTo, config, true);
+        if(matchBox){
+           proxy.setBox(this.getBox());
+        }
+        return proxy;
+    },
+    
+    /**
+     * Removes this element from the DOM and deletes it from the cache
+     */
+    remove : function(){
+        this.dom.parentNode.removeChild(this.dom);
+        delete YAHOO.ext.Element.cache[this.dom.id];
+    },
+    
+    /**
+     * Sets up event handlers to add and remove a css class when the mouse is over this element
+     * @param {String} className
+     * @return {YAHOO.ext.Element} this
+     */
+    addClassOnOver : function(className){
+        this.on('mouseover', function(){
+            this.addClass(className);
+        }, this, true);
+        this.on('mouseout', function(){
+            this.removeClass(className);
+        }, this, true);
+        return this;
+    },
+    
+    /**
+     * Stops the specified event from bubbling and optionally prevent's the default action
+     * @param {String} eventName
+     * @param {Boolean} preventDefault (optional) true to prevent the default action too
+     * @return {YAHOO.ext.Element} this
+     */
+    swallowEvent : function(eventName, preventDefault){
+        var fn = function(e){
+            e.stopPropagation();
+            if(preventDefault){
+                e.preventDefault();
+            }
+        };
+        this.mon(eventName, fn);
+        return this;
+    },
+    
+    /**
+     * Sizes this element to it's parent element's dimensions performing 
+     * neccessary box adjustments. 
+     * @param {Boolean} monitorResize (optional) If true maintains the fit when the browser window is resized.
+     * @return {YAHOO.ext.Element} this
+     */
+    fitToParent : function(monitorResize){
+        var p = getEl(this.dom.parentNode, true);
+        p.beginMeasure(); // in case parent is display:none
+        var box = p.getBox(true, true);
+        p.endMeasure();
+        this.setSize(box.width, box.height);
+        if(monitorResize === true){
+            YAHOO.ext.EventManager.onWindowResize(this.fitToParent, this, true);
+        }
+        return this;
+    },
+    
+    /**
+     * Gets the next sibling, skipping text nodes
+     * @return {HTMLElement} The next sibling or null
+	 */
+    getNextSibling : function(){
+        var n = this.dom.nextSibling;
+        while(n && n.nodeType != 1){
+            n = n.nextSibling;
+        }
+        return n;
+    },
+    
+    /**
+     * Gets the previous sibling, skipping text nodes
+     * @return {HTMLElement} The previous sibling or null
+	 */
+    getPrevSibling : function(){
+        var n = this.dom.previousSibling;
+        while(n && n.nodeType != 1){
+            n = n.previousSibling;
+        }
+        return n;
+    },
+    
+    
+    /**
+     * Appends the passed element(s) to this element
+     * @param {String/HTMLElement/Array/Element/CompositeElement} el
+     * @return {YAHOO.ext.Element} this
+     */
+    appendChild: function(el){
+        el = getEl(el);
+        el.appendTo(this);
+        return this;
+    },
+    
+    /**
+     * Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child element.
+     * @param {Object} config DomHelper element config object
+     * @param {<i>HTMLElement</i>} insertBefore (optional) a child element of this element
+     * @return {YAHOO.ext.Element} The new child element
+     */
+    createChild: function(config, insertBefore){
+        var c;
+        if(insertBefore){
+            c = YAHOO.ext.DomHelper.insertBefore(insertBefore, config, true);
+        }else{
+            c = YAHOO.ext.DomHelper.append(this.dom, config, true);
+        }
+        return c;
+    },
+    
+    /**
+     * Appends this element to the passed element
+     * @param {String/HTMLElement/Element} el The new parent element
+     * @return {YAHOO.ext.Element} this
+     */
+    appendTo: function(el){
+        var node = getEl(el).dom;
+        node.appendChild(this.dom);
+        return this;
+    },
+    
+    /**
+     * Inserts this element before the passed element in the DOM
+     * @param {String/HTMLElement/Element} el The element to insert before
+     * @return {YAHOO.ext.Element} this
+     */
+    insertBefore: function(el){
+        var node = getEl(el).dom;
+        node.parentNode.insertBefore(this.dom, node);
+        return this;
+    },
+    
+    /**
+     * Inserts this element after the passed element in the DOM
+     * @param {String/HTMLElement/Element} el The element to insert after
+     * @return {YAHOO.ext.Element} this
+     */
+    insertAfter: function(el){
+        var node = getEl(el).dom;
+        node.parentNode.insertBefore(this.dom, node.nextSibling);
+        return this;
+    },
+    
+    /**
+     * Creates and wraps this element with another element
+     * @param {Object} config (optional) DomHelper element config object for the wrapper element or null for an empty div
+     * @return {Element} The newly created wrapper element
+     */
+    wrap: function(config){
+        if(!config){
+            config = {tag: 'div'};
+        }
+        var newEl = YAHOO.ext.DomHelper.insertBefore(this.dom, config, true);
+        newEl.dom.appendChild(this.dom);
+        return newEl;
+    },
+    
+    /**
+     * Replaces the passed element with this element
+     * @param {String/HTMLElement/Element} el The element to replace
+     * @return {YAHOO.ext.Element} this
+     */
+    replace: function(el){
+        el = getEl(el);
+        this.insertBefore(el);
+        el.remove();
+        return this;
+    },
+    
+    /**
+     * Inserts an html fragment into this element
+     * @param {String} where Where to insert the html in relation to the this element - beforeBegin, afterBegin, beforeEnd, afterEnd.
+     * @param {String} html The HTML fragment
+     * @return {YAHOO.ext.Element} this
+     */
+    insertHtml : function(where, html){
+        YAHOO.ext.DomHelper.insertHtml(where, this.dom, html);
+        return this;
+    },
+    
+    /**
+     * Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
+     * @param {Object} o The object with the attributes
+     * @return {YAHOO.ext.Element} this
+     */
+    set : function(o){
+        var el = this.dom;
+        var useSet = el.setAttribute ? true : false;
+        for(var attr in o){
+            if(attr == 'style' || typeof o[attr] == 'function') continue;
+            if(attr=='cls'){
+                el.className = o['cls'];
+            }else{
+                if(useSet) el.setAttribute(attr, o[attr]);
+                else el[attr] = o[attr];
+            }
+        }
+        YAHOO.ext.DomHelper.applyStyles(el, o.style);
+        return this;
+    }
+};
+
+/**
+ * true to automatically adjust width and height settings for box-model issues (default to true)
+ */
+YAHOO.ext.Element.prototype.autoBoxAdjust = true;
+/**
+ * true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false).
+ * To enable this globally:<pre><code>YAHOO.ext.Element.prototype.autoDisplayMode = true;</code></pre>
+ */
+YAHOO.ext.Element.prototype.autoDisplayMode = true;
+
+YAHOO.ext.Element.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i;
+/**
+ * Visibility mode constant - Use visibility to hide element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.Element.VISIBILITY = 1;
+/**
+ * Visibility mode constant - Use display to hide element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.Element.DISPLAY = 2;
+
+YAHOO.ext.Element.blockElements = /^(?:address|blockquote|center|dir|div|dl|fieldset|form|h\d|hr|isindex|menu|ol|ul|p|pre|table|dd|dt|li|tbody|tr|td|thead|tfoot|iframe)$/i;
+YAHOO.ext.Element.borders = {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'};
+YAHOO.ext.Element.paddings = {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'};
+YAHOO.ext.Element.margins = {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'};
+        
+/**
+ * @private Call out to here so we make minimal closure
+ */
+YAHOO.ext.Element.createStopHandler = function(stopPropagation, handler, scope, override){
+    return function(e){
+        if(e){
+            if(stopPropagation){
+                YAHOO.util.Event.stopEvent(e);
+            }else {
+                YAHOO.util.Event.preventDefault(e);
+            }
+        }
+        handler.call(override && scope ? scope : window, e, scope);
+    };
+};
+
+/**
+ * @private
+ */
+YAHOO.ext.Element.cache = {};
+
+/**
+ * Static method to retreive Element objects. Uses simple caching to consistently return the same object. 
+ * Automatically fixes if an object was recreated with the same id via AJAX or DOM.
+ * @param {String/HTMLElement/Element} el The id of the element or the element to wrap (must have an id). If you pass in an element, it is returned
+ * @param {<i>Boolean</i>} autoGenerateId (optional) Set this flag to true if you are passing an element without an id (like document.body). It will auto generate an id if one isn't present. 
+ * @return {Element} The element object
+ * @static
+ */
+YAHOO.ext.Element.get = function(el, autoGenerateId){
+    if(!el){ return null; }
+    autoGenerateId = true; // now generates id by default
+    if(el instanceof YAHOO.ext.Element){
+        el.dom = YAHOO.util.Dom.get(el.id); // refresh dom element in case no longer valid
+        YAHOO.ext.Element.cache[el.id] = el; // in case it was created directly with Element(), let's cache it
+        return el;
+    }else if(el.isComposite){
+        return el;
+    }else if(el instanceof Array){
+        return YAHOO.ext.Element.select(el);
+    }
+    var key = el;
+    if(typeof el != 'string'){ // must be an element
+        if(!el.id && !autoGenerateId){ return null; }
+        YAHOO.util.Dom.generateId(el, 'elgen-');
+        key = el.id;
+    }
+    var element = YAHOO.ext.Element.cache[key];
+    if(!element){
+        element = new YAHOO.ext.Element(key);
+        if(!element.dom) return null;
+        YAHOO.ext.Element.cache[key] = element;
+    }else{
+        element.dom = YAHOO.util.Dom.get(key);
+    }
+    return element;
+};
+
+/**
+ * Shorthand function for YAHOO.ext.Element.get()
+ */
+var getEl = YAHOO.ext.Element.get;
+
+// clean up refs
+YAHOO.util.Event.addListener(window, 'unload', function(){ YAHOO.ext.Element.cache = null; });

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/EventManager.js.html b/www/extras/yui-ext/docs/output/EventManager.js.html new file mode 100644 index 000000000..f6b6709b6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/EventManager.js.html @@ -0,0 +1,428 @@ +EventManager.js
+/**
+ * @class YAHOO.ext.EventManager
+ * Registers event handlers that want to receive a normalized EventObject instead of the standard browser event and provides 
+ * several useful events directly.
+ * See {@link YAHOO.ext.EventObject} for more details on normalized event objects.
+ * @singleton
+ */
+YAHOO.ext.EventManager = new function(){
+    var docReadyEvent;
+    var docReadyProcId;
+    var docReadyState = false;
+    this.ieDeferSrc = null;
+    var resizeEvent;
+    var resizeTask;
+    
+    var fireDocReady = function(){
+        if(!docReadyState){
+            docReadyState = true;
+            if(docReadyProcId){
+                clearInterval(docReadyProcId);
+            }
+            if(docReadyEvent){
+                docReadyEvent.fire();
+            }
+        }
+    };
+    
+    var initDocReady = function(){
+        docReadyEvent = new YAHOO.util.CustomEvent('documentready');
+        if(document.addEventListener) {
+            YAHOO.util.Event.on(document, "DOMContentLoaded", fireDocReady);
+        }else if(YAHOO.ext.util.Browser.isIE){
+            // inspired by  http://www.thefutureoftheweb.com/blog/2006/6/adddomloadevent

+            document.write('<s'+'cript id="ie-deferred-loader" defer="defer" src="' +
+                        (YAHOO.ext.EventManager.ieDeferSrc || YAHOO.ext.SSL_SECURE_URL) + '"></s'+'cript>');
+            YAHOO.util.Event.on('ie-deferred-loader', 'readystatechange', function(){
+                if(this.readyState == 'complete'){
+                    fireDocReady();
+                }
+            });
+        }else if(YAHOO.ext.util.Browser.isSafari){ 
+            docReadyProcId = setInterval(function(){
+                var rs = document.readyState;
+                if(rs == 'loaded' || rs == 'complete') {
+                    fireDocReady();     
+                 }
+            }, 10);
+        }
+        // no matter what, make sure it fires on load
+        YAHOO.util.Event.on(window, 'load', fireDocReady);
+    };
+    /** 
+     * Places a simple wrapper around an event handler to override the browser event 
+     * object with a YAHOO.ext.EventObject
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    An object that becomes the scope of the handler
+     * @param {boolean}  override If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {Function} The wrapped function
+     */
+    this.wrap = function(fn, scope, override){
+        var wrappedFn = function(e){
+            YAHOO.ext.EventObject.setEvent(e);
+            fn.call(override ? scope || window : window, YAHOO.ext.EventObject, scope);
+        };
+        return wrappedFn;
+    };
+    
+    /**
+     * Appends an event handler
+     *
+     * @param {Object}   element        The html element to assign the 
+     *                             event to
+     * @param {String}   eventName     The type of event to append
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    An object that becomes the scope of the handler
+     * @param {boolean}  override If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {Function} The wrapper function created (to be used to remove the listener if necessary)
+     */
+    this.addListener = function(element, eventName, fn, scope, override){
+        var wrappedFn = this.wrap(fn, scope, override);
+        YAHOO.util.Event.addListener(element, eventName, wrappedFn);
+        return wrappedFn;
+    };
+    
+    /**
+     * Removes an event handler
+     *
+     * @param {Object}   element        The html element to remove the 
+     *                             event from
+     * @param {String}   eventName     The type of event to append
+     * @param {Function} wrappedFn        The wrapper method returned when adding the listener
+     * @return {Boolean} True if a listener was actually removed
+     */
+    this.removeListener = function(element, eventName, wrappedFn){
+        return YAHOO.util.Event.removeListener(element, eventName, wrappedFn);
+    };
+    
+    /**
+     * Appends an event handler (shorthand for addListener)
+     *
+     * @param {Object}   element        The html element to assign the 
+     *                             event to
+     * @param {String}   eventName     The type of event to append
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    An arbitrary object that will be 
+     *                             passed as a parameter to the handler
+     * @param {boolean}  override If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     * @return {Function} The wrapper function created (to be used to remove the listener if necessary)
+     * @method
+     */
+    this.on = this.addListener;
+    
+    /**
+     * Fires when the document is ready (before onload and before images are loaded)
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    An  object that becomes the scope of the handler
+     * @param {boolean}  override If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     */
+    this.onDocumentReady = function(fn, scope, override){
+        if(!docReadyEvent){
+            initDocReady();
+        }
+        docReadyEvent.subscribe(fn, scope, override);
+    }
+    
+    /**
+     * Fires when the window is resized and provides resize event buffering (50 milliseconds), passes new viewport width and height to handlers.
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    An object that becomes the scope of the handler
+     * @param {boolean}  override If true, the obj passed in becomes
+     *                             the execution scope of the listener
+     */
+    this.onWindowResize = function(fn, scope, override){
+        if(!resizeEvent){
+            resizeEvent = new YAHOO.util.CustomEvent('windowresize');
+            resizeTask = new YAHOO.ext.util.DelayedTask(function(){
+                resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight());
+            });
+            YAHOO.util.Event.on(window, 'resize', function(){
+                resizeTask.delay(50);
+            });
+        }
+        resizeEvent.subscribe(fn, scope, override);
+    },
+    
+    /**
+     * Removes the passed window resize listener.
+     * @param {Function} fn        The method the event invokes
+     * @param {Object}   scope    The scope of handler
+     */
+    this.removeResizeListener = function(fn, scope){
+        if(resizeEvent){
+            resizeEvent.unsubscribe(fn, scope);
+        }
+    }
+};
+
+/**
+ * @class YAHOO.ext.EventObject
+ * EventObject exposes the Yahoo! UI Event functionality directly on the object
+ * passed to your event handler. It exists mostly for convenience. It also fixes the annoying null checks automatically to cleanup your code 
+ * (All the YAHOO.util.Event methods throw javascript errors if the passed event is null).
+ * To get an EventObject instead of the standard browser event,
+ * your must register your listener thru the {@link YAHOO.ext.EventManager} or directly on an Element
+ * with {@link YAHOO.ext.Element#addManagedListener} or the shorthanded equivalent {@link YAHOO.ext.Element#mon}.<br>
+ * Example:
+ * <pre><code>
+ fu<>nction handleClick(e){ // e is not a standard event object, it is a YAHOO.ext.EventObject
+    e.preventDefault();
+    var target = e.getTarget();
+    ...
+ }
+ var myDiv = getEl('myDiv');
+ myDiv.mon('click', handleClick);
+ //or
+ YAHOO.ext.EventManager.on('myDiv', 'click', handleClick);
+ YAHOO.ext.EventManager.addListener('myDiv', 'click', handleClick);
+ </code></pre>
+ * @singleton
+ */
+YAHOO.ext.EventObject = new function(){
+    /** The normal browser event */ 
+    this.browserEvent = null;
+    /** The button pressed in a mouse event */ 
+    this.button = -1;
+    /** True if the shift key was down during the event */ 
+    this.shiftKey = false;
+    /** True if the control key was down during the event */ 
+    this.ctrlKey = false;
+    /** True if the alt key was down during the event */ 
+    this.altKey = false;
+    
+    /** Key constant @type Number */
+    this.BACKSPACE = 8;
+    /** Key constant @type Number */
+    this.TAB = 9;
+    /** Key constant @type Number */
+    this.RETURN = 13;
+    /** Key constant @type Number */
+    this.ESC = 27;
+    /** Key constant @type Number */
+    this.SPACE = 32;
+    /** Key constant @type Number */
+    this.PAGEUP = 33;
+    /** Key constant @type Number */
+    this.PAGEDOWN = 34;
+    /** Key constant @type Number */
+    this.END = 35;
+    /** Key constant @type Number */
+    this.HOME = 36;
+    /** Key constant @type Number */
+    this.LEFT = 37;
+    /** Key constant @type Number */
+    this.UP = 38;
+    /** Key constant @type Number */
+    this.RIGHT = 39;
+    /** Key constant @type Number */
+    this.DOWN = 40;
+    /** Key constant @type Number */
+    this.DELETE = 46;
+    /** Key constant @type Number */
+    this.F5 = 116;
+
+       /** @private */ 
+    this.setEvent = function(e){
+        this.browserEvent = e;
+        if(e){
+            this.button = e.button;
+            this.shiftKey = e.shiftKey;
+            this.ctrlKey = e.ctrlKey;
+            this.altKey = e.altKey;
+        }else{
+            this.button = -1;
+            this.shiftKey = false;
+            this.ctrlKey = false;
+            this.altKey = false;
+        }
+    };
+    
+    /**
+     * Stop the event. Calls YAHOO.util.Event.stopEvent() if the event is not null.
+     */ 
+    this.stopEvent = function(){
+        if(this.browserEvent){
+            YAHOO.util.Event.stopEvent(this.browserEvent);
+        }
+    };
+    
+    /**
+     * Prevents the browsers default handling of the event. Calls YAHOO.util.Event.preventDefault() if the event is not null.
+     */ 
+    this.preventDefault = function(){
+        if(this.browserEvent){
+            YAHOO.util.Event.preventDefault(this.browserEvent);
+        }
+    };
+    
+    /** @private */
+    this.isNavKeyPress = function(){
+        return (this.browserEvent.keyCode && this.browserEvent.keyCode >= 33 && this.browserEvent.keyCode <= 40);
+    };
+    
+    /**
+     * Cancels bubbling of the event. Calls YAHOO.util.Event.stopPropagation() if the event is not null.
+     */ 
+    this.stopPropagation = function(){
+        if(this.browserEvent){
+            YAHOO.util.Event.stopPropagation(this.browserEvent);
+        }
+    };
+    
+    /**
+     * Gets the key code for the event. Returns value from YAHOO.util.Event.getCharCode() if the event is not null.
+     * @return {Number}
+     */ 
+    this.getCharCode = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getCharCode(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Returns a browsers key for a keydown event
+     * @return {Number} The key code
+     */
+    this.getKey = function(){
+        if(this.browserEvent){
+            return this.browserEvent.charCode || this.browserEvent.keyCode;
+        }
+        return null;
+    };
+    
+    /**
+     * Gets the x coordinate of the event. Returns value from YAHOO.util.Event.getPageX() if the event is not null.
+     * @return {Number}
+     */ 
+    this.getPageX = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getPageX(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Gets the y coordinate of the event. Returns value from YAHOO.util.Event.getPageY() if the event is not null.
+     * @return {Number}
+     */ 
+    this.getPageY = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getPageY(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Gets the time of the event. Returns value from YAHOO.util.Event.getTime() if the event is not null.
+     * @return {Number}
+     */ 
+    this.getTime = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getTime(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Gets the page coordinates of the event. Returns value from YAHOO.util.Event.getXY() if the event is not null.
+     * @return {Array} The xy values like [x, y]
+     */ 
+    this.getXY = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getXY(this.browserEvent);
+        }
+        return [];
+    };
+    
+    /**
+     * Gets the target for the event. Returns value from YAHOO.util.Event.getTarget() if the event is not null.
+     * @return {HTMLelement}
+     */ 
+    this.getTarget = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getTarget(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Walk up the DOM looking for a particular target - if the default target matches, it is returned.
+     * @param {String} className The class name to look for or null
+     * @param {String} tagName (optional) The tag name to look for
+     * @return {HTMLelement}
+     */ 
+    this.findTarget = function(className, tagName){
+        if(tagName) tagName = tagName.toLowerCase();
+        if(this.browserEvent){
+            function isMatch(el){
+               if(!el){
+                   return false;
+               }
+               if(className && !YAHOO.util.Dom.hasClass(el, className)){
+                   return false;
+               }
+               if(tagName && el.tagName.toLowerCase() != tagName){
+                   return false;
+               }
+               return true;
+            };
+            
+            var t = this.getTarget();
+            if(!t || isMatch(t)){
+    		    return t;
+    	    }
+    	    var p = t.parentNode;
+    	    var b = document.body;
+    	    while(p && p != b){
+                if(isMatch(p)){
+                	return p;
+                }
+                p = p.parentNode;
+            }
+    	}
+        return null;
+    };
+    /**
+     * Gets the related target. Returns value from YAHOO.util.Event.getRelatedTarget() if the event is not null.
+     * @return {HTMLElement}
+     */ 
+    this.getRelatedTarget = function(){
+        if(this.browserEvent){
+            return YAHOO.util.Event.getRelatedTarget(this.browserEvent);
+        }
+        return null;
+    };
+    
+    /**
+     * Normalizes mouse wheel delta across browsers
+     * @return {Number} The delta 
+     */
+    this.getWheelDelta = function(){
+        var e = this.browserEvent;
+        var delta = 0;
+        if(e.wheelDelta){ /* IE/Opera. */
+            delta = e.wheelDelta/120;
+            /* In Opera 9, delta differs in sign as compared to IE. */
+            if(window.opera) delta = -delta;
+        }else if(e.detail){ /* Mozilla case. */
+            delta = -e.detail/3;
+        }
+        return delta;
+    };
+    
+    /**
+     * Returns true if the control, shift or alt key was pressed during this event.
+     * @return {Boolean}
+     */ 
+    this.hasModifier = function(){
+        return this.ctrlKey || this.altKey || this.shiftKey;
+    };
+}();
+            
+    

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Function.html b/www/extras/yui-ext/docs/output/Function.html new file mode 100644 index 000000000..d6ccf4458 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Function.html @@ -0,0 +1,183 @@ + + + + Function + + + + + +
+ +

Class Function

+ + + + + +
Package:Global
Class:Function
Extends:Object
Defined In:yutil.js
+
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 createCallback() : FunctionFunction
Creates a callback that passes arguments[0], arguments[1], arguments[2], ... +Call directly on any function. Example: ...
 createDelegate([Object obj], [Array args], [Boolean/Number appendArgs]) : FunctionFunction
Creates a delegate (callback) that sets the scope to obj. +Call directly on any function. Example: this.myFunction.cre...
 createInterceptor(Function fcn, [Object scope]) : FunctionFunction
Creates an interceptor function. The passed fcn is called before the original one. If it returns false, the original ...
 createSequence(Function fcn, [Object scope]) : FunctionFunction
Create a combined function call sequence of the original function + the passed function. +The resulting function retur...
 defer(Number millis, [Object obj], [Array args], [Boolean/Number appendArgs]) : NumberFunction
Calls this function after the number of millseconds specified.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

createCallback

+ public function createCallback() +
+ Creates a callback that passes arguments[0], arguments[1], arguments[2], ... +Call directly on any function. Example: myFunction.createCallback(myarg, myarg2) +Will create a function that is bound to those 2 args. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Function
    The new function
  • +
+
+
+
This method is defined by Function.
+
+ +
+

createDelegate

+ public function createDelegate([Object obj], [Array args], [Boolean/Number appendArgs]) +
+ Creates a delegate (callback) that sets the scope to obj. +Call directly on any function. Example: this.myFunction.createDelegate(this) +Will create a function that is automatically scoped to this. +
+ Parameters: +
  • obj : Object
    (optional) The object for which the scope is set
  • args : Array
    (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
  • appendArgs : Boolean/Number
    (optional) if True args are appended to call args instead of overriding, if a number the args are inserted at the specified position
+ Returns: +
    +
  • Function
    The new function
  • +
+
+
+
This method is defined by Function.
+
+ +
+

createInterceptor

+ public function createInterceptor(Function fcn, [Object scope]) +
+ Creates an interceptor function. The passed fcn is called before the original one. If it returns false, the original one is not called. +The resulting function returns the results of the original function. +The passed fcn is called with the parameters of the original function. +@addon +
+ Parameters: +
  • fcn : Function
    The function to call before the original
  • scope : Object
    (optional) The scope of the passed fcn (Defaults to scope of original function or window)
+ Returns: +
    +
  • Function
    The new function
  • +
+
+
+
This method is defined by Function.
+
+ +
+

createSequence

+ public function createSequence(Function fcn, [Object scope]) +
+ Create a combined function call sequence of the original function + the passed function. +The resulting function returns the results of the original function. +The passed fcn is called with the parameters of the original function +
+ Parameters: +
  • fcn : Function
    The function to sequence
  • scope : Object
    (optional) The scope of the passed fcn (Defaults to scope of original function or window)
+ Returns: +
    +
  • Function
    The new function
  • +
+
+
+
This method is defined by Function.
+
+ +
+

defer

+ public function defer(Number millis, [Object obj], [Array args], [Boolean/Number appendArgs]) +
+ Calls this function after the number of millseconds specified. +
+ Parameters: +
  • millis : Number
    The number of milliseconds for the setTimeout call
  • obj : Object
    (optional) The object for which the scope is set
  • args : Array
    (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
  • appendArgs : Boolean/Number
    (optional) if True args are appended to call args instead of overriding, if a number the args are inserted at the specified position
+ Returns: +
    +
  • Number
    The timeout id that can be used with clearTimeout
  • +
+
+
+
This method is defined by Function.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Grid.js.html b/www/extras/yui-ext/docs/output/Grid.js.html new file mode 100644 index 000000000..406778609 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Grid.js.html @@ -0,0 +1,896 @@ +Grid.js
/**
+ * @class YAHOO.ext.grid.Grid
+ * @extends YAHOO.ext.util.Observable
+ * This class represents the primary interface of a component based grid control.
+ * <br><br>Usage:<pre><code>
+ * var grid = new YAHOO.ext.grid.Grid('my-container-id', dataModel, columnModel);
+ * // set any options
+ * grid.render();
+ * </code></pre>
+ * Common Problems:
+ * - Grid does not resize properly when going smaller: Setting overflow hidden on the container 
+ * element will correct this
+ * - If you get el.style[camel]= NaNpx or -2px or something related, be certain you have given your container element 
+ * dimensions. The grid adapts to your container's size, if your container has no size defined then the results
+ * are unpredictable.
+ * - Do not put render the grid into an element with display:none. Use visibility:hidden 
+ * and position:absolute - at least until the grid is rendered. Otherwise there is no way for the 
+ * grid to calculate dimension/offsets.
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.ext.util.Browser
+ * @requires YAHOO.ext.util.CSS
+ * @requires YAHOO.ext.SplitBar 
+ * @requires YAHOO.ext.EventObject 
+ * @constructor
+ * @param {String/HTMLElement/YAHOO.ext.Element} container The element into which this grid will be rendered - 
+ * The container MUST have some type of size defined for the grid to fill. The container will be 
+ * automatically set to position relative if it isn't already.
+ * @param {Object} dataModel The data model to bind to
+ * @param {Object} colModel The column model with info about this grid's columns
+ * @param {<i>Object</i>} selectionModel (optional) The selection model for this grid (defaults to DefaultSelectionModel)
+ */
+YAHOO.ext.grid.Grid = function(container, dataModel, colModel, selectionModel){
+	/** @private */
+	this.container = YAHOO.ext.Element.get(container);
+	this.container.update('');
+	this.container.setStyle('overflow', 'hidden');
+	this.id = this.container.id;
+	this.rows = [];
+    this.rowCount = 0;
+    this.fieldId = null;
+    this.dataModel = dataModel;
+    this.colModel = colModel;
+    this.selModel = selectionModel;
+	this.activeEditor = null;
+	this.editingCell = null;
+	
+	/** The minimum width a column can be resized to. (Defaults to 25)
+	 * @type Number */
+	this.minColumnWidth = 25;
+	
+	/** True to automatically resize the columns to fit their content <b>on initial render</b>
+	 * @type Boolean */
+	this.autoSizeColumns = false;
+	
+	/** True to measure headers with column data when auto sizing columns
+	 * @type Boolean */
+	this.autoSizeHeaders = false;
+	
+	/**
+	 * True to autoSize the grid when the window resizes - defaults to true
+	 */
+	this.monitorWindowResize = true;
+	
+	/** If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of
+	 * rows measured to get a columns size - defaults to 0 (all rows).
+	 * @type Number */
+	this.maxRowsToMeasure = 0;
+	
+	/** True to highlight rows when the mouse is over (default is false)
+	 * @type Boolean */
+	this.trackMouseOver = false;
+	
+	/** True to enable drag and drop of rows
+	 * @type Boolean */
+	this.enableDragDrop = false;
+	
+	/** True to stripe the rows (default is true)
+	 * @type Boolean */
+	this.stripeRows = true;
+	/** True to fit the height of the grid container to the height of the data (defaults to false)
+	 * @type Boolean */
+	this.autoHeight = false;
+	
+	/** True to fit the width of the grid container to the width of the columns (defaults to false)
+	 * @type Boolean */
+	this.autoWidth = false;
+	
+	/** A regular expression defining tagNames 
+     * allowed to have text selection (Defaults to <code>/INPUT|TEXTAREA|SELECT/i</code>) */
+    this.allowTextSelectionPattern = /INPUT|TEXTAREA|SELECT/i;
+	
+	/** @private */
+	this.setValueDelegate = this.setCellValue.createDelegate(this);
+	
+	var CE = YAHOO.util.CustomEvent;
+	/** @private */
+	this.events = {
+	    // raw events
+	    /**
+	     * @event click
+	     * The raw click event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'click' : new CE('click'),
+	    /**
+	     * @event dblclick
+	     * The raw dblclick event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'dblclick' : new CE('dblclick'),
+	    /**
+	     * @event mousedown
+	     * The raw mousedown event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'mousedown' : new CE('mousedown'),
+	    /**
+	     * @event mouseup
+	     * The raw mouseup event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'mouseup' : new CE('mouseup'),
+	    /**
+	     * @event mouseover
+	     * The raw mouseover event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'mouseover' : new CE('mouseover'),
+	    /**
+	     * @event mouseout
+	     * The raw mouseout event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'mouseout' : new CE('mouseout'),
+	    /**
+	     * @event keypress
+	     * The raw keypress event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'keypress' : new CE('keypress'),
+	    /**
+	     * @event keydown
+	     * The raw keydown event for the entire grid.
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'keydown' : new CE('keydown'),
+	    
+	    // custom events
+	    
+	    /**
+	     * @event cellclick
+	     * Fires when a cell is clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'cellclick' : new CE('cellclick'),
+	    /**
+	     * @event celldblclick
+	     * Fires when a cell is double clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'celldblclick' : new CE('celldblclick'),
+	    /**
+	     * @event rowclick
+	     * Fires when a row is clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'rowclick' : new CE('rowclick'),
+	    /**
+	     * @event rowdblclick
+	     * Fires when a cell is double clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'rowdblclick' : new CE('rowdblclick'),
+	    /**
+	     * @event headerclick
+	     * Fires when a header is clicked
+	     * @param {Grid} this
+	     * @param {Number} columnIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'headerclick' : new CE('headerclick'),
+	    /**
+	     * @event rowcontextmenu
+	     * Fires when a row is right clicked
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'rowcontextmenu' : new CE('rowcontextmenu'),
+	    /**
+	     * @event headercontextmenu
+	     * Fires when a header is right clicked
+	     * @param {Grid} this
+	     * @param {Number} columnIndex
+	     * @param {YAHOO.ext.EventObject} e
+	     */
+	    'headercontextmenu' : new CE('headercontextmenu'),
+	    /**
+	     * @event beforeedit
+	     * Fires before a cell is edited
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     */
+	    'beforeedit' : new CE('beforeedit'),
+	    /**
+	     * @event afteredit
+	     * Fires after a cell is edited
+	     * @param {Grid} this
+	     * @param {Number} rowIndex
+	     * @param {Number} columnIndex
+	     */
+	    'afteredit' : new CE('afteredit'),
+	    /**
+	     * @event bodyscroll
+	     * Fires when the body element is scrolled
+	     * @param {Number} scrollLeft
+	     * @param {Number} scrollTop
+	     */
+	    'bodyscroll' : new CE('bodyscroll'),
+	    /**
+	     * @event columnresize
+	     * Fires when the user resizes a column
+	     * @param {Number} columnIndex
+	     * @param {Number} newSize
+	     */
+	    'columnresize' : new CE('columnresize'),
+	    /**
+	     * @event startdrag
+	     * Fires when row(s) start being dragged 
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'startdrag' : new CE('startdrag'),
+	    /**
+	     * @event enddrag
+	     * Fires when a drag operation is complete
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'enddrag' : new CE('enddrag'),
+	    /**
+	     * @event dragdrop
+	     * Fires when dragged row(s) are dropped on a valid DD target 
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'dragdrop' : new CE('dragdrop'),
+	    /**
+	     * @event dragover
+	     * Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dragged over.
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'dragover' : new CE('dragover'),
+	    /**
+	     * @event dragenter
+	     *  Fires when the dragged row(s) first cross another DD target while being dragged 
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'dragenter' : new CE('dragenter'),
+	    /**
+	     * @event dragout
+	     * Fires when the dragged row(s) leave another DD target while being dragged 
+	     * @param {Grid} this
+	     * @param {YAHOO.ext.GridDD} dd The drag drop object
+	     * @param {String} targetId The target drag drop object
+	     * @param {event} e The raw browser event
+	     */
+	    'dragout' : new CE('dragout')
+	};
+};
+
+YAHOO.ext.grid.Grid.prototype = { 
+    /**
+     * Called once after all setup has been completed and the grid is ready to be rendered.
+     */
+    render : function(){
+        if((!this.container.dom.offsetHeight || this.container.dom.offsetHeight < 20) 
+                || this.container.getStyle('height') == 'auto'){
+    	    this.autoHeight = true;   
+    	}	       
+    	if((!this.container.dom.offsetWidth || this.container.dom.offsetWidth < 20) 
+                || this.container.getStyle('width') == 'auto'){
+    	    this.autoWidth = true;   
+    	}	       
+    	if(!this.view){
+    	    if(this.dataModel.isPaged()){
+    		    this.view = new YAHOO.ext.grid.PagedGridView();
+    	    }else{
+    	        this.view = new YAHOO.ext.grid.GridView();
+    	    }
+    	}
+    	this.view.init(this);
+        this.el = getEl(this.view.render(), true);
+        var c = this.container;
+        c.mon("click", this.onClick, this, true);
+        c.mon("dblclick", this.onDblClick, this, true);
+        c.mon("contextmenu", this.onContextMenu, this, true);
+        c.mon("selectstart", this.cancelTextSelection, this, true);
+        c.mon("mousedown", this.cancelTextSelection, this, true);
+        c.mon("mousedown", this.onMouseDown, this, true);
+        c.mon("mouseup", this.onMouseUp, this, true);
+        if(this.trackMouseOver){
+            this.el.mon("mouseover", this.onMouseOver, this, true);
+            this.el.mon("mouseout", this.onMouseOut, this, true);
+        }
+        c.mon("keypress", this.onKeyPress, this, true);
+        c.mon("keydown", this.onKeyDown, this, true);
+        this.init();
+    },
+    
+    /**
+     * Replace the current data model with a new one (experimental)
+     * @param {DataModel} dm The new data model
+     * @pram {Boolean} rerender true to render the grid rows from scratch
+     */
+    setDataModel : function(dm, rerender){
+        this.view.unplugDataModel(this.dataModel);
+        this.dataModel = dm;
+        this.view.plugDataModel(dm);
+        if(rerender){
+            dm.fireEvent('datachanged');
+        }
+    },
+    
+    init : function(){
+        this.rows = this.el.dom.rows;
+        if(!this.disableSelection){
+	        if(!this.selModel){
+	            this.selModel = new YAHOO.ext.grid.DefaultSelectionModel(this);
+	        }
+	        this.selModel.init(this);
+	        this.selModel.onSelectionChange.subscribe(this.updateField, this, true);
+        }else{
+            this.selModel = new YAHOO.ext.grid.DisableSelectionModel(this);
+            this.selModel.init(this);
+        }
+        
+        if(this.enableDragDrop){
+            this.dd = new YAHOO.ext.grid.GridDD(this, this.container.dom);
+        }
+     },   
+
+    onMouseDown : function(e){
+        this.fireEvent('mousedown', e);
+    },
+    
+    onMouseUp : function(e){
+        this.fireEvent('mouseup', e);
+    },
+    
+    onMouseOver : function(e){
+        this.fireEvent('mouseover', e);
+    },
+    
+    onMouseOut : function(e){
+        this.fireEvent('mouseout', e);
+    },
+    
+    onKeyPress : function(e){
+        this.fireEvent('keypress', e);
+    },
+    
+    onKeyDown : function(e){
+        this.fireEvent('keydown', e);
+    },
+    
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    
+    onClick : function(e){
+        this.fireEvent('click', e);
+        var target = e.getTarget();
+        var row = this.getRowFromChild(target);
+        var cell = this.getCellFromChild(target);
+        var header = this.getHeaderFromChild(target);
+        if(row){
+            this.fireEvent('rowclick', this, row.rowIndex, e);
+        }
+        if(cell){
+            this.fireEvent('cellclick', this, row.rowIndex, cell.columnIndex, e);
+        }
+        if(header){
+            this.fireEvent('headerclick', this, header.columnIndex, e);
+        }
+    },
+
+    onContextMenu : function(e){
+        var target = e.getTarget();
+        var row = this.getRowFromChild(target);
+        var header = this.getHeaderFromChild(target);
+        if(row){
+            this.fireEvent('rowcontextmenu', this, row.rowIndex, e);
+        }
+        if(header){
+            this.fireEvent('headercontextmenu', this, header.columnIndex, e);
+        }
+        e.preventDefault();
+    },
+
+    onDblClick : function(e){
+        this.fireEvent('dblclick', e);
+        var target = e.getTarget();
+        var row = this.getRowFromChild(target);
+        var cell = this.getCellFromChild(target);
+        if(row){
+            this.fireEvent('rowdblclick', this, row.rowIndex, e);
+        }
+        if(cell){
+            this.fireEvent('celldblclick', this, row.rowIndex, cell.columnIndex, e);
+        }
+    },
+    
+    /**
+     * Starts editing the specified for the specified row/column
+     * @param {Number} rowIndex
+     * @param {Number} colIndex
+     */
+    startEditing : function(rowIndex, colIndex){
+        var row = this.rows[rowIndex];
+        var cell = row.childNodes[colIndex];
+        this.stopEditing();
+        setTimeout(this.doEdit.createDelegate(this, [row, cell]), 10);
+    },
+        
+    /**
+     * Stops any active editing
+     */
+    stopEditing : function(){
+        if(this.activeEditor){
+            this.activeEditor.stopEditing();
+        }
+    },
+        
+    /** @ignore */
+    doEdit : function(row, cell){
+        if(!row || !cell) return;
+        var cm = this.colModel;
+        var dm = this.dataModel;
+        var colIndex = cell.columnIndex;
+        var rowIndex = row.rowIndex;
+        if(cm.isCellEditable(colIndex, rowIndex)){
+           var ed = cm.getCellEditor(colIndex, rowIndex);
+           if(ed){
+               if(this.activeEditor){
+                   this.activeEditor.stopEditing();
+               }
+               this.fireEvent('beforeedit', this, rowIndex, colIndex);
+               this.activeEditor = ed;
+               this.editingCell = cell;
+               this.view.ensureVisible(row, true);
+               try{
+                   cell.focus();
+               }catch(e){}
+               ed.init(this, this.el.dom.parentNode, this.setValueDelegate);
+               var value = dm.getValueAt(rowIndex, cm.getDataIndex(colIndex));
+               // set timeout so firefox stops editing before starting a new edit
+               setTimeout(ed.startEditing.createDelegate(ed, [value, row, cell]), 1);
+           }   
+        }  
+    },
+    
+    setCellValue : function(value, rowIndex, colIndex){
+         this.dataModel.setValueAt(value, rowIndex, this.colModel.getDataIndex(colIndex));
+         this.fireEvent('afteredit', this, rowIndex, colIndex);
+    },
+    
+    /** @ignore Called when text selection starts or mousedown to prevent default */
+    cancelTextSelection : function(e){
+        var target = e.getTarget();
+        if(target && target != this.el.dom.parentNode && !this.allowTextSelectionPattern.test(target.tagName)){
+            e.preventDefault();
+        }
+    },
+    
+    /**
+     * Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, 
+     * but if manual update is required this method will initiate it.
+     */
+    autoSize : function(){
+        this.view.updateWrapHeight();
+        this.view.adjustForScroll();
+    },
+    
+    /**
+     * Scrolls the grid to the specified row
+     * @param {Number/HTMLElement} row The row object or index of the row
+     */
+    scrollTo : function(row){
+        if(typeof row == 'number'){
+            row = this.rows[row];
+        }
+        this.view.ensureVisible(row, true);
+    },
+    
+    /** @private */
+    getEditingCell : function(){
+        return this.editingCell;    
+    },
+    
+    /**
+     * Binds this grid to the field with the specified id. Initially reads and parses the comma 
+     * delimited ids in the field and selects those items. All selections made in the grid
+     * will be persisted to the field by their ids comma delimited.
+     * @param {String} The id of the field to bind to
+     */
+    bindToField : function(fieldId){
+        this.fieldId = fieldId;
+        this.readField();
+    },
+    
+    /** @private */
+    updateField : function(){
+        if(this.fieldId){
+            var field = YAHOO.util.Dom.get(this.fieldId);
+            field.value = this.getSelectedRowIds().join(',');
+        }
+    },
+    
+    /**
+     * Causes the grid to read and select the ids from the bound field - See {@link #bindToField}.
+     */
+    readField : function(){
+        if(this.fieldId){
+            var field = YAHOO.util.Dom.get(this.fieldId);
+            var values = field.value.split(',');
+            var rows = this.getRowsById(values);
+            this.selModel.selectRows(rows, false);
+        }
+    },
+	
+	/**
+	 * Returns the table row at the specified index
+	 * @param {Number} index
+	 * @return {HTMLElement} 
+	 */
+    getRow : function(index){
+        return this.rows[index];
+    },
+	
+	/**
+	 * Returns the rows that have the specified id(s). The id value for a row is provided 
+	 * by the DataModel. See {@link YAHOO.ext.grid.DefaultDataModel#getRowId}.
+	 * @param {String/Array} An id to find or an array of ids
+	 * @return {HtmlElement/Array} If one id was passed in, it returns one result. 
+	 * If an array of ids was specified, it returns an Array of HTMLElements
+	 */
+    getRowsById : function(id){
+        var dm = this.dataModel;
+        if(!(id instanceof Array)){
+            for(var i = 0; i < this.rows.length; i++){
+                if(dm.getRowId(i) == id){
+                    return this.rows[i];
+                }
+            }
+            return null;
+        }
+        var found = [];
+        var re = "^(?:";
+        for(var i = 0; i < id.length; i++){
+            re += id[i];
+            if(i != id.length-1) re += "|";
+        }
+        var regex = new RegExp(re + ")$");
+        for(var i = 0; i < this.rows.length; i++){
+            if(regex.test(dm.getRowId(i))){
+                found.push(this.rows[i]);
+            }
+        }
+        return found;
+    },
+    
+    /**
+	 * Returns the row that comes after the specified row - text nodes are skipped.
+	 * @param {HTMLElement} row
+	 * @return {HTMLElement} 
+	 */
+    getRowAfter : function(row){
+        return this.getSibling('next', row);
+    },
+    
+    /**
+	 * Returns the row that comes before the specified row - text nodes are skipped.
+	 * @param {HTMLElement} row
+	 * @return {HTMLElement} 
+	 */
+    getRowBefore : function(row){
+        return this.getSibling('previous', row);
+    },
+    
+    /**
+	 * Returns the cell that comes after the specified cell - text nodes are skipped.
+	 * @param {HTMLElement} cell
+	 * @param {Boolean} includeHidden
+	 * @return {HTMLElement} 
+	 */
+    getCellAfter : function(cell, includeHidden){
+        var next = this.getSibling('next', cell);
+        if(next && !includeHidden && this.colModel.isHidden(next.columnIndex)){
+            return this.getCellAfter(next);
+        }
+        return next;
+    },
+    
+    /**
+	 * Returns the cell that comes before the specified cell - text nodes are skipped.
+	 * @param {HTMLElement} cell
+	 * @param {Boolean} includeHidden
+	 * @return {HTMLElement} 
+	 */
+    getCellBefore : function(cell, includeHidden){
+        var prev = this.getSibling('previous', cell);
+        if(prev && !includeHidden && this.colModel.isHidden(prev.columnIndex)){
+            return this.getCellBefore(prev);
+        }
+        return prev;
+    },
+    
+    /**
+	 * Returns the last cell for the row - text nodes and hidden columns are skipped.
+	 * @param {HTMLElement} row
+	 * @param {Boolean} includeHidden
+	 * @return {HTMLElement} 
+	 */
+    getLastCell : function(row, includeHidden){
+        var cell = this.getElement('previous', row.lastChild);
+        if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){
+            return this.getCellBefore(cell);
+        }
+        return cell;
+    },
+    
+    /**
+	 * Returns the first cell for the row - text nodes and hidden columns are skipped.
+	 * @param {HTMLElement} row
+	 * @param {Boolean} includeHidden
+	 * @return {HTMLElement} 
+	 */
+    getFirstCell : function(row, includeHidden){
+        var cell = this.getElement('next', row.firstChild);
+        if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){
+            return this.getCellAfter(cell);
+        }
+        return cell;
+    },
+    
+    /**
+     * @private
+     * Gets siblings, skipping text nodes
+     * @param {String} type The direction to walk: 'next' or 'previous'
+     * @param {HTMLElement} node
+	 */
+    getSibling : function(type, node){
+        if(!node) return null;
+        type += 'Sibling';
+        var n = node[type];
+        while(n && n.nodeType != 1){
+            n = n[type];
+        }
+        return n;
+    },
+    
+    /**
+     * Returns node if node is an HTMLElement else walks the siblings in direction looking for 
+     * a node that is an element
+     * @param {String} direction The direction to walk: 'next' or 'previous'
+     * @private
+     */
+    getElement : function(direction, node){
+        if(!node || node.nodeType == 1) return node;
+        else return this.getSibling(direction, node);
+    },
+    
+    /**
+     * @private
+     */
+    getElementFromChild : function(childEl, parentClass){
+        if(!childEl || (YAHOO.util.Dom.hasClass(childEl, parentClass))){
+		    return childEl;
+	    }
+	    var p = childEl.parentNode;
+	    var b = document.body;
+	    while(p && p != b){
+            if(YAHOO.util.Dom.hasClass(p, parentClass)){
+            	return p;
+            }
+            p = p.parentNode;
+        }
+	    return null;
+    },
+    
+    /**
+	 * Returns the row that contains the specified child element.
+	 * @param {HTMLElement} childEl
+	 * @return {HTMLElement} 
+	 */
+    getRowFromChild : function(childEl){
+        return this.getElementFromChild(childEl, 'ygrid-row');
+    },
+    
+    /**
+	 * Returns the cell that contains the specified child element.
+	 * @param {HTMLElement} childEl
+	 * @return {HTMLElement} 
+	 */
+    getCellFromChild : function(childEl){
+        return this.getElementFromChild(childEl, 'ygrid-col');
+    },
+    
+    
+    /**
+     * Returns the header element that contains the specified child element.
+     * @param {HTMLElement}  childEl
+	 * @return {HTMLElement} 
+	 */
+     getHeaderFromChild : function(childEl){
+        return this.getElementFromChild(childEl, 'ygrid-hd');
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().getSelectedRows() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRows}</small> for more details.
+     * @return {Array}
+     */
+    getSelectedRows : function(){
+        return this.selModel.getSelectedRows();
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().getSelectedRows()[0] - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRows}</small> for more details.
+     * @return {HTMLElement}
+     */
+    getSelectedRow : function(){
+        if(this.selModel.hasSelection()){
+            return this.selModel.getSelectedRows()[0];
+        }
+        return null;
+    },
+    
+    /**
+     * Get the selected row indexes
+     * @return {Array} Array of indexes
+     */
+    getSelectedRowIndexes : function(){
+        var a = [];
+        var rows = this.selModel.getSelectedRows();
+        for(var i = 0; i < rows.length; i++) {
+        	a[i] = rows[i].rowIndex;
+        }
+        return a;
+    },
+    
+    /**
+     * Gets the first selected row or -1 if none are selected
+     * @return {Number}
+     */
+    getSelectedRowIndex : function(){
+        if(this.selModel.hasSelection()){
+           return this.selModel.getSelectedRows()[0].rowIndex;
+        }
+        return -1;
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().getSelectedRowIds()[0] - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRowIds}</small> for more details.
+     * @return {String}
+     */
+    getSelectedRowId : function(){
+        if(this.selModel.hasSelection()){
+           return this.selModel.getSelectedRowIds()[0];
+        }
+        return null;
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().getSelectedRowIds() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRowIds}</small> for more details.
+     * @return {Array}
+     */
+    getSelectedRowIds : function(){
+        return this.selModel.getSelectedRowIds();
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().clearSelections() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#clearSelections}</small> for more details.
+     */
+    clearSelections : function(){
+        this.selModel.clearSelections();
+    },
+    
+        
+    /**
+     * Convenience method for getSelectionModel().selectAll() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#selectAll}</small> for more details.
+     */
+    selectAll : function(){
+        this.selModel.selectAll();
+    },
+    
+        
+    /**
+     * Convenience method for getSelectionModel().getCount() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#getCount}</small> for more details.
+     * @return {Number}
+     */
+    getSelectionCount : function(){
+        return this.selModel.getCount();
+    },
+    
+    /**
+     * Convenience method for getSelectionModel().hasSelection() - 
+     * See <small>{@link YAHOO.ext.grid.DefaultSelectionModel#hasSelection}</small> for more details.
+     * @return {Boolean}
+     */
+    hasSelection : function(){
+        return this.selModel.hasSelection();
+    },
+    
+    /**
+     * Returns the grid's SelectionModel.
+     * @return {SelectionModel}
+     */
+    getSelectionModel : function(){
+        if(!this.selModel){
+            this.selModel = new DefaultSelectionModel();
+        }
+        return this.selModel;
+    },
+    
+    /**
+     * Returns the grid's DataModel.
+     * @return {DataModel}
+     */
+    getDataModel : function(){
+        return this.dataModel;
+    },
+    
+    /**
+     * Returns the grid's ColumnModel.
+     * @return {ColumnModel}
+     */
+    getColumnModel : function(){
+        return this.colModel;
+    },
+    
+    /**
+     * Returns the grid's GridView object.
+     * @return {GridView}
+     */
+    getView : function(){
+        return this.view;
+    },
+    /**
+     * Called to get grid's drag proxy text, by default returns this.ddText. 
+     * @return {String}
+     */
+    getDragDropText : function(){
+        return this.ddText.replace('%0', this.selModel.getCount());
+    }
+};
+/**
+ * Configures the text is the drag proxy (defaults to "%0 selected row(s)"). 
+ * %0 is replaced with the number of selected rows.
+ * @type String
+ */
+YAHOO.ext.grid.Grid.prototype.ddText = "%0 selected row(s)";

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/GridDD.js.html b/www/extras/yui-ext/docs/output/GridDD.js.html new file mode 100644 index 000000000..2e3f9cab7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/GridDD.js.html @@ -0,0 +1,101 @@ +GridDD.js
+// kill dependency issue
+if(YAHOO.util.DDProxy){
+/**
+ * @class YAHOO.ext.grid.GridDD
+ * Custom implementation of YAHOO.util.DDProxy used internally by the grid
+ * @extends YAHOO.util.DDProxy
+ */
+YAHOO.ext.grid.GridDD = function(grid, bwrap){
+    this.grid = grid;
+    var ddproxy = document.createElement('div');
+    ddproxy.id = grid.container.id + '-ddproxy';
+    ddproxy.className = 'ygrid-drag-proxy';
+    document.body.insertBefore(ddproxy, document.body.firstChild);
+    YAHOO.util.Dom.setStyle(ddproxy, 'opacity', .80);
+    var ddicon = document.createElement('span');
+    ddicon.className = 'ygrid-drop-icon ygrid-drop-nodrop';
+    ddproxy.appendChild(ddicon);
+    var ddtext = document.createElement('span');
+    ddtext.className = 'ygrid-drag-text';
+    ddtext.innerHTML = "&#160;";
+    ddproxy.appendChild(ddtext);
+    
+    this.ddproxy = ddproxy;
+    this.ddtext = ddtext;
+    this.ddicon = ddicon;
+    YAHOO.util.Event.on(bwrap, 'click', this.handleClick, this, true);
+    YAHOO.ext.grid.GridDD.superclass.constructor.call(this, bwrap.id, 'GridDD', 
+          {dragElId : ddproxy.id, resizeFrame: false});
+          
+    this.unlockDelegate = grid.selModel.unlock.createDelegate(grid.selModel);
+};
+YAHOO.extendX(YAHOO.ext.grid.GridDD, YAHOO.util.DDProxy);
+
+YAHOO.ext.grid.GridDD.prototype.handleMouseDown = function(e){
+    var row = this.grid.getRowFromChild(YAHOO.util.Event.getTarget(e));
+    if(!row) return;
+    if(this.grid.selModel.isSelected(row)){
+        YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e);
+    }else {
+        this.grid.selModel.unlock();
+        YAHOO.ext.EventObject.setEvent(e);
+        this.grid.selModel.rowClick(this.grid, row.rowIndex, YAHOO.ext.EventObject);
+        YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e);
+        this.grid.selModel.lock();
+    }
+};
+
+YAHOO.ext.grid.GridDD.prototype.handleClick = function(e){
+    if(this.grid.selModel.isLocked()){
+         setTimeout(this.unlockDelegate, 1);
+         YAHOO.util.Event.stopEvent(e);
+    }
+};
+
+/**
+ * Updates the DD visual element to allow/not allow a drop
+ * @param {Boolean} dropStatus True if drop is allowed on the target
+ */
+YAHOO.ext.grid.GridDD.prototype.setDropStatus = function(dropStatus){
+    if(dropStatus === true){
+        YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-nodrop', 'ygrid-drop-ok');
+    }else{
+        YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-ok', 'ygrid-drop-nodrop');
+    }
+};
+
+YAHOO.ext.grid.GridDD.prototype.startDrag = function(e){
+    this.ddtext.innerHTML = this.grid.getDragDropText();
+    this.setDropStatus(false);
+    this.grid.selModel.lock();
+    this.grid.fireEvent('startdrag', this.grid, this, e);
+};
+       
+YAHOO.ext.grid.GridDD.prototype.endDrag = function(e){
+    YAHOO.util.Dom.setStyle(this.ddproxy, 'visibility', 'hidden');
+    this.grid.fireEvent('enddrag', this.grid, this, e);
+};
+
+YAHOO.ext.grid.GridDD.prototype.autoOffset = function(iPageX, iPageY) {
+    this.setDelta(-12, -20);
+};
+
+YAHOO.ext.grid.GridDD.prototype.onDragEnter = function(e, id) {
+    this.setDropStatus(true);
+    this.grid.fireEvent('dragenter', this.grid, this, id, e);
+};
+
+YAHOO.ext.grid.GridDD.prototype.onDragDrop = function(e, id) {
+    this.grid.fireEvent('dragdrop', this.grid, this, id, e);
+};
+
+YAHOO.ext.grid.GridDD.prototype.onDragOver = function(e, id) {
+    this.grid.fireEvent('dragover', this.grid, this, id, e);
+};
+
+YAHOO.ext.grid.GridDD.prototype.onDragOut = function(e, id) {
+    this.setDropStatus(false);
+    this.grid.fireEvent('dragout', this.grid, this, id, e);
+};
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/GridView.js.html b/www/extras/yui-ext/docs/output/GridView.js.html new file mode 100644 index 000000000..50f2e8596 --- /dev/null +++ b/www/extras/yui-ext/docs/output/GridView.js.html @@ -0,0 +1,763 @@ +GridView.js
/**
+ * @class YAHOO.ext.grid.GridView
+ * Default UI code used internally by the Grid. This is the object returned by {@link YAHOO.ext.grid.Grid#getView}.
+ * @constructor
+ */
+YAHOO.ext.grid.GridView = function(){
+	this.grid = null;
+	this.lastFocusedRow = null;
+	this.onScroll = new YAHOO.util.CustomEvent('onscroll');
+	this.adjustScrollTask = new YAHOO.ext.util.DelayedTask(this._adjustForScroll, this);
+	this.ensureVisibleTask = new YAHOO.ext.util.DelayedTask();
+};
+
+YAHOO.ext.grid.GridView.prototype = {
+	init: function(grid){
+		this.grid = grid;
+	},
+	
+	fireScroll: function(scrollLeft, scrollTop){
+		this.onScroll.fireDirect(this.grid, scrollLeft, scrollTop);
+	},
+	
+	/**
+	 * @private
+	 * Utility method that gets an array of the cell renderers
+	 */
+	getColumnRenderers : function(){
+    	var renderers = [];
+    	var cm = this.grid.colModel;
+        var colCount = cm.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            renderers.push(cm.getRenderer(i));
+        }
+        return renderers;
+    },
+    
+    buildIndexMap : function(){
+        var colToData = {};
+        var dataToCol = {};
+        var cm = this.grid.colModel;
+        for(var i = 0, len = cm.getColumnCount(); i < len; i++){
+            var di = cm.getDataIndex(i);
+            colToData[i] = di;
+            dataToCol[di] = i;
+        }
+        return {'colToData': colToData, 'dataToCol': dataToCol};
+    },
+    
+    getDataIndexes : function(){
+    	if(!this.indexMap){
+            this.indexMap = this.buildIndexMap();
+        }
+        return this.indexMap.colToData;
+    },
+    
+    getColumnIndexByDataIndex : function(dataIndex){
+        if(!this.indexMap){
+            this.indexMap = this.buildIndexMap();
+        }
+    	return this.indexMap.dataToCol[dataIndex];
+    },
+    
+    updateHeaders : function(){
+        var colModel = this.grid.colModel;
+        var hcells = this.headers;
+        var colCount = colModel.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            hcells[i].textNode.innerHTML = colModel.getColumnHeader(i);
+        }
+    },
+    
+    adjustForScroll : function(disableDelay){
+        if(!disableDelay){
+            this.adjustScrollTask.delay(50);
+        }else{
+            this._adjustForScroll();
+        }
+    },
+    
+    /**
+     * Returns the rowIndex/columnIndex of the cell found at the passed page coordinates
+     * @param {Number} x
+     * @param {Number} y
+     * @return {Array} [rowIndex, columnIndex]
+     */
+     getCellAtPoint : function(x, y){
+        var colIndex = null;        
+        var rowIndex = null;
+        
+        // translate page coordinates to local coordinates
+        var xy = YAHOO.util.Dom.getXY(this.wrap);
+        x = (x - xy[0]) + this.wrap.scrollLeft;
+        y = (y - xy[1]) + this.wrap.scrollTop;
+        
+        var colModel = this.grid.colModel;
+        var pos = 0;
+        var colCount = colModel.getColumnCount();
+        for(var i = 0; i < colCount; i++){
+            if(colModel.isHidden(i)) continue;
+            var width = colModel.getColumnWidth(i);
+            if(x >= pos && x < pos+width){
+                colIndex = i;
+                break;
+            }
+            pos += width;
+        }
+        if(colIndex != null){
+            rowIndex = (y == 0 ? 0 : Math.floor(y / this.getRowHeight()));
+            if(rowIndex >= this.grid.dataModel.getRowCount()){
+                return null;
+            }
+            return [colIndex, rowIndex];
+        }
+        return null;
+    },
+    
+    /** @private */
+    _adjustForScroll : function(){
+        this.forceScrollUpdate();
+        if(this.scrollbarMode == YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){
+            var adjustment = 0;
+            if(this.wrap.clientWidth && this.wrap.clientWidth !== 0){
+                adjustment = this.wrap.offsetWidth - this.wrap.clientWidth;
+            }
+            this.hwrap.setWidth(this.wrap.offsetWidth-adjustment);
+        }else{
+            this.hwrap.setWidth(this.wrap.offsetWidth);
+        }
+        this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(), this.wrap.clientWidth));
+    },
+
+    /**
+     * Focuses the specified row. The preferred way to scroll to a row is {@link #ensureVisible}.
+     * @param {Number/HTMLElement} row The index of a row or the row itself
+     */
+     focusRow : function(row){
+        if(typeof row == 'number'){
+            row = this.getBodyTable().childNodes[row];
+        }
+        if(!row) return;
+    	var left = this.wrap.scrollLeft;
+    	try{ // try catch for IE occasional focus bug
+    	    row.childNodes.item(0).hideFocus = true;
+        	row.childNodes.item(0).focus();
+        }catch(e){}
+        this.ensureVisible(row);
+        this.wrap.scrollLeft = left;
+        this.handleScroll();
+        this.lastFocusedRow = row;
+    },
+
+    /**
+     * Scrolls the specified row into view. This call is automatically buffered (delayed), to disable
+     * the delay, pass true for disableDelay. 
+     * @param {Number/HTMLElement} row The index of a row or the row itself
+     * @param {Boolean} disableDelay
+     */
+     ensureVisible : function(row, disableDelay){
+        if(!disableDelay){
+            this.ensureVisibleTask.delay(50, this._ensureVisible, this, [row]);
+        }else{
+            this._ensureVisible(row);
+        }
+    },
+
+    /** @ignore */
+    _ensureVisible : function(row){
+        if(typeof row == 'number'){
+            row = this.getBodyTable().childNodes[row];
+        }
+        if(!row) return;
+    	var left = this.wrap.scrollLeft;
+    	var rowTop = parseInt(row.offsetTop, 10); // parseInt for safari bug
+        var rowBottom = rowTop + row.offsetHeight;
+        var clientTop = parseInt(this.wrap.scrollTop, 10); // parseInt for safari bug
+        var clientBottom = clientTop + this.wrap.clientHeight;
+        if(rowTop < clientTop){
+        	this.wrap.scrollTop = rowTop;
+        }else if(rowBottom > clientBottom){
+            this.wrap.scrollTop = rowBottom-this.wrap.clientHeight;
+        }
+        this.wrap.scrollLeft = left;
+        this.handleScroll();
+    },
+    
+    updateColumns : function(){
+        this.grid.stopEditing();
+        var colModel = this.grid.colModel;
+        var hcols = this.headers;
+        var colCount = colModel.getColumnCount();
+        var pos = 0;
+        var totalWidth = colModel.getTotalWidth();
+        for(var i = 0; i < colCount; i++){
+            if(colModel.isHidden(i)) continue;
+            var width = colModel.getColumnWidth(i);
+            hcols[i].style.width = width + 'px';
+            hcols[i].style.left = pos + 'px';
+            hcols[i].split.style.left = (pos+width-3) + 'px';
+            this.setCSSWidth(i, width, pos);
+            pos += width;
+        }
+        this.lastWidth = totalWidth;
+        if(this.grid.autoWidth){
+            this.grid.container.setWidth(totalWidth+this.grid.container.getBorderWidth('lr'));
+            this.grid.autoSize();
+        }
+        this.bwrap.setWidth(Math.max(totalWidth, this.wrap.clientWidth));
+        if(!YAHOO.ext.util.Browser.isIE){ // fix scrolling prob in gecko and opera
+        	this.wrap.scrollLeft = this.hwrap.dom.scrollLeft;
+        }
+        this.syncScroll();
+        this.forceScrollUpdate();
+        if(this.grid.autoHeight){
+            this.autoHeight();
+            this.updateWrapHeight();
+        }
+    },
+    
+    setCSSWidth : function(colIndex, width, pos){
+        var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex];
+        YAHOO.ext.util.CSS.updateRule(selector, 'width', width + 'px');
+        if(typeof pos == 'number'){
+            YAHOO.ext.util.CSS.updateRule(selector, 'left', pos + 'px');
+        }
+    },
+    
+    /**
+     * Set a css style for a column dynamically. 
+     * @param {Number} colIndex The index of the column
+     * @param {String} name The css property name
+     * @param {String} value The css value
+     */
+     setCSSStyle : function(colIndex, name, value){
+        var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex];
+        YAHOO.ext.util.CSS.updateRule(selector, name, value);
+    },
+    
+    handleHiddenChange : function(colModel, colIndex, hidden){
+        if(hidden){
+            this.hideColumn(colIndex);
+        }else{
+            this.unhideColumn(colIndex);
+        }
+        this.updateColumns();
+    },
+    
+    hideColumn : function(colIndex){
+        var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex];
+        YAHOO.ext.util.CSS.updateRule(selector, 'position', 'absolute');
+        YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'hidden');
+        
+        this.headers[colIndex].style.display = 'none';
+        this.headers[colIndex].split.style.display = 'none';
+    },
+    
+    unhideColumn : function(colIndex){
+        var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex];
+        YAHOO.ext.util.CSS.updateRule(selector, 'position', '');
+        YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'visible');
+        
+        this.headers[colIndex].style.display = '';
+        this.headers[colIndex].split.style.display = '';
+    },
+    
+    getBodyTable : function(){
+    	return this.bwrap.dom;
+    },
+    
+    updateRowIndexes : function(firstRow, lastRow){
+        var stripeRows = this.grid.stripeRows;
+        var bt = this.getBodyTable();
+        var nodes = bt.childNodes;
+        firstRow = firstRow || 0;
+        lastRow = lastRow || nodes.length-1;
+        var re = /^(?:ygrid-row ygrid-row-alt|ygrid-row)/;
+        for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+            var node = nodes[rowIndex];
+            if(stripeRows && (rowIndex+1) % 2 == 0){
+        		node.className = node.className.replace(re, 'ygrid-row ygrid-row-alt');
+        	}else{
+        		node.className = node.className.replace(re, 'ygrid-row');
+        	}
+            node.rowIndex = rowIndex;
+            nodes[rowIndex].style.top = (rowIndex * this.rowHeight) + 'px';
+        }
+    },
+
+    insertRows : function(dataModel, firstRow, lastRow){
+        this.updateBodyHeight();
+        this.adjustForScroll(true);
+        var renderers = this.getColumnRenderers();
+        var dindexes = this.getDataIndexes();
+        var colCount = this.grid.colModel.getColumnCount();
+        var beforeRow = null;
+        var bt = this.getBodyTable();
+        if(firstRow < bt.childNodes.length){
+            beforeRow = bt.childNodes[firstRow];
+        }
+        for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+            var row = document.createElement('span');
+            row.className = 'ygrid-row';
+            row.style.top = (rowIndex * this.rowHeight) + 'px';
+            this.renderRow(dataModel, row, rowIndex, colCount, renderers, dindexes);
+            if(beforeRow){
+            	bt.insertBefore(row, beforeRow);
+            }else{
+                bt.appendChild(row);
+            }
+        }
+        this.updateRowIndexes(firstRow);
+        this.adjustForScroll(true);
+    },
+    
+    renderRow : function(dataModel, row, rowIndex, colCount, renderers, dindexes){
+        for(var colIndex = 0; colIndex < colCount; colIndex++){
+            var td = document.createElement('span');
+            td.className = 'ygrid-col ygrid-col-' + colIndex + (colIndex == colCount-1 ? ' ygrid-col-last' : '');
+            td.columnIndex = colIndex;
+            td.tabIndex = 0;
+            var span = document.createElement('span');
+            span.className = 'ygrid-cell-text';
+            td.appendChild(span);
+            var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex);
+            if(typeof val == 'undefined' || val === '') val = '&#160;';
+            span.innerHTML = val;
+            row.appendChild(td);
+        }
+    },
+    
+    deleteRows : function(dataModel, firstRow, lastRow){
+        this.updateBodyHeight();
+        // first make sure they are deselected
+        this.grid.selModel.deselectRange(firstRow, lastRow);
+        var bt = this.getBodyTable();
+        var rows = []; // get references because the rowIndex will change
+        for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+            rows.push(bt.childNodes[rowIndex]);
+        }
+        for(var i = 0; i < rows.length; i++){
+            bt.removeChild(rows[i]);
+            rows[i] = null;
+        }
+        rows = null;
+        this.updateRowIndexes(firstRow);
+        this.adjustForScroll();
+    },
+    
+    updateRows : function(dataModel, firstRow, lastRow){
+        var bt = this.getBodyTable();
+        var dindexes = this.getDataIndexes();
+        var renderers = this.getColumnRenderers();
+        var colCount = this.grid.colModel.getColumnCount();
+        for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){
+            var row = bt.rows[rowIndex];
+            var cells = row.childNodes;
+            for(var colIndex = 0; colIndex < colCount; colIndex++){
+                var td = cells[colIndex];
+                var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex);
+                if(typeof val == 'undefined' || val === '') val = '&#160;';
+                td.firstChild.innerHTML = val;
+            }
+        }
+    },
+    
+    handleSort : function(dataModel, sortColumnIndex, sortDir, noRefresh){
+        this.grid.selModel.syncSelectionsToIds();
+        if(!noRefresh){
+           this.updateRows(dataModel, 0, dataModel.getRowCount()-1);
+        }
+        this.updateHeaderSortState();
+        if(this.lastFocusedRow){
+            this.focusRow(this.lastFocusedRow);
+        }
+    },
+    
+    syncScroll : function(){
+        this.hwrap.dom.scrollLeft = this.wrap.scrollLeft;
+    },
+    
+    handleScroll : function(){
+        this.syncScroll();
+        this.fireScroll(this.wrap.scrollLeft, this.wrap.scrollTop);
+        this.grid.fireEvent('bodyscroll', this.wrap.scrollLeft, this.wrap.scrollTop);
+    },
+    
+    getRowHeight : function(){
+        if(!this.rowHeight){
+            var rule = YAHOO.ext.util.CSS.getRule(["#" + this.grid.id + " .ygrid-row", ".ygrid-row"]);
+        	if(rule && rule.style.height){
+        	    this.rowHeight = parseInt(rule.style.height, 10);
+        	}else{
+        	    this.rowHeight = 21;
+        	}
+        }
+        return this.rowHeight;
+    },
+    
+    renderRows : function(dataModel){
+        if(this.grid.selModel){
+            this.grid.selModel.clearSelections();
+        }
+    	var bt = this.getBodyTable();
+    	bt.innerHTML = '';
+    	this.rowHeight = this.getRowHeight();
+    	this.insertRows(dataModel, 0, dataModel.getRowCount()-1);
+    },
+    
+    updateCell : function(dataModel, rowIndex, dataIndex){
+        var colIndex = this.getColumnIndexByDataIndex(dataIndex);
+        if(typeof colIndex == 'undefined'){ // not present in grid
+            return;
+        }
+        var bt = this.getBodyTable();
+        var row = bt.childNodes[rowIndex];
+        var cell = row.childNodes[colIndex];
+        var renderer = this.grid.colModel.getRenderer(colIndex);
+        var val = renderer(dataModel.getValueAt(rowIndex, dataIndex), rowIndex, colIndex);
+        if(typeof val == 'undefined' || val === '') val = '&#160;';
+        cell.firstChild.innerHTML = val;
+    },
+    
+    calcColumnWidth : function(colIndex, maxRowsToMeasure){
+        var maxWidth = 0;
+        var bt = this.getBodyTable();
+        var rows = bt.childNodes;
+        var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length);
+        if(this.grid.autoSizeHeaders){
+            var h = this.headers[colIndex];
+            var curWidth = h.style.width;
+            h.style.width = this.grid.minColumnWidth+'px';
+            maxWidth = Math.max(maxWidth, h.scrollWidth);
+            h.style.width = curWidth;
+        }
+        for(var i = 0; i < stopIndex; i++){
+            var cell = rows[i].childNodes[colIndex].firstChild;
+            maxWidth = Math.max(maxWidth, cell.scrollWidth);
+        }
+        return maxWidth + /*margin for error in IE*/ 5;
+    },
+    
+    /**
+     * Autofit a column to it's content.
+     * @param {Number} colIndex
+     * @param {Boolean} forceMinSize true to force the column to go smaller if possible
+     */
+     autoSizeColumn : function(colIndex, forceMinSize){
+        if(forceMinSize){
+           this.setCSSWidth(colIndex, this.grid.minColumnWidth);
+        }
+        var newWidth = this.calcColumnWidth(colIndex);
+        this.grid.colModel.setColumnWidth(colIndex,
+            Math.max(this.grid.minColumnWidth, newWidth));
+        this.grid.fireEvent('columnresize', colIndex, newWidth);
+    },
+    
+    /**
+     * Autofits all columns to their content and then expands to fit any extra space in the grid
+     */
+     autoSizeColumns : function(){
+        var colModel = this.grid.colModel;
+        var colCount = colModel.getColumnCount();
+        var wrap = this.wrap;
+        for(var i = 0; i < colCount; i++){
+            this.setCSSWidth(i, this.grid.minColumnWidth);
+            colModel.setColumnWidth(i, this.calcColumnWidth(i, this.grid.maxRowsToMeasure), true);
+        }
+        if(colModel.getTotalWidth() < wrap.clientWidth){
+            var diff = Math.floor((wrap.clientWidth - colModel.getTotalWidth()) / colCount);
+            for(var i = 0; i < colCount; i++){
+                colModel.setColumnWidth(i, colModel.getColumnWidth(i) + diff, true);
+            }
+        }
+        this.updateColumns();  
+    },
+    
+    /**
+     * Autofits all columns to the grid's width proportionate with their current size
+     */
+    fitColumns : function(){
+        var cm = this.grid.colModel;
+        var colCount = cm.getColumnCount();
+        var cols = [];
+        var width = 0;
+        var i, w;
+        for (i = 0; i < colCount; i++){
+            if(!cm.isHidden(i) && !cm.isFixed(i)){
+                w = cm.getColumnWidth(i);
+                cols.push(i);
+                cols.push(w);
+                width += w;
+            }
+        }
+        var frac = (this.wrap.clientWidth - cm.getTotalWidth())/width;
+        while (cols.length){
+            w = cols.pop();
+            i = cols.pop();
+            cm.setColumnWidth(i, Math.floor(w + w*frac), true);
+        }
+        this.updateColumns();
+    }, 
+    
+    onWindowResize : function(){
+        if(this.grid.monitorWindowResize){
+            this.adjustForScroll();
+            this.updateWrapHeight();
+            this.adjustForScroll();
+        }  
+    },
+    
+    updateWrapHeight : function(){
+        this.grid.container.beginMeasure();
+        this.autoHeight();
+        var box = this.grid.container.getSize(true);
+        this.wrapEl.setHeight(box.height-this.footerHeight-parseInt(this.wrap.offsetTop, 10));
+        this.pwrap.setSize(box.width, box.height);
+        this.grid.container.endMeasure();
+    },
+    
+    forceScrollUpdate : function(){
+        var wrap = this.wrapEl;
+        wrap.setWidth(wrap.getWidth(true));
+        setTimeout(function(){ // set timeout so FireFox works
+            wrap.setWidth('');
+        }, 1);
+    },
+    
+    updateHeaderSortState : function(){
+        var state = this.grid.dataModel.getSortState();
+        if(!state || typeof state.column == 'undefined') return;
+        var sortColumn = this.getColumnIndexByDataIndex(state.column);
+        var sortDir = state.direction;
+        for(var i = 0, len = this.headers.length; i < len; i++){
+            var h = this.headers[i];
+            if(i != sortColumn){
+                h.sortDesc.style.display = 'none';
+                h.sortAsc.style.display = 'none';
+            }else{
+                h.sortDesc.style.display = sortDir == 'DESC' ? 'block' : 'none';
+                h.sortAsc.style.display = sortDir == 'ASC' ? 'block' : 'none';
+            }
+        }
+    },
+
+    unplugDataModel : function(dm){
+        dm.removeListener('cellupdated', this.updateCell, this);
+        dm.removeListener('datachanged', this.renderRows, this);
+        dm.removeListener('rowsdeleted', this.deleteRows, this);
+        dm.removeListener('rowsinserted', this.insertRows, this);
+        dm.removeListener('rowsupdated', this.updateRows, this);
+        dm.removeListener('rowssorted', this.handleSort, this);
+    },
+    
+    plugDataModel : function(dm){
+        dm.on('cellupdated', this.updateCell, this, true);
+        dm.on('datachanged', this.renderRows, this, true);
+        dm.on('rowsdeleted', this.deleteRows, this, true);
+        dm.on('rowsinserted', this.insertRows, this, true);
+        dm.on('rowsupdated', this.updateRows, this, true);
+        dm.on('rowssorted', this.handleSort, this, true);
+    },
+    
+    render : function(){
+        var grid = this.grid;
+        var container = grid.container.dom;
+        var dataModel = grid.dataModel;
+        this.plugDataModel(dataModel);
+    
+        var colModel = grid.colModel;
+        colModel.onWidthChange.subscribe(this.updateColumns, this, true);
+        colModel.onHeaderChange.subscribe(this.updateHeaders, this, true);
+        colModel.onHiddenChange.subscribe(this.handleHiddenChange, this, true);
+        
+        YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true);
+        
+        var autoSizeDelegate = this.autoSizeColumn.createDelegate(this);
+        
+        var colCount = colModel.getColumnCount();
+        
+        var dh = YAHOO.ext.DomHelper;
+        this.pwrap = dh.append(container, 
+            {tag: 'div', cls: 'ygrid-positioner', 
+            style: 'position:relative;width:100%;height:100%;left:0;top:0;overflow:hidden;'}, true);
+        var pos = this.pwrap.dom;
+        
+        //create wrapper elements that handle offsets and scrolling
+        var wrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap'});
+        this.wrap = wrap;
+        this.wrapEl = getEl(wrap, true);
+        YAHOO.ext.EventManager.on(wrap, 'scroll', this.handleScroll, this, true);
+        
+        var hwrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap-headers'});
+        this.hwrap = getEl(hwrap, true);
+        
+        var bwrap = dh.append(wrap, {tag: 'div', cls: 'ygrid-wrap-body', id: container.id + '-body'});
+        this.bwrap = getEl(bwrap, true);
+        this.bwrap.setWidth(colModel.getTotalWidth());
+        bwrap.rows = bwrap.childNodes;
+        
+        this.footerHeight = 0;
+        var foot = this.appendFooter(this.pwrap);
+        if(foot){
+            this.footer = getEl(foot, true);
+            this.footerHeight = this.footer.getHeight();
+        }
+        this.updateWrapHeight();
+        
+        var hrow = dh.append(hwrap, {tag: 'span', cls: 'ygrid-hrow'});
+        this.hrow = hrow;
+        
+        if(!YAHOO.ext.util.Browser.isGecko){
+            // IE doesn't like iframes, we will leave this alone
+            var iframe = document.createElement('iframe');
+            iframe.className = 'ygrid-hrow-frame';
+            iframe.frameBorder = 0;
+            iframe.src = YAHOO.ext.SSL_SECURE_URL;
+            hwrap.appendChild(iframe);
+        }
+        this.headerCtrl = new YAHOO.ext.grid.HeaderController(this.grid);
+        this.headers = [];
+        this.cols = [];
+        
+        var htemplate = dh.createTemplate({
+           tag: 'span', cls: 'ygrid-hd ygrid-header-{0}', children: [{
+                tag: 'span', 
+                cls: 'ygrid-hd-body', 
+                html: '<table border="0" cellpadding="0" cellspacing="0">' +
+                      '<tbody><tr><td><span>{1}</span></td>' +
+                      '<td><span class="sort-desc"></span><span class="sort-asc"></span></td>' +
+                      '</tr></tbody></table>'
+           }]           
+        });
+        htemplate.compile();
+        for(var i = 0; i < colCount; i++){
+            var hd = htemplate.append(hrow, [i, colModel.getColumnHeader(i)]);
+            var spans = hd.getElementsByTagName('span');
+            hd.textNode = spans[1];
+            hd.sortDesc = spans[2];
+    	    hd.sortAsc = spans[3];
+    	    hd.columnIndex = i;
+            this.headers.push(hd);
+            if(colModel.isSortable(i)){
+                this.headerCtrl.register(hd);
+            }
+            var split = dh.append(hrow, {tag: 'span', cls: 'ygrid-hd-split'});
+            hd.split = split;
+        	
+        	if(colModel.isResizable(i) && !colModel.isFixed(i)){
+            	YAHOO.util.Event.on(split, 'dblclick', autoSizeDelegate.createCallback(i+0, true));
+            	var sb = new YAHOO.ext.SplitBar(split, hd, null, YAHOO.ext.SplitBar.LEFT);
+            	sb.columnIndex = i;
+            	sb.minSize = grid.minColumnWidth;
+            	sb.onMoved.subscribe(this.onColumnSplitterMoved, this, true);
+            	YAHOO.util.Dom.addClass(sb.proxy, 'ygrid-column-sizer');
+            	YAHOO.util.Dom.setStyle(sb.proxy, 'background-color', '');
+            	sb.dd._resizeProxy = function(){
+            	    var el = this.getDragEl();
+            	    YAHOO.util.Dom.setStyle(el, 'height', (hwrap.clientHeight+wrap.clientHeight-2) +'px');
+            	};
+        	}else{
+        	    split.style.cursor = 'default';
+        	}
+        }
+       if(grid.autoSizeColumns){
+            this.renderRows(dataModel);
+            this.autoSizeColumns();
+        }else{
+            this.updateColumns();
+            this.renderRows(dataModel);
+        }
+        
+        for(var i = 0; i < colCount; i++){
+            if(colModel.isHidden(i)){
+                this.hideColumn(i);
+            }
+        }
+        this.updateHeaderSortState();
+        return this.bwrap;
+    },
+    
+    onColumnSplitterMoved : function(splitter, newSize){
+        this.grid.colModel.setColumnWidth(splitter.columnIndex, newSize);
+        this.grid.fireEvent('columnresize', splitter.columnIndex, newSize);
+    },
+    
+    appendFooter : function(parentEl){
+        return null;  
+    },
+    
+    autoHeight : function(){
+        if(this.grid.autoHeight){
+            var h = this.getBodyHeight();
+            var c = this.grid.container;
+            var total = h + (parseInt(this.wrap.offsetTop, 10)||0) + 
+                    this.footerHeight + c.getBorderWidth('tb') + c.getPadding('tb')
+                    + (this.wrap.offsetHeight - this.wrap.clientHeight);
+            c.setHeight(total);
+            
+        }
+    },
+    
+    getBodyHeight : function(){
+        return this.grid.dataModel.getRowCount() * this.getRowHeight();;
+    },
+    
+    updateBodyHeight : function(){
+        this.getBodyTable().style.height = this.getBodyHeight() + 'px';
+        if(this.grid.autoHeight){
+            this.autoHeight();
+            this.updateWrapHeight();
+        }
+    }
+};
+YAHOO.ext.grid.GridView.SCROLLBARS_UNDER = 0;
+YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP = 1;
+YAHOO.ext.grid.GridView.prototype.scrollbarMode = YAHOO.ext.grid.GridView.SCROLLBARS_UNDER;
+
+YAHOO.ext.grid.GridView.prototype.fitColumnsToContainer = YAHOO.ext.grid.GridView.prototype.fitColumns;
+
+YAHOO.ext.grid.HeaderController = function(grid){
+	this.grid = grid;
+	this.headers = [];
+};
+
+YAHOO.ext.grid.HeaderController.prototype = {
+	register : function(header){
+		this.headers.push(header);
+		YAHOO.ext.EventManager.on(header, 'selectstart', this.cancelTextSelection, this, true);
+        YAHOO.ext.EventManager.on(header, 'mousedown', this.cancelTextSelection, this, true);
+        YAHOO.ext.EventManager.on(header, 'mouseover', this.headerOver, this, true);
+        YAHOO.ext.EventManager.on(header, 'mouseout', this.headerOut, this, true);
+        YAHOO.ext.EventManager.on(header, 'click', this.headerClick, this, true);
+	},
+	
+	headerClick : function(e){
+	    var grid = this.grid, cm = grid.colModel, dm = grid.dataModel;
+	    grid.stopEditing();
+        var header = grid.getHeaderFromChild(e.getTarget());
+        var state = dm.getSortState();
+        var direction = header.sortDir || 'ASC';
+        if(typeof state.column != 'undefined' && 
+                 grid.getView().getColumnIndexByDataIndex(state.column) == header.columnIndex){
+            direction = (state.direction == 'ASC' ? 'DESC' : 'ASC');
+        }
+        header.sortDir = direction;
+        dm.sort(cm, cm.getDataIndex(header.columnIndex), direction);
+    },
+    
+    headerOver : function(e){
+        var header = this.grid.getHeaderFromChild(e.getTarget());
+        YAHOO.util.Dom.addClass(header, 'ygrid-hd-over');
+        //YAHOO.ext.util.CSS.applyFirst(header, this.grid.id, '.ygrid-hd-over');
+    },
+    
+    headerOut : function(e){
+        var header = this.grid.getHeaderFromChild(e.getTarget());
+        YAHOO.util.Dom.removeClass(header, 'ygrid-hd-over');
+        //YAHOO.ext.util.CSS.revertFirst(header, this.grid.id, '.ygrid-hd-over');
+    },
+    
+    cancelTextSelection : function(e){
+    	e.preventDefault();
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/JSON.js.html b/www/extras/yui-ext/docs/output/JSON.js.html new file mode 100644 index 000000000..9ae52d198 --- /dev/null +++ b/www/extras/yui-ext/docs/output/JSON.js.html @@ -0,0 +1,129 @@ +JSON.js
/**
+ * @class YAHOO.ext.util.JSON
+ * Modified version of Douglas Crockford's json.js that doesn't
+ * mess with the Object prototype 
+ * http://www.json.org/js.html
+ * @singleton
+ */
+YAHOO.ext.util.JSON = new function(){
+    var useHasOwn = {}.hasOwnProperty ? true : false;
+    var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/;
+    
+    var pad = function(n) {
+        return n < 10 ? '0' + n : n;
+    };
+    
+    var m = {
+        '\b': '\\b',
+        '\t': '\\t',
+        '\n': '\\n',
+        '\f': '\\f',
+        '\r': '\\r',
+        '"' : '\\"',
+        '\\': '\\\\'
+    };
+
+    var encodeString = function(s){
+        if (/["\\\x00-\x1f]/.test(s)) {
+            return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) {
+                var c = m[b];
+                if(c){
+                    return c;
+                }
+                c = b.charCodeAt();
+                return '\\u00' +
+                    Math.floor(c / 16).toString(16) +
+                    (c % 16).toString(16);
+            }) + '"';
+        }
+        return '"' + s + '"';
+    };
+    
+    var encodeArray = function(o){
+        var a = ['['], b, i, l = o.length, v;
+            for (i = 0; i < l; i += 1) {
+                v = o[i];
+                switch (typeof v) {
+                    case 'undefined':
+                    case 'function':
+                    case 'unknown':
+                        break;
+                    default:
+                        if (b) {
+                            a.push(',');
+                        }
+                        a.push(v === null ? "null" : YAHOO.ext.util.JSON.encode(v));
+                        b = true;
+                }
+            }
+            a.push(']');
+            return a.join('');
+    };
+    
+    var encodeDate = function(o){
+        return '"' + o.getFullYear() + '-' +
+                pad(o.getMonth() + 1) + '-' +
+                pad(o.getDate()) + 'T' +
+                pad(o.getHours()) + ':' +
+                pad(o.getMinutes()) + ':' +
+                pad(o.getSeconds()) + '"';
+    };
+    
+    /**
+     * Encodes an Object, Array or other value
+     * @param {Mixed} o The variable to encode
+     * @return {String} The JSON string
+     */
+    this.encode = function(o){
+        if(typeof o == 'undefined' || o === null){
+            return 'null';
+        }else if(o instanceof Array){
+            return encodeArray(o);
+        }else if(o instanceof Date){
+            return encodeDate(o);
+        }else if(typeof o == 'string'){
+            return encodeString(o);
+        }else if(typeof o == 'number'){
+            return isFinite(o) ? String(o) : "null";
+        }else if(typeof o == 'boolean'){
+            return String(o);
+        }else {
+            var a = ['{'], b, i, v;
+            for (var i in o) {
+                if(!useHasOwn || o.hasOwnProperty(i)) {
+                    v = o[i];
+                    switch (typeof v) {
+                    case 'undefined':
+                    case 'function':
+                    case 'unknown':
+                        break;
+                    default:
+                        if(b){
+                            a.push(',');
+                        }
+                        a.push(this.encode(i), ':',
+                                v === null ? "null" : this.encode(v));
+                        b = true;
+                    }
+                }
+            }
+            a.push('}');
+            return a.join('');
+        }
+    };
+    
+    /**
+     * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
+     * @param {String} json The JSON string
+     * @return {Object} The resulting object
+     */
+    this.decode = function(json){
+        try{
+            if(validRE.test(json)) {
+                return eval('(' + json + ')');
+            }
+        }catch(e){
+        }
+        throw new SyntaxError("parseJSON");
+    };
+}();

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/JSONDataModel.js.html b/www/extras/yui-ext/docs/output/JSONDataModel.js.html new file mode 100644 index 000000000..f28658f8d --- /dev/null +++ b/www/extras/yui-ext/docs/output/JSONDataModel.js.html @@ -0,0 +1,81 @@ +JSONDataModel.js
+/**
+ * @class YAHOO.ext.grid.JSONDataModel
+ * This is an implementation of a DataModel used by the Grid. It works 
+ * with JSON data.
+ * <br>Example schema:
+ * <pre><code>
+ * var schema = {
+ *     root: 'Results.Result',
+ *     id: 'ASIN',
+ *     fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
+ * };
+ * </code></pre>
+ * @extends YAHOO.ext.grid.LoadableDataModel
+ * @constructor
+*/
+YAHOO.ext.grid.JSONDataModel = function(schema){
+    YAHOO.ext.grid.JSONDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.JSON);
+    /**@private*/
+    this.schema = schema;
+};
+YAHOO.extendX(YAHOO.ext.grid.JSONDataModel, YAHOO.ext.grid.LoadableDataModel, {
+    /**
+     * Overrides loadData in LoadableDataModel to process JSON data
+     * @param {Object} data The JSON object to load
+     * @param {Function} callback
+     */
+    loadData : function(data, callback, keepExisting){
+    	var idField = this.schema.id;
+    	var fields = this.schema.fields;
+    	if(this.schema.totalProperty){
+            var v = parseInt(eval('data.' + this.schema.totalProperty), 10);
+            if(!isNaN(v)){
+                this.totalCount = v;
+            }
+        }
+    	var rowData = [];
+    	try{
+    	    var root = eval('data.' + this.schema.root);
+    	    for(var i = 0; i < root.length; i++){
+    			var node = root[i];
+    			var colData = [];
+    			colData.node = node;
+    			colData.id = (typeof node[idField] != 'undefined' && node[idField] !== '' ? node[idField] : String(i));
+    			for(var j = 0; j < fields.length; j++) {
+    			    var val = node[fields[j]];
+    			    if(typeof val == 'undefined'){
+    			        val = '';
+    			    }
+    	            if(this.preprocessors[j]){
+    	                val = this.preprocessors[j](val);
+    	            }
+    	            colData.push(val);
+    	        }
+    	        rowData.push(colData);
+    		}
+    		if(keepExisting !== true){
+    		  this.removeAll();
+    		}
+            this.addRows(rowData);
+        	if(typeof callback == 'function'){
+    	    	callback(this, true);
+    	    }
+        	this.fireLoadEvent();
+    	}catch(e){
+    		this.fireLoadException(e, null);
+    		if(typeof callback == 'function'){
+    	    	callback(this, false);
+    	    }
+    	}
+    },
+    
+    /**
+     * Overrides getRowId in DefaultDataModel to return the ID value of the specified node. 
+     * @param {Number} rowIndex
+     * @return {Number}
+     */
+    getRowId : function(rowIndex){
+        return this.data[rowIndex].id;
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutDragDropMgr.js.html b/www/extras/yui-ext/docs/output/LayoutDragDropMgr.js.html new file mode 100644 index 000000000..df5102f10 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutDragDropMgr.js.html @@ -0,0 +1,35 @@ +LayoutDragDropMgr.js
YAHOO.ext.LayoutDragDropMgr = function(layout){
+    this.layout = layout;
+    this.pollId = null;
+    this.pollInterval = 50;
+    this.monitorDelegate = this.monitor.createDelegate(this);
+    this.mouseMoveDelegate = YAHOO.ext.EventManager.wrap(this.onMouseMove, this, true);
+};
+YAHOO.ext.LayoutDragDropMgr.prototype = {
+    startDrag : function(dragRegion){
+        this.dragOffsets = this.el.getXY() || [0,0];
+        this.dragRegion = dragRegion;
+        this.layout.getEl().on('mousemove', this.mouseMoveDelegate);
+        this.pollId = setInterval(this.monitorDelegate, this.pollInterval);
+    },
+    
+    endDragOver : function(dragRegion){
+        this.dragRegion = null;
+        this.layout.getEl().removeListener('mousemove', this.mouseMoveDelegate);
+        clearInterval(this.pollId);
+    },
+    
+    onMouseMove : function(e){
+        var xy = e.getXY();
+        this.pointX = xy[0] - this.dragOffsets[0];
+        this.pointY = xy[1] - this.dragOffsets[1];
+    },
+    
+    monitor : function(){
+        var x = this.pointX;
+        var y = this.pointY;
+        var pos = this.dragRegion.position;
+        
+    } 
+    
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutManager.js.html b/www/extras/yui-ext/docs/output/LayoutManager.js.html new file mode 100644 index 000000000..af9cec231 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutManager.js.html @@ -0,0 +1,131 @@ +LayoutManager.js
/**
+ * @class YAHOO.ext.LayoutManager
+ * @extends YAHOO.ext.util.Observable
+ * Base class for layout managers.
+ */
+YAHOO.ext.LayoutManager = function(container){
+    YAHOO.ext.LayoutManager.superclass.constructor.call(this);
+    this.el = getEl(container, true);
+    this.id = this.el.id;
+    this.el.addClass('ylayout-container');
+    /** false to disable window resize monitoring @type Boolean */
+    this.monitorWindowResize = true;
+    this.regions = {};
+    this.events = {
+        /**
+         * @event layout
+         * Fires when a layout is performed. 
+         * @param {YAHOO.ext.LayoutManager} this
+         */
+        'layout' : new YAHOO.util.CustomEvent(),
+        /**
+         * @event regionresized
+         * Fires when the user resizes a region. 
+         * @param {YAHOO.ext.LayoutRegion} region
+         * @param {Number} newSize The new size (width for east/west, height for north/south)
+         */
+        'regionresized' : new YAHOO.util.CustomEvent(),
+        /**
+         * @event regioncollapsed
+         * Fires when a region is collapsed. 
+         * @param {YAHOO.ext.LayoutRegion} region
+         */
+        'regioncollapsed' : new YAHOO.util.CustomEvent(),
+        /**
+         * @event regionexpanded
+         * Fires when a region is expanded.  
+         * @param {YAHOO.ext.LayoutRegion} region
+         */
+        'regionexpanded' : new YAHOO.util.CustomEvent()
+    };
+    this.updating = false;
+    YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true);
+};
+
+YAHOO.extendX(YAHOO.ext.LayoutManager, YAHOO.ext.util.Observable, {
+    /**
+     * Returns true if this layout is currently being updated
+     * @return {Boolean}
+     */
+    isUpdating : function(){
+        return this.updating; 
+    },
+    
+    /**
+     * Suspend the LayoutManager from doing auto-layouts while
+     * making multiple add or remove calls
+     */
+    beginUpdate : function(){
+        this.updating = true;    
+    },
+    
+    /**
+     * Restore auto-layouts and optionally disable the manager from performing a layout
+     * @param {Boolean} noLayout true to disable a layout update 
+     */
+    endUpdate : function(noLayout){
+        this.updating = false;
+        if(!noLayout){
+            this.layout();
+        }    
+    },
+    
+    layout: function(){
+        
+    },
+    
+    onRegionResized : function(region, newSize){
+        this.fireEvent('regionresized', region, newSize);
+        this.layout();
+    },
+    
+    onRegionCollapsed : function(region){
+        this.fireEvent('regioncollapsed', region);
+    },
+    
+    onRegionExpanded : function(region){
+        this.fireEvent('regionexpanded', region);
+    },
+        
+    /**
+     * Returns the size of the current view, This method normalizes document.body and element embedded layouts and
+     * performs box-model adjustments.
+     * @return {Object} The size as an object {width: (the width), height: (the height)}
+     */
+    getViewSize : function(){
+        var size;
+        if(this.el.dom != document.body){
+            this.el.beginMeasure();
+            size = this.el.getSize();
+            this.el.endMeasure();
+        }else{
+            size = {width: YAHOO.util.Dom.getViewportWidth(), height: YAHOO.util.Dom.getViewportHeight()};
+        }
+        size.width -= this.el.getBorderWidth('lr')-this.el.getPadding('lr');
+        size.height -= this.el.getBorderWidth('tb')-this.el.getPadding('tb');
+        return size;
+    },
+    
+    /**
+     * Returns the element this layout is bound to.
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    /**
+     * Returns the specified region.
+     * @param {String} target The region key
+     * @return {YAHOO.ext.LayoutRegion}
+     */
+    getRegion : function(target){
+        return this.regions[target];
+    },
+    
+    onWindowResize : function(){
+        if(this.monitorWindowResize){
+            this.layout();
+        }
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutRegion.js.html b/www/extras/yui-ext/docs/output/LayoutRegion.js.html new file mode 100644 index 000000000..ce0a4579e --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutRegion.js.html @@ -0,0 +1,587 @@ +LayoutRegion.js
/**
+ * @class YAHOO.ext.LayoutRegion
+ * @extends YAHOO.ext.util.Observable
+ * This class represents a region in a layout manager.
+ */
+YAHOO.ext.LayoutRegion = function(mgr, config, pos){
+    this.mgr = mgr;
+    this.position  = pos;
+    var dh = YAHOO.ext.DomHelper;
+    /** This regions container element @type YAHOO.ext.Element */
+    this.el = dh.append(mgr.el.dom, {tag: 'div', cls: 'ylayout-panel ylayout-panel-' + this.position}, true);
+    /** This regions title element @type YAHOO.ext.Element */
+    this.titleEl = dh.append(this.el.dom, {tag: 'div', unselectable: 'on', cls: 'yunselectable ylayout-panel-hd ylayout-title-'+this.position, children:[
+        {tag: 'span', cls: 'yunselectable ylayout-panel-hd-text', unselectable: 'on', html: '&#160;'},
+        {tag: 'div', cls: 'yunselectable ylayout-panel-hd-tools', unselectable: 'on'}
+    ]}, true);
+    this.titleEl.enableDisplayMode();
+    /** This regions title text element @type HTMLElement */
+    this.titleTextEl = this.titleEl.dom.firstChild;
+    this.tools = getEl(this.titleEl.dom.childNodes[1], true);
+    this.closeBtn = this.createTool(this.tools.dom, 'ylayout-close');
+    this.closeBtn.enableDisplayMode();
+    this.closeBtn.on('click', this.closeClicked, this, true);
+    this.closeBtn.hide();
+    /** This regions body element @type YAHOO.ext.Element */
+    this.bodyEl = dh.append(this.el.dom, {tag: 'div', cls: 'ylayout-panel-body'}, true);
+    this.events = {
+        /**
+         * @event invalidated
+         * Fires when the layout for this region is changed.
+         * @param {YAHOO.ext.LayoutRegion} this
+         */
+        'invalidated' : new YAHOO.util.CustomEvent('invalidated'),
+        /**
+         * @event visibilitychange
+         * Fires when this region is shown or hidden 
+         * @param {YAHOO.ext.LayoutRegion} this
+         * @param {Boolean} visibility true or false
+         */
+        'visibilitychange' : new YAHOO.util.CustomEvent('visibilitychange'),
+        /**
+         * @event paneladded
+         * Fires when a panel is added. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         * @param {YAHOO.ext.ContentPanel} panel The panel
+         */
+        'paneladded' : new YAHOO.util.CustomEvent('paneladded'),
+        /**
+         * @event panelremoved
+         * Fires when a panel is removed. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         * @param {YAHOO.ext.ContentPanel} panel The panel
+         */
+        'panelremoved' : new YAHOO.util.CustomEvent('panelremoved'),
+        /**
+         * @event collapsed
+         * Fires when this region is collapsed. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         */
+        'collapsed' : new YAHOO.util.CustomEvent('collapsed'),
+        /**
+         * @event expanded
+         * Fires when this region is expanded. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         */
+        'expanded' : new YAHOO.util.CustomEvent('expanded'),
+        /**
+         * @event panelactivated
+         * Fires when a panel is activated. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         * @param {YAHOO.ext.ContentPanel} panel The activated panel
+         */
+        'panelactivated' : new YAHOO.util.CustomEvent('panelactivated'),
+        /**
+         * @event resized
+         * Fires when the user resizes this region. 
+         * @param {YAHOO.ext.LayoutRegion} this
+         * @param {Number} newSize The new size (width for east/west, height for north/south)
+         */
+        'resized' : new YAHOO.util.CustomEvent('resized')
+    };
+    /** A collection of panels in this region. @type YAHOO.ext.util.MixedCollection */
+    this.panels = new YAHOO.ext.util.MixedCollection();
+    this.panels.getKey = this.getPanelId.createDelegate(this);
+    this.box = null;
+    this.visible = false;
+    this.collapsed = false;
+    this.hide();
+    this.on('paneladded', this.validateVisibility, this, true);
+    this.on('panelremoved', this.validateVisibility, this, true);
+    this.activePanel = null;
+    
+    this.applyConfig(config);
+    
+    /* One day this will get finished
+    this.draggable = config.draggable || false;
+    if(YAHOO.ext.LayoutRegionDD && mgr.enablePanelDD){
+        this.dd = new YAHOO.ext.LayoutRegionDD(this);
+    }*/
+};
+
+YAHOO.extendX(YAHOO.ext.LayoutRegion, YAHOO.ext.util.Observable, {
+    getPanelId : function(p){
+        return p.getId();
+    },
+    
+    applyConfig : function(config){
+        if(config.collapsible && this.position != 'center' && !this.collapsedEl){
+            var dh = YAHOO.ext.DomHelper;
+            this.collapseBtn = this.createTool(this.tools.dom, 'ylayout-collapse-'+this.position);
+            this.collapseBtn.mon('click', this.collapse, this, true);
+            /** This regions collapsed element @type YAHOO.ext.Element */
+            this.collapsedEl = dh.append(this.mgr.el.dom, {tag: 'div', cls: 'ylayout-collapsed ylayout-collapsed-'+this.position, children:[
+                {tag: 'div', cls: 'ylayout-collapsed-tools'}
+            ]}, true);
+            if(config.floatable !== false){
+               this.collapsedEl.addClassOnOver('ylayout-collapsed-over');
+               this.collapsedEl.mon('click', this.collapseClick, this, true);
+            }
+            this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild, 'ylayout-expand-'+this.position);
+            this.expandBtn.mon('click', this.expand, this, true);
+        }
+        if(this.collapseBtn){
+            this.collapseBtn.setVisible(config.collapsible == true);
+        }
+        this.cmargins = config.cmargins || this.cmargins || 
+                         (this.position == 'west' || this.position == 'east' ? 
+                             {top: 0, left: 2, right:2, bottom: 0} : 
+                             {top: 2, left: 0, right:0, bottom: 2});
+        this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0};
+        this.bottomTabs = config.tabPosition != 'top';
+        this.autoScroll = config.autoScroll || false;
+        if(this.autoScroll){
+            this.bodyEl.setStyle('overflow', 'auto');
+        }else{
+            this.bodyEl.setStyle('overflow', 'hidden');
+        }
+        if((!config.titlebar && !config.title) || config.titlebar === false){
+            this.titleEl.hide();
+        }else{
+            this.titleEl.show();
+            if(config.title){
+                this.titleTextEl.innerHTML = config.title;
+            }
+        }
+        this.duration = config.duration || .30;
+        this.slideDuration = config.slideDuration || .45;
+        this.config = config;
+        if(config.collapsed){
+            this.collapse(true);
+        }
+    },
+    
+    /**
+     * Resizes the region to the specified size. For vertical regions (west, east) this adjusts 
+     * the width, for horizontal (north, south) the height.
+     * @param {Number} newSize The new width or height
+     */
+    resizeTo : function(newSize){
+        switch(this.position){
+            case 'east':
+            case 'west':
+                this.el.setWidth(newSize);
+                this.fireEvent('resized', this, newSize);
+            break;
+            case 'north':
+            case 'south':
+                this.el.setHeight(newSize);
+                this.fireEvent('resized', this, newSize);
+            break;                
+        }
+    },
+    
+    getBox : function(){
+        var b;
+        if(!this.collapsed){
+            b = this.el.getBox(false, true);
+        }else{
+            b = this.collapsedEl.getBox(false, true);
+        }
+        return b;
+    },
+    
+    getMargins : function(){
+        return this.collapsed ? this.cmargins : this.margins;
+    },
+    
+    highlight : function(){
+        this.el.addClass('ylayout-panel-dragover'); 
+    },
+    
+    unhighlight : function(){
+        this.el.removeClass('ylayout-panel-dragover'); 
+    },
+    
+    updateBox : function(box){
+        this.box = box;
+        if(!this.collapsed){
+            this.el.dom.style.left = box.x + 'px';
+            this.el.dom.style.top = box.y + 'px';
+            this.el.setSize(box.width, box.height);
+            var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height;
+            bodyHeight -= this.el.getBorderWidth('tb');
+            bodyWidth = box.width - this.el.getBorderWidth('rl');
+            this.bodyEl.setHeight(bodyHeight);
+            this.bodyEl.setWidth(bodyWidth);
+            var tabHeight = bodyHeight;
+            if(this.tabs){
+                tabHeight = this.tabs.syncHeight(bodyHeight);
+                if(YAHOO.ext.util.Browser.isIE) this.tabs.el.repaint();
+            }
+            this.panelSize = {width: bodyWidth, height: tabHeight};
+            if(this.activePanel){
+                this.activePanel.setSize(bodyWidth, tabHeight);
+            }
+        }else{
+            this.collapsedEl.dom.style.left = box.x + 'px';
+            this.collapsedEl.dom.style.top = box.y + 'px';
+            this.collapsedEl.setSize(box.width, box.height);
+        }
+        if(this.tabs){
+            this.tabs.autoSizeTabs();
+        }
+    },
+    
+    /**
+     * Returns the container element for this region.
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    /**
+     * Hides this region.
+     */
+    hide : function(){
+        if(!this.collapsed){
+            this.el.dom.style.left = '-2000px';
+            this.el.hide();
+        }else{
+            this.collapsedEl.dom.style.left = '-2000px';
+            this.collapsedEl.hide();
+        }
+        this.visible = false;
+        this.fireEvent('visibilitychange', this, false);
+    },
+    
+    /**
+     * Shows this region if it was previously hidden.
+     */
+    show : function(){
+        if(!this.collapsed){
+            this.el.show();
+        }else{
+            this.collapsedEl.show();
+        }
+        this.visible = true;
+        this.fireEvent('visibilitychange', this, true);
+    },
+    
+    /**
+     * Returns true if this region is currently visible.
+     * @return {Boolean}
+     */
+    isVisible : function(){
+        return this.visible;
+    },
+    
+    closeClicked : function(){
+        if(this.activePanel){
+            this.remove(this.activePanel);
+        }
+    },
+    
+    collapseClick : function(e){
+       if(this.isSlid){
+           e.stopPropagation();
+           this.slideIn();
+       }else{
+           e.stopPropagation();
+           this.slideOut();
+       }   
+    },
+    
+    /**
+     * Collapses this region.
+     * @param {Boolean} skipAnim (optional) true to collapse the element without animation (if animate is true)
+     */
+    collapse : function(skipAnim){
+        if(this.collapsed) return;
+        this.collapsed = true;
+        if(this.split){
+            this.split.el.hide();
+        }
+        if(this.config.animate && skipAnim !== true){
+            this.animateCollapse();
+        }else{
+            this.el.setLocation(-20000,-20000);
+            this.el.hide();
+            this.collapsedEl.show();
+            this.fireEvent('collapsed', this); 
+        }
+        this.fireEvent('invalidated', this);    
+    },
+    
+    animateCollapse : function(){
+        // overridden
+    },
+    
+    /**
+     * Expand this region if it was previously collapsed.
+     * @param {YAHOO.ext.EventObject} e The event that triggered the expand (or null if calling manually)
+     * @param {Boolean} skipAnim (optional) true to expand the element without animation (if animate is true)
+     */
+    expand : function(e, skipAnim){
+        if(e) e.stopPropagation();
+        if(!this.collapsed) return;
+        if(this.isSlid){
+            this.slideIn(this.expand.createDelegate(this));
+            return;
+        }
+        this.collapsed = false;
+        this.el.show();
+        if(this.config.animate && skipAnim !== true){
+            this.animateExpand();
+        }else{
+            if(this.split){
+                this.split.el.show();
+            }
+            this.collapsedEl.setLocation(-2000,-2000);
+            this.collapsedEl.hide();
+            this.fireEvent('invalidated', this);
+            this.fireEvent('expanded', this);
+        }
+    },
+    
+    animateExpand : function(){
+        // overridden
+    },
+    
+    initTabs : function(){
+        this.bodyEl.setStyle('overflow', 'hidden');
+        var ts = new YAHOO.ext.TabPanel(this.bodyEl.dom, this.bottomTabs);
+        this.tabs = ts;
+        ts.resizeTabs = this.config.resizeTabs === true;
+        ts.minTabWidth = this.config.minTabWidth || 40;
+        ts.maxTabWidth = this.config.maxTabWidth || 250;
+        ts.preferredTabWidth = this.config.preferredTabWidth || 150;
+        ts.monitorResize = false;
+        ts.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden');
+        this.panels.each(this.initPanelAsTab, this);
+    },
+    
+    initPanelAsTab : function(panel){
+        var ti = this.tabs.addTab(panel.getEl().id, panel.getTitle(), null, 
+                    this.config.closeOnTab && panel.isClosable());
+        ti.on('activate', function(){ 
+              this.setActivePanel(panel); 
+        }, this, true);
+        if(this.config.closeOnTab){
+            ti.on('beforeclose', function(t, e){
+                e.cancel = true;
+                this.remove(panel);
+            }, this, true);
+        }
+        return ti;
+    },
+    
+    updatePanelTitle : function(panel, title){
+        if(this.activePanel == panel){
+            this.updateTitle(title);
+        }
+        if(this.tabs){
+            this.tabs.getTab(panel.getEl().id).setText(title);
+        }
+    },
+    
+    updateTitle : function(title){
+        if(this.titleTextEl && !this.config.title){
+            this.titleTextEl.innerHTML = (typeof title != 'undefined' && title.length > 0 ? title : "&#160;");
+        }
+    },
+    
+    setActivePanel : function(panel){
+        panel = this.getPanel(panel);
+        if(this.activePanel && this.activePanel != panel){
+            this.activePanel.setActiveState(false);
+        }
+        this.activePanel = panel;
+        panel.setActiveState(true);
+        if(this.panelSize){
+            panel.setSize(this.panelSize.width, this.panelSize.height);
+        }
+        this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable());
+        this.updateTitle(panel.getTitle());
+        this.fireEvent('panelactivated', this, panel);
+        /*
+        if(this.dd && !panel.enableDD){
+            this.dd.lock();
+        }*/
+    },
+    
+    /**
+     * Show the specified panel.
+     * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself
+     * @return {YAHOO.ext.ContentPanel} The shown panel or null
+     */
+    showPanel : function(panel){
+        if(panel = this.getPanel(panel)){
+            if(this.tabs){
+                this.tabs.activate(panel.getEl().id);
+            }else{
+                this.setActivePanel(panel);
+            }
+        }
+        return panel;
+    },
+    
+    /**
+     * Get the active panel for this region.
+     * @return {YAHOO.ext.ContentPanel} The active panel or null
+     */
+    getActivePanel : function(){
+        return this.activePanel;
+    },
+    
+    validateVisibility : function(){
+        if(this.panels.getCount() < 1){
+            this.updateTitle('&#160;');
+            this.closeBtn.hide();
+            this.hide();
+        }else{
+            if(!this.isVisible()){
+                this.show();
+            }
+        }
+    },
+    
+    /**
+     * Add the passed ContentPanel(s)
+     * @param {ContentPanel...} panel The ContentPanel(s) to add (you can pass more than one)
+     * @return {YAHOO.ext.ContentPanel} The panel added (if only one was added)
+     */
+    add : function(panel){
+        if(arguments.length > 1){
+            for(var i = 0, len = arguments.length; i < len; i++) {
+            	this.add(arguments[i]);
+            }
+            return null;
+        }
+        panel.setRegion(this);
+        this.panels.add(panel);
+        if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){
+            this.bodyEl.dom.appendChild(panel.getEl().dom);
+            this.setActivePanel(panel);
+            this.fireEvent('paneladded', this, panel);
+            return panel;
+        }
+        if(!this.tabs){
+            this.initTabs();
+        }else{
+            this.initPanelAsTab(panel);
+        }
+        this.tabs.activate(panel.getEl().id);
+        this.fireEvent('paneladded', this, panel);
+        return panel;
+    },
+    
+    /**
+     * Returns true if the panel is in this region.
+     * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself
+     * @return {Boolean}
+     */
+    hasPanel : function(panel){
+        if(typeof panel == 'object'){ // must be panel obj
+            panel = panel.getId();
+        }
+        return this.getPanel(panel) ? true : false;
+    },
+    
+    /**
+     * Hides the tab for the specified panel.
+     * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself
+     */
+    hidePanel : function(panel){
+        if(this.tabs && (panel = this.getPanel(panel))){
+            this.tabs.hideTab(panel.getEl().id);
+        }
+    },
+    
+    /**
+     * Unhides the tab for a previously hidden panel.
+     * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself
+     */
+    unhidePanel : function(panel){
+        if(this.tabs && (panel = this.getPanel(panel))){
+            this.tabs.unhideTab(panel.getEl().id);
+        }
+    },
+    
+    // broken
+    //clearPanels : function(){
+    //    this.panels.each(this.remove, this);
+    //},
+    
+    /**
+     * Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed.
+     * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself
+     * @param {Boolean} preservePanel Overrides the config preservePanel option
+     * @return {YAHOO.ext.ContentPanel} The panel that was removed
+     */
+    remove : function(panel, preservePanel){
+        panel = this.getPanel(panel);
+        if(!panel){
+            return null;
+        }
+        preservePanel = (typeof preservePanel != 'undefined' ? preservePanel : this.config.preservePanels === true);
+        var panelId = panel.getId();
+        this.panels.removeKey(panelId);
+        if(preservePanel){
+            document.body.appendChild(panel.getEl().dom);
+        }
+        if(this.tabs){
+            this.tabs.removeTab(panel.getEl().id);
+        }else if (!preservePanel){
+            this.bodyEl.dom.removeChild(panel.getEl().dom);
+        }
+        if(this.panels.getCount() == 1 && this.tabs && !this.config.alwaysShowTabs){
+            var p = this.panels.first();
+            var tempEl = document.createElement('span'); // temp holder to keep IE from deleting the node
+            tempEl.appendChild(p.getEl().dom);
+            this.bodyEl.update('');
+            this.bodyEl.dom.appendChild(p.getEl().dom);
+            tempEl = null;
+            this.updateTitle(p.getTitle());
+            this.tabs = null;
+            this.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden');
+            this.setActivePanel(p);
+        }
+        panel.setRegion(null);
+        if(this.activePanel == panel){
+            this.activePanel = null;
+        }
+        if(this.config.autoDestroy !== false && preservePanel !== true){
+            try{panel.destroy();}catch(e){}
+        }
+        this.fireEvent('panelremoved', this, panel);
+        return panel;
+    },
+    
+    /**
+     * Returns the TabPanel component used by this region
+     * @return {YAHOO.ext.TabPanel}
+     */
+    getTabs : function(){
+        return this.tabs;    
+    },
+    
+    /**
+     * Returns the panel specified or null if it's not in this region.
+     * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself
+     * @return {YAHOO.ext.ContentPanel}
+     */
+    getPanel : function(id){
+        if(typeof id == 'object'){ // must be panel obj
+            return id;
+        }
+        return this.panels.get(id);
+    },
+    
+    /**
+     * Returns this regions position (north/south/east/west/center).
+     * @return {String} 
+     */
+    getPosition: function(){
+        return this.position;    
+    },
+    
+    createTool : function(parentEl, className){
+        var btn = YAHOO.ext.DomHelper.append(parentEl, {tag: 'div', cls: 'ylayout-tools-button', 
+            children: [{tag: 'div', cls: 'ylayout-tools-button-inner ' + className, html: '&#160;'}]}, true);
+        btn.on('mouseover', btn.addClass.createDelegate(btn, ['ylayout-tools-button-over']));
+        btn.on('mouseout', btn.removeClass.createDelegate(btn, ['ylayout-tools-button-over']));
+        return btn;
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutRegionDD.js.html b/www/extras/yui-ext/docs/output/LayoutRegionDD.js.html new file mode 100644 index 000000000..f5c265ce1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutRegionDD.js.html @@ -0,0 +1,44 @@ +LayoutRegionDD.js
if(YAHOO.util.DDProxy){
+YAHOO.ext.LayoutRegionDD = function(region){
+    this.proxy = YAHOO.ext.DomHelper.append(document.body, 
+                {tag : 'div', cls: 'ylayout-panel-proxy', id: region.el.id + '-ddproxy'}, true);
+    this.proxy.setOpacity(.5);
+    YAHOO.ext.LayoutRegionDD.superclass.constructor.call(this, region.el.dom.id, 'PanelDrag', {dragElId: this.proxy.id, scroll:false})
+    this.layoutRegion = region;
+    this.setHandleElId(region.titleEl.id);
+};
+
+YAHOO.extendX(YAHOO.ext.LayoutRegionDD, YAHOO.util.DDProxy, {
+    endDrag : function(){
+        this.layoutRegion.mgr.endDragOver(this.layoutRegion);
+    },
+    
+    startDrag : function(){
+        this.layoutRegion.mgr.startDragOver(this.layoutRegion);
+    },
+    
+    onDragDrop : function(e, id){
+        var target = YAHOO.util.DragDropMgr.getDDById(id);
+        if(target && target.layoutRegion){
+            target.layoutRegion.unhighlight();
+            var p = this.layoutRegion.activePanel;
+            this.layoutRegion.remove(p);
+            target.layoutRegion.add(p);
+        }
+    },
+    
+    onDragEnter : function(e, id){
+        var target = YAHOO.util.DragDropMgr.getDDById(id);
+        if(target && target.layoutRegion){
+            target.layoutRegion.highlight();
+        }
+    },
+    
+    onDragOut : function(e, id){
+        var target = YAHOO.util.DragDropMgr.getDDById(id);
+        if(target && target.layoutRegion){
+            target.layoutRegion.unhighlight();
+        }
+    }
+});
+}

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LayoutStateManager.js.html b/www/extras/yui-ext/docs/output/LayoutStateManager.js.html new file mode 100644 index 000000000..d9e8f2657 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LayoutStateManager.js.html @@ -0,0 +1,68 @@ +LayoutStateManager.js
/*
+ * Private internal class for reading and applying state
+ */
+YAHOO.ext.LayoutStateManager = function(layout){
+     // default empty state
+     this.state = {
+        north: {},
+        south: {},
+        east: {},
+        west: {}       
+    };
+};
+
+YAHOO.ext.LayoutStateManager.prototype = {
+    init : function(layout, provider){
+        this.provider = provider;
+        var state = provider.get(layout.id+'-layout-state');
+        if(state){
+            var wasUpdating = layout.isUpdating();
+            if(!wasUpdating){
+                layout.beginUpdate();
+            }
+            for(var key in state){
+                if(typeof state[key] != 'function'){
+                    var rstate = state[key];
+                    var r = layout.getRegion(key);
+                    if(r && rstate){
+                        if(rstate.size){
+                            r.resizeTo(rstate.size);
+                        }
+                        if(rstate.collapsed == true){
+                            r.collapse(true);
+                        }else{
+                            r.expand(null, true);
+                        }
+                    }
+                }
+            }
+            if(!wasUpdating){
+                layout.endUpdate();
+            }
+            this.state = state; 
+        }
+        this.layout = layout;
+        layout.on('regionresized', this.onRegionResized, this, true);
+        layout.on('regioncollapsed', this.onRegionCollapsed, this, true);
+        layout.on('regionexpanded', this.onRegionExpanded, this, true);
+    },
+    
+    storeState : function(){
+        this.provider.set(this.layout.id+'-layout-state', this.state);
+    },
+    
+    onRegionResized : function(region, newSize){
+        this.state[region.getPosition()].size = newSize;
+        this.storeState();
+    },
+    
+    onRegionCollapsed : function(region){
+        this.state[region.getPosition()].collapsed = true;
+        this.storeState();
+    },
+    
+    onRegionExpanded : function(region){
+        this.state[region.getPosition()].collapsed = false;
+        this.storeState();
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LoadableDataModel.js.html b/www/extras/yui-ext/docs/output/LoadableDataModel.js.html new file mode 100644 index 000000000..93bf53e1f --- /dev/null +++ b/www/extras/yui-ext/docs/output/LoadableDataModel.js.html @@ -0,0 +1,331 @@ +LoadableDataModel.js
/**
+ * @class YAHOO.ext.grid.LoadableDataModel
+ * This class extends DefaultDataModel and adds the core functionality to load data remotely. Generally you will want to use one of it's subclasses.<br><br>
+ * @extends YAHOO.ext.grid.DefaultDataModel
+ * @constructor
+ * @param {String} dataType YAHOO.ext.grid.LoadableDataModel.XML, YAHOO.ext.grid.LoadableDataModel.TEXT or YAHOO.ext.grid.JSON
+*/
+YAHOO.ext.grid.LoadableDataModel = function(dataType){
+    YAHOO.ext.grid.LoadableDataModel.superclass.constructor.call(this, []);
+    
+    /** Fires when a successful load is completed - fireDirect sig: (this)
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     * @private
+     */
+    this.onLoad = new YAHOO.util.CustomEvent('load');
+    /** Fires when a load fails - fireDirect sig: (this, errorMsg, responseObj)
+     * @type YAHOO.util.CustomEvent 
+     * @deprecated Use addListener instead of accessing directly
+     * @private
+     */
+    this.onLoadException = new YAHOO.util.CustomEvent('loadException');
+    /**
+       * @event load
+       * Fires when new data has successfully been loaded
+       * @param {DataModel} this
+       */
+    this.events['load'] = this.onLoad;
+    /**
+       * @event beforeload
+       * Fires before a load takes place
+       * @param {DataModel} this
+       */
+    this.events['beforeload'] = new YAHOO.util.CustomEvent('beforeload');
+    /**
+       * @event loadexception
+       * Fires when there's an error loading data
+       * @param {DataModel} this
+       * @param {Exception} e The exception object or null
+       * @param {Object} response The Connect response object
+       */
+    this.events['loadexception'] = this.onLoadException;
+    
+    /**@private*/
+    this.dataType = dataType;
+    /**@private*/
+    this.preprocessors = [];
+    /**@private*/
+    this.postprocessors = [];
+    
+    // paging info
+    /** The active page @type Number*/
+    this.loadedPage = 1;
+    /** True to use remote sorting, initPaging automatically sets this to true @type Boolean */
+    this.remoteSort = false;
+    /** The number of records per page @type Number*/
+    this.pageSize = 0;
+    /** The script/page to call to provide paged/sorted data @type String*/
+    this.pageUrl = null;
+    /** An object of key/value pairs to be passed as parameters
+     * when loading pages/sorting @type Object*/
+    this.baseParams = {};
+    /** Maps named params to url parameters - Override to specify your own param names */
+    this.paramMap = {'page':'page', 'pageSize':'pageSize', 'sortColumn':'sortColumn', 'sortDir':'sortDir'};
+    
+};
+YAHOO.extendX(YAHOO.ext.grid.LoadableDataModel, YAHOO.ext.grid.DefaultDataModel, {
+    
+    /** @ignore */
+    setLoadedPage: function(pageNum, userCallback){
+        this.loadedPage = pageNum;
+        if(typeof userCallback == 'function'){
+            userCallback();
+        }
+    },
+    
+    /** Returns true if this model uses paging @return Boolean */
+    isPaged: function(){
+        return this.pageSize > 0;
+    },
+    
+    /** Returns the total number of records available, override if needed @return {Number} */
+    getTotalRowCount: function(){
+        return this.totalCount || this.getRowCount();
+    },
+    
+    /** Returns the number of records per page @return Number */
+    getPageSize: function(){
+        return this.pageSize;
+    },
+    
+    /** Returns the total number of pages available @return Number */
+    getTotalPages: function(){
+        if(this.getPageSize() == 0 || this.getTotalRowCount() == 0){
+            return 1;
+        }
+        return Math.ceil(this.getTotalRowCount()/this.getPageSize());
+    },
+    
+    /** Initializes paging for this model.
+     * @param {String} url
+     * @param {Number} pageSize
+     * @param {Object} baseParams (optional) Object containing key/value pairs to add to all requests
+     */
+    initPaging: function(url, pageSize, baseParams){
+        this.pageUrl = url;
+        this.pageSize = pageSize;
+        this.remoteSort = true;
+        if(baseParams) this.baseParams = baseParams;
+    },
+    
+    /** @ignore */
+    createParams: function(pageNum, sortColumn, sortDir){
+        var params = {}, map = this.paramMap;
+        for(var key in this.baseParams){
+            if(typeof this.baseParams[key] != 'function'){
+                params[key] = this.baseParams[key];
+            }
+        }
+        params[map['page']] = pageNum;
+        params[map['pageSize']] = this.getPageSize();
+        params[map['sortColumn']] = (typeof sortColumn == 'undefined' ? '' : sortColumn);
+        params[map['sortDir']] = sortDir || '';
+        return params;
+    },
+    
+    /**
+     * Loads a page of data.
+     * @param {Number} pageNum Which page to load. The first page is 1.
+     * @param {Function} callback (optional) Optional callback when loading is complete
+     * @param {Boolean} keepExisting (optional) true to keep existing data and append the new data
+     */
+    loadPage: function(pageNum, callback, keepExisting){
+        var sort = this.getSortState();
+        var params = this.createParams(pageNum, sort.column, sort.direction);
+        this.load(this.pageUrl, params, this.setLoadedPage.createDelegate(this, [pageNum, callback]), 
+                   keepExisting ? (pageNum-1) * this.pageSize : null);
+    },
+    
+    /** @ignore */
+    applySort: function(suppressEvent){
+    	if(!this.remoteSort){
+            YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this, arguments);
+        }else if(!suppressEvent){
+            var sort = this.getSortState();
+            if(sort.column){
+               this.fireRowsSorted(sort.column, sort.direction, true);
+            }
+        }
+    },
+    
+    /** @ignore */
+    resetPaging: function(){
+    	this.loadedPage = 1;
+    },
+    
+    /* Overridden sort method to use remote sorting if turned on */
+    sort: function(sortInfo, columnIndex, direction, suppressEvent){
+        if(!this.remoteSort){
+            YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this, arguments);
+        }else{
+            this.sortInfo = sortInfo;
+            this.sortColumn = columnIndex;
+            this.sortDir = direction;
+            var params = this.createParams(this.loadedPage, columnIndex, direction);
+            this.load(this.pageUrl, params, this.fireRowsSorted.createDelegate(this, [columnIndex, direction, true]));
+        }
+    },
+    
+    /**
+     * Initiates the loading of the data from the specified URL - Failed load attempts will 
+     * fire the {@link #loadexception} event.
+     * @param {Object/String} url The url from which the data can be loaded
+     * @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "param1=1&amp;param2=2" or as an object {param1: 1, param2: 2}
+     * @param {<i>Function</i>} callback (optional) Callback when load is complete - called with signature (this, rowCountLoaded)
+     * @param {<i>Number</i>} insertIndex (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+     */
+    load: function(url, params, callback, insertIndex){
+    	this.fireEvent('beforeload', this);
+    	if(params && typeof params != 'string'){ // must be object
+            var buf = [];
+            for(var key in params){
+                if(typeof params[key] != 'function'){
+                    buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&');
+                }
+            }
+            delete buf[buf.length-1];
+            params = buf.join('');
+        }
+        var cb = {
+            success: this.processResponse,
+            failure: this.processException,
+            scope: this,
+    		argument: {callback: callback, insertIndex: insertIndex}
+        };
+        var method = params ? 'POST' : 'GET';
+        YAHOO.util.Connect.asyncRequest(method, url, cb, params);
+    },
+    
+    /**@private*/
+    processResponse: function(response){
+        var cb = response.argument.callback;
+        var keepExisting = (typeof response.argument.insertIndex == 'number');
+        var insertIndex = response.argument.insertIndex;
+        switch(this.dataType){
+        	case YAHOO.ext.grid.LoadableDataModel.XML:
+        		this.loadData(response.responseXML, cb, keepExisting, insertIndex);
+        	break;
+        	case YAHOO.ext.grid.LoadableDataModel.JSON:
+        		var rtext = response.responseText;
+        		try { // this code is a modified version of Yahoo! UI DataSource JSON parsing
+    		        // Trim leading spaces
+    		        while(rtext.substring(0,1) == " ") {
+    		            rtext = rtext.substring(1, rtext.length);
+    		        }
+    		        // Invalid JSON response
+    		        if(rtext.indexOf("{") < 0) {
+    		            throw "Invalid JSON response";
+    		        }
+    		
+    		        // Empty (but not invalid) JSON response
+    		        if(rtext.indexOf("{}") === 0) {
+    		            this.loadData({}, response.argument.callback);
+    		            return;
+    		        }
+    		
+    		        // Turn the string into an object literal...
+    		        // ...eval is necessary here
+    		        var jsonObjRaw = eval("(" + rtext + ")");
+    		        if(!jsonObjRaw) {
+    		            throw "Error evaling JSON response";
+    		        }
+    				this.loadData(jsonObjRaw, cb, keepExisting, insertIndex);
+    		    } catch(e) {
+    		        this.fireLoadException(e, response);
+    				if(typeof callback == 'function'){
+    			    	callback(this, false);
+    			    }
+    		   	}
+        	break;
+        	case YAHOO.ext.grid.LoadableDataModel.TEXT:
+        		this.loadData(response.responseText, cb, keepExisting, insertIndex);
+        	break;
+        };
+    },
+    
+    /**@private*/
+    processException: function(response){
+        this.fireLoadException(null, response);
+        if(typeof response.argument.callback == 'function'){
+            response.argument.callback(this, false);
+        }
+    },
+    
+    fireLoadException: function(e, responseObj){
+        this.onLoadException.fireDirect(this, e, responseObj);
+    },
+    
+    fireLoadEvent: function(){
+        this.fireEvent('load', this.loadedPage, this.getTotalPages());
+    },
+    
+    /**
+     * Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates.
+     * @param {Number} columnIndex 
+     * @param {Function} fn
+     */
+    addPreprocessor: function(columnIndex, fn){
+        this.preprocessors[columnIndex] = fn;
+    },
+    
+    /**
+     * Gets the preprocessor function for the specified column.
+     * @param {Number} columnIndex
+     * @return {Function}
+     */
+    getPreprocessor: function(columnIndex){
+        return this.preprocessors[columnIndex];
+    },
+    
+    /**
+     * Removes a preprocessor function.
+     * @param {Number} columnIndex 
+     */
+    removePreprocessor: function(columnIndex){
+        this.preprocessors[columnIndex] = null;
+    },
+    
+    /**
+     * Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string before updating XML document).
+     * @param {Number} columnIndex 
+     * @param {Function} fn
+     */
+    addPostprocessor: function(columnIndex, fn){
+        this.postprocessors[columnIndex] = fn;
+    },
+    
+    /**
+     * Gets the postprocessor function for the specified column.
+     * @param {Number} columnIndex
+     * @return {Function}
+     */
+    getPostprocessor: function(columnIndex){
+        return this.postprocessors[columnIndex];
+    },
+    
+    /**
+     * Removes a postprocessor function.
+     * @param {Number} columnIndex
+     */
+    removePostprocessor: function(columnIndex){
+        this.postprocessors[columnIndex] = null;
+    },
+    /**
+     * Empty interface method - Called to process the data returned by the XHR - Classes which extend LoadableDataModel should implement this method.
+     * See {@link YAHOO.ext.XMLDataModel} for an example implementation.
+     */
+    loadData: function(data, callback, keepExisting, insertIndex){
+    	
+    }
+});
+
+YAHOO.ext.grid.LoadableDataModel.XML = 'xml';
+YAHOO.ext.grid.LoadableDataModel.JSON = 'json';
+YAHOO.ext.grid.LoadableDataModel.TEXT = 'text';
+
+
+
+
+
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LogMsg.html b/www/extras/yui-ext/docs/output/LogMsg.html new file mode 100644 index 000000000..9b95f5d1a --- /dev/null +++ b/www/extras/yui-ext/docs/output/LogMsg.html @@ -0,0 +1,156 @@ + + + + LogMsg + + + + + +
+ +

Class LogMsg

+ + + + + +
Package:Global
Class:LogMsg
Extends:Object
Defined In:logger-debug.js
+
+ The LogMsg class defines a single log message.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 category : StringLogMsg
Log category.
 msg : StringLogMsg
Log message.
 source : StringLogMsg
Log source. The first word passed in as the source argument.
 sourceDetail : StringLogMsg
Log source detail. The remainder of the string passed in as the source argument, not +including the first word (if any).
 time : DateLogMsg
Log timestamp.
+ +

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 LogMsg(oConfigs {Object})LogMsg
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

category

+ public String category +
+ Log category.
+
This property is defined by LogMsg.
+
+ +
+

msg

+ public String msg +
+ Log message.
+
This property is defined by LogMsg.
+
+ +
+

source

+ public String source +
+ Log source. The first word passed in as the source argument.
+
This property is defined by LogMsg.
+
+ +
+

sourceDetail

+ public String sourceDetail +
+ Log source detail. The remainder of the string passed in as the source argument, not +including the first word (if any).
+
This property is defined by LogMsg.
+
+ +
+

time

+ public Date time +
+ Log timestamp.
+
This property is defined by LogMsg.
+
+
+ + +

Constructor Details

+
+
+

LogMsg

+ public function LogMsg(oConfigs {Object}) +
+
+ Parameters: +
  • {Object} : oConfigs
    Object literal of configuration params.
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LogReader.html b/www/extras/yui-ext/docs/output/LogReader.html new file mode 100644 index 000000000..84aaa5fa0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/LogReader.html @@ -0,0 +1,493 @@ + + + + LogReader + + + + + +
+ +

Class LogReader

+ + + + + +
Package:Global
Class:LogReader
Extends:Object
Defined In:logger-debug.js
+
+ The LogReader class provides UI to read messages logged to YAHOO.widget.Logger.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bottom : StringLogReader
Public member to access CSS bottom position of the log reader container.
 fontSize : StringLogReader
Public member to access CSS font size of the log reader container.
 footerEnabled : BooleanLogReader
Whether or not the footer UI is enabled for the log reader.
 height : StringLogReader
Public member to access CSS height of the log reader container.
 left : StringLogReader
Public member to access CSS left position of the log reader container.
 logReaderEnabled : BooleanLogReader
Whether or not the log reader is enabled to output log messages.
 newestOnTop : BooleanLogReader
Whether or not newest message is printed on top.
 right : StringLogReader
Public member to access CSS right position of the log reader container.
 thresholdMax : NumberLogReader
Maximum number of messages a LogReader console will display.
 thresholdMin : NumberLogReader
When a LogReader console reaches its thresholdMax, it will clear out messages +and print out the latest thresholdMin n...
 top : StringLogReader
Public member to access CSS top position of the log reader container.
 verboseOutput : BooleanLogReader
Whether or not output is verbose (more readable). Setting to true will make +output more compact (less readable).
 width : StringLogReader
Public member to access CSS width of the log reader container.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LogReader([elContainer {HTMLElement}], [elContainer {String}], [oConfigs {Object}])LogReader
 formatMsg(oLogMsg {Object}) : StringLogReader
Formats message string to HTML for output to console.
 getLastTime() : DateLogReader
Gets timestamp of the last log.
 hide() : voidLogReader
Hides UI of log reader. Logging functionality is not disrupted.
 pause() : voidLogReader
Pauses output of log messages. While paused, log messages are not lost, but +get saved to a buffer and then output upo...
 resume() : voidLogReader
Resumes output of log messages, including outputting any log messages that +have been saved to buffer while paused.
 setTitle(sTitle {String}) : voidLogReader
Updates title to given string.
 show() : voidLogReader
Shows UI of log reader. Logging functionality is not disrupted.
 toString() : StringLogReader
Public accessor to the unique name of the LogReader instance.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

bottom

+ public String bottom +
+ Public member to access CSS bottom position of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

fontSize

+ public String fontSize +
+ Public member to access CSS font size of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

footerEnabled

+ public Boolean footerEnabled +
+ Whether or not the footer UI is enabled for the log reader.
+
This property is defined by LogReader.
+
+ +
+

height

+ public String height +
+ Public member to access CSS height of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

left

+ public String left +
+ Public member to access CSS left position of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

logReaderEnabled

+ public Boolean logReaderEnabled +
+ Whether or not the log reader is enabled to output log messages.
+
This property is defined by LogReader.
+
+ +
+

newestOnTop

+ public Boolean newestOnTop +
+ Whether or not newest message is printed on top.
+
This property is defined by LogReader.
+
+ +
+

right

+ public String right +
+ Public member to access CSS right position of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

thresholdMax

+ public Number thresholdMax +
+ Maximum number of messages a LogReader console will display.
+
This property is defined by LogReader.
+
+ +
+

thresholdMin

+ public Number thresholdMin +
+ When a LogReader console reaches its thresholdMax, it will clear out messages +and print out the latest thresholdMin number of messages.
+
This property is defined by LogReader.
+
+ +
+

top

+ public String top +
+ Public member to access CSS top position of the log reader container.
+
This property is defined by LogReader.
+
+ +
+

verboseOutput

+ public Boolean verboseOutput +
+ Whether or not output is verbose (more readable). Setting to true will make +output more compact (less readable).
+
This property is defined by LogReader.
+
+ +
+

width

+ public String width +
+ Public member to access CSS width of the log reader container.
+
This property is defined by LogReader.
+
+
+ + +

Constructor Details

+
+
+

LogReader

+ public function LogReader([elContainer {HTMLElement}], [elContainer {String}], [oConfigs {Object}]) +
+
+ Parameters: +
  • {HTMLElement} : elContainer
    (optional) DOM element reference of an existing DIV.
  • {String} : elContainer
    (optional) String ID of an existing DIV.
  • {Object} : oConfigs
    (optional) Object literal of configuration params.
+
+
+
+
+ +

Method Details

+
+ +
+

formatMsg

+ public function formatMsg(oLogMsg {Object}) +
+ Formats message string to HTML for output to console. +
+ Parameters: +
  • {Object} : oLogMsg
    Log message object.
+ Returns: +
    +
  • String
    HTML-formatted message for output to console.
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

getLastTime

+ public function getLastTime() +
+ Gets timestamp of the last log. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    Timestamp of the last log.
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

hide

+ public function hide() +
+ Hides UI of log reader. Logging functionality is not disrupted. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

pause

+ public function pause() +
+ Pauses output of log messages. While paused, log messages are not lost, but +get saved to a buffer and then output upon resume of log reader. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

resume

+ public function resume() +
+ Resumes output of log messages, including outputting any log messages that +have been saved to buffer while paused. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

setTitle

+ public function setTitle(sTitle {String}) +
+ Updates title to given string. +
+ Parameters: +
  • {String} : sTitle
    New title.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

show

+ public function show() +
+ Shows UI of log reader. Logging functionality is not disrupted. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogReader.
+
+ +
+

toString

+ public function toString() +
+ Public accessor to the unique name of the LogReader instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    Unique name of the LogReader instance.
  • +
+
+
+
This method is defined by LogReader.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/LogWriter.html b/www/extras/yui-ext/docs/output/LogWriter.html new file mode 100644 index 000000000..e25684c5e --- /dev/null +++ b/www/extras/yui-ext/docs/output/LogWriter.html @@ -0,0 +1,169 @@ + + + + LogWriter + + + + + +
+ +

Class LogWriter

+ + + + + +
Package:Global
Class:LogWriter
Extends:Object
Defined In:logger-debug.js
+
+ The LogWriter class provides a mechanism to log messages through +YAHOO.widget.Logger from a named source.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LogWriter(sSource {String})LogWriter
 getSource() : StringLogWriter
Public accessor to get the source name.
 log(sMsg {String}, sCategory {String}) : voidLogWriter
Logs a message attached to the source of the LogWriter.
 setSource(sSource {String}) : voidLogWriter
Public accessor to set the source name.
 toString() : StringLogWriter
Public accessor to the unique name of the LogWriter instance.
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

LogWriter

+ public function LogWriter(sSource {String}) +
+
+ Parameters: +
  • {String} : sSource
    Source of LogWriter instance.
+
+
+
+
+ +

Method Details

+
+ +
+

getSource

+ public function getSource() +
+ Public accessor to get the source name. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The LogWriter source.
  • +
+
+
+
This method is defined by LogWriter.
+
+ +
+

log

+ public function log(sMsg {String}, sCategory {String}) +
+ Logs a message attached to the source of the LogWriter. +
+ Parameters: +
  • {String} : sMsg
    The log message.
  • {String} : sCategory
    Category name.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogWriter.
+
+ +
+

setSource

+ public function setSource(sSource {String}) +
+ Public accessor to set the source name. +
+ Parameters: +
  • {String} : sSource
    Source of LogWriter instance.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LogWriter.
+
+ +
+

toString

+ public function toString() +
+ Public accessor to the unique name of the LogWriter instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    Unique name of the LogWriter instance.
  • +
+
+
+
This method is defined by LogWriter.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/MixedCollection.js.html b/www/extras/yui-ext/docs/output/MixedCollection.js.html new file mode 100644 index 000000000..912ae7e7f --- /dev/null +++ b/www/extras/yui-ext/docs/output/MixedCollection.js.html @@ -0,0 +1,188 @@ +MixedCollection.js
/**
+ * Collection class that maintains both numeric indexes and keys and exposes events
+ */
+YAHOO.ext.util.MixedCollection = function(allowFunctions){
+    this.items = [];
+    this.keys = [];
+    this.events = {
+        'clear' : new YAHOO.util.CustomEvent('clear'),
+        'add' : new YAHOO.util.CustomEvent('add'),
+        'replace' : new YAHOO.util.CustomEvent('replace'),
+        'remove' : new YAHOO.util.CustomEvent('remove')
+    }
+    this.allowFunctions = allowFunctions === true;
+};
+
+YAHOO.extendX(YAHOO.ext.util.MixedCollection, YAHOO.ext.util.Observable, {
+    allowFunctions : false,
+    add : function(key, o){
+        if(arguments.length == 1){
+            o = arguments[0];
+            key = this.getKey(o);
+        }
+        this.items.push(o);
+        if(typeof key != 'undefined' && key != null){
+            this.items[key] = o;
+            this.keys.push(key);
+        }
+        this.fireEvent('add', this.items.length-1, o, key);
+        return o;
+    },
+    
+    getKey : function(o){
+         return null;  
+    },
+    
+    replace : function(key, o){
+        if(typeof this.items[key] == 'undefined'){
+            return this.add(key, o);
+        }
+        var old = this.items[key];
+        if(typeof key == 'number'){ // array index key
+            this.items[key] = o;
+        }else{
+            var index = this.indexOfKey(key);
+            this.items[index] = o;
+            this.items[key] = o;
+        }
+        this.fireEvent('replace', key, old, o);
+        return o;
+    },
+    
+    addAll : function(objs){
+        if(arguments.length > 1 || objs instanceof Array){
+            var args = arguments.length > 1 ? arguments : objs;
+            for(var i = 0, len = args.length; i < len; i++){
+                this.add(args[i]);
+            }
+        }else{
+            for(var key in objs){
+                if(this.allowFunctions || typeof objs[key] != 'function'){
+                    this.add(objs[key], key);
+                }
+            }
+        }
+    },
+    
+    each : function(fn, scope){
+        for(var i = 0, len = this.items.length; i < len; i++){
+            fn.call(scope || window, this.items[i]);
+        }
+    },
+    
+    eachKey : function(fn, scope){
+        for(var i = 0, len = this.keys.length; i < len; i++){
+            fn.call(scope || window, this.keys[i], this.items[i]);
+        }
+    },
+    
+    find : function(fn, scope){
+        for(var i = 0, len = this.items.length; i < len; i++){
+            if(fn.call(scope || window, this.items[i])){
+                return this.items[i];
+            }
+        }
+        return null;
+    },
+    
+    insert : function(index, key, o){
+        if(arguments.length == 2){
+            o = arguments[1];
+            key = this.getKey(o);
+        }
+        if(index >= this.items.length){
+            return this.add(o, key);
+        }
+        this.items.splice(index, 0, o);
+        if(typeof key != 'undefined' && key != null){
+            this.items[key] = o;
+            this.keys.splice(index, 0, key);
+        }
+        this.fireEvent('add', index, o, key);
+        return o;
+    },
+    
+    remove : function(o){
+        var index = this.indexOf(o);
+        this.items.splice(index, 1);
+        if(typeof this.keys[index] != 'undefined'){
+            var key = this.keys[index];
+            this.keys.splice(index, 1);
+            delete this.items[key];
+        }
+        this.fireEvent('remove', o);
+        return o;
+    },
+    
+    removeAt : function(index){
+        this.items.splice(index, 1);
+        var key = this.keys[index];
+        if(typeof key != 'undefined'){
+             this.keys.splice(index, 1);
+             delete this.items[key];
+        }
+        this.fireEvent('remove', o, key);
+    },
+    
+    removeKey : function(key){
+        var o = this.items[key];
+        var index = this.indexOf(o);
+        this.items.splice(index, 1);
+        this.keys.splice(index, 1);
+        delete this.items[key];
+        this.fireEvent('remove', o, key);
+    },
+    
+    getCount : function(){
+        return this.items.length;  
+    },
+    
+    indexOf : function(o){
+        if(!this.items.indexOf){
+            for(var i = 0, len = this.items.length; i < len; i++){
+                if(this.items[i] == o) return i;
+            }
+            return -1;
+        }else{
+            return this.items.indexOf(o);
+        }
+    },
+    
+    indexOfKey : function(key){
+        if(!this.keys.indexOf){
+            for(var i = 0, len = this.key.length; i < len; i++){
+                if(this.key[i] == o) return i;
+            }
+            return -1;
+        }else{
+            return this.keys.indexOf(o);
+        }
+    },
+    
+    item : function(key){
+        return this.items[key];
+    },
+    
+    contains : function(o){
+        return this.indexOf(o) != -1;
+    },
+    
+    containsKey : function(key){
+        return typeof this.items[key] != 'undefined';
+    },
+    
+    clear : function(o){
+        this.items = [];
+        this.keys = [];
+        this.fireEvent('clear');
+    },
+    
+    first : function(){
+        return this.items[0];  
+    },
+    
+    last : function(){
+        return this.items[this.items.length];    
+    }
+});
+YAHOO.ext.util.MixedCollection.prototype.get = YAHOO.ext.util.MixedCollection.prototype.item;

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/NumberEditor.js.html b/www/extras/yui-ext/docs/output/NumberEditor.js.html new file mode 100644 index 000000000..870ecf1d5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/NumberEditor.js.html @@ -0,0 +1,166 @@ +NumberEditor.js
/**
+ * @class YAHOO.ext.grid.NumberEditor
+ * @extends YAHOO.ext.grid.CellEditor
+Provides a masked editor for numeric values. Invalid keys are ignored. It supports the following configuration options:
+<ul class="list">
+<li><i>allowDecimals</i> - True if the cell can have decimal values.</li>
+<li><i>decimalSeparator</i> - Character(s) to allow as the decimal separator.</li>
+<li><i>decimalPrecision</i> - Set the maximum decimal precision.</li>
+<li><i>decimalPrecisionFcn</i> - Define the function to call to remove extra precision (ie. Math.floor, Math.round, Math.ceil or your own function).</li>
+<li><i>allowNegative</i> - True if the cell allows negative values.</li>
+<li><i>selectOnFocus</i> - True to select the text when the editor is activated.</li>
+<li><i>minValue</i> - The minimum value the cell will allow.</li>
+<li><i>maxValue</i> - The maximum value the cell will allow.</li>
+<li><i>minText</i> - The tooltip to display when the value in the cell is below the minimum.</li>
+<li><i>maxText</i> - The tooltip to display when the value in the cell is above the maximum.</li>
+<li><i>nanText</i> - The tooltip to display when the value in the cell is not a valid number (for example, negatives are allowed and the value in the cell is just "-" with no numbers).</li>
+<li><i>allowBlank</i> - True if the cell is allowed to be empty.</li>
+<li><i>blankText</i> - The tooltip (error message) to display when the cell is empty and is not allowed to be.</li>
+<li><i>validator</i> - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.</li>
+<li><i>validationDelay</i> - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).</li>
+</ul>
+For more information on using this editor, see <a href="http://www.jackslocum.com/yui/2006/09/10/adding-built-in-editing-support-to-the-yahoo-ui-extensions-grid/">this blog post</a>.
+* @constructor
+* Create a new NumberEditor
+* @param {Object} config
+ */
+YAHOO.ext.grid.NumberEditor = function(config){
+    var element = document.createElement('input');
+    element.type = 'text';
+    element.className = 'ygrid-editor ygrid-num-editor';
+    element.setAttribute('autocomplete', 'off');
+    document.body.appendChild(element);
+    YAHOO.ext.grid.NumberEditor.superclass.constructor.call(this, element);
+    YAHOO.ext.util.Config.apply(this, config);
+};
+YAHOO.extendX(YAHOO.ext.grid.NumberEditor, YAHOO.ext.grid.CellEditor);
+
+YAHOO.ext.grid.NumberEditor.prototype.initEvents = function(){
+    var stopOnEnter = function(e){
+        if(e.browserEvent.keyCode == e.RETURN){
+            this.stopEditing(true);
+        }else if(e.browserEvent.keyCode == e.ESC){
+            this.setValue(this.originalValue);
+            this.stopEditing(true);
+        }
+    };
+    
+    var allowed = "0123456789";
+    if(this.allowDecimals){
+        allowed += this.decimalSeparator;
+    }
+    if(this.allowNegative){
+        allowed += '-';
+    }
+    var keyPress = function(e){
+        var c = e.getCharCode();
+        if(c != e.BACKSPACE && allowed.indexOf(String.fromCharCode(c)) === -1){
+            e.stopEvent();
+        }
+    };
+    this.element.mon('keydown', stopOnEnter, this, true);
+    var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this);
+    this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay]));
+    this.element.mon('keypress', keyPress, this, true);
+    this.element.on('blur', this.stopEditing, this, true);
+};
+
+YAHOO.ext.grid.NumberEditor.prototype.validate = function(){
+    var dom = this.element.dom;
+    var value = dom.value;
+    if(value.length < 1){ // if it's blank
+         if(this.allowBlank){
+             dom.title = '';
+             this.element.removeClass('ygrid-editor-invalid');
+             return true;
+         }else{
+             dom.title = this.blankText;
+             this.element.addClass('ygrid-editor-invalid');
+             return false;
+         }
+    }
+    if(value.search(/\d+/) === -1){
+        dom.title = this.nanText.replace('%0', value);
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    var num = this.parseValue(value);
+    if(num < this.minValue){
+        dom.title = this.minText.replace('%0', this.minValue);
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    if(num > this.maxValue){
+        dom.title = this.maxText.replace('%0', this.maxValue);
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    var msg = this.validator(value);
+    if(msg !== true){
+        dom.title = msg;
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    dom.title = '';
+    this.element.removeClass('ygrid-editor-invalid');
+    return true;
+};
+
+YAHOO.ext.grid.NumberEditor.prototype.show = function(){
+    this.element.dom.title = '';
+    YAHOO.ext.grid.NumberEditor.superclass.show.call(this);
+    if(this.selectOnFocus){
+        try{
+            this.element.dom.select();
+        }catch(e){}
+    }
+    this.validate(this.element.dom.value);
+};
+
+YAHOO.ext.grid.NumberEditor.prototype.getValue = function(){
+   if(!this.validate()){
+       return this.originalValue;
+   }else{
+       var value = this.element.dom.value;
+       if(value.length < 1){
+           return value;
+       } else{
+           return this.fixPrecision(this.parseValue(value));
+       }
+   }   
+};
+YAHOO.ext.grid.NumberEditor.prototype.parseValue = function(value){
+    return parseFloat(new String(value).replace(this.decimalSeparator, '.'));
+};
+
+YAHOO.ext.grid.NumberEditor.prototype.fixPrecision = function(value){
+   if(!this.allowDecimals || this.decimalPrecision == -1 || isNaN(value) || value == 0 || !value){
+       return value;
+   }
+   // this should work but doesn't due to precision error in JS
+   // var scale = Math.pow(10, this.decimalPrecision);
+   // var fixed = this.decimalPrecisionFcn(value * scale);
+   // return fixed / scale;
+   //
+   // so here's our workaround:
+   var scale = Math.pow(10, this.decimalPrecision+1);
+   var fixed = this.decimalPrecisionFcn(value * scale);
+   fixed = this.decimalPrecisionFcn(fixed/10);
+   return fixed / (scale/10);
+};
+
+YAHOO.ext.grid.NumberEditor.prototype.allowBlank = true;
+YAHOO.ext.grid.NumberEditor.prototype.allowDecimals = true;
+YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator = '.';
+YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision = 2;
+YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn = Math.floor;
+YAHOO.ext.grid.NumberEditor.prototype.allowNegative = true;
+YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus = true;
+YAHOO.ext.grid.NumberEditor.prototype.minValue = Number.NEGATIVE_INFINITY;
+YAHOO.ext.grid.NumberEditor.prototype.maxValue = Number.MAX_VALUE;
+YAHOO.ext.grid.NumberEditor.prototype.minText = 'The minimum value for this field is %0';
+YAHOO.ext.grid.NumberEditor.prototype.maxText = 'The maximum value for this field is %0';
+YAHOO.ext.grid.NumberEditor.prototype.blankText = 'This field cannot be blank';
+YAHOO.ext.grid.NumberEditor.prototype.nanText = '%0 is not a valid number';
+YAHOO.ext.grid.NumberEditor.prototype.validationDelay = 100;
+YAHOO.ext.grid.NumberEditor.prototype.validator = function(){return true;};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/PagedGridView.js.html b/www/extras/yui-ext/docs/output/PagedGridView.js.html new file mode 100644 index 000000000..17f3a86f6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/PagedGridView.js.html @@ -0,0 +1,194 @@ +PagedGridView.js
/**
+ * @class YAHOO.ext.grid.PagedGridView
+ * @extends YAHOO.ext.grid.GridView
+ * Extends the default GridView to add a paging interface.
+ * @constructor
+ * This class is created for you automatically if your data model is set to use paging.
+ */
+YAHOO.ext.grid.PagedGridView = function(){
+    YAHOO.ext.grid.PagedGridView.superclass.constructor.call(this);
+    this.cursor = 1;
+};
+
+YAHOO.extendX(YAHOO.ext.grid.PagedGridView, YAHOO.ext.grid.GridView, {
+    appendFooter : function(parentEl){
+        var fwrap = document.createElement('div');
+        fwrap.className = 'ygrid-wrap-footer';
+        var fbody = document.createElement('span');
+        fbody.className = 'ygrid-footer';
+        fwrap.appendChild(fbody);
+        parentEl.appendChild(fwrap);
+        this.createPagingToolbar(fbody);
+        return fwrap;
+    },
+
+    createPagingToolbar : function(container){
+        var tb = new YAHOO.ext.Toolbar(container);
+        this.pageToolbar = tb;
+        this.first = tb.addButton({
+            tooltip: this.firstText, 
+            className: 'ygrid-page-first',
+            disabled: true,
+            click: this.onClick.createDelegate(this, ['first'])
+        });
+        this.prev = tb.addButton({
+            tooltip: this.prevText, 
+            className: 'ygrid-page-prev', 
+            disabled: true,
+            click: this.onClick.createDelegate(this, ['prev'])
+        });
+        tb.addSeparator();
+        tb.add(this.beforePageText);
+        var pageBox = document.createElement('input');
+        pageBox.type = 'text';
+        pageBox.size = 3;
+        pageBox.value = '1';
+        pageBox.className = 'ygrid-page-number';
+        tb.add(pageBox);
+        this.field = getEl(pageBox, true);
+        this.field.mon('keydown', this.onEnter, this, true);
+        this.field.on('focus', function(){pageBox.select();});
+        this.afterTextEl = tb.addText(this.afterPageText.replace('%0', '1'));
+        this.field.setHeight(18);
+        tb.addSeparator();
+        this.next = tb.addButton({
+            tooltip: this.nextText, 
+            className: 'ygrid-page-next', 
+            disabled: true,
+            click: this.onClick.createDelegate(this, ['next'])
+        });
+        this.last = tb.addButton({
+            tooltip: this.lastText, 
+            className: 'ygrid-page-last', 
+            disabled: true,
+            click: this.onClick.createDelegate(this, ['last'])
+        });
+        tb.addSeparator();
+        this.loading = tb.addButton({
+            tooltip: this.refreshText, 
+            className: 'ygrid-loading',
+            disabled: true,
+            click: this.onClick.createDelegate(this, ['refresh'])
+        });
+        this.onPageLoaded(1, this.grid.dataModel.getTotalPages());
+    },
+    
+    /**
+     * Returns the toolbar used for paging so you can add new buttons.
+     * @return {YAHOO.ext.Toolbar}
+     */
+    getPageToolbar : function(){
+        return this.pageToolbar;  
+    },
+    
+    onPageLoaded : function(pageNum, totalPages){
+        this.cursor = pageNum;
+        this.lastPage = totalPages;
+        this.afterTextEl.innerHTML = this.afterPageText.replace('%0', totalPages);
+        this.field.dom.value = pageNum;
+        this.first.setDisabled(pageNum == 1);
+        this.prev.setDisabled(pageNum == 1);
+        this.next.setDisabled(pageNum == totalPages);
+        this.last.setDisabled(pageNum == totalPages);
+        this.loading.enable();
+    },
+    
+    onLoadError : function(){
+        this.loading.enable();
+    },
+    
+    onEnter : function(e){
+        if(e.browserEvent.keyCode == e.RETURN){
+            var v = this.field.dom.value;
+            if(!v){
+                this.field.dom.value = this.cursor;
+                return;
+            }
+            var pageNum = parseInt(v, 10);
+            if(isNaN(pageNum)){
+                this.field.dom.value = this.cursor;
+                return;
+            }
+            pageNum = Math.min(Math.max(1, pageNum), this.lastPage);
+            this.grid.dataModel.loadPage(pageNum);
+            e.stopEvent();
+        }
+    },
+    
+    beforeLoad : function(){
+        if(this.loading){
+            this.loading.disable();
+        }  
+    },
+    
+    onClick : function(which){
+        switch(which){
+            case 'first':
+                this.grid.dataModel.loadPage(1);
+            break;
+            case 'prev':
+                this.grid.dataModel.loadPage(this.cursor -1);
+            break;
+            case 'next':
+                this.grid.dataModel.loadPage(this.cursor + 1);
+            break;
+            case 'last':
+                this.grid.dataModel.loadPage(this.lastPage);
+            break;
+            case 'refresh':
+                this.grid.dataModel.loadPage(this.cursor);
+            break;
+        }
+    },
+    
+    unplugDataModel : function(dm){
+        dm.removeListener('beforeload', this.beforeLoad, this);
+        dm.removeListener('load', this.onPageLoaded, this);
+        dm.removeListener('loadexception', this.onLoadError, this);
+        YAHOO.ext.grid.PagedGridView.superclass.unplugDataModel.call(this, dm);
+    },
+    
+    plugDataModel : function(dm){
+        dm.on('beforeload', this.beforeLoad, this, true);
+        dm.on('load', this.onPageLoaded, this, true);
+        dm.on('loadexception', this.onLoadError, this);
+        YAHOO.ext.grid.PagedGridView.superclass.plugDataModel.call(this, dm);
+    },
+    
+    /**
+     * Customizable piece of the default paging text (defaults to "Page")
+     * @type String
+     */
+    beforePageText : "Page",
+    /**
+     * Customizable piece of the default paging text (defaults to "of %0")
+     * @type String
+     */
+    afterPageText : "of %0",
+    /**
+     * Customizable piece of the default paging text (defaults to "First Page")
+     * @type String
+     */
+    firstText : "First Page",
+    /**
+     * Customizable piece of the default paging text (defaults to "Previous Page")
+     * @type String
+     */
+    prevText : "Previous Page",
+    /**
+     * Customizable piece of the default paging text (defaults to "Next Page")
+     * @type String
+     */
+    nextText : "Next Page",
+    /**
+     * Customizable piece of the default paging text (defaults to "Last Page")
+     * @type String
+     */
+    lastText : "Last Page",
+    /**
+     * Customizable piece of the default paging text (defaults to "Refresh")
+     * @type String
+     */
+    refreshText : "Refresh"
+});
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Resizable.js.html b/www/extras/yui-ext/docs/output/Resizable.js.html new file mode 100644 index 000000000..9ce88ea9e --- /dev/null +++ b/www/extras/yui-ext/docs/output/Resizable.js.html @@ -0,0 +1,654 @@ +Resizable.js
/**
+ * @class YAHOO.ext.Resizable
+ * @extends YAHOO.ext.util.Observable
+ * <p>Applies drag handles to an element to make it resizable. The drag handles are inserted into the element 
+ * and positioned absolute. Some elements, such as a textarea or image, don't support this. To overcome that, you can wrap
+ * the textarea in a div and set "resizeChild" to true (or the id of the textarea).</p>
+ * <p>
+ * By default handles are displayed when the mouse is near the edge of the element. To make the handles displayed all the time,
+ * add a class "yresizable-pinned" to the element. Note: depending on your element you may need to 
+ * apply "adjustments" (see below) to get the handles to look right when pinned.
+ * </p>
+ * Here's a Resizable with every possible config option and it's default value:
+<pre><code>
+var resizer = new YAHOO.ext.Resizable('element-id', {
+    resizeChild : false, // true to resize the firstChild or an id/element to resize
+    adjustments : [0, 0], // or "auto" to have resizable calculate 
+    width : null, (leave blank to use default/css size)
+    height : null, 
+    minWidth : 5,
+    minHeight : 5,
+    maxWidth : 10000,
+    maxHeight : 10000,
+    widthIncrement : 0, // snapping
+    heightIncrement : 0, // snapping
+    enabled : true,
+    animate : false, // (ignored if resizeChild is true)
+    duration : .35,
+    dynamic : false, // true for real time sizing instead of proxy resizing
+    multiDirectional : false, // true for 4 way adjustments
+    disableTrackOver : false, // disable mouse over tracking for pinned resizers
+    easing : YAHOO.util.Easing.easeOutStrong,
+    pinned: false, // true to pin the handles to always be displayed
+    wrap: false, // automatic wrapping for elements that need it (like textarea/img)
+    minX: 0,
+    minY: 0
+});
+resizer.on('resize', myHandler);
+</code></pre>
+* <p>
+ * To hide a particular handle, set it's display to none in CSS, or through script:<br>
+ * resizer.east.setDisplayed(false);
+ * </p>
+ * @constructor
+ * Create a new resizable component
+ * @param {String/HTMLElement/YAHOO.ext.Element} el The id or element to resize
+ * @param {Object} config configuration options
+  */
+YAHOO.ext.Resizable = function(el, config){
+    this.el = getEl(el);
+    
+    if(config && config.wrap){
+        config.resizeChild = this.el;
+        this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : null);
+        this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap';
+        this.el.setStyle('overflow', 'hidden');
+        this.el.setPositioning(config.resizeChild.getPositioning());
+        config.resizeChild.clearPositioning();
+        if(!config.width || !config.height){
+            var csize = config.resizeChild.getSize();
+            //csize.width -= config.adjustments[0];
+            //csize.height -= config.adjustments[1];
+            this.el.setSize(csize.width, csize.height);
+        }
+        if(config.pinned && !config.adjustments){
+            config.adjustments = 'auto';
+        }
+    }
+    
+    this.proxy = this.el.createProxy({tag: 'div', cls: 'yresizable-proxy', id: this.el.id + '-rzproxy'})
+    this.proxy.unselectable();
+    
+    // the overlay traps mouse events while dragging and fixes iframe issue
+    this.overlay = this.el.createProxy({tag: 'div', cls: 'yresizable-overlay', html: '&#160;'});
+    this.overlay.unselectable();
+    this.overlay.enableDisplayMode('block');
+    this.overlay.mon('mousemove', this.onMouseMove, this, true);
+    this.overlay.mon('mouseup', this.onMouseUp, this, true);
+    
+    YAHOO.ext.util.Config.apply(this, config, {
+        /** True to resizeSize the first child or id/element to resize @type YAHOO.ext.Element */
+        resizeChild : false,
+        /** String "auto" or an array [width, height] with values to be <b>added</b> to the resize operation's new size. @type Array/String */
+        adjustments : [0, 0],
+        /** The minimum width for the element @type Number */
+        minWidth : 5,
+        /** The minimum height for the element @type Number */
+        minHeight : 5,
+        /** The maximum width for the element @type Number */
+        maxWidth : 10000,
+        /** The maximum height for the element @type Number */
+        maxHeight : 10000,
+        /** false to disable resizing @type Boolean */
+        enabled : true,
+        /** True to animate the resize (not compatible with dynamic sizing) @type Boolean */
+        animate : false,
+        /** Animation duration @type Float */
+        duration : .35,
+        /** True to resize the element while dragging instead of using a proxy @type Boolean */
+        dynamic : false,
+        // these 3 are only available at config time
+        /** String consisting of the resize handles to display. Valid handles are 
+         * n (north), s (south) e (east), w (west), ne (northeast), nw (northwest), se (southeast), sw (southwest) 
+         * and all (which applies them all). If this is blank it defaults to "e,s,se". Handles can be delimited using
+         * a space, comma or semi-colon. This is only applied at config time.  @type String*/
+        handles : false,
+        multiDirectional : false,
+        /** true to disable mouse tracking. This is only applied at config time.  @type Boolean*/
+        disableTrackOver : false,
+        /** Animation easing @type YAHOO.util.Easing */
+        easing : YAHOO.util.Easing ? YAHOO.util.Easing.easeOutStrong : null,
+        /** The increment to snap the width resize in pixels (dynamic must be true) @type Number */
+        widthIncrement : 0,
+        /** The increment to snap the height resize in pixels (dynamic must be true) @type Number */
+        heightIncrement : 0,
+        /** true to pin the resize handles. This is only applied at config time.  @type Boolean*/
+        pinned : false,
+        /** The initial width for the element @type Number */
+        width : null,
+        /** The initial height for the element @type Number */
+        height : null,
+        /** true to preserve the initial size ratio.  @type Boolean*/
+        preserveRatio : false,
+        /** true for transparent handles. This is only applied at config time.  @type Boolean*/
+        transparent: false,
+        /** The minimum allowed page X for the element (only used for west resizing, defaults to 0) @type Number */
+        minX: 0,
+        /** The minimum allowed page Y for the element (only used for north resizing, defaults to 0) @type Number */
+        minY: 0,
+        /** convenience to initialize drag drop.  @type Boolean*/
+        draggable: false
+    });
+    
+    if(this.pinned){
+        this.disableTrackOver = true;
+        this.el.addClass('yresizable-pinned');    
+    }
+    // if the element isn't positioned, make it relative
+    if(this.el.getStyle('position') != 'absolute'){
+        this.el.setStyle('position', 'relative');
+    }
+    if(!this.handles){ // no handles passed, must be legacy style
+        this.handles = 's,e,se';
+        if(this.multiDirectional){
+            this.handles += ',n,w';
+        }
+    }
+    if(this.handles == 'all'){
+        this.handles = 'n s e w ne nw se sw';
+    }
+    var hs = this.handles.split(/\s*?[,;]\s*?| /);
+    var ps = YAHOO.ext.Resizable.positions;
+    for(var i = 0, len = hs.length; i < len; i++){
+        if(hs[i] && ps[hs[i]]){
+            var pos = ps[hs[i]];
+            this[pos] = new YAHOO.ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);
+        }
+    }
+    // legacy
+    this.corner = this.southeast;
+    
+    this.activeHandle = null;
+    
+    if(this.resizeChild){
+        if(typeof this.resizeChild == 'boolean'){
+            this.resizeChild = YAHOO.ext.Element.get(this.el.dom.firstChild, true);
+        }else{
+            this.resizeChild = YAHOO.ext.Element.get(this.resizeChild, true);
+        }
+    }
+    
+    if(this.adjustments == 'auto'){
+        var rc = this.resizeChild;
+        var hw = this.west, he = this.east, hn = this.north, hs = this.south;
+        if(rc && (hw || hn)){
+            rc.setRelativePositioned();
+            rc.setLeft(hw ? hw.el.getWidth() : 0);
+            rc.setTop(hn ? hn.el.getHeight() : 0);
+        }
+        this.adjustments = [
+            (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),
+            (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 
+        ];
+    }
+    
+    if(this.draggable){
+        this.dd = this.dynamic ? 
+            this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});
+        this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);
+    }
+    
+    // public events
+    this.events = {
+        /**
+         * @event beforeresize
+         * Fired before resize is allowed. Set enabled to false to cancel resize. 
+         * @param {YAHOO.ext.Resizable} this
+         * @param {YAHOO.ext.EventObject} e The mousedown event
+         */
+        'beforeresize' : new YAHOO.util.CustomEvent(),
+        /**
+         * @event resize
+         * Fired after a resize. 
+         * @param {YAHOO.ext.Resizable} this
+         * @param {Number} width The new width
+         * @param {Number} height The new height
+         * @param {YAHOO.ext.EventObject} e The mouseup event
+         */
+        'resize' : new YAHOO.util.CustomEvent()
+    };
+    
+    if(this.width !== null && this.height !== null){
+        this.resizeTo(this.width, this.height);
+    }else{
+        this.updateChildSize();
+    }
+};
+
+YAHOO.extendX(YAHOO.ext.Resizable, YAHOO.ext.util.Observable, {
+    /**
+     * Perform a manual resize
+     * @param {Number} width
+     * @param {Number} height
+     */
+    resizeTo : function(width, height){
+        this.el.setSize(width, height);
+        this.updateChildSize();
+        this.fireEvent('resize', this, width, height, null);
+    },
+    
+    startSizing : function(e){
+        this.fireEvent('beforeresize', this, e);
+        if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler
+            this.resizing = true;
+            this.startBox = this.el.getBox();
+            this.startPoint = e.getXY();
+            this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],
+                            (this.startBox.y + this.startBox.height) - this.startPoint[1]];
+            this.proxy.setBox(this.startBox);
+            
+            this.overlay.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight());
+            this.overlay.show();
+            
+            if(!this.dynamic){
+                this.proxy.show();
+            }
+        }
+    },
+    
+    onMouseDown : function(handle, e){
+        if(this.enabled){
+            e.stopEvent();
+            this.activeHandle = handle;
+            this.overlay.setStyle('cursor', handle.el.getStyle('cursor'));
+            this.startSizing(e);
+        }          
+    },
+    
+    onMouseUp : function(e){
+        var size = this.resizeElement();
+        this.resizing = false;
+        this.handleOut();
+        this.overlay.hide();
+        this.fireEvent('resize', this, size.width, size.height, e);
+    },
+    
+    updateChildSize : function(){
+        if(this.resizeChild){
+            var el = this.el;
+            var child = this.resizeChild;
+            var adj = this.adjustments;
+            if(el.dom.offsetWidth){
+                var b = el.getSize(true);
+                child.setSize(b.width+adj[0], b.height+adj[1]);
+            }
+            // Second call here for IE
+            // The first call enables instant resizing and
+            // the second call corrects scroll bars if they
+            // exist
+            if(YAHOO.ext.util.Browser.isIE){
+                setTimeout(function(){
+                    if(el.dom.offsetWidth){
+                        var b = el.getSize(true);
+                        child.setSize(b.width+adj[0], b.height+adj[1]);
+                    }
+                }, 10);
+            }
+        }
+    },
+    
+    snap : function(value, inc, min){
+        if(!inc || !value) return value;
+        var newValue = value;
+        var m = value % inc;
+        if(m > 0){
+            if(m > (inc/2)){
+                newValue = value + (inc-m);
+            }else{
+                newValue = value - m;
+            }
+        }
+        return Math.max(min, newValue);
+    },
+    
+    resizeElement : function(){
+        var box = this.proxy.getBox();
+        //box.width = this.snap(box.width, this.widthIncrement);
+        //box.height = this.snap(box.height, this.heightIncrement);
+        //if(this.multiDirectional){
+            this.el.setBox(box, false, this.animate, this.duration, null, this.easing);
+        //}else{
+        //    this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);
+        //}
+        this.updateChildSize();
+        this.proxy.hide();
+        return box;
+    },
+    
+    constrain : function(v, diff, m, mx){
+        if(v - diff < m){
+            diff = v - m;    
+        }else if(v - diff > mx){
+            diff = mx - v; 
+        }
+        return diff;                
+    },
+    
+    onMouseMove : function(e){
+        if(this.enabled){
+            try{// try catch so if something goes wrong the user doesn't get hung
+            
+            //var curXY = this.startPoint;
+            var curSize = this.curSize || this.startBox;
+            var x = this.startBox.x, y = this.startBox.y;
+            var ox = x, oy = y;
+            var w = curSize.width, h = curSize.height;
+            var ow = w, oh = h;
+            var mw = this.minWidth, mh = this.minHeight;
+            var mxw = this.maxWidth, mxh = this.maxHeight;
+            var wi = this.widthIncrement;
+            var hi = this.heightIncrement;
+            
+            var eventXY = e.getXY();
+            var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0]));
+            var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1]));
+            
+            var pos = this.activeHandle.position;
+            
+            switch(pos){
+                case 'east':
+                    w += diffX; 
+                    w = Math.min(Math.max(mw, w), mxw);
+                    break;
+                case 'south':
+                    h += diffY;
+                    h = Math.min(Math.max(mh, h), mxh);
+                    break;
+                case 'southeast':
+                    w += diffX; 
+                    h += diffY;
+                    w = Math.min(Math.max(mw, w), mxw);
+                    h = Math.min(Math.max(mh, h), mxh);
+                    break;
+                case 'north':
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    y += diffY;
+                    h -= diffY;
+                    break;
+                case 'west':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    x += diffX;
+                    w -= diffX;
+                    break;
+                case 'northeast':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    w += diffX; 
+                    y += diffY;
+                    h -= diffY;
+                    break;
+                case 'northwest':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    y += diffY;
+                    h -= diffY;
+                    x += diffX;
+                    w -= diffX;
+                    break;
+               case 'southwest':
+                    diffX = this.constrain(w, diffX, mw, mxw);
+                    diffY = this.constrain(h, diffY, mh, mxh);
+                    h += diffY;
+                    x += diffX;
+                    w -= diffX;
+                    break;
+            }
+            
+            var sw = this.snap(w, wi, mw);
+            var sh = this.snap(h, hi, mh);
+            if(sw != w || sh != h){
+                switch(pos){
+                    case 'northeast':
+                        y -= sh - h;
+                    break;
+                    case 'north':
+                        y -= sh - h;
+                        break;
+                    case 'southwest':
+                        x -= sw - w;
+                    break;
+                    case 'west':
+                        x -= sw - w;
+                        break;
+                    case 'northwest':
+                        x -= sw - w;
+                        y -= sh - h;
+                    break;
+                }
+                w = sw;
+                h = sh;
+            }
+            
+            if(this.preserveRatio){
+                switch(pos){
+                    case 'southeast':
+                    case 'east':
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        w = ow * (h/oh);
+                       break;
+                    case 'south':
+                        w = ow * (h/oh);
+                        w = Math.min(Math.max(mw, w), mxw);
+                        h = oh * (w/ow);
+                        break;
+                    case 'northeast':
+                    case 'north':
+                        w = ow * (h/oh);
+                        w = Math.min(Math.max(mw, w), mxw);
+                        h = oh * (w/ow);
+                        break;
+                    case 'southwest':
+                    case 'west':
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        var tw = w;
+                        w = ow * (h/oh);
+                        x += tw - w;
+                       break;
+                    case 'northwest':
+                        var tw = w;
+                        var th = h;
+                        h = oh * (w/ow);
+                        h = Math.min(Math.max(mh, h), mxh);
+                        w = ow * (h/oh);
+                        y += th - h;
+                         x += tw - w;
+                       break;
+                        
+                }
+            }
+            
+            this.proxy.setBounds(x, y, w, h);
+            /*
+            var x = xy[0], y = xy[1];
+            var sb = this.startBox;
+            var ox = this.offsets[0], oy = this.offsets[1];
+            switch(this.activeHandle.position){
+                case 'east':
+                    var w = this.mwidth(x - sb.x + ox);
+                    this.applySize(w, null, null, null);
+                    break;
+                case 'south':
+                    var h = this.mheight(y - sb.y + oy);
+                    this.applySize(null, h, null, null);
+                    break;
+                case 'southeast':
+                    var w = this.mwidth(x - sb.x + ox);
+                    var h = this.mheight(y - sb.y + oy);
+                    this.applySize(w, h, null, null);
+                    break;
+                case 'north':
+                    var y = Math.max(this.minY, sb.y + (y-this.startPoint[1]));
+                    var h = sb.height+(sb.y-y);
+                    if(h <= this.maxHeight && h >= this.minHeight){
+                        this.applySize(null, h, null, y);
+                    }
+                    break;
+                case 'west':
+                    var x = Math.max(this.minX, sb.x + (x-this.startPoint[0]));
+                    var w = sb.width+(sb.x-x);
+                    if( w <= this.maxWidth && w >= this.minWidth){
+                        this.applySize(w, null, x, null);
+                    }
+                    break;
+                case 'northeast':
+                    var w = this.mwidth(x - sb.x + ox);
+                    var y = Math.max(this.minY, sb.y + (y-this.startPoint[1]));
+                    var h = sb.height+(sb.y-y);
+                    if(h <= this.maxHeight && h >= this.minHeight){
+                        this.applySize(w, h, null, y);
+                    }else{
+                        this.applySize(w, null, null, null);
+                    }
+                    break;
+                case 'northwest':
+                    var y = Math.max(this.minY, sb.y + (y-this.startPoint[1]));
+                    var h = sb.height+(sb.y-y);
+                    var x = Math.max(this.minX, sb.x + (x-this.startPoint[0]));
+                    var w = sb.width+(sb.x-x);
+                    if(h <= this.maxHeight && h >= this.minHeight && w <= this.maxWidth && w >= this.minWidth){
+                        this.applySize(w, h, x, y);
+                    }else if(h <= this.maxHeight && h >= this.minHeight){
+                        this.applySize(null, h, null, y);
+                    }else if( w <= this.maxWidth && w >= this.minWidth){
+                        this.applySize(w, null, x, null);
+                    }
+                    break;
+               case 'southwest':
+                    var h = this.mheight(y - sb.y + oy);
+                    var x = Math.max(this.minX, sb.x + (x-this.startPoint[0]));
+                    var w = sb.width+(sb.x-x);
+                    if(w <= this.maxWidth && w >= this.minWidth){
+                        this.applySize(w, h, x, null);
+                    }else{
+                        this.applySize(null, h, null, null);
+                    }
+                    break;
+                
+            }
+            if(p == 'southeast' || p == 'east' || p == 'south'){
+                var w = Math.min(Math.max(this.minWidth, xy[0]-sb.x+this.offsets[0]),this.maxWidth);
+                var h = Math.min(Math.max(this.minHeight, xy[1]-sb.y+this.offsets[1]), this.maxHeight);
+                w = this.snap(w, this.widthIncrement);
+                h = this.snap(h, this.heightIncrement);
+                if(this.preserveRatio){
+                    if(Math.abs(w - sb.width) > Math.abs(h - sb.height)){
+                        h = sb.height * (w/sb.width);
+                    }else{
+                        w = sb.width * (h/sb.height);
+                    }
+                    this.proxy.setSize(w, h);
+                }else if(p == 'southeast'){
+                    this.proxy.setSize(w, h);
+                }else if(p == 'east'){
+                    this.proxy.setWidth(w);
+                }else if(p == 'south'){
+                    this.proxy.setHeight(h);
+                }
+            }else{
+                var x = Math.max(this.minX, sb.x + (xy[0]-this.startPoint[0]));
+                var y = Math.max(this.minY, sb.y + (xy[1]-this.startPoint[1]));
+                var w = sb.width+(sb.x-x);
+                var h = sb.height+(sb.y-y);
+                if(p == 'northwest' && w <= this.maxWidth && w >= this.minWidth){
+                    this.proxy.setXY([x,y]);
+                    this.proxy.setSize(w, h);
+                }else if(p == 'northeast' && w <= this.maxWidth && w >= this.minWidth){
+                    w = Math.min(Math.max(this.minWidth, xy[0]-sb.x+this.offsets[0]),this.maxWidth);
+                    
+                    this.proxy.setY(y);
+                    this.proxy.setSize(w, h);
+                }else if(p == 'west' && w <= this.maxWidth && w >= this.minWidth){
+                    this.proxy.setX(x);
+                    this.proxy.setWidth(w);
+                }else if(p == 'north' && h <= this.maxHeight && h >= this.minHeight){
+                    this.proxy.setY(y);
+                    this.proxy.setHeight(h);
+                }
+            }*/
+            if(this.dynamic){
+                this.resizeElement();
+            }
+            }catch(e){}
+        }
+    },
+    
+    handleOver : function(){
+        if(this.enabled){
+            this.el.addClass('yresizable-over');
+        }
+    },
+    
+    handleOut : function(){
+        if(!this.resizing){
+            this.el.removeClass('yresizable-over');
+        }
+    },
+    
+    /**
+     * Returns the element this component is bound to.
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    /**
+     * Returns the resizeChild element (or null).
+     * @return {YAHOO.ext.Element}
+     */
+    getResizeChild : function(){
+        return this.resizeChild;
+    }
+});
+
+// hash to map config positions to true positions
+YAHOO.ext.Resizable.positions = {
+    n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast' 
+};
+
+
+YAHOO.ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){
+    if(!this.tpl){
+        // only initialize the template if resizable is used
+        var tpl = YAHOO.ext.DomHelper.createTemplate(
+            {tag: 'div', cls: 'yresizable-handle yresizable-handle-{0}', html: '&#160;'}
+        );
+        tpl.compile();
+        YAHOO.ext.Resizable.Handle.prototype.tpl = tpl;
+    }
+    this.position = pos;
+    this.rz = rz;
+    this.el = this.tpl.append(rz.el.dom, [this.position], true);
+    this.el.unselectable();
+    if(transparent){
+        this.el.setOpacity(0);
+    }
+    this.el.mon('mousedown', this.onMouseDown, this, true);
+    if(!disableTrackOver){
+        this.el.mon('mouseover', this.onMouseOver, this, true);
+        this.el.mon('mouseout', this.onMouseOut, this, true);
+    }
+};
+
+YAHOO.ext.Resizable.Handle.prototype = {
+    afterResize : function(rz){
+        // do nothing    
+    },
+    
+    onMouseDown : function(e){
+        this.rz.onMouseDown(this, e);
+    },
+    
+    onMouseOver : function(e){
+        this.rz.handleOver(this, e);
+    },
+    
+    onMouseOut : function(e){
+        this.rz.handleOut(this, e);
+    }  
+};
+
+
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SelectEditor.js.html b/www/extras/yui-ext/docs/output/SelectEditor.js.html new file mode 100644 index 000000000..8515a0b54 --- /dev/null +++ b/www/extras/yui-ext/docs/output/SelectEditor.js.html @@ -0,0 +1,37 @@ +SelectEditor.js
/**
+ * @class YAHOO.ext.grid.SelectEditor
+ * @extends YAHOO.ext.grid.CellEditor
+Creates an editor out of an existing select field. You can create the select element through DOM in Javascript and pass it to the SelectEditor's constructor <b>or</b> an easier way is like this:
+<br><br>
+Define the select field in your document, giving it the ygrid-editor class.
+<pre><code>
+&lt;select id="light" class="ygrid-editor"&gt;
+	&lt;option value="Shade"&gt;Shade&lt;/option&gt;
+	&lt;option value="Mostly Shady"&gt;Mostly Shady&lt;/option&gt;
+	&lt;option value="Sun or Shade"&gt;Sun or Shade&lt;/option&gt;
+	&lt;option value="Mostly Sunny"&gt;Mostly Sunny&lt;/option&gt;
+	&lt;option value="Sunny"&gt;Sunny&lt;/option&gt;
+&lt;/select&gt;
+</code></pre>
+Create the SelectEditor object, passing in the id of your select field.
+<pre><code>
+var editor = new YAHOO.ext.grid.SelectEditor('light'); 
+</code></pre>
+For more information on using this editor, see <a href="http://www.jackslocum.com/yui/2006/09/10/adding-built-in-editing-support-to-the-yahoo-ui-extensions-grid/">this blog post</a>.
+* @constructor
+* Create a new SelectEditor
+* @param {HTMLElement/String} element
+ */
+YAHOO.ext.grid.SelectEditor = function(element){
+    element.hideFocus = true;
+    YAHOO.ext.grid.SelectEditor.superclass.constructor.call(this, element);
+    this.element.swallowEvent('click');
+};
+YAHOO.extendX(YAHOO.ext.grid.SelectEditor, YAHOO.ext.grid.CellEditor);
+
+YAHOO.ext.grid.SelectEditor.prototype.fitToCell = function(box){
+    if(YAHOO.ext.util.Browser.isGecko){
+        box.height -= 3;
+    }
+    this.element.setBox(box, true);
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SelectionModel.js.html b/www/extras/yui-ext/docs/output/SelectionModel.js.html new file mode 100644 index 000000000..407611974 --- /dev/null +++ b/www/extras/yui-ext/docs/output/SelectionModel.js.html @@ -0,0 +1,444 @@ +SelectionModel.js
/**
+ @class YAHOO.ext.grid.DefaultSelectionModel
+ * @extends YAHOO.ext.util.Observable
+ * The default SelectionModel used by {@link YAHOO.ext.grid.Grid}. 
+ It supports multiple selections and keyboard selection/navigation. <br><br>
+ @constructor
+ */
+YAHOO.ext.grid.DefaultSelectionModel = function(){
+    this.selectedRows = [];
+    this.selectedRowIds = [];
+    this.lastSelectedRow = null;
+    
+    this.onRowSelect = new YAHOO.util.CustomEvent('SelectionTable.rowSelected');
+    this.onSelectionChange = new YAHOO.util.CustomEvent('SelectionTable.selectionChanged');
+    
+    this.events = {
+        /**
+	     * @event selectionchange
+	     * Fires when the selection changes 
+	     * @param {SelectionModel} this
+	     * @param {Array} rows Array of row elements that are selected
+	     * @param {String} ids Array of ids that are selected
+	     */
+	    'selectionchange' : this.onSelectionChange,
+        /**
+	     * @event dragenter
+	     * Fires when a row is selected or deselected
+	     * @param {SelectionModel} this
+	     * @param {HTMLElement} row The row element
+	     * @param {Boolean} selected true if the row was selected, false if deselected
+	     */
+	    'rowselect' : this.onRowSelect
+    };
+    
+    this.locked = false;
+};
+
+YAHOO.ext.grid.DefaultSelectionModel.prototype = {
+    /** @ignore Called by the grid automatically. Do not call directly. */
+    init : function(grid){
+        this.grid = grid;
+        this.initEvents();
+    },
+    
+    /**
+     * Lock the selections
+     */
+    lock : function(){
+        this.locked = true;
+    },
+    
+    /**
+     * Unlock the selections
+     */
+    unlock : function(){
+        this.locked = false;  
+    },
+    
+    /**
+     * Returns true if the selections are locked
+     * @return {Boolean}
+     */
+    isLocked : function(){
+        return this.locked;    
+    },
+    
+    /** @ignore */
+    initEvents : function(){
+        if(this.grid.trackMouseOver){
+        	this.grid.addListener("mouseover", this.handleOver, this, true);
+        	this.grid.addListener("mouseout", this.handleOut, this, true);
+        }
+        this.grid.addListener("rowclick", this.rowClick, this, true);
+        this.grid.addListener("keydown", this.keyDown, this, true);
+    },
+    
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    
+    /** @ignore Syncs selectedRows with the correct row by looking it up by id. 
+      Used after a sort moves data around. */
+    syncSelectionsToIds : function(){
+        if(this.getCount() > 0){
+            var ids = this.selectedRowIds.concat();
+            this.clearSelections();
+            this.selectRowsById(ids, true);
+        }
+    },
+    
+    /**
+     * Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index).
+     * @param {String/Array} id The id(s) to select 
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections 
+     */
+    selectRowsById : function(id, keepExisting){
+        var rows = this.grid.getRowsById(id);
+        if (!(rows instanceof Array)){
+            this.selectRow(rows, keepExisting);
+            return;
+        }
+        this.selectRows(rows, keepExisting);
+    },
+    
+    /**
+     * Gets the number of selected rows.
+     * @return {Number}
+     */
+    getCount : function(){
+        return this.selectedRows.length;
+    },
+    
+    /**
+     * Selects the first row in the grid.
+     */
+    selectFirstRow : function(){
+        for(var j = 0; j < this.grid.rows.length; j++){
+            if(this.isSelectable(this.grid.rows[j])){
+            	this.focusRow(this.grid.rows[j]);
+                this.setRowState(this.grid.rows[j], true);
+                return;
+            }
+        }
+    },
+    
+    /**
+     * Selects the row immediately following the last selected row.
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections
+     */
+    selectNext : function(keepExisting){
+        if(this.lastSelectedRow){
+            for(var j = (this.lastSelectedRow.rowIndex+1); j < this.grid.rows.length; j++){
+                var row = this.grid.rows[j];
+                if(this.isSelectable(row)){
+                    this.focusRow(row);
+                    this.setRowState(row, true, keepExisting);
+                    return;
+                }
+            }
+        }
+    },
+    
+    /**
+     * Selects the row that precedes the last selected row.
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections 
+     */
+    selectPrevious : function(keepExisting){
+        if(this.lastSelectedRow){
+            for(var j = (this.lastSelectedRow.rowIndex-1); j >= 0; j--){
+                var row = this.grid.rows[j];
+                if(this.isSelectable(row)){
+                    this.focusRow(row);
+                    this.setRowState(row, true, keepExisting);
+                    return;
+                }
+            }
+        }
+    },
+    
+    /**
+     * Returns the selected rows.
+     * @return {Array} Array of DOM row elements
+     */
+    getSelectedRows : function(){
+        return this.selectedRows;
+    },
+    
+    /**
+     * Returns the selected row ids.
+     * @return {Array} Array of String ids
+     */
+    getSelectedRowIds : function(){
+        return this.selectedRowIds;
+    },
+    
+    /**
+     * Clears all selections.
+     */
+    clearSelections : function(){
+        if(this.isLocked()) return;
+        var oldSelections = this.selectedRows.concat();
+        for(var j = 0; j < oldSelections.length; j++){
+            this.setRowState(oldSelections[j], false);
+        }
+        this.selectedRows = [];
+        this.selectedRowIds = [];
+    },
+    
+        
+    /**
+     * Selects all rows.
+     */
+    selectAll : function(){
+        if(this.isLocked()) return;
+        this.selectedRows = [];
+        this.selectedRowIds = [];
+        for(var j = 0, len = this.grid.rows.length; j < len; j++){
+            this.setRowState(this.grid.rows[j], true, true);
+        }
+    },
+    
+    /**
+     * Returns True if there is a selection.
+     * @return {Boolean}
+     */
+    hasSelection : function(){
+        return this.selectedRows.length > 0;
+    },
+    
+    /**
+     * Returns True if the specified row is selected.
+     * @param {HTMLElement} row The row to check
+     * @return {Boolean}
+     */
+    isSelected : function(row){
+        return row && (row.selected === true || row.getAttribute('selected') == 'true');
+    },
+    
+    /**
+     * Returns True if the specified row is selectable.
+     * @param {HTMLElement} row The row to check
+     * @return {Boolean}
+     */
+    isSelectable : function(row){
+        return row && row.getAttribute('selectable') != 'false';
+    },
+    
+    /** @ignore */
+    rowClick : function(grid, rowIndex, e){
+        if(this.isLocked()) return;
+        var row = grid.getRow(rowIndex);
+        if(this.isSelectable(row)){
+            if(e.shiftKey && this.lastSelectedRow){
+                var lastIndex = this.lastSelectedRow.rowIndex;
+                this.selectRange(this.lastSelectedRow, row, e.ctrlKey);
+                this.lastSelectedRow = this.grid.el.dom.rows[lastIndex];
+            }else{
+                this.focusRow(row);
+                var rowState = e.ctrlKey ? !this.isSelected(row) : true;
+                this.setRowState(row, rowState, e.hasModifier());
+            }
+        }
+    },
+    
+    /**
+     * Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow() instead.
+     * @deprecated
+     * @param {HTMLElement} row The row to focus
+     */
+    focusRow : function(row){
+    	this.grid.view.focusRow(row);
+    },
+
+    /**
+     * Selects a row.
+     * @param {Number/HTMLElement} row The row or index of the row to select
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections 
+     */
+    selectRow : function(row, keepExisting){
+        this.setRowState(this.getRow(row), true, keepExisting);
+    },
+    
+    /**
+     * Selects multiple rows.
+     * @param {Array} rows Array of the rows or indexes of the row to select
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections 
+     */
+    selectRows : function(rows, keepExisting){
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        for(var i = 0; i < rows.length; i++){
+            this.selectRow(rows[i], true);
+        }
+    },
+    
+    /**
+     * Deselects a row.
+     * @param {Number/HTMLElement} row The row or index of the row to deselect
+     */
+    deselectRow : function(row){
+        this.setRowState(this.getRow(row), false);
+    },
+    
+    /** @ignore */
+    getRow : function(row){
+        if(typeof row == 'number'){
+            row = this.grid.rows[row];
+        }
+        return row;
+    },
+    
+    /**
+     * Selects a range of rows. All rows in between startRow and endRow are also selected.
+     * @param {Number/HTMLElement} startRow The row or index of the first row in the range
+     * @param {Number/HTMLElement} endRow The row or index of the last row in the range
+     * @param {<i>Boolean</i>} keepExisting (optional) True to retain existing selections 
+     */
+    selectRange : function(startRow, endRow, keepExisting){
+        startRow = this.getRow(startRow);
+        endRow = this.getRow(endRow);
+        this.setRangeState(startRow, endRow, true, keepExisting);
+    },
+    
+    /**
+     * Deselects a range of rows. All rows in between startRow and endRow are also deselected.
+     * @param {Number/HTMLElement} startRow The row or index of the first row in the range
+     * @param {Number/HTMLElement} endRow The row or index of the last row in the range
+     */
+    deselectRange : function(startRow, endRow){
+        startRow = this.getRow(startRow);
+        endRow = this.getRow(endRow);
+        this.setRangeState(startRow, endRow, false, true);
+    },
+    
+    /** @ignore */
+    setRowStateFromChild : function(childEl, selected, keepExisting){
+        var row = this.grid.getRowFromChild(childEl);
+        this.setRowState(row, selected, keepExisting);
+    },
+    
+    /** @ignore */
+    setRangeState : function(startRow, endRow, selected, keepExisting){
+        if(this.isLocked()) return;
+        if(!keepExisting){
+            this.clearSelections();
+        }
+        var curRow = startRow;
+        while(curRow.rowIndex != endRow.rowIndex){
+            this.setRowState(curRow, selected, true);
+            curRow = (startRow.rowIndex < endRow.rowIndex ? 
+                        this.grid.getRowAfter(curRow) : this.grid.getRowBefore(curRow))
+        }
+        this.setRowState(endRow, selected, true);
+    },
+    
+    /** @ignore */
+    setRowState : function(row, selected, keepExisting){
+        if(this.isLocked()) return;
+        if(this.isSelectable(row)){
+            if(selected){
+                if(!keepExisting){
+                    this.clearSelections();
+                }
+                this.setRowClass(row, 'selected');
+                row.selected = true;
+                this.selectedRows.push(row);
+                this.selectedRowIds.push(this.grid.dataModel.getRowId(row.rowIndex));
+                this.lastSelectedRow = row;
+            }else{
+                this.setRowClass(row, '');
+                row.selected = false;
+                this._removeSelected(row);
+            }
+            this.fireEvent('rowselect', this, row, selected);
+            this.fireEvent('selectionchange', this, this.selectedRows, this.selectedRowIds);
+        }
+    },
+
+    /** @ignore */
+    handleOver : function(e){
+        var row = this.grid.getRowFromChild(e.getTarget());
+        if(this.isSelectable(row) && !this.isSelected(row)){
+            this.setRowClass(row, 'over');
+        }
+    },
+    
+    /** @ignore */
+    handleOut : function(e){
+        var row = this.grid.getRowFromChild(e.getTarget());
+        if(this.isSelectable(row) && !this.isSelected(row)){
+            this.setRowClass(row, '');
+        }
+    },
+    
+    /** @ignore */
+    keyDown : function(e){
+        if(e.browserEvent.keyCode == e.DOWN){
+            this.selectNext(e.shiftKey);
+            e.preventDefault();
+        }else if(e.browserEvent.keyCode == e.UP){
+            this.selectPrevious(e.shiftKey);
+            e.preventDefault();
+        }
+    },
+
+    /** @ignore */
+    setRowClass : function(row, cssClass){
+        if(this.isSelectable(row)){
+            if(cssClass == 'selected'){
+                YAHOO.util.Dom.removeClass(row, 'ygrid-row-over');
+                YAHOO.util.Dom.addClass(row, 'ygrid-row-selected');
+            }else if(cssClass == 'over'){
+                YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected');
+                YAHOO.util.Dom.addClass(row, 'ygrid-row-over');
+            }else if(cssClass == ''){
+                YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected');
+                YAHOO.util.Dom.removeClass(row, 'ygrid-row-over');
+            }
+        }
+    },
+    
+    /** @ignore */
+    _removeSelected : function(row){
+        var sr = this.selectedRows;
+        for (var i = 0; i < sr.length; i++) {
+          if (sr[i] === row){
+              this.selectedRows.splice(i, 1);
+              this.selectedRowIds.splice(i, 1);
+              return;
+          }
+        }
+    }
+};
+
+/**
+ @class YAHOO.ext.grid.SingleSelectionModel
+ @extends YAHOO.ext.grid.DefaultSelectionModel
+ Allows only one row to be selected at a time.
+ @constructor
+ * Create new SingleSelectionModel
+ */
+YAHOO.ext.grid.SingleSelectionModel = function(){
+    YAHOO.ext.grid.SingleSelectionModel.superclass.constructor.call(this);
+};
+
+YAHOO.extendX(YAHOO.ext.grid.SingleSelectionModel, YAHOO.ext.grid.DefaultSelectionModel);
+
+/** @ignore */
+YAHOO.ext.grid.SingleSelectionModel.prototype.setRowState = function(row, selected){
+    YAHOO.ext.grid.SingleSelectionModel.superclass.setRowState.call(this, row, selected, false);
+};
+
+YAHOO.ext.grid.DisableSelectionModel = function(){
+    YAHOO.ext.grid.DisableSelectionModel.superclass.constructor.call(this);
+};
+
+YAHOO.extendX(YAHOO.ext.grid.DisableSelectionModel, YAHOO.ext.grid.DefaultSelectionModel);
+
+YAHOO.ext.grid.DisableSelectionModel.prototype.initEvents = function(){
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SplitBar.js.html b/www/extras/yui-ext/docs/output/SplitBar.js.html new file mode 100644 index 000000000..86f7ebe1e --- /dev/null +++ b/www/extras/yui-ext/docs/output/SplitBar.js.html @@ -0,0 +1,451 @@ +SplitBar.js
/*
+ * splitbar.js, version .7
+ * Copyright(c) 2006, Jack Slocum.
+ * Code licensed under the BSD License
+ */
+if(YAHOO.util.DragDropMgr){
+  YAHOO.util.DragDropMgr.clickTimeThresh = 350;
+}
+/**
+ * @class YAHOO.ext.SplitBar
+ * @extends YAHOO.ext.util.Observable
+ * Creates draggable splitter bar functionality from two elements.
+ * <br><br>
+ * Usage:
+ * <pre><code>
+var split = new YAHOO.ext.SplitBar('elementToDrag', 'elementToSize', 
+                   YAHOO.ext.SplitBar.HORIZONTAL, YAHOO.ext.SplitBar.LEFT);
+split.setAdapter(new YAHOO.ext.SplitBar.AbsoluteLayoutAdapter("container"));
+split.minSize = 100;
+split.maxSize = 600;
+split.animate = true;
+split.onMoved.subscribe(splitterMoved);
+</code></pre>
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.DDProxy
+ * @requires YAHOO.util.Anim (optional) to support animation
+ * @requires YAHOO.util.Easing (optional) to support animation
+ * @constructor
+ * Create a new SplitBar
+ * @param {String/HTMLElement/Element} dragElement The element to be dragged and act as the SplitBar. 
+ * @param {String/HTMLElement/Element} resizingElement The element to be resized based on where the SplitBar element is dragged 
+ * @param {Number} orientation (optional) Either YAHOO.ext.SplitBar.HORIZONTAL or YAHOO.ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
+ * @param {Number} placement (optional) Either YAHOO.ext.SplitBar.LEFT or YAHOO.ext.SplitBar.RIGHT for horizontal or  
+                        YAHOO.ext.SplitBar.TOP or YAHOO.ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position 
+                        position of the SplitBar).
+ */
+YAHOO.ext.SplitBar = function(dragElement, resizingElement, orientation, placement){
+    
+    /** @private */
+    this.el = YAHOO.ext.Element.get(dragElement, true);
+    this.el.dom.unselectable = 'on';
+    /** @private */
+    this.resizingEl = YAHOO.ext.Element.get(resizingElement, true);
+    
+    /**
+     * @private
+     * The orientation of the split. Either YAHOO.ext.SplitBar.HORIZONTAL or YAHOO.ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
+     * Note: If this is changed after creating the SplitBar, the placement property must be manually updated
+     * @type Number
+     */
+    this.orientation = orientation || YAHOO.ext.SplitBar.HORIZONTAL;
+    
+    /**
+     * The minimum size of the resizing element. (Defaults to 0)
+     * @type Number
+     */
+    this.minSize = 0;
+    
+    /**
+     * The maximum size of the resizing element. (Defaults to 2000)
+     * @type Number
+     */
+    this.maxSize = 2000;
+    
+    this.onMoved = new YAHOO.util.CustomEvent("SplitBarMoved", this);
+    
+    /**
+     * Whether to animate the transition to the new size
+     * @type Boolean
+     */
+    this.animate = false;
+    
+    /**
+     * Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes.
+     * @type Boolean
+     */
+    this.useShim = false;
+    
+    /** @private */
+    this.shim = null;
+    
+    /** @private */
+    this.proxy = YAHOO.ext.SplitBar.createProxy(this.orientation);
+    
+    /** @private */
+    this.dd = new YAHOO.util.DDProxy(this.el.dom.id, "SplitBars", {dragElId : this.proxy.id});
+    
+    /** @private */
+    this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);
+    
+    /** @private */
+    this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);
+    
+    /** @private */
+    this.dragSpecs = {};
+    
+    /**
+     * @private The adapter to use to positon and resize elements
+     */
+    this.adapter = new YAHOO.ext.SplitBar.BasicLayoutAdapter();
+    this.adapter.init(this);
+    
+    if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+        /** @private */
+        this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? YAHOO.ext.SplitBar.LEFT : YAHOO.ext.SplitBar.RIGHT);
+        this.el.setStyle('cursor', 'e-resize');
+    }else{
+        /** @private */
+        this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? YAHOO.ext.SplitBar.TOP : YAHOO.ext.SplitBar.BOTTOM);
+        this.el.setStyle('cursor', 'n-resize');
+    }
+    
+    this.events = {
+        /**
+         * @event resize
+         * Fires when the splitter is moved (alias for moved)
+         * @param {YAHOO.ext.SplitBar} this
+         * @param {Number} newSize the new width or height
+         */
+        'resize' : this.onMoved,
+        /**
+         * @event moved
+         * Fires when the splitter is moved
+         * @param {YAHOO.ext.SplitBar} this
+         * @param {Number} newSize the new width or height
+         */
+        'moved' : this.onMoved,
+        /**
+         * @event beforeresize
+         * Fires before the splitter is dragged
+         * @param {YAHOO.ext.SplitBar} this
+         */
+        'beforeresize' : new YAHOO.util.CustomEvent('beforeresize')
+    }
+}
+
+YAHOO.extendX(YAHOO.ext.SplitBar, YAHOO.ext.util.Observable, {
+    onStartProxyDrag : function(x, y){
+        this.fireEvent('beforeresize', this);
+        if(this.useShim){
+            if(!this.shim){
+                this.shim = YAHOO.ext.SplitBar.createShim();
+            }
+            this.shim.setVisible(true);
+        }
+        YAHOO.util.Dom.setStyle(this.proxy, 'display', 'block');
+        var size = this.adapter.getElementSize(this);
+        this.activeMinSize = this.getMinimumSize();;
+        this.activeMaxSize = this.getMaximumSize();;
+        var c1 = size - this.activeMinSize;
+        var c2 = Math.max(this.activeMaxSize - size, 0);
+        if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(
+                this.placement == YAHOO.ext.SplitBar.LEFT ? c1 : c2, 
+                this.placement == YAHOO.ext.SplitBar.LEFT ? c2 : c1
+            );
+            this.dd.setYConstraint(0, 0);
+        }else{
+            this.dd.resetConstraints();
+            this.dd.setXConstraint(0, 0);
+            this.dd.setYConstraint(
+                this.placement == YAHOO.ext.SplitBar.TOP ? c1 : c2, 
+                this.placement == YAHOO.ext.SplitBar.TOP ? c2 : c1
+            );
+         }
+        this.dragSpecs.startSize = size;
+        this.dragSpecs.startPoint = [x, y];
+        
+        YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);
+    },
+    
+    /** 
+     * @private Called after the drag operation by the DDProxy
+     */
+    onEndProxyDrag : function(e){
+        YAHOO.util.Dom.setStyle(this.proxy, 'display', 'none');
+        var endPoint = YAHOO.util.Event.getXY(e);
+        if(this.useShim){
+            this.shim.setVisible(false);
+        }
+        var newSize;
+        if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+            newSize = this.dragSpecs.startSize + 
+                (this.placement == YAHOO.ext.SplitBar.LEFT ?
+                    endPoint[0] - this.dragSpecs.startPoint[0] :
+                    this.dragSpecs.startPoint[0] - endPoint[0]
+                );
+        }else{
+            newSize = this.dragSpecs.startSize + 
+                (this.placement == YAHOO.ext.SplitBar.TOP ?
+                    endPoint[1] - this.dragSpecs.startPoint[1] :
+                    this.dragSpecs.startPoint[1] - endPoint[1]
+                );
+        }
+        newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);
+        if(newSize != this.dragSpecs.startSize){
+            this.adapter.setElementSize(this, newSize);
+            this.onMoved.fireDirect(this, newSize);
+        }
+    },
+    
+    /**
+     * Get the adapter this SplitBar uses
+     * @return The adapter object
+     */
+    getAdapter : function(){
+        return this.adapter;
+    },
+    
+    /**
+     * Set the adapter this SplitBar uses
+     * @param {Object} adapter A SplitBar adapter object
+     */
+    setAdapter : function(adapter){
+        this.adapter = adapter;
+        this.adapter.init(this);
+    },
+    
+    /**
+     * Gets the minimum size for the resizing element
+     * @return {Number} The minimum size
+     */
+    getMinimumSize : function(){
+        return this.minSize;
+    },
+    
+    /**
+     * Sets the minimum size for the resizing element
+     * @param {Number} minSize The minimum size
+     */
+    setMinimumSize : function(minSize){
+        this.minSize = minSize;
+    },
+    
+    /**
+     * Gets the maximum size for the resizing element
+     * @return {Number} The maximum size
+     */
+    getMaximumSize : function(){
+        return this.maxSize;
+    },
+    
+    /**
+     * Sets the maximum size for the resizing element
+     * @param {Number} maxSize The maximum size
+     */
+    setMaximumSize : function(maxSize){
+        this.maxSize = maxSize;
+    },
+    
+    /**
+     * Sets the initialize size for the resizing element
+     * @param {Number} size The initial size
+     */
+    setCurrentSize : function(size){
+        var oldAnimate = this.animate;
+        this.animate = false;
+        this.adapter.setElementSize(this, size);
+        this.animate = oldAnimate;
+    }
+});
+
+/**
+ * @private static Create the shim to drag over iframes
+ */
+YAHOO.ext.SplitBar.createShim = function(){
+    var shim = document.createElement('div');
+    shim.unselectable = 'on';
+    YAHOO.util.Dom.generateId(shim, 'split-shim');
+    YAHOO.util.Dom.setStyle(shim, 'width', '100%');
+    YAHOO.util.Dom.setStyle(shim, 'height', '100%');
+    YAHOO.util.Dom.setStyle(shim, 'position', 'absolute');
+    YAHOO.util.Dom.setStyle(shim, 'background', 'white');
+    YAHOO.util.Dom.setStyle(shim, 'z-index', 11000);
+    window.document.body.appendChild(shim);
+    var shimEl = YAHOO.ext.Element.get(shim);
+    shimEl.setOpacity(.01);
+    shimEl.setXY([0, 0]);
+    return shimEl;
+};
+
+/**
+ * @private static Create our own proxy element element. So it will be the same same size on all browsers, we won't use borders. Instead we use a background color.
+ */
+YAHOO.ext.SplitBar.createProxy = function(orientation){
+    var proxy = document.createElement('div');
+    proxy.unselectable = 'on';
+    YAHOO.util.Dom.generateId(proxy, 'split-proxy');
+    YAHOO.util.Dom.setStyle(proxy, 'position', 'absolute');
+    YAHOO.util.Dom.setStyle(proxy, 'visibility', 'hidden');
+    YAHOO.util.Dom.setStyle(proxy, 'z-index', 11001);
+    YAHOO.util.Dom.setStyle(proxy, 'background-color', "#aaa");
+    if(orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+        YAHOO.util.Dom.setStyle(proxy, 'cursor', 'e-resize');
+    }else{
+        YAHOO.util.Dom.setStyle(proxy, 'cursor', 'n-resize');
+    }
+    // the next 2 fix IE abs position div height problem
+    YAHOO.util.Dom.setStyle(proxy, 'line-height', '0px');
+    YAHOO.util.Dom.setStyle(proxy, 'font-size', '0px');
+    window.document.body.appendChild(proxy);
+    return proxy;
+};
+
+/** 
+ * @class YAHOO.ext.SplitBar.BasicLayoutAdapter
+ * Default Adapter. It assumes the splitter and resizing element are not positioned
+ * elements and only gets/sets the width of the element. Generally used for table based layouts.
+ */
+YAHOO.ext.SplitBar.BasicLayoutAdapter = function(){
+};
+
+YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype = {
+    // do nothing for now
+    init : function(s){
+    
+    },
+    /**
+     * Called before drag operations to get the current size of the resizing element. 
+     * @param {YAHOO.ext.SplitBar} s The SplitBar using this adapter
+     */
+     getElementSize : function(s){
+        if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+            return s.resizingEl.getWidth();
+        }else{
+            return s.resizingEl.getHeight();
+        }
+    },
+    
+    /**
+     * Called after drag operations to set the size of the resizing element.
+     * @param {YAHOO.ext.SplitBar} s The SplitBar using this adapter
+     * @param {Number} newSize The new size to set
+     * @param {Function} onComplete A function to be invoke when resizing is complete
+     */
+    setElementSize : function(s, newSize, onComplete){
+        if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){
+            if(!YAHOO.util.Anim || !s.animate){
+                s.resizingEl.setWidth(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setWidth(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut);
+            }
+        }else{
+            
+            if(!YAHOO.util.Anim || !s.animate){
+                s.resizingEl.setHeight(newSize);
+                if(onComplete){
+                    onComplete(s, newSize);
+                }
+            }else{
+                s.resizingEl.setHeight(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut);
+            }
+        }
+    }
+};
+
+/** 
+ *@class YAHOO.ext.SplitBar.AbsoluteLayoutAdapter
+ * @extends YAHOO.ext.SplitBar.BasicLayoutAdapter
+ * Adapter that  moves the splitter element to align with the resized sizing element. 
+ * Used with an absolute positioned SplitBar.
+ * @param {String/HTMLElement/Element} container The container that wraps around the absolute positioned content. If it's
+ * document.body, make sure you assign an id to the body element.
+ */
+YAHOO.ext.SplitBar.AbsoluteLayoutAdapter = function(container){
+    this.basic = new YAHOO.ext.SplitBar.BasicLayoutAdapter();
+    this.container = getEl(container);
+}
+
+YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype = {
+    init : function(s){
+        this.basic.init(s);
+        //YAHOO.util.Event.on(window, 'resize', this.moveSplitter.createDelegate(this, [s]));
+    },
+    
+    getElementSize : function(s){
+        return this.basic.getElementSize(s);
+    },
+    
+    setElementSize : function(s, newSize, onComplete){
+        this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));
+    },
+    
+    moveSplitter : function(s){
+        var yes = YAHOO.ext.SplitBar;
+        switch(s.placement){
+            case yes.LEFT:
+                s.el.setX(s.resizingEl.getRight());
+                break;
+            case yes.RIGHT:
+                s.el.setStyle('right', (this.container.getWidth() - s.resizingEl.getLeft()) + 'px');
+                break;
+            case yes.TOP:
+                s.el.setY(s.resizingEl.getBottom());
+                break;
+            case yes.BOTTOM:
+                s.el.setY(s.resizingEl.getTop() - s.el.getHeight());
+                break;
+        }
+    }
+};
+
+/**
+ * Orientation constant - Create a vertical SplitBar
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.VERTICAL = 1;
+
+/**
+ * Orientation constant - Create a horizontal SplitBar
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.HORIZONTAL = 2;
+
+/**
+ * Placement constant - The resizing element is to the left of the splitter element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.LEFT = 1;
+
+/**
+ * Placement constant - The resizing element is to the right of the splitter element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.RIGHT = 2;
+
+/**
+ * Placement constant - The resizing element is positioned above the splitter element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.TOP = 3;
+
+/**
+ * Placement constant - The resizing element is positioned under splitter element
+ * @static
+ * @type Number
+ */
+YAHOO.ext.SplitBar.BOTTOM = 4;
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/SplitLayoutRegion.js.html b/www/extras/yui-ext/docs/output/SplitLayoutRegion.js.html new file mode 100644 index 000000000..6773aa676 --- /dev/null +++ b/www/extras/yui-ext/docs/output/SplitLayoutRegion.js.html @@ -0,0 +1,282 @@ +SplitLayoutRegion.js
/**
+ * @class YAHOO.ext.SplitLayoutRegion
+ * @extends YAHOO.ext.LayoutRegion
+ * Adds a splitbar and other (private) useful functionality to a LayoutRegion
+ */
+YAHOO.ext.SplitLayoutRegion = function(mgr, config, pos, cursor){
+    this.cursor = cursor;
+    YAHOO.ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos);
+    if(config.split){
+        this.hide();
+    }
+};
+
+YAHOO.extendX(YAHOO.ext.SplitLayoutRegion, YAHOO.ext.LayoutRegion, {
+    applyConfig : function(config){
+        YAHOO.ext.SplitLayoutRegion.superclass.applyConfig.call(this, config);
+        if(config.split){
+            if(!this.split){
+                var splitEl = YAHOO.ext.DomHelper.append(this.mgr.el.dom, 
+                        {tag: 'div', id: this.el.id + '-split', cls: 'ylayout-split ylayout-split-'+this.position, html: '&#160;'});
+                /** The SplitBar for this region @type YAHOO.ext.SplitBar */
+                this.split = new YAHOO.ext.SplitBar(splitEl, this.el);
+                this.split.onMoved.subscribe(this.onSplitMove, this, true);
+                this.split.useShim = config.useShim === true;
+                YAHOO.util.Dom.setStyle([this.split.el.dom, this.split.proxy], 'cursor', this.cursor);
+                this.split.getMaximumSize = this.getMaxSize.createDelegate(this);
+            }
+            if(typeof config.minSize != 'undefined'){
+                this.split.minSize = config.minSize;
+            }
+            if(typeof config.maxSize != 'undefined'){
+                this.split.maxSize = config.maxSize;
+            }
+        }
+    },
+    
+    getMaxSize : function(){
+         var cmax = this.config.maxSize || 10000;
+         var center = this.mgr.getRegion('center');
+         return Math.min(cmax, (this.el.getWidth()+center.getEl().getWidth())-center.getMinWidth());
+    },
+    
+    onSplitMove : function(split, newSize){
+        this.fireEvent('resized', this, newSize);
+    },
+    
+    /** 
+     * Returns the SplitBar for this region.
+     * @return {YAHOO.ext.SplitBar}
+     */
+    getSplitBar : function(){
+        return this.split;
+    },
+    
+    hide : function(){
+        if(this.split){
+            this.split.el.setLocation(-2000,-2000);
+            this.split.el.hide();
+        }
+        YAHOO.ext.SplitLayoutRegion.superclass.hide.call(this);
+    },
+    
+    show : function(){
+        if(this.split){
+            this.split.el.show();
+        }
+        YAHOO.ext.SplitLayoutRegion.superclass.show.call(this);
+    },
+    
+    beforeSlide: function(){
+        if(YAHOO.ext.util.Browser.isGecko){// firefox overflow auto bug workaround
+            this.bodyEl.clip();
+            if(this.tabs) this.tabs.bodyEl.clip();
+            if(this.activePanel){
+                this.activePanel.getEl().clip();
+                
+                if(this.activePanel.beforeSlide){
+                    this.activePanel.beforeSlide();
+                }
+            }
+        }
+    },
+    
+    afterSlide : function(){
+        if(YAHOO.ext.util.Browser.isGecko){// firefox overflow auto bug workaround
+            this.bodyEl.unclip();
+            if(this.tabs) this.tabs.bodyEl.unclip();
+            if(this.activePanel){
+                this.activePanel.getEl().unclip();
+                if(this.activePanel.afterSlide){
+                    this.activePanel.afterSlide();
+                }
+            }
+        }
+    },
+    
+    slideOut : function(){
+        if(!this.slideEl){
+            this.slideEl = new YAHOO.ext.Actor(
+                YAHOO.ext.DomHelper.append(this.mgr.el.dom, {tag: 'div', cls:'ylayout-slider'}));
+            if(this.config.autoHide !== false){
+                var slideInTask = new YAHOO.ext.util.DelayedTask(this.slideIn, this);
+                this.slideEl.mon('mouseout', function(e){
+                    var to = e.getRelatedTarget();
+                    if(to && to != this.slideEl.dom && !YAHOO.util.Dom.isAncestor(this.slideEl.dom, to)){
+                        slideInTask.delay(500);
+                    }
+                }, this, true);
+                this.slideEl.mon('mouseover', function(e){
+                    slideInTask.cancel();
+                }, this, true);
+            }
+        }
+        var sl = this.slideEl, c = this.collapsedEl, cm = this.cmargins;
+        this.isSlid = true;
+        this.snapshot = {
+            'left': this.el.getLeft(true),
+            'top': this.el.getTop(true),
+            'colbtn': this.collapseBtn.isVisible(),
+            'closebtn': this.closeBtn.isVisible()
+        };
+        this.collapseBtn.hide();
+        this.closeBtn.hide();
+        this.el.show();
+        this.el.setLeftTop(0,0);
+        sl.startCapture(true);
+        var size;
+        switch(this.position){
+            case 'west':
+                sl.setLeft(c.getRight(true));
+                sl.setTop(c.getTop(true));
+                size = this.el.getWidth();
+            break;
+            case 'east':
+                sl.setRight(this.mgr.getViewSize().width-c.getLeft(true));
+                sl.setTop(c.getTop(true));
+                size = this.el.getWidth();
+            break;
+            case 'north':
+                sl.setLeft(c.getLeft(true));
+                sl.setTop(c.getBottom(true));
+                size = this.el.getHeight();
+            break;
+            case 'south':
+                sl.setLeft(c.getLeft(true));
+                sl.setBottom(this.mgr.getViewSize().height-c.getTop(true));
+                size = this.el.getHeight();
+            break;
+        }
+        sl.dom.appendChild(this.el.dom);
+        YAHOO.util.Event.on(document.body, 'click', this.slideInIf, this, true);
+        sl.setSize(this.el.getWidth(), this.el.getHeight());
+        this.beforeSlide();
+        if(this.activePanel){
+            this.activePanel.setSize(this.bodyEl.getWidth(), this.bodyEl.getHeight());
+        }
+        sl.slideShow(this.getAnchor(), size, this.slideDuration, null, false);
+        sl.play(function(){
+            this.afterSlide();
+        }.createDelegate(this));
+    },
+    
+    slideInIf : function(e){
+        var t = YAHOO.util.Event.getTarget(e);
+        if(!YAHOO.util.Dom.isAncestor(this.el.dom, t)){
+            this.slideIn();
+        }
+    },
+    
+    slideIn : function(callback){
+        if(this.isSlid && !this.slideEl.playlist.isPlaying()){
+            YAHOO.util.Event.removeListener(document.body, 'click', this.slideInIf, this, true);
+            this.slideEl.startCapture(true);
+            this.slideEl.slideHide(this.getAnchor(), this.slideDuration, null);
+            this.beforeSlide();
+            this.slideEl.play(function(){
+                this.isSlid = false;
+                this.el.setPositioning(this.snapshot);
+                this.collapseBtn.setVisible(this.snapshot.colbtn);
+                this.closeBtn.setVisible(this.snapshot.closebtn);
+                this.afterSlide();
+                this.mgr.el.dom.appendChild(this.el.dom);
+                if(typeof callback == 'function'){
+                    callback();
+                }
+            }.createDelegate(this));
+        }
+    },
+    
+    animateExpand : function(){
+        var em = this.margins, cm = this.cmargins;
+        var c = this.collapsedEl, el = this.el;
+        var direction, distance;
+        switch(this.position){
+            case 'west':
+                direction = 'right';
+                el.setLeft(-(el.getWidth() + (em.right+em.left)));
+                el.setTop(c.getTop(true)-cm.top+em.top);
+                distance = el.getWidth() + (em.right+em.left);
+            break;
+            case 'east':
+                direction = 'left';
+                el.setLeft(this.mgr.getViewSize().width + em.left);
+                el.setTop(c.getTop(true)-cm.top+em.top);
+                distance = el.getWidth() + (em.right+em.left);
+            break;
+            case 'north':
+                direction = 'down';
+                el.setLeft(em.left);
+                el.setTop(-(el.getHeight() + (em.top+em.bottom)));
+                distance = el.getHeight() + (em.top+em.bottom);
+            break;
+            case 'south':
+                direction = 'up';
+                el.setLeft(em.left);
+                el.setTop(this.mgr.getViewSize().height + em.top);
+                distance = el.getHeight() + (em.top+em.bottom);
+            break;
+        }
+        this.beforeSlide();
+        el.setStyle('z-index', '100');
+        el.show();
+        c.setLocation(-2000,-2000);
+        c.hide();
+        el.move(direction, distance, true, this.duration, function(){
+            this.afterSlide();
+            el.setStyle('z-index', '');
+            if(this.split){
+                this.split.el.show();
+            }
+            this.fireEvent('invalidated', this);
+            this.fireEvent('expanded', this);
+        }.createDelegate(this), this.config.easing || YAHOO.util.Easing.easeOut);
+    },
+    
+    animateCollapse : function(){
+        var em = this.margins, cm = this.cmargins;
+        var c = this.collapsedEl, el = this.el;
+        var direction, distance;
+        switch(this.position){
+            case 'west':
+                direction = 'left';
+                distance = el.getWidth() + (em.right+em.left);
+            break;
+            case 'east':
+                direction = 'right';
+                distance = el.getWidth() + (em.right+em.left);
+            break;
+            case 'north':
+                direction = 'up';
+                distance = el.getHeight() + (em.top+em.bottom);
+            break;
+            case 'south':
+                direction = 'down';
+                distance = el.getHeight() + (em.top+em.bottom);
+            break;
+        }
+        this.el.setStyle('z-index', '100');
+        this.beforeSlide();
+        this.el.move(direction, distance, true, this.duration, function(){
+            this.afterSlide();
+            this.el.setStyle('z-index', '');
+            this.el.setLocation(-20000,-20000);
+            this.el.hide();
+            this.collapsedEl.show();
+            this.fireEvent('collapsed', this); 
+        }.createDelegate(this), YAHOO.util.Easing.easeIn);
+    },
+    
+    getAnchor : function(){
+        switch(this.position){
+            case 'west':
+                return 'left';
+            case 'east':
+                return 'right';
+            case 'north':
+                return 'top';
+            case 'south':
+                return 'bottom';
+        }
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/State.js.html b/www/extras/yui-ext/docs/output/State.js.html new file mode 100644 index 000000000..4214222f6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/State.js.html @@ -0,0 +1,265 @@ +State.js
YAHOO.namespace('ext.state');
+/**
+ * @class YAHOO.ext.state.Provider
+ * Abstract base class for provider implementations. This class provides methods
+ * for encoding and decoding <b>typed</b> variables including dates and defines the 
+ * Provider interface.
+ */
+YAHOO.ext.state.Provider = function(){
+    YAHOO.ext.state.Provider.superclass.constructor.call(this);
+    /**
+     * @event statechange
+     * Fires when a state change occurs.
+     * @param {Provider} this
+     * @param {String} key The state key which was changed
+     * @param {String} value The encoded value for the state
+     */
+    this.events = {
+        'statechange': new YAHOO.util.CustomEvent('statechange')  
+    };
+    this.state = {};
+};
+YAHOO.extendX(YAHOO.ext.state.Provider, YAHOO.ext.util.Observable, {
+    /**
+     * Get the current value for a key.
+     * @param {String} name
+     * @param {Mixed} defaultValue
+     * @return {Mixed}
+     */
+    get : function(name, defaultValue){
+        return typeof this.state[name] == 'undefined' ?
+            defaultValue : this.state[name];
+    },
+    
+    /**
+     * Clear a value from the state.
+     */
+    clear : function(name){
+        delete this.state[name];
+        this.fireEvent('statechange', this, name, null);
+    },
+    
+    /**
+     * Set the value for a key.
+     * @param {String} name
+     * @param {Mixed} value
+     */
+    set : function(name, value){
+        this.state[name] = value;
+        this.fireEvent('statechange', this, name, value);
+    },
+    
+    /**
+     * Decodes a string previously encoded with {@link #encodeValue}.
+     * @param {String} value
+     * @return {Mixed} The value
+     */
+    decodeValue : function(cookie){
+        var re = /^(a|n|d|b|s|o)\:(.*)$/;
+        var matches = re.exec(unescape(cookie));
+        if(!matches || !matches[1]) return; // non state cookie
+        var type = matches[1];
+        var v = matches[2];
+        switch(type){
+            case 'n':
+                return parseFloat(v);
+            case 'd':
+                return new Date(Date.parse(v));
+            case 'b':
+                return (v == '1');
+            case 'a':
+                var all = [];
+                var values = v.split('^');
+                for(var i = 0, len = values.length; i < len; i++){
+                    all.push(this.decodeValue(values[i]))
+                }
+                return all;
+           case 'o':
+                var all = {};
+                var values = v.split('^');
+                for(var i = 0, len = values.length; i < len; i++){
+                    var kv = values[i].split('=');
+                    all[kv[0]] = this.decodeValue(kv[1]);
+                }
+                return all;
+           default:
+                return v;
+        }
+    },
+    
+    /**
+     * Encode a value including type information.
+     * @param {Mixed} value
+     * @return {String}
+     */
+    encodeValue : function(v){
+        var enc;
+        if(typeof v == 'number'){
+            enc = 'n:' + v;
+        }else if(typeof v == 'boolean'){
+            enc = 'b:' + (v ? '1' : '0');
+        }else if(v instanceof Date){
+            enc = 'd:' + v.toGMTString();
+        }else if(v instanceof Array){
+            var flat = '';
+            for(var i = 0, len = v.length; i < len; i++){
+                flat += this.encodeValue(v[i]);
+                if(i != len-1) flat += '^';
+            }
+            enc = 'a:' + flat;
+        }else if(typeof v == 'object'){
+            var flat = '';
+            for(var key in v){
+                if(typeof v[key] != 'function'){
+                    flat += key + '=' + this.encodeValue(v[key]) + '^';
+                }
+            }
+            enc = 'o:' + flat.substring(0, flat.length-1);
+        }else{
+            enc = 's:' + v;
+        }
+        return escape(enc);        
+    }
+});
+
+/**
+ * @class YAHOO.ext.state.Manager
+ * This is the global state manager. By default all components that are "state aware" check this class
+ * for state information if you don't pass them a custom state provider. In order for this class
+ * to be useful, it must be initialized with a provider when your application initializes.
+ <pre><code>
+// in your initialization function
+init : function(){
+   YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider());
+   ...
+   // supposed you have a {@link YAHOO.ext.BorderLayout}
+   var layout = new YAHOO.ext.BorderLayout(...);
+   layout.restoreState();
+   // or a {YAHOO.ext.BasicDialog}
+   var dialog = new YAHOO.ext.BasicDialog(...);
+   dialog.restoreState();
+ </code></pre>
+ * @singleton
+ */
+YAHOO.ext.state.Manager = new function(){
+    var provider = new YAHOO.ext.state.Provider();
+    
+    return {
+        /**
+         * Configures the default provider for your application.
+         * @param {Provider} stateProvider
+         */
+        setProvider : function(stateProvider){
+            provider = stateProvider;
+        },
+        
+        /**
+         * Get the current value for a key.
+         * @param {String} name
+         * @param {Mixed} defaultValue
+         * @return {Mixed}
+         */
+        get : function(key, defaultValue){
+            return provider.get(key, defaultValue);
+        },
+        
+        /**
+         * Set the value for a key.
+         * @param {String} name
+         * @param {Mixed} value
+         */
+         set : function(key, value){
+            provider.set(key, value);
+        },
+        
+        /**
+         * Clear a value from the state.
+         */
+        clear : function(key){
+            provider.clear(key);
+        },
+        
+        /**
+         * Gets the currently configured provider.
+         * @return {Provider}
+         */
+        getProvider : function(){
+            return provider;
+        }
+    };
+}();
+
+/**
+ * @class YAHOO.ext.state.CookieProvider
+ * @extends YAHOO.ext.state.Provider
+ * The default Provider implementation. The example below includes all valid configuration options and their
+ * default values.
+ <pre><code>
+   var cp = new YAHOO.ext.state.CookieProvider({
+       path: '/',
+       expires: new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
+       domain: null,
+       secure: false       
+   })
+   YAHOO.ext.state.Manager.setProvider(cp);
+ </code></pre>
+ * @constructor
+ * Create a new CookieProvider
+ * @param {Object} config The configuration object
+ */
+YAHOO.ext.state.CookieProvider = function(config){
+    YAHOO.ext.state.CookieProvider.superclass.constructor.call(this);
+    this.path = '/';
+    this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
+    this.domain = null;
+    this.secure = false;
+    YAHOO.ext.util.Config.apply(this, config);
+    this.state = this.readCookies();
+};
+
+YAHOO.extendX(YAHOO.ext.state.CookieProvider, YAHOO.ext.state.Provider, {
+    set : function(name, value){
+        if(typeof value == 'undefined' || value === null){
+            this.clear(name);
+            return;
+        }
+        this.setCookie(name, value);
+        YAHOO.ext.state.CookieProvider.superclass.set.call(this, name, value);
+    },
+        
+    clear : function(name){
+        this.clearCookie(name);
+        YAHOO.ext.state.CookieProvider.superclass.clear.call(this, name);
+    },
+        
+    readCookies : function(){
+        var cookies = {};
+        var c = document.cookie + ';';
+        var re = /\s?(.*?)=(.*?);/g;
+    	var matches;
+    	while((matches = re.exec(c)) != null){
+            var name = matches[1];
+            var value = matches[2];
+            if(name && name.substring(0,3) == 'ys-'){
+                cookies[name.substr(3)] = this.decodeValue(value);
+            }
+        }
+        return cookies;
+    },
+    
+    setCookie : function(name, value){
+        document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +
+           ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +
+           ((this.path == null) ? "" : ("; path=" + this.path)) +
+           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+           ((this.secure == true) ? "; secure" : "");
+    },
+    
+    clearCookie : function(name){
+        document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +
+           ((this.path == null) ? "" : ("; path=" + this.path)) +
+           ((this.domain == null) ? "" : ("; domain=" + this.domain)) +
+           ((this.secure == true) ? "; secure" : "");
+    }
+});
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TabPanel.js.html b/www/extras/yui-ext/docs/output/TabPanel.js.html new file mode 100644 index 000000000..3dc884361 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TabPanel.js.html @@ -0,0 +1,705 @@ +TabPanel.js
/**
+ * @class YAHOO.ext.TabPanel
+ * @extends YAHOO.ext.util.Observable
+ * Creates a lightweight TabPanel component using Yahoo! UI.
+ * <br><br>
+ * Usage:
+ * <pre><code>
+    <font color="#008000">// basic tabs 1, built from existing content</font>
+    var tabs = new YAHOO.ext.TabPanel('tabs1');
+    tabs.addTab('script', "View Script");
+    tabs.addTab('markup', "View Markup");
+    tabs.activate('script');
+    
+    <font color="#008000">// more advanced tabs, built from javascript</font>
+    var jtabs = new YAHOO.ext.TabPanel('jtabs');
+    jtabs.addTab('jtabs-1', "Normal Tab", "My content was added during construction.");
+    
+    <font color="#008000">// set up the UpdateManager</font>
+    var tab2 = jtabs.addTab('jtabs-2', "Ajax Tab 1");
+    var updater = tab2.getUpdateManager();
+    updater.setDefaultUrl('ajax1.htm');
+    tab2.onActivate.subscribe(updater.refresh, updater, true);
+    
+    <font color="#008000">// Use setUrl for Ajax loading</font>
+    var tab3 = jtabs.addTab('jtabs-3', "Ajax Tab 2");
+    tab3.setUrl('ajax2.htm', null, true);
+    
+    <font color="#008000">// Disabled tab</font>
+    var tab4 = jtabs.addTab('tabs1-5', "Disabled Tab", "Can't see me cause I'm disabled");
+    tab4.disable();
+    
+    jtabs.activate('jtabs-1');
+}
+ * </code></pre>
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.ext.UpdateManager
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.Connect (optional)
+ * @constructor
+ * Create new TabPanel.
+ * @param {String/HTMLElement/Element} container The id, DOM element or YAHOO.ext.Element container where this TabPanel is to be rendered. 
+ * @param {Boolean} config Config object to set any properties for this TabPanel or true to render the tabs on the bottom. 
+ */
+YAHOO.ext.TabPanel = function(container, config){
+    /**
+    * The container element for this TabPanel.
+    * @type YAHOO.ext.Element
+    */
+    this.el = getEl(container, true);
+    /** The position of the tabs. Can be 'top' or 'bottom' @type String */
+    this.tabPosition = 'top';
+    this.currentTabWidth = 0;
+    /** The minimum width of a tab (ignored if resizeTabs is not true). @type Number */
+    this.minTabWidth = 40;
+    /** The maximum width of a tab (ignored if resizeTabs is not true). @type Number */
+    this.maxTabWidth = 250;
+    /** The preferred (default) width of a tab (ignored if resizeTabs is not true). @type Number */
+    this.preferredTabWidth = 175;
+    /** Set this to true to enable dynamic tab resizing. @type Boolean */
+    this.resizeTabs = false;
+    /** Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true). @type Boolean */
+    this.monitorResize = true;
+    
+    if(config){
+        if(typeof config == 'boolean'){
+            this.tabPosition = config ? 'bottom' : 'top';
+        }else{
+            YAHOO.ext.util.Config.apply(this, config);
+        }
+    }
+    if(this.tabPosition == 'bottom'){
+        this.bodyEl = getEl(this.createBody(this.el.dom));
+        this.el.addClass('ytabs-bottom');
+    }
+    this.stripWrap = getEl(this.createStrip(this.el.dom), true);
+    this.stripEl = getEl(this.createStripList(this.stripWrap.dom), true);
+    this.stripBody = getEl(this.stripWrap.dom.firstChild.firstChild, true);
+    if(this.tabPosition != 'bottom'){
+    /** The body element that contains TabPaneItem bodies. 
+     * @type YAHOO.ext.Element
+     */
+      this.bodyEl = getEl(this.createBody(this.el.dom));
+      this.el.addClass('ytabs-top');
+    }
+    this.items = [];
+    
+    // add indexOf to array if it isn't present
+    if(!this.items.indexOf){
+        this.items.indexOf = function(o){
+            for(var i = 0, len = this.length; i < len; i++){
+                if(this[i] == o) return i;
+            }
+            return -1;
+        }
+    }
+    this.active = null;
+    this.onTabChange = new YAHOO.util.CustomEvent('TabItem.onTabChange');
+    this.activateDelegate = this.activate.createDelegate(this);
+    
+    this.events = {
+        /**
+         * @event tabchange
+         * Fires when the active tab changes
+         * @param {YAHOO.ext.TabPanel} this
+         * @param {YAHOO.ext.TabPanelItem} activePanel The new active tab
+         */
+        'tabchange': this.onTabChange,
+        /**
+         * @event beforetabchange
+         * Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change
+         * @param {YAHOO.ext.TabPanel} this
+         * @param {Object} e Set cancel to true on this object to cancel the tab change
+         * @param {YAHOO.ext.TabPanelItem} tab The tab being changed to
+         */
+        'beforetabchange' : new YAHOO.util.CustomEvent('beforechange')
+    };
+    
+    YAHOO.ext.EventManager.onWindowResize(this.onResize, this, true);
+    this.cpad = this.el.getPadding('lr');
+    this.hiddenCount = 0;
+}
+
+YAHOO.ext.TabPanel.prototype = {
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    /**
+     * Creates a new TabPanelItem by looking for an existing element with the provided id - if it's not found it creates one.
+     * @param {String} id The id of the div to use <b>or create</b>
+     * @param {String} text The text for the tab
+     * @param {<i>String</i>} content (optional) Content to put in the TabPanelItem body
+     * @param {<i>Boolean</i>} closable (optional) True to create a close icon on the tab
+     * @return {YAHOO.ext.TabPanelItem} The created TabPanelItem
+     */
+    addTab : function(id, text, content, closable){
+        var item = new YAHOO.ext.TabPanelItem(this, id, text, closable);
+        this.addTabItem(item);
+        if(content){
+            item.setContent(content);
+        }
+        return item;
+    },
+    
+    /**
+     * Returns the TabPanelItem with the specified id/index
+     * @param {String/Number} id The id or index of the TabPanelItem to fetch.
+     * @return {YAHOO.ext.TabPanelItem}
+     */
+    getTab : function(id){
+        return this.items[id];
+    },
+    
+    /**
+     * Hides the TabPanelItem with the specified id/index
+     * @param {String/Number} id The id or index of the TabPanelItem to hide.
+     */
+    hideTab : function(id){
+        var t = this.items[id];
+        if(!t.isHidden()){
+           t.setHidden(true);
+           this.hiddenCount++;
+           this.autoSizeTabs();
+        }
+    },
+    
+    /**
+     * "Unhides" the TabPanelItem with the specified id/index
+     * @param {String/Number} id The id or index of the TabPanelItem to unhide.
+     */
+    unhideTab : function(id){
+        var t = this.items[id];
+        if(t.isHidden()){
+           t.setHidden(false);
+           this.hiddenCount--;
+           this.autoSizeTabs();
+        }
+    },
+    
+    /**
+     * Add an existing TabPanelItem.
+     * @param {YAHOO.ext.TabPanelItem} item The TabPanelItem to add
+     */
+    addTabItem : function(item){
+        this.items[item.id] = item;
+        this.items.push(item);
+        if(this.resizeTabs){
+           item.setWidth(this.currentTabWidth || this.preferredTabWidth)
+           this.autoSizeTabs();
+        }else{
+            item.autoSize();
+        }
+    },
+        
+    /**
+     * Remove a TabPanelItem.
+     * @param {String/Number} id The id or index of the TabPanelItem to remove.
+     */
+    removeTab : function(id){
+        var items = this.items;
+        var tab = items[id];
+        if(!tab) return;
+        var index = items.indexOf(tab);
+        if(this.active == tab && items.length > 1){
+            var newTab = this.getNextAvailable(index);
+            if(newTab)newTab.activate();
+        }
+        tab.purgeListeners();
+        this.stripEl.dom.removeChild(tab.pnode.dom);
+        if(tab.bodyEl.dom.parentNode == this.bodyEl.dom){ // if it was moved already prevent error
+            this.bodyEl.dom.removeChild(tab.bodyEl.dom);
+        }
+        items.splice(index, 1);
+        delete this.items[tab.id];
+        this.autoSizeTabs();
+    },
+    
+    getNextAvailable : function(start){
+        var items = this.items;
+        var index = start;
+        // look for a next tab that will slide over to
+        // replace the one being removed
+        while(index < items.length){
+            var item = items[++index];
+            if(item && !item.isHidden()){
+                return item;
+            }
+        }
+        // if one isn't found select the previous tab (on the left)
+        var index = start;
+        while(index >= 0){
+            var item = items[--index];
+            if(item && !item.isHidden()){
+                return item;
+            }
+        }
+        return null;
+    },
+    
+    /**
+     * Disable a TabPanelItem. <b>It cannot be the active tab, if it is this call is ignored.</b>. 
+     * @param {String/Number} id The id or index of the TabPanelItem to disable.
+     */
+    disableTab : function(id){
+        var tab = this.items[id];
+        if(tab && this.active != tab){
+            tab.disable();
+        }
+    },
+    
+    /**
+     * Enable a TabPanelItem that is disabled.
+     * @param {String/Number} id The id or index of the TabPanelItem to enable.
+     */
+    enableTab : function(id){
+        var tab = this.items[id];
+        tab.enable();
+    },
+    
+    /**
+     * Activate a TabPanelItem. The currently active will be deactivated. 
+     * @param {String/Number} id The id or index of the TabPanelItem to activate.
+     */
+    activate : function(id){
+        var tab = this.items[id];
+        if(tab == this.active){
+            return tab;
+        } 
+        var e = {};
+        this.fireEvent('beforetabchange', this, e, tab);
+        if(e.cancel !== true && !tab.disabled){
+            if(this.active){
+                this.active.hide();
+            }
+            this.active = this.items[id];
+            this.active.show();
+            this.onTabChange.fireDirect(this, this.active);
+        }
+        return tab;
+    },
+    
+    /**
+     * Get the active TabPanelItem
+     * @return {YAHOO.ext.TabPanelItem} The active TabPanelItem or null if none are active.
+     */
+    getActiveTab : function(){
+        return this.active;
+    },
+    
+    /**
+     * Updates the tab body element to fit the height of the container element
+     * for overflow scrolling
+     * @param {Number} targetHeight (optional) Override the starting height from the elements height
+     */
+    syncHeight : function(targetHeight){
+        var height = (targetHeight || this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb');
+        var bm = this.bodyEl.getMargins();
+        var newHeight = height-(this.stripWrap.getHeight())-(bm.top+bm.bottom);
+        this.bodyEl.setHeight(newHeight);
+        return newHeight; 
+    },
+    
+    onResize : function(){
+        if(this.monitorResize){
+            this.autoSizeTabs();
+        }
+    },
+
+    /**
+     * Disables tab resizing while tabs are being added (if resizeTabs is false this does nothing)
+     */
+    beginUpdate : function(){
+        this.updating = true;    
+    },
+    
+    /**
+     * Stops an update and resizes the tabs (if resizeTabs is false this does nothing)
+     */
+    endUpdate : function(){
+        this.updating = false;
+        this.autoSizeTabs();  
+    },
+    
+    /**
+     * Manual call to resize the tabs (if resizeTabs is false this does nothing)
+     */
+    autoSizeTabs : function(){
+        var count = this.items.length;
+        var vcount = count - this.hiddenCount;
+        if(!this.resizeTabs || count < 1 || vcount < 1 || this.updating) return;
+        var w = Math.max(this.el.getWidth() - this.cpad, 10);
+        var availWidth = Math.floor(w / vcount);
+        var b = this.stripBody;
+        if(b.getWidth() > w){
+            var tabs = this.items;
+            this.setTabWidth(Math.max(availWidth, this.minTabWidth));
+            if(availWidth < this.minTabWidth){
+                /*if(!this.sleft){    // incomplete scrolling code
+                    this.createScrollButtons();
+                }
+                this.showScroll();
+                this.stripClip.setWidth(w - (this.sleft.getWidth()+this.sright.getWidth()));*/
+            }
+        }else{
+            if(this.currentTabWidth < this.preferredTabWidth){
+                this.setTabWidth(Math.min(availWidth, this.preferredTabWidth));
+            }
+        }
+    },
+    
+    /**
+     * Resizes all the tabs to the passed width
+     * @param {Number} The new width
+     */
+    setTabWidth : function(width){
+        this.currentTabWidth = width;
+        for(var i = 0, len = this.items.length; i < len; i++) {
+        	if(!this.items[i].isHidden())this.items[i].setWidth(width);
+        }
+    },
+    
+    /**
+     * Destroys this TabPanel
+     * @param {Boolean} removeEl (optional) True to remove the element from the DOM as well
+     */
+    destroy : function(removeEl){
+        YAHOO.ext.EventManager.removeResizeListener(this.onResize, this);
+        for(var i = 0, len = this.items.length; i < len; i++){
+            this.items[i].purgeListeners();
+        }
+        if(removeEl === true){
+            this.el.update('');
+            this.el.remove();
+        }
+    }
+};
+
+/**
+* @class YAHOO.ext.TabPanelItem
+* @extends YAHOO.ext.util.Observable
+*/ 
+YAHOO.ext.TabPanelItem = function(tabPanel, id, text, closable){
+    /**
+     * The TabPanel this TabPanelItem belongs to
+     * @type YAHOO.ext.TabPanel
+     */
+    this.tabPanel = tabPanel;
+    /**
+     * The id for this TabPanelItem
+     * @type String
+     */
+    this.id = id;
+    /** @private */
+    this.disabled = false;
+    /** @private */
+    this.text = text;
+    /** @private */
+    this.loaded = false;
+    this.closable = closable;
+    
+    /** 
+     * The body element for this TabPanelItem
+     * @type YAHOO.ext.Element
+     */
+    this.bodyEl = getEl(tabPanel.createItemBody(tabPanel.bodyEl.dom, id));
+    this.bodyEl.setVisibilityMode(YAHOO.ext.Element.VISIBILITY);
+    this.bodyEl.setStyle('display', 'block');
+    this.hideAction();
+    
+    var els = tabPanel.createStripElements(tabPanel.stripEl.dom, text, closable);
+    /** @private */
+    this.el = getEl(els.el, true);
+    this.inner = getEl(els.inner, true);
+    this.textEl = getEl(this.el.dom.firstChild.firstChild.firstChild, true);
+    this.pnode = getEl(els.el.parentNode, true);
+    this.el.mon('click', this.onTabClick, this, true);
+    /** @private */
+    if(closable){
+        var c = getEl(els.close, true);
+        c.dom.title = this.closeText;
+        c.addClassOnOver('close-over');
+        c.mon('click', this.closeClick, this, true);
+     }
+    
+    // these two are now private and deprecated
+    this.onActivate = new YAHOO.util.CustomEvent('TabItem.onActivate');
+    this.onDeactivate = new YAHOO.util.CustomEvent('TabItem.onDeactivate');
+    
+    this.events = {
+         /**
+         * @event activate
+         * Fires when this tab becomes the active tab
+         * @param {YAHOO.ext.TabPanel} tabPanel
+         * @param {YAHOO.ext.TabPanelItem} this
+         */
+        'activate': this.onActivate,
+        /**
+         * @event beforeclose
+         * Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true)
+         * @param {YAHOO.ext.TabPanelItem} this
+         * @param {Object} e Set cancel to true on this object to cancel the close.
+         */
+        'beforeclose': new YAHOO.util.CustomEvent('beforeclose'),
+        /**
+         * @event close
+         * Fires when this tab is closed
+         * @param {YAHOO.ext.TabPanelItem} this
+         */
+         'close': new YAHOO.util.CustomEvent('close'),
+        /**
+         * @event deactivate
+         * Fires when this tab is no longer the active tab
+         * @param {YAHOO.ext.TabPanel} tabPanel
+         * @param {YAHOO.ext.TabPanelItem} this
+         */
+         'deactivate' : this.onDeactivate  
+    };
+    this.hidden = false;
+};
+
+YAHOO.ext.TabPanelItem.prototype = {
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : function(){
+       YAHOO.ext.util.Observable.prototype.purgeListeners.call(this);
+       this.el.removeAllListeners(); 
+    },
+    /**
+     * Show this TabPanelItem - this <b>does not</b> deactivate the currently active TabPanelItem.
+     */
+    show : function(){
+        this.pnode.addClass('on');
+        this.showAction();
+        if(YAHOO.ext.util.Browser.isOpera){
+            this.tabPanel.stripWrap.repaint();
+        }
+        this.onActivate.fireDirect(this.tabPanel, this); 
+    },
+    
+    /**
+     * Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd.
+     */
+    hide : function(){
+        this.pnode.removeClass('on');
+        this.hideAction();
+        this.onDeactivate.fireDirect(this.tabPanel, this); 
+    },
+    
+    hideAction : function(){
+        this.bodyEl.setStyle('position', 'absolute');
+        this.bodyEl.setLeft(-20000);
+        this.bodyEl.setTop(-20000);
+        this.bodyEl.hide();
+    },
+    
+    showAction : function(){
+        this.bodyEl.setLeft('');
+        this.bodyEl.setTop('');
+        this.bodyEl.setStyle('position', 'static');
+        this.bodyEl.show();
+    },
+    
+    setTooltip : function(text){
+        this.titleEl.dom.title = text;
+    },
+    
+    onTabClick : function(e){
+        e.preventDefault();
+        this.tabPanel.activate(this.id);
+    },
+    
+    getWidth : function(){
+        return this.inner.getWidth();  
+    },
+    
+    setWidth : function(width){
+        var iwidth = width - this.pnode.getPadding("lr");
+        this.inner.setWidth(iwidth);
+        this.textEl.setWidth(iwidth-this.inner.getPadding('lr'));
+        this.pnode.setWidth(width);
+    },
+    
+    setHidden : function(hidden){
+        this.hidden = hidden;
+        this.pnode.setStyle('display', hidden ? 'none' : 'block');  
+    },
+    
+    isHidden : function(){
+        return this.hidden;  
+    },
+    
+    getText : function(){
+        return this.text;
+    },
+    
+    autoSize : function(){
+        this.el.beginMeasure();
+        this.textEl.setWidth(1);
+        this.setWidth(this.textEl.dom.scrollWidth+this.pnode.getPadding("lr")+this.inner.getPadding('lr'));
+        this.el.endMeasure();
+    },
+    
+    setText : function(text){
+        this.text = text;
+        this.textEl.update(text);
+        this.textEl.dom.title = text;
+        if(!this.tabPanel.resizeTabs){
+            this.autoSize();
+        }
+    },
+    /**
+     * Activate this TabPanelItem - this <b>does</b> deactivate the currently active TabPanelItem.
+     */
+    activate : function(){
+        this.tabPanel.activate(this.id);
+    },
+    
+    /**
+     * Disable this TabPanelItem - this call is ignore if this is the active TabPanelItem.
+     */
+    disable : function(){
+        if(this.tabPanel.active != this){
+            this.disabled = true;
+            this.pnode.addClass('disabled');
+        }
+    },
+    
+    /**
+     * Enable this TabPanelItem if it was previously disabled.
+     */
+    enable : function(){
+        this.disabled = false;
+        this.pnode.removeClass('disabled');
+    },
+    
+    /**
+     * Set the content for this TabPanelItem.
+     * @param {String} content The content
+     * @param {Boolean} loadScripts true to look for and load scripts
+     */
+    setContent : function(content, loadScripts){
+        this.bodyEl.update(content, loadScripts);
+    },
+    
+    /**
+     * Get the {@link YAHOO.ext.UpdateManager} for the body of this TabPanelItem. Enables you to perform Ajax updates.
+     * @return {YAHOO.ext.UpdateManager} The UpdateManager
+     */
+    getUpdateManager : function(){
+        return this.bodyEl.getUpdateManager();
+    },
+    
+    /**
+     * Set a URL to be used to load the content for this TabPanelItem.
+     * @param {String/Function} url The url to load the content from or a function to call to get the url
+     * @param {<i>String/Object</i>} params (optional) The string params for the update call or an object of the params. See {@link YAHOO.ext.UpdateManager#update} for more details. (Defaults to null)
+     * @param {<i>Boolean</i>} loadOnce (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this TabPanelItem is activated. (Defaults to false)
+     * @return {YAHOO.ext.UpdateManager} The UpdateManager
+     */
+    setUrl : function(url, params, loadOnce){
+        if(this.refreshDelegate){
+            this.onActivate.unsubscribe(this.refreshDelegate);
+        }
+        this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]);
+        this.onActivate.subscribe(this.refreshDelegate);
+        return this.bodyEl.getUpdateManager();
+    },
+    
+    /** @private */
+    _handleRefresh : function(url, params, loadOnce){
+        if(!loadOnce || !this.loaded){
+            var updater = this.bodyEl.getUpdateManager();
+            updater.update(url, params, this._setLoaded.createDelegate(this));
+        }
+    },
+    
+    /** @private */
+    _setLoaded : function(){
+        this.loaded = true;
+    },
+    
+    /** @private */
+    closeClick : function(e){
+        var e = {};
+        this.fireEvent('beforeclose', this, e);
+        if(e.cancel !== true){
+            this.tabPanel.removeTab(this.id);
+            this.fireEvent('close', this);
+        }
+    },
+    /**
+     * The text displayed in the tooltip for the close icon.
+     * @type String
+     */
+    closeText : 'Close this tab'
+};
+
+/** @private */
+YAHOO.ext.TabPanel.prototype.createStrip = function(container){
+    var strip = document.createElement('div');
+    strip.className = 'ytab-wrap';
+    container.appendChild(strip);
+    return strip;
+};
+/** @private */
+YAHOO.ext.TabPanel.prototype.createStripList = function(strip){
+    // div wrapper for retard IE
+    strip.innerHTML = '<div class="ytab-strip-wrap"><table class="ytab-strip" cellspacing="0" cellpadding="0" border="0"><tbody><tr></tr></tbody></table></div>';
+    return strip.firstChild.firstChild.firstChild.firstChild;
+};
+/** @private */
+YAHOO.ext.TabPanel.prototype.createBody = function(container){
+    var body = document.createElement('div');
+    YAHOO.util.Dom.generateId(body, 'tab-body');
+    YAHOO.util.Dom.addClass(body, 'yui-ext-tabbody');
+    container.appendChild(body);
+    return body;
+};
+/** @private */
+YAHOO.ext.TabPanel.prototype.createItemBody = function(bodyEl, id){
+    var body = YAHOO.util.Dom.get(id);
+    if(!body){
+        body = document.createElement('div');
+        body.id = id;
+    }
+    YAHOO.util.Dom.addClass(body, 'yui-ext-tabitembody');
+    bodyEl.appendChild(body);
+    return body;
+};
+/** @private */
+YAHOO.ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){
+    var td = document.createElement('td');
+    stripEl.appendChild(td);
+    if(closable){
+        td.className = "ytab-closable";
+        if(!this.closeTpl){
+            this.closeTpl = new YAHOO.ext.Template(
+               '<a href="#" class="ytab-right"><span class="ytab-left"><em class="ytab-inner">' +
+               '<span unselectable="on" title="{text}" class="ytab-text">{text}</span>' +
+               '<div unselectable="on" class="close-icon">&#160;</div></em></span></a>'
+            );
+        }
+        var el = this.closeTpl.overwrite(td, {'text': text});
+        var close = el.getElementsByTagName('div')[0];
+        var inner = el.getElementsByTagName('em')[0];
+        return {'el': el, 'close': close, 'inner': inner};
+    } else {
+        if(!this.tabTpl){
+            this.tabTpl = new YAHOO.ext.Template(
+               '<a href="#" class="ytab-right"><span class="ytab-left"><em class="ytab-inner">' +
+               '<span unselectable="on" title="{text}" class="ytab-text">{text}</span></em></span></a>'
+            );
+        }
+        var el = this.tabTpl.overwrite(td, {'text': text});
+        var inner = el.getElementsByTagName('em')[0];
+        return {'el': el, 'inner': inner};
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TaskPanel.js.html b/www/extras/yui-ext/docs/output/TaskPanel.js.html new file mode 100644 index 000000000..9a1481991 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TaskPanel.js.html @@ -0,0 +1 @@ +TaskPanel.js

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TemplateView.js.html b/www/extras/yui-ext/docs/output/TemplateView.js.html new file mode 100644 index 000000000..92f5f85c2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TemplateView.js.html @@ -0,0 +1,492 @@ +TemplateView.js
/**
+ * @class YAHOO.ext.View
+ * @extends YAHOO.ext.util.Observable
+ * Create a "View" for an element based on a data model or UpdateManager and the supplied DomHelper template. 
+ * This class also supports single and multi selection modes. <br>
+ * Create a data model bound view:
+<pre><code>
+var dataModel = new YAHOO.ext.grid.XMLDataModel(...);
+var view = new YAHOO.ext.View('my-element', 
+           '&lt;div id="{0}"&gt;{2} - {1}&lt;/div&gt;', // auto create template
+           dataModel, { 
+              singleSelect: true, 
+              selectedClass: 'ydataview-selected'
+           });
+
+// listen for node click?
+view.on('click', function(vw, index, node, e){
+    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
+});
+
+// load XML data
+dataModel.load('foobar.xml');
+</code></pre>
+For an example of creating a JSON/UpdateManager view, see {@link YAHOO.ext.JsonView}.
+ * <br><br>
+ * <b>Note: The root of your template must be a single node. Table/row implementations may work but are not supported due to
+ * IE's limited insertion support with tables and Opera's faulty event bubbling.</b>
+ * @constructor
+ * Create a new View
+ * @param {String/HTMLElement/Element} container The container element where the view is to be rendered.
+ * @param {String/DomHelper.Template} tpl The rendering template or a string to create a template with
+ * @param {DataModel} dataModel The bound data model
+ * @param {Object} config The config object
+*/
+YAHOO.ext.View = function(container, tpl, dataModel, config){
+    this.el = getEl(container, true);
+    this.nodes = this.el.dom.childNodes;
+    if(typeof tpl == 'string'){
+        tpl = new YAHOO.ext.Template(tpl);
+    }
+    tpl.compile();
+    /**
+     * The template used by this View
+     * @type {YAHOO.ext.DomHelper.Template}
+     */
+    this.tpl = tpl;
+    this.setDataModel(dataModel);
+    
+    var CE = YAHOO.util.CustomEvent;
+	/** @private */
+	this.events = {
+	    /**
+         * @event click
+         * Fires when a template node is clicked.
+         * @param {YAHOO.ext.View} this
+         * @param {Number} index The index of the target node
+         * @param {HTMLElement} node The target node
+         * @param {YAHOO.ext.EventObject} e The raw event object
+         */
+        'click' : new CE('click'),
+	    /**
+         * @event dblclick
+         * Fires when a template node is double clicked.
+         * @param {YAHOO.ext.View} this
+         * @param {Number} index The index of the target node
+         * @param {HTMLElement} node The target node
+         * @param {YAHOO.ext.EventObject} e The raw event object
+         */
+        'dblclick' : new CE('dblclick'),
+	    /**
+         * @event contextmenu
+         * Fires when a template node is right clicked.
+         * @param {YAHOO.ext.View} this
+         * @param {Number} index The index of the target node
+         * @param {HTMLElement} node The target node
+         * @param {YAHOO.ext.EventObject} e The raw event object
+         */
+        'contextmenu' : new CE('contextmenu'),
+	    /**
+         * @event selectionchange
+         * Fires when the selected nodes change.
+         * @param {YAHOO.ext.View} this
+         * @param {Array} selections Array of the selected nodes
+         */
+        'selectionchange' : new CE('selectionchange')
+	};
+	this.el.mon("click", this.onClick, this, true);
+    this.el.mon("dblclick", this.onDblClick, this, true);
+    this.el.mon("contextmenu", this.onContextMenu, this, true);
+    
+    /**
+     * The css class to add to selected nodes
+     * @type {YAHOO.ext.DomHelper.Template}
+     */
+    this.selectedClass = 'ydataview-selected';
+    
+    this.selections = [];
+    this.lastSelection = null;
+    
+    /**
+     * The root property in the loaded json object that contains the data
+     * @type {String}
+     */
+    this.jsonRoot = null;
+    YAHOO.ext.util.Config.apply(this, config);
+    if(this.renderUpdates || this.jsonRoot){
+        var um = this.el.getUpdateManager();
+        um.setRenderer(this);
+    }
+};
+
+YAHOO.extendX(YAHOO.ext.View, YAHOO.ext.util.Observable, {
+    /**
+     * Returns the element this view is bound to.
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;  
+    },
+    
+    render : function(el, response){
+        this.clearSelections();
+        this.el.update('');
+        var o;
+        try{
+            o = YAHOO.ext.util.JSON.decode(response.responseText);
+            if(this.jsonRoot){
+                o = eval('o.' + this.jsonRoot);
+            }
+        }catch(e){}
+        if(o && o.length){
+            this.html = [];
+            for(var i = 0, len = o.length; i < len; i++) {
+            	this.renderEach(o[i]);
+            }
+            this.el.update(this.html.join(''));
+            this.html = null;
+            this.nodes = this.el.dom.childNodes;
+            this.updateIndexes(0);
+        }
+    },
+    
+    /**
+     * Refreshes the view. 
+     */
+     refresh : function(){
+        this.clearSelections();
+        this.el.update('');
+        this.html = [];
+        this.dataModel.each(this.renderEach, this);
+        this.el.update(this.html.join(''));
+        this.html = null;
+        this.nodes = this.el.dom.childNodes;
+        this.updateIndexes(0);
+    },
+    
+    /**
+     * Function to override to reformat the data that is sent to 
+     * the template for each node.
+     * @param {Array/Object} data The raw data (array of colData for a data model bound view or 
+     * a JSON object for an UpdateManager bound view).
+     * @param {Number} index The index of the data within the data model 
+     */
+    prepareData : function(data, index){
+        return data;  
+    },
+    
+    renderEach : function(data){
+        this.html[this.html.length] = this.tpl.applyTemplate(this.prepareData(data));
+    },
+    
+    /**
+     * Refresh an individual node.
+     * @param {Number} index 
+     */
+    refreshNode : function(index){
+        this.refreshNodes(index, index);
+    },
+    
+    refreshNodes : function(dm, startIndex, endIndex){
+        this.clearSelections();
+        var dm = this.dataModel;
+        var ns = this.nodes;
+        for(var i = startIndex; i <= endIndex; i++){
+            var d = this.prepareData(dm.getRow(i), i);
+            if(i < ns.length-1){
+                var old = ns[i];
+                this.tpl.insertBefore(old, d);
+                this.el.dom.removeChild(old);
+            }else{
+                this.tpl.append(this.el.dom, d);
+            }
+        }
+        this.updateIndexes(startIndex, endIndex);
+    },
+    
+    deleteNodes : function(dm, startIndex, endIndex){
+        this.clearSelections();
+        if(startIndex == 0 && endIndex >= this.nodes.length-1){
+            this.el.update('');
+        }else{
+            var el = this.el.dom;
+            for(var i = startIndex; i <= endIndex; i++){
+                el.removeChild(this.nodes[startIndex]);
+            }
+            this.updateIndexes(startIndex);
+        }
+    },
+    
+    insertNodes : function(dm, startIndex, endIndex){
+        if(this.nodes.length == 0){
+            this.refresh();
+        }else{
+            this.clearSelections();
+            var t = this.tpl;
+            var before = this.nodes[startIndex];
+            var dm = this.dataModel;
+            if(before){
+                for(var i = startIndex; i <= endIndex; i++){
+                    t.insertBefore(before, this.prepareData(dm.getRow(i), i));
+                }
+            }else{
+                var el = this.el.dom;
+                for(var i = startIndex; i <= endIndex; i++){
+                    t.append(el, this.prepareData(dm.getRow(i), i));
+                }
+            }
+            this.updateIndexes(startIndex);
+        }
+    },
+    
+    updateIndexes : function(dm, startIndex, endIndex){
+        var ns = this.nodes;
+        startIndex = startIndex || 0;
+        endIndex = endIndex || ns.length-1;
+        for(var i = startIndex; i <= endIndex; i++){
+            ns[i].nodeIndex = i;
+        }
+    },
+    
+    /**
+     * Changes the data model this view uses and refresh the view.
+     * @param {DataModel} dataModel 
+     */
+     setDataModel : function(dm){
+        this.unplugDataModel(this.dataModel);
+        this.dataModel = dm;
+        dm.on('cellupdated', this.refreshNode, this, true);
+        dm.on('datachanged', this.refresh, this, true);
+        dm.on('rowsdeleted', this.deleteNodes, this, true);
+        dm.on('rowsinserted', this.insertNodes, this, true);
+        dm.on('rowsupdated', this.refreshNodes, this, true);
+        dm.on('rowssorted', this.refresh, this, true);
+        this.refresh();
+    },
+    
+    /**
+     * Unplug the data model and stop updates.
+     * @param {DataModel} dataModel 
+     */
+    unplugDataModel : function(dm){
+        if(!dm) return;
+        dm.removeListener('cellupdated', this.refreshNode, this);
+        dm.removeListener('datachanged', this.refresh, this);
+        dm.removeListener('rowsdeleted', this.deleteNodes, this);
+        dm.removeListener('rowsinserted', this.insertNodes, this);
+        dm.removeListener('rowsupdated', this.refreshNodes, this);
+        dm.removeListener('rowssorted', this.refresh, this);
+        this.dataModel = null;
+    },
+    
+    /**
+     * Returns the template node the passed child belongs to or null if it doesn't belong to one.
+     * @param {HTMLElement} node
+     * @return {HTMLElement} The template node 
+     */
+    findItemFromChild : function(node){
+        var el = this.el.dom;
+        if(!node || node.parentNode == el){
+		    return node;
+	    }
+	    var p = node.parentNode;
+	    while(p && p != el){
+            if(p.parentNode == el){
+            	return p;
+            }
+            p = p.parentNode;
+        }
+	    return null;
+    },
+    
+    /** @ignore */
+    onClick : function(e){
+        var item = this.findItemFromChild(e.getTarget());
+        if(item){
+            var index = this.indexOf(item);
+            this.onItemClick(item, index, e);
+            this.fireEvent('click', this, index, item, e);
+        }else{
+            this.clearSelections();
+        }
+    },
+
+    /** @ignore */
+    onContextMenu : function(e){
+        var item = this.findItemFromChild(e.getTarget());
+        if(item){
+            this.fireEvent('contextmenu', this, this.indexOf(item), item, e);
+        }
+    },
+
+    /** @ignore */
+    onDblClick : function(e){
+        var item = this.findItemFromChild(e.getTarget());
+        if(item){
+            this.fireEvent('dblclick', this, this.indexOf(item), item, e);
+        }
+    },
+    
+    onItemClick : function(item, index, e){
+        if(this.multiSelect || this.singleSelect){
+            if(this.multiSelect && e.shiftKey && this.lastSelection){
+                this.select(this.getNodes(this.indexOf(this.lastSelection), index), false);
+            }else{
+                this.select(item, this.multiSelect && e.ctrlKey);
+                this.lastSelection = item;
+            }
+        }
+    },
+    
+    /**
+     * Get the number of selected nodes.
+     * @return {Number}
+     */
+     getSelectionCount : function(){
+        return this.selections.length;
+    },
+    
+    /**
+     * Get the currently selected nodes.
+     * @return {Array} An array of HTMLElements
+     */
+    getSelectedNodes : function(){
+        return this.selections;
+    },
+    
+    /**
+     * Get the indexes of the selected nodes.
+     * @return {Array}
+     */
+    getSelectedIndexes : function(){
+        var indexes = [];
+        for(var i = 0, len = this.selections.length; i < len; i++) {
+        	indexes.push(this.selections[i].nodeIndex);
+        }
+        return indexes;
+    },
+    
+    /**
+     * Clear all selections
+     * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange event
+     */
+    clearSelections : function(suppressEvent){
+        if(this.multiSelect || this.singleSelect){
+            YAHOO.util.Dom.removeClass(this.selections, this.selectedClass);
+            this.selections = [];
+            if(!suppressEvent){
+                this.fireEvent('selectionchange', this, this.selections);
+            }
+        }
+    },
+    
+    /**
+     * Selects nodes.
+     * @param {Array/HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node, id of a template node or an array of any of those to select
+     * @param {Boolean} keepExisting (optional) true to keep existing selections
+     * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange vent
+     */
+    select : function(nodeInfo, keepExisting, suppressEvent){
+        if(!keepExisting){
+            this.clearSelections(true);
+        }
+        if(nodeInfo instanceof Array){
+            for(var i = 0, len = nodeInfo.length; i < len; i++) {
+            	this.select(nodeInfo[i], true, true);
+            }
+        }else{
+            var node = this.getNode(nodeInfo);
+            if(node){
+                YAHOO.util.Dom.addClass(node, this.selectedClass);
+                this.selections.push(node);
+            }
+        }
+        if(!suppressEvent){
+            this.fireEvent('selectionchange', this, this.selections);
+        }
+    },
+    
+    /**
+     * Gets a template node.
+     * @param {HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node or the id of a template node
+     * @return {HTMLElement} The node or null if it wasn't found
+     */
+     getNode : function(nodeInfo){
+        if(typeof nodeInfo == 'object'){
+            return nodeInfo;
+        }else if(typeof nodeInfo == 'string'){
+            return document.getElementById(nodeInfo);
+        }else if(typeof nodeInfo == 'number'){
+            return this.nodes[nodeInfo];
+        }
+        return null;
+    },
+    
+    /**
+     * Gets a range template nodes.
+     * @param {Number} startIndex
+     * @param {Number} endIndex
+     * @return {Array} An array of nodes
+     */
+    getNodes : function(start, end){
+        var ns = this.nodes;
+        startIndex = startIndex || 0;
+        endIndex = typeof endIndex == 'undefined' ? ns.length-1 : endIndex;
+        var nodes = [];
+        for(var i = start; i <= end; i++) {
+        	nodes.push(ns[i]);
+        }
+        return nodes;
+    },
+    
+    /**
+     * Finds the index of the passed node
+     * @param {HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node or the id of a template node
+     * @return {Number} The index of the node or -1
+     */
+     indexOf : function(node){
+        node = this.getNode(node);
+        if(typeof node.nodeIndex == 'number'){
+            return node.nodeIndex;
+        }
+        var ns = this.nodes;
+        for(var i = 0, len = ns.length; i < len; i++) {
+        	if(ns[i] == node){
+        	    return i;
+        	}
+        }
+        return -1;
+    }
+});
+
+/**
+ * @class YAHOO.ext.JsonView
+ * @extends YAHOO.ext.View
+ * Shortcut class to create a JSON + UpdateManager template view. Usage:
+<pre><code>
+var view = new YAHOO.ext.View('my-element', 
+           '&lt;div id="{id}"&gt;{foo} - {bar}&lt;/div&gt;', // auto create template
+           { multiSelect: true, jsonRoot: 'data' });
+
+// listen for node click?
+view.on('click', function(vw, index, node, e){
+    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
+});
+
+// direct load of JSON data
+view.load('foobar.php');
+</code></pre>
+ * @constructor
+ * Create a new JsonView
+ * @param {String/HTMLElement/Element} container The container element where the view is to be rendered.
+ * @param {DomHelper.Template} tpl The rendering template
+ * @param {Object} config The config object
+ */ 
+YAHOO.ext.JsonView = function(container, tpl, config){
+    var cfg = config || {};
+    cfg.renderUpdates = true;
+    YAHOO.ext.JsonView.superclass.constructor.call(this, container, tpl, null, config); 
+};
+YAHOO.extendX(YAHOO.ext.JsonView, YAHOO.ext.View, {
+    /**
+     * Direct access to the elements UpdateManager update() method (takes the same parameters).
+     * @param {String/Function} url The url for this request or a function to call to get the url
+     * @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "param1=1&amp;param2=2" or an object {param1: 1, param2: 2}
+     * @param {<i>Function</i>} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     * @param {<i>Boolean</i>} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+     */
+    load : function(){
+        var um = this.el.getUpdateManager();
+        um.update.apply(um, arguments);
+    }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/TextEditor.js.html b/www/extras/yui-ext/docs/output/TextEditor.js.html new file mode 100644 index 000000000..d69dfa4b6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/TextEditor.js.html @@ -0,0 +1,110 @@ +TextEditor.js
/**
+ * @class YAHOO.ext.grid.TextEditor
+ * @extends YAHOO.ext.grid.CellEditor
+Provides basic text editing for a cells and supports the following configuration options:
+<ul class="list">
+<li><i>allowBlank</i> - True if the cell is allowed to be empty.</li>
+<li><i>minLength</i> - The minimum length the cell will accept.</li>
+<li><i>maxLength</i> - The maximum length the cell will allow.</li>
+<li><i>minText</i> - The tooltip to display when the length of the value in the cell is below the minimum.</li>
+<li><i>maxText</i> - The tooltip to display when the length of the value in the cell is above the maximum.</li>
+<li><i>selectOnFocus</i> - True to select the text when the editor is activated.</li>
+<li><i>blankText</i> - The tooltip (error message) to display when the cell is empty and is not allowed to be.</li>
+<li><i>regex</i> - A regular expression to match if the value is valid. If the regex.test(value) returns false, the value is considered invalid.</li>
+<li><i>regexText</i> - The tooltip (error message) to display when regex does not match.</li>
+<li><i>validator</i> - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.</li>
+<li><i>validationDelay</i> - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).</li>
+</ul>
+For more information on using this editor, see <a href="http://www.jackslocum.com/yui/2006/09/10/adding-built-in-editing-support-to-the-yahoo-ui-extensions-grid/">this blog post</a>.
+* @constructor
+* Create a new TextEditor
+* @param {Object} config
+ */
+YAHOO.ext.grid.TextEditor = function(config){
+    var element = document.createElement('input');
+    element.type = 'text';
+    element.className = 'ygrid-editor ygrid-text-editor';
+    element.setAttribute('autocomplete', 'off');
+    document.body.appendChild(element);
+    YAHOO.ext.grid.TextEditor.superclass.constructor.call(this, element);
+    YAHOO.ext.util.Config.apply(this, config);
+};
+YAHOO.extendX(YAHOO.ext.grid.TextEditor, YAHOO.ext.grid.CellEditor);
+
+YAHOO.ext.grid.TextEditor.prototype.validate = function(){
+    var dom = this.element.dom;
+    var value = dom.value;
+    if(value.length < 1){ // if it's blank
+         if(this.allowBlank){
+             dom.title = '';
+             this.element.removeClass('ygrid-editor-invalid');
+             return true;
+         }else{
+             dom.title = this.blankText;
+             this.element.addClass('ygrid-editor-invalid');
+             return false;
+         }
+    }
+    if(value.length < this.minLength){
+        dom.title = this.minText.replace('%0', this.minLength);
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    if(value.length > this.maxLength){
+        dom.title = this.maxText.replace('%0', this.maxLength);
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    var msg = this.validator(value);
+    if(msg !== true){
+        dom.title = msg;
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    if(this.regex && !this.regex.test(value)){
+        dom.title = this.regexText;
+        this.element.addClass('ygrid-editor-invalid');
+        return false;
+    }
+    dom.title = '';
+    this.element.removeClass('ygrid-editor-invalid');
+    return true;
+};
+
+YAHOO.ext.grid.TextEditor.prototype.initEvents = function(){
+    YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this);
+    var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this);
+    this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay]));
+};
+
+YAHOO.ext.grid.TextEditor.prototype.show = function(){
+    this.element.dom.title = '';
+    YAHOO.ext.grid.TextEditor.superclass.show.call(this);
+    this.element.focus();
+    if(this.selectOnFocus){
+        try{
+            this.element.dom.select();
+        }catch(e){}
+    }
+    this.validate(this.element.dom.value);
+};
+
+YAHOO.ext.grid.TextEditor.prototype.getValue = function(){
+   if(!this.validate()){
+       return this.originalValue;
+   }else{
+       return this.element.dom.value;
+   }   
+};
+
+YAHOO.ext.grid.TextEditor.prototype.allowBlank = true;
+YAHOO.ext.grid.TextEditor.prototype.minLength = 0;
+YAHOO.ext.grid.TextEditor.prototype.maxLength = Number.MAX_VALUE;
+YAHOO.ext.grid.TextEditor.prototype.minText = 'The minimum length for this field is %0';
+YAHOO.ext.grid.TextEditor.prototype.maxText = 'The maximum length for this field is %0';
+YAHOO.ext.grid.TextEditor.prototype.selectOnFocus = true;
+YAHOO.ext.grid.TextEditor.prototype.blankText = 'This field cannot be blank';
+YAHOO.ext.grid.TextEditor.prototype.validator = function(){return true;};
+YAHOO.ext.grid.TextEditor.prototype.validationDelay = 200;
+YAHOO.ext.grid.TextEditor.prototype.regex = null;
+YAHOO.ext.grid.TextEditor.prototype.regexText = '';

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/Toolbar.js.html b/www/extras/yui-ext/docs/output/Toolbar.js.html new file mode 100644 index 000000000..30f2ba639 --- /dev/null +++ b/www/extras/yui-ext/docs/output/Toolbar.js.html @@ -0,0 +1,286 @@ +Toolbar.js
/**
+ * @class YAHOO.ext.Toolbar
+ * Basic Toolbar used by the Grid to create the paging toolbar. This class is reusable but functionality
+ * is limited. Look for more functionality in a future version. 
+ */
+ YAHOO.ext.Toolbar = function(container){
+    this.el = getEl(container, true);
+    var div = document.createElement('div');
+    div.className = 'ytoolbar';
+    var tb = document.createElement('table');
+    tb.border = 0;
+    tb.cellPadding = 0;
+    tb.cellSpacing = 0;
+    div.appendChild(tb);
+    var tbody = document.createElement('tbody');
+    tb.appendChild(tbody);
+    var tr = document.createElement('tr');
+    tbody.appendChild(tr);
+    this.el.dom.appendChild(div);
+    this.tr = tr;
+};
+
+YAHOO.ext.Toolbar.prototype = {
+    /**
+     * Adds element(s) to the toolbar - this function takes a variable number of 
+     * arguments of mixed type and adds them to the toolbar...
+     * 
+     * @param {Mixed} arg If arg is a ToolbarButton, it is added. If arg is a string, it is wrapped 
+     * in a ytb-text element and added unless the text is "separator" in which case a separator
+     * is added. Otherwise, it is assumed the element is an HTMLElement and it is added directly.
+     */
+    add : function(){
+        for(var i = 0; i < arguments.length; i++){
+            var el = arguments[i];
+            var td = document.createElement('td');
+            this.tr.appendChild(td);
+            if(el instanceof YAHOO.ext.ToolbarButton){
+                el.init(td);
+            }else if(el instanceof Array){
+                this.addButton(el);
+            }else if(typeof el == 'string'){
+                var span = document.createElement('span');
+                if(el == 'separator'){
+                    span.className = 'ytb-sep';
+                }else{
+                    span.innerHTML = el;
+                    span.className = 'ytb-text';
+                }
+                td.appendChild(span);
+            }else if(typeof el == 'object'){ // must be element?
+                td.appendChild(el);
+            }
+        }
+    },
+    
+    /**
+     * Returns the element for this toolbar
+     * @return {YAHOO.ext.Element}
+     */
+    getEl : function(){
+        return this.el;  
+    },
+    
+    /**
+     * Adds a separator
+     */
+    addSeparator : function(){
+        var td = document.createElement('td');
+        this.tr.appendChild(td);
+        var span = document.createElement('span');
+        span.className = 'ytb-sep';
+        td.appendChild(span);
+    },
+    
+    /**
+     * Add a button (or buttons), see {@link YAHOO.ext.ToolbarButton} for more info on the config
+     * @param {Object/Array} config A button config or array of configs
+     * @return {YAHOO.ext.ToolbarButton/Array}
+     */
+    addButton : function(config){
+        if(config instanceof Array){
+            var buttons = [];
+            for(var i = 0, len = config.length; i < len; i++) {
+            	buttons.push(this.addButton(config[i]));
+            }
+            return buttons;
+        }
+        var b = config;
+        if(!(config instanceof YAHOO.ext.ToolbarButton)){
+             b = new YAHOO.ext.ToolbarButton(config);
+        }
+        this.add(b);
+        return b;
+    },
+    
+    /**
+     * Adds text to the toolbar
+     * @param {String} text The text to add
+     * @return {HTMLElement} The span element created which you can use to update the text.
+     */
+    addText : function(text){
+        var td = document.createElement('td');
+        this.tr.appendChild(td);
+        var span = document.createElement('span');
+        span.className = 'ytb-text';
+        span.innerHTML = text;
+        td.appendChild(span);
+        return span;
+    },
+    
+    /**
+     * Inserts a button (or buttons) at the specified index
+     * @param {Number} index The index where the buttons are to be inserted
+     * @param {Object/Array} config A button config or array of configs
+     * @return {YAHOO.ext.ToolbarButton/Array}
+     */
+    insertButton : function(index, config){
+        if(config instanceof Array){
+            var buttons = [];
+            for(var i = 0, len = config.length; i < len; i++) {
+               buttons.push(this.insertButton(index + i, config[i]));
+            }
+            return buttons;
+        }
+        var b = new YAHOO.ext.ToolbarButton(config);
+        var td = document.createElement('td');
+        var nextSibling = this.tr.childNodes[index];
+        if (nextSibling)
+           this.tr.insertBefore(td, nextSibling);
+       else
+           this.tr.appendChild(td);
+        b.init(td);
+        return b;
+    }
+};
+
+/**
+ * @class YAHOO.ext.ToolbarButton
+ * A toolbar button. The config has the following options:
+ * <ul>
+ * <li>className - The CSS class for the button. Use this to attach a background image for an icon.</li>
+ * <li>text - The button's text</li>
+ * <li>tooltip - The buttons tooltip text</li>
+ * <li>click - function to call when the button is clicked</li>
+ * <li>mouseover - function to call when the mouse moves over the button</li>
+ * <li>mouseout - function to call when the mouse moves off the button</li>
+ * <li>scope - The scope of the above event handlers</li>
+ * <li></li>
+ * <li></li>
+ */
+YAHOO.ext.ToolbarButton = function(config){
+    YAHOO.ext.util.Config.apply(this, config);
+};
+
+YAHOO.ext.ToolbarButton.prototype = {
+    /** @private */
+    init : function(appendTo){
+        var element = document.createElement('span');
+        element.className = 'ytb-button';
+        element.unselectable = 'on';
+        if(this.id){
+            element.id = this.id;
+        }
+        this.disabled = (this.disabled === true);
+        var inner = document.createElement('span');
+        inner.className = 'ytb-button-inner ' + this.className;
+        inner.unselectable = 'on';
+        if(this.tooltip){
+            element.setAttribute('title', this.tooltip);
+        }
+        if(this.style){
+           YAHOO.ext.DomHelper.applyStyles(inner, this.style);
+        } 
+        element.appendChild(inner);
+        appendTo.appendChild(element);
+        this.el = getEl(element, true);
+        inner.innerHTML = (this.text ? this.text : '&#160;');
+        this.inner = inner;
+        this.el.mon('click', this.onClick, this, true);    
+        this.el.mon('mouseover', this.onMouseOver, this, true);    
+        this.el.mon('mouseout', this.onMouseOut, this, true);
+    },
+    
+    /**
+     * Sets this buttons click handler
+     * @param {Function} click The function to call when the button is clicked
+     * @param {Object} scope (optional) Scope for the function passed above
+     */
+    setHandler : function(click, scope){
+        this.click = click;
+        this.scope = scope;  
+    },
+    
+    /**
+     * Set this buttons text
+     * @param {String} text
+     */
+    setText : function(text){
+        this.inner.innerHTML = text;    
+    },
+    
+    /**
+     * Set this buttons tooltip text
+     * @param {String} text
+     */
+    setTooltip : function(text){
+        this.el.dom.title = text;    
+    },
+    
+    /**
+     * Show this button
+     */
+    show: function(){
+        this.el.dom.parentNode.style.display = '';
+    },
+    
+    /**
+     * Hide this button
+     */
+    hide: function(){
+        this.el.dom.parentNode.style.display = 'none';  
+    },
+    
+    /**
+     * Disable this button
+     */
+    disable : function(){
+        this.disabled = true;
+        if(this.el){
+            this.el.addClass('ytb-button-disabled');
+        }
+    },
+    
+    /**
+     * Enable this button
+     */
+    enable : function(){
+        this.disabled = false;
+        if(this.el){
+            this.el.removeClass('ytb-button-disabled');
+        }
+    },
+    
+    /**
+     * Returns true if this button is disabled.
+     * @return {Boolean}
+     */
+    isDisabled : function(){
+        return this.disabled === true;
+    },
+    
+    setDisabled : function(disabled){
+        if(disabled){
+            this.disable();
+        }else{
+            this.enable();
+        }
+    },
+    
+    /** @private */
+    onClick : function(){
+        if(!this.disabled && this.click){
+            this.click.call(this.scope || window, this);
+        }
+    },
+    
+    /** @private */
+    onMouseOver : function(){
+        if(!this.disabled){
+            this.el.addClass('ytb-button-over');
+            if(this.mouseover){
+                this.mouseover.call(this.scope || window, this);
+            }
+        }
+    },
+    
+    /** @private */
+    onMouseOut : function(){
+        this.el.removeClass('ytb-button-over');
+        if(!this.disabled){
+            if(this.mouseout){
+                this.mouseout.call(this.scope || window, this);
+            }
+        }
+    }
+};

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/UpdateManager.js.html b/www/extras/yui-ext/docs/output/UpdateManager.js.html new file mode 100644 index 000000000..305a639f2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/UpdateManager.js.html @@ -0,0 +1,477 @@ +UpdateManager.js
/**
+ * @class YAHOO.ext.UpdateManager
+ * @extends YAHOO.ext.util.Observable
+ * Provides AJAX-style update for Element object using Yahoo 
+ * UI library YAHOO.util.Connect functionality.<br><br>
+ * Usage:<br>
+ * <pre><code>
+ * // Get it from a YAHOO.ext.Element object
+ * var el = getEl('foo');
+ * var mgr = el.getUpdateManager();
+ * mgr.update('http://myserver.com/index.php', 'param1=1&amp;param2=2');
+ * ...
+ * mgr.formUpdate('myFormId', 'http://myserver.com/index.php');
+ * <br>
+ * // or directly (returns the same UpdateManager instance)
+ * var mgr = new YAHOO.ext.UpdateManager('myElementId');
+ * mgr.startAutoRefresh(60, 'http://myserver.com/index.php');
+ * mgr.onUpdate.subscribe(myFcnNeedsToKnow);
+ * <br>
+ * </code></pre>
+ * @requires YAHOO.ext.Element
+ * @requires YAHOO.util.Dom
+ * @requires YAHOO.util.Event
+ * @requires YAHOO.util.CustomEvent 
+ * @requires YAHOO.util.Connect
+ * @constructor
+ * Create new UpdateManager directly.
+ * @param {String/HTMLElement/YAHOO.ext.Element} el The element to update 
+ * @param {<i>Boolean</i>} forceNew (optional) By default the constructor checks to see if the passed element already has an UpdateManager and if it does it returns the same instance. This will skip that check (useful for extending this class).
+ */
+YAHOO.ext.UpdateManager = function(el, forceNew){
+    el = YAHOO.ext.Element.get(el);
+    if(!forceNew && el.updateManager){
+        return el.updateManager;
+    }
+    /**
+     * The Element object
+     * @type YAHOO.ext.Element
+     */
+    this.el = el;
+    /**
+     * Cached url to use for refreshes. Overwritten every time update() is called unless 'discardUrl' param is set to true.
+     * @type String
+     */
+    this.defaultUrl = null;
+    this.beforeUpdate = new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate');
+    this.onUpdate = new YAHOO.util.CustomEvent('UpdateManager.onUpdate');
+    this.onFailure = new YAHOO.util.CustomEvent('UpdateManager.onFailure');
+    
+    this.events = {
+        /**
+         * @event beforeupdate
+         * Fired before an update is made, return false from your handler and the update is cancelled. 
+         * @param {YAHOO.ext.Element} el
+         * @param {String/Object/Function} url
+         * @param {String/Object} params
+         */
+        'beforeupdate': this.beforeUpdate,
+        /**
+         * @event update
+         * Fired after successful update is made. 
+         * @param {YAHOO.ext.Element} el
+         * @param {Object} oResponseObject The YAHOO.util.Connect response Object
+         */
+        'update': this.onUpdate,
+        /**
+         * @event failure
+         * Fired on update failure. Uses fireDirect with signature: (oElement, oResponseObject)
+         * @param {YAHOO.ext.Element} el
+         * @param {Object} oResponseObject The YAHOO.util.Connect response Object
+         */
+        'failure': this.onFailure 
+    };
+    
+    /**
+     * Blank page URL to use with SSL file uploads (Defaults to YAHOO.ext.UpdateManager.defaults.sslBlankUrl or 'about:blank'). 
+     * @type String
+     */
+    this.sslBlankUrl = YAHOO.ext.UpdateManager.defaults.sslBlankUrl;
+    /**
+     * Whether to append unique parameter on get request to disable caching (Defaults to YAHOO.ext.UpdateManager.defaults.disableCaching or false). 
+     * @type Boolean
+     */
+    this.disableCaching = YAHOO.ext.UpdateManager.defaults.disableCaching;
+    /**
+     * Text for loading indicator (Defaults to YAHOO.ext.UpdateManager.defaults.indicatorText or '&lt;div class="loading-indicator"&gt;Loading...&lt;/div&gt;'). 
+     * @type String
+     */
+    this.indicatorText = YAHOO.ext.UpdateManager.defaults.indicatorText;
+    /**
+     * Whether to show indicatorText when loading (Defaults to YAHOO.ext.UpdateManager.defaults.showLoadIndicator or true). 
+     * @type String
+     */
+    this.showLoadIndicator = YAHOO.ext.UpdateManager.defaults.showLoadIndicator;
+    /**
+     * Timeout for requests or form posts in seconds (Defaults to YAHOO.ext.UpdateManager.defaults.timeout or 30 seconds). 
+     * @type Number
+     */
+    this.timeout = YAHOO.ext.UpdateManager.defaults.timeout;
+    
+    /**
+     * True to process scripts in the output (Defaults to YAHOO.ext.UpdateManager.defaults.loadScripts (false)). 
+     * @type Boolean
+     */
+    this.loadScripts = YAHOO.ext.UpdateManager.defaults.loadScripts;
+    
+    /**
+     * YAHOO.util.Connect transaction object of current executing transaction
+     */
+    this.transaction = null;
+    
+    /**
+     * @private
+     */
+    this.autoRefreshProcId = null;
+    /**
+     * Delegate for refresh() prebound to 'this', use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments
+     * @type Function
+     */
+    this.refreshDelegate = this.refresh.createDelegate(this);
+    /**
+     * Delegate for update() prebound to 'this', use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments
+     * @type Function
+     */
+    this.updateDelegate = this.update.createDelegate(this);
+    /**
+     * Delegate for formUpdate() prebound to 'this', use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arguments
+     * @type Function
+     */
+    this.formUpdateDelegate = this.formUpdate.createDelegate(this);
+    /**
+     * @private
+     */
+    this.successDelegate = this.processSuccess.createDelegate(this);
+    /**
+     * @private
+     */
+     this.failureDelegate = this.processFailure.createDelegate(this);
+     
+     /**
+      * The renderer for this UpdateManager. Defaults to {@link YAHOO.ext.UpdateManager.BasicRenderer}. 
+      */
+      this.renderer = new YAHOO.ext.UpdateManager.BasicRenderer();
+};
+
+YAHOO.ext.UpdateManager.prototype = {
+    fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent,
+    on : YAHOO.ext.util.Observable.prototype.on,
+    addListener : YAHOO.ext.util.Observable.prototype.addListener,
+    delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener,
+    removeListener : YAHOO.ext.util.Observable.prototype.removeListener,
+    purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners,
+    /**
+     * Get the Element this UpdateManager is bound to
+     * @return {YAHOO.ext.Element} The element
+     */
+    getEl : function(){
+        return this.el;
+    },
+    
+    /**
+     * Performs an async request, updating this element with the response. If params are specified it uses POST, otherwise it uses GET.
+     * @param {Object/String/Function} url The url for this request or a function to call to get the url or a config object containing any of the following options:
+<pre><code>
+um.update({
+    url: 'your-url.php',
+    params: {param1: 'foo', param2: 'bar'}, // or a URL encoded string
+    callback: yourFunction,
+    scope: yourObject, //(optional scope)  
+    discardUrl: false, 
+    disableCaching: false,
+    indicatorText: 'Loading...',
+    timeout: 30,
+    loadScripts: false
+});   
+</code></pre>
+     * The only required property is url. The optional properties nocache, text and scripts 
+     * are shorthand for disableCaching, indicatorText and loadScripts and are used to set their associated property on this UpdateManager instance.
+     * @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "param1=1&amp;param2=2" or an object {param1: 1, param2: 2}
+     * @param {<i>Function</i>} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     * @param {<i>Boolean</i>} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+     */
+    update : function(url, params, callback, discardUrl){
+        if(this.beforeUpdate.fireDirect(this.el, url, params) !== false){
+            if(typeof url == 'object'){ // must be config object
+                var cfg = url;
+                url = cfg.url;
+                params = params || cfg.params;
+                callback = callback || cfg.callback;
+                discardUrl = discardUrl || cfg.discardUrl;
+                if(callback && cfg.scope){
+                    callback = callback.createDelegate(cfg.scope);
+                }
+                if(typeof cfg.nocache != 'undefined'){this.disableCaching = cfg.nocache};
+                if(typeof cfg.text != 'undefined'){this.indicatorText = cfg.text};
+                if(typeof cfg.scripts != 'undefined'){this.loadScripts = cfg.scripts};
+                if(typeof cfg.timeout != 'undefined'){this.timeout = cfg.timeout};
+            }
+            this.showLoading();
+            if(!discardUrl){
+                this.defaultUrl = url;
+            }
+            if(typeof url == 'function'){
+                url = url();
+            }
+            if(params && typeof params != 'string'){ // must be object
+                var buf = [];
+                for(var key in params){
+                    if(typeof params[key] != 'function'){
+                        buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&');
+                    }
+                }
+                delete buf[buf.length-1];
+                params = buf.join('');
+            }
+            var callback = {
+                success: this.successDelegate,
+                failure: this.failureDelegate,
+                timeout: (this.timeout*1000),
+                argument: {'url': url, 'form': null, 'callback': callback, 'params': params}
+            };
+            var method = params ? 'POST' : 'GET';
+            if(method == 'GET'){
+                url = this.prepareUrl(url);
+            }
+            this.transaction = YAHOO.util.Connect.asyncRequest(method, url, callback, params);
+        }
+    },
+    
+    /**
+     * Performs an async form post, updating this element with the response. If the form has the attribute enctype="multipart/form-data", it assumes it's a file upload.
+     * Uses this.sslBlankUrl for SSL file uploads to prevent IE security warning. See YUI docs for more info. 
+     * @param {String/HTMLElement} form The form Id or form element
+     * @param {<i>String</i>} url (optional) The url to pass the form to. If omitted the action attribute on the form will be used.
+     * @param {<i>Boolean</i>} reset (optional) Whether to try to reset the form after the update
+     * @param {<i>Function</i>} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     */
+    formUpdate : function(form, url, reset, callback){
+        if(this.beforeUpdate.fireDirect(this.el, form, url) !== false){
+            this.showLoading();
+            formEl = YAHOO.util.Dom.get(form);
+            if(typeof url == 'function'){
+                url = url();
+            }
+            url = url || formEl.action;
+            var callback = {
+                success: this.successDelegate,
+                failure: this.failureDelegate,
+                timeout: (this.timeout*1000),
+                argument: {'url': url, 'form': form, 'callback': callback, 'reset': reset}
+            };
+            var isUpload = false;
+            var enctype = formEl.getAttribute('enctype');
+            if(enctype && enctype.toLowerCase() == 'multipart/form-data'){
+                isUpload = true;
+            }
+            YAHOO.util.Connect.setForm(form, isUpload, this.sslBlankUrl);
+            this.transaction = YAHOO.util.Connect.asyncRequest('POST', url, callback);
+        }
+    },
+    
+    /**
+     * Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately
+     * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     */
+    refresh : function(callback){
+        if(this.defaultUrl == null){
+            return;
+        }
+        this.update(this.defaultUrl, null, callback, true);
+    },
+    
+    /**
+     * Set this element to auto refresh.
+     * @param {Number} interval How often to update (in seconds).
+     * @param {<i>String/Function</i>} url (optional) The url for this request or a function to call to get the url (Defaults to the last used url)
+     * @param {<i>String/Object</i>} params (optional) The parameters to pass as either a url encoded string "&param1=1&param2=2" or as an object {param1: 1, param2: 2}
+     * @param {<i>Function</i>} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+     * @param {<i>Boolean</i>} refreshNow (optional) Whether to execute the refresh now, or wait the interval
+     */
+    startAutoRefresh : function(interval, url, params, callback, refreshNow){
+        if(refreshNow){
+            this.update(url || this.defaultUrl, params, callback, true);
+        }
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+        }
+        this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000);
+    },
+    
+    /**
+     * Stop auto refresh on this element.
+     */
+     stopAutoRefresh : function(){
+        if(this.autoRefreshProcId){
+            clearInterval(this.autoRefreshProcId);
+        }
+    },
+    
+    /**
+     * Called to update the element to "Loading" state. Override to perform custom action.
+     */
+    showLoading : function(){
+        if(this.showLoadIndicator){
+            this.el.update(this.indicatorText);
+        }
+    },
+    
+    /**
+     * Adds unique parameter to query string if disableCaching = true
+     * @private
+     */
+    prepareUrl : function(url){
+        if(this.disableCaching){
+            var append = '_dc=' + (new Date().getTime());
+            if(url.indexOf('?') !== -1){
+                url += '&' + append;
+            }else{
+                url += '?' + append;
+            }
+        }
+        return url;
+    },
+    
+    /**
+     * @private
+     */
+    processSuccess : function(response){
+        this.transaction = null;
+        if(response.argument.form && response.argument.reset){
+            try{ // put in try/catch since some older FF releases had problems with this
+                response.argument.form.reset();
+            }catch(e){}
+        }
+        if(this.loadScripts){
+            this.renderer.render(this.el, response, this, 
+                this.updateComplete.createDelegate(this, [response]));
+        }else{
+            this.renderer.render(this.el, response, this);
+            this.updateComplete(response);
+        }
+    },
+    
+    updateComplete : function(response){
+        this.fireEvent('update', this.el, response);
+        if(typeof response.argument.callback == 'function'){
+            response.argument.callback(this.el, true);
+        }
+    },
+    
+    /**
+     * @private
+     */
+    processFailure : function(response){
+        this.transaction = null;
+        this.onFailure.fireDirect(this.el, response);
+        if(typeof response.argument.callback == 'function'){
+            response.argument.callback(this.el, false);
+        }
+    },
+    
+    /**
+     * Set the content renderer for this UpdateManager. See {@link YAHOO.ext.UpdateManager.BasicRenderer#render} for more details.
+     * @param {Object} renderer The object implementing the render() method
+     */
+    setRenderer : function(renderer){
+        this.renderer = renderer;
+    },
+    
+    getRenderer : function(){
+       return this.renderer;  
+    },
+    
+    /**
+     * Set the defaultUrl used for updates
+     * @param {String/Function} defaultUrl The url or a function to call to get the url
+     */
+    setDefaultUrl : function(defaultUrl){
+        this.defaultUrl = defaultUrl;
+    },
+    
+    /**
+     * Aborts the executing transaction
+     */
+    abort : function(){
+        if(this.transaction){
+            YAHOO.util.Connect.abort(this.transaction);
+        }
+    },
+    
+    /**
+     * Returns true if an update is in progress
+     * @return {Boolean}
+     */
+    isUpdating : function(){
+        if(this.transaction){
+            return YAHOO.util.Connect.isCallInProgress(this.transaction);
+        }
+        return false;
+    }
+};
+
+/**
+ * The defaults collection enables customizing the default properties of UpdateManager
+ */
+   YAHOO.ext.UpdateManager.defaults = {
+       /**
+         * Timeout for requests or form posts in seconds (Defaults 30 seconds). 
+         * @type Number
+         */
+         timeout : 30,
+         
+         /**
+         * True to process scripts by default (Defaults to false). 
+         * @type Number
+         */
+        loadScripts : false,
+         
+        /**
+        * Blank page URL to use with SSL file uploads (Defaults to 'about:blank'). 
+        * @type String
+        */
+        sslBlankUrl : (YAHOO.ext.SSL_SECURE_URL || 'javascript:false'),
+        /**
+         * Whether to append unique parameter on get request to disable caching (Defaults to false). 
+         * @type Boolean
+         */
+        disableCaching : false,
+        /**
+         * Whether to show indicatorText when loading (Defaults to true). 
+         * @type String
+         */
+        showLoadIndicator : true,
+        /**
+         * Text for loading indicator (Defaults to '&lt;div class="loading-indicator"&gt;Loading...&lt;/div&gt;'). 
+         * @type String
+         */
+        indicatorText : '<div class="loading-indicator">Loading...</div>'
+   };
+
+/**
+ * Static convenience method, Usage: 
+ * <pre><code>YAHOO.ext.UpdateManager.update('my-div', 'stuff.php');</code></pre>
+ * @param {String/HTMLElement/YAHOO.ext.Element} el The element to update
+ * @param {String} url The url
+ * @param {<i>String/Object</i>} params (optional) Url encoded param string or an object of name/value pairs
+ * @param {<i>Object</i>} options (optional) A config object with any of the UpdateManager properties you want to set - for example: {disableCaching:true, indicatorText: 'Loading data...'}
+ * @static
+ */
+YAHOO.ext.UpdateManager.updateElement = function(el, url, params, options){
+    var um = getEl(el, true).getUpdateManager();
+    YAHOO.ext.util.Config.apply(um, options);
+    um.update(url, params, options.callback);
+}
+// alias for backwards compat
+YAHOO.ext.UpdateManager.update = YAHOO.ext.UpdateManager.updateElement;
+/**
+ * @class YAHOO.ext.UpdateManager.BasicRenderer
+ * Default Content renderer. Updates the elements innerHTML with the responseText.
+ */ 
+YAHOO.ext.UpdateManager.BasicRenderer = function(){};
+
+YAHOO.ext.UpdateManager.BasicRenderer.prototype = {
+    /**
+     * This is called when the transaction is completed and it's time to update the element - The BasicRenderer 
+     * updates the elements innerHTML with the responseText - To perform a custom render (i.e. XML or JSON processing), 
+     * create an object with a "render(el, response)" method and pass it to setRenderer on the UpdateManager.
+     * @param {YAHOO.ext.Element} el The element being rendered
+     * @param {Object} response The YUI Connect response object
+     * @param {UpdateManager} updateManager The calling update manager
+     * @param {Function} callback A callback that will need to be called if loadScripts is true on the UpdateManager
+     */
+     render : function(el, response, updateManager, callback){
+        el.update(response.responseText, updateManager.loadScripts, callback);
+    }
+};
+

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/XMLDataModel.js.html b/www/extras/yui-ext/docs/output/XMLDataModel.js.html new file mode 100644 index 000000000..00cc13b13 --- /dev/null +++ b/www/extras/yui-ext/docs/output/XMLDataModel.js.html @@ -0,0 +1,257 @@ +XMLDataModel.js
/**
+ * @class YAHOO.ext.grid.XMLDataModel
+ * This is an implementation of a DataModel used by the Grid. It works 
+ * with XML data. 
+ * <br>Example schema from Amazon search:
+ * <pre><code>
+ * var schema = {
+ *     tagName: 'Item',
+ *     id: 'ASIN',
+ *     fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
+ * };
+ * </code></pre>
+ * @extends YAHOO.ext.grid.LoadableDataModel
+ * @constructor
+ * @param {Object} schema The schema to use
+ * @param {XMLDocument} xml An XML document to load immediately
+*/
+YAHOO.ext.grid.XMLDataModel = function(schema, xml){
+    YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.XML);
+    /**@private*/
+    this.schema = schema;
+    this.xml = xml;
+    if(xml){
+        this.loadData(xml);
+    }
+    this.idSeed = 0;
+};
+YAHOO.extendX(YAHOO.ext.grid.XMLDataModel, YAHOO.ext.grid.LoadableDataModel, {
+    
+    getDocument: function(){
+       return this.xml;    
+    },
+    
+    /**
+     * Overrides loadData in LoadableDataModel to process XML
+     * @param {XMLDocument} doc The document to load
+     * @param {<i>Function</i>} callback (optional) callback to call when loading is complete
+     * @param {<i>Boolean</i>} keepExisting (optional) true to keep existing data
+     * @param {<i>Number</i>} insertIndex (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+     */
+    loadData: function(doc, callback, keepExisting, insertIndex){
+    	this.xml = doc;
+    	var idField = this.schema.id;
+    	var fields = this.schema.fields;
+    	if(this.schema.totalTag){
+    	    this.totalCount = null;
+    	    var totalNode = doc.getElementsByTagName(this.schema.totalTag);
+    	    if(totalNode && totalNode.item(0) && totalNode.item(0).firstChild) {
+                var v = parseInt(totalNode.item(0).firstChild.nodeValue, 10);
+                if(!isNaN(v)){
+                    this.totalCount = v;
+                }
+        	}
+    	}
+    	var rowData = [];
+    	var nodes = doc.getElementsByTagName(this.schema.tagName);
+        if(nodes && nodes.length > 0) {
+    	    for(var i = 0; i < nodes.length; i++) {
+    	        var node = nodes.item(i);
+    	        var colData = [];
+    	        colData.node = node;
+    	        colData.id = this.getNamedValue(node, idField, String(++this.idSeed));
+    	        for(var j = 0; j < fields.length; j++) {
+    	            var val = this.getNamedValue(node, fields[j], "");
+    	            if(this.preprocessors[j]){
+    	                val = this.preprocessors[j](val);
+    	            }
+    	            colData.push(val);
+    	        }
+    	        rowData.push(colData);
+    	    }
+        }
+        if(keepExisting !== true){
+           YAHOO.ext.grid.XMLDataModel.superclass.removeAll.call(this);
+    	}
+    	if(typeof insertIndex != 'number'){
+    	    insertIndex = this.getRowCount();
+    	}
+        YAHOO.ext.grid.XMLDataModel.superclass.insertRows.call(this, insertIndex, rowData);
+        if(typeof callback == 'function'){
+        	callback(this, true);
+        }
+        this.fireLoadEvent();
+    },
+    
+    /**
+     * Adds a row to this DataModel and syncs the XML document
+     * @param {String} id The id of the row, if null the next row index is used
+     * @param {Array} cellValues The cell values for this row
+     * @return {Number} The index of the new row (if the model is sorted this index may not be accurate)
+     */
+    addRow: function(id, cellValues){
+        var node = this.createNode(this.xml, id, cellValues);
+        cellValues.id = id || ++this.idSeed;
+        cellValues.node = node;
+        return YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this, cellValues);
+    },
+    
+    /**
+     * Inserts a row into this DataModel and syncs the XML document
+     * @param {Number} index The index to insert the row
+     * @param {String} id The id of the row, if null the next row index is used
+     * @param {Array} cellValues The cell values for this row
+     * @return {Number} The index of the new row (if the model is sorted this index may not be accurate)
+     */
+    insertRow: function(index, id, cellValues){
+        var node = this.createNode(this.xml, id, cellValues);
+        cellValues.id = id || ++this.idSeed;
+        cellValues.node = node;
+        return YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues);
+    },
+    
+    /**
+     * Removes the row from DataModel and syncs the XML document
+     * @param {Number} index The index of the row to remove
+     */
+    removeRow: function(index){
+        var node = this.data[index].node;
+        node.parentNode.removeChild(node);
+        YAHOO.ext.grid.XMLDataModel.superclass.removeRow.call(this, index, index);
+    },
+    
+    getNode: function(rowIndex){
+        return this.data[rowIndex].node;
+    },
+    
+    /**
+     * Override this method to define your own node creation routine for when new rows are added.
+     * By default this method clones the first node and sets the column values in the newly cloned node.
+     * In many instances this will not work and you will have to create the node manually.
+     * @param {XMLDocument} xmlDoc The xml document being used by this model
+     * @param {String/Number} id The row id
+     * @param {Array} colData The column data for the new node
+     * @return {XMLNode} The created node
+     */
+    createNode: function(xmlDoc, id, colData){
+        var template = this.data[0].node;
+        var newNode = template.cloneNode(true);
+        var fields = this.schema.fields;
+        for(var i = 0, len = fields.length; i < len; i++){
+            var nodeValue = colData[i];
+            if(this.postprocessors[i]){
+                nodeValue = this.postprocessors[i](nodeValue);
+            }
+            this.setNamedValue(newNode, fields[i], nodeValue);
+        }
+        if(id){
+            this.setNamedValue(newNode, this.schema.idField, id);
+        }
+        template.parentNode.appendChild(newNode);
+        return newNode;
+    },
+    
+    /**
+     * @private
+     * Convenience function looks for value in attributes, then in children tags - also 
+     * normalizes namespace matches (ie matches ns:tag, FireFox matches tag and not ns:tag).
+     */
+    getNamedValue: function(node, name, defaultValue){
+    	if(!node || !name){
+    		return defaultValue;
+    	}
+    	var nodeValue = defaultValue;
+        var attrNode = node.attributes.getNamedItem(name);
+        if(attrNode) {
+        	nodeValue = attrNode.value;
+        } else {
+            var childNode = node.getElementsByTagName(name);
+            if(childNode && childNode.item(0) && childNode.item(0).firstChild) {
+                nodeValue = childNode.item(0).firstChild.nodeValue;
+        	}else{
+        	    // try to strip namespace for FireFox
+        	    var index = name.indexOf(':');
+        	    if(index > 0){
+        	        return this.getNamedValue(node, name.substr(index+1), defaultValue);
+        	    }
+        	}
+        }
+        return nodeValue;
+    },
+    
+    /**
+     * @private
+     * Convenience function set a value in the underlying xml node.
+     */
+    setNamedValue: function(node, name, value){
+    	if(!node || !name){
+    		return;
+    	}
+    	var attrNode = node.attributes.getNamedItem(name);
+        if(attrNode) {
+        	attrNode.value = value;
+        	return;
+        }
+        var childNode = node.getElementsByTagName(name);
+        if(childNode && childNode.item(0) && childNode.item(0).firstChild) {
+            childNode.item(0).firstChild.nodeValue = value;
+        }else{
+    	    // try to strip namespace for FireFox
+    	    var index = name.indexOf(':');
+    	    if(index > 0){
+    	        this.setNamedValue(node, name.substr(index+1), value);
+    	    }
+    	}
+    },
+    
+    /**
+     * Overrides DefaultDataModel.setValueAt to update the underlying XML Document
+     * @param {Object} value The new value
+     * @param {Number} rowIndex
+     * @param {Number} colIndex
+     */
+    setValueAt: function(value, rowIndex, colIndex){
+        var node = this.data[rowIndex].node;
+        if(node){
+            var nodeValue = value;
+            if(this.postprocessors[colIndex]){
+                nodeValue = this.postprocessors[colIndex](value);
+            }
+            this.setNamedValue(node, this.schema.fields[colIndex], nodeValue);
+        }
+        YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this, value, rowIndex, colIndex);
+    },
+    
+    /**
+     * Overrides getRowId in DefaultDataModel to return the ID value of the specified node. 
+     * @param {Number} rowIndex
+     * @return {Number}
+     */
+    getRowId: function(rowIndex){
+        return this.data[rowIndex].id;
+    },
+    
+    addRows : function(rowData){   
+        for(var j = 0, len = rowData.length; j < len; j++){
+           var cellValues = rowData[j];
+           var id = ++this.idSeed; 
+           var node = this.createNode(this.xml, id, cellValues);       
+           cellValues.node=node;
+           cellValues.id = cellValues.id || id;
+           YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this,cellValues);
+        }
+    },   
+
+   insertRows : function(index, rowData){
+       // copy original array so it is not reversed 
+       rowData = rowData.slice(0).reverse();
+       for(var j = 0, len = rowData.length; j < len; j++){
+          var cellValues = rowData[j];
+          var id = ++this.idSeed; 
+          var node = this.createNode(this.xml, id, cellValues);
+          cellValues.id = cellValues.id || id;
+          cellValues.node = node;
+          YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues);
+       }
+   }
+});

Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.Actor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.Actor.html new file mode 100644 index 000000000..4b9be8d4f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.Actor.html @@ -0,0 +1,3505 @@ + + + + YAHOO.ext.Actor + + + + + +
+ +

Class YAHOO.ext.Actor

+ + + + + +
Package:YAHOO.ext
Class:Actor
Extends:Element
Defined In:Actor.js
+
+ Provides support for syncing and chaining of Element Yahoo! UI based animation and some common effects. Actors support "self-play" without an Animator.

+Note: Along with the animation methods defined below, this class inherits and captures all of the "set" or animation methods of YAHOO.ext.Element. "get" methods are not captured and execute immediately. +

Usage:
+

+var actor = new YAHOO.ext.Actor('myElementId');
+actor.startCapture(true);
+actor.moveTo(100, 100, true);
+actor.squish();
+actor.play();
+
+// or to start capturing immediately, with no Animator (the null second param) +
+var actor = new YAHOO.ext.Actor('myElementId', null, true); +actor.moveTo(100, 100, true); +actor.squish(); +actor.play(); +
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 DISPLAY<static> : NumberElement
<static> Visibility mode constant - Use display to hide element
 VISIBILITY<static> : NumberElement
<static> Visibility mode constant - Use visibility to hide element
 autoBoxAdjust : ObjectElement
true to automatically adjust width and height settings for box-model issues (default to true)
 autoDisplayMode : ObjectElement
true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false...
 capturing : ObjectActor
Whether this actor is currently capturing
 defaultUnit : StringElement
The default unit to append to CSS values where a unit isn't provided (Defaults to px).
 dom : HTMLElementElement
The DOM element
 id : StringElement
The DOM element ID
 originalDisplay : StringElement
The element's default display mode
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Actor(String/HTMLElement el, [YAHOO.ext.Animator animator], [Boolean selfCapture])Actor
Create new Actor.
 addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) : voidActor
Capture an async function call.
 addCall(Function fcn, [Array args], [Object scope]) : voidActor
Capture a function call.
 addClass() : voidActor
Capturing override - See YAHOO.ext.Element.addClass for method details.
 addClassOnOver(String className) : YAHOO.ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is over this element
 addHandler(String eventName, Boolean stopPropagation, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element. The difference between this function and addListener is this +function preve...
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element
 addManagedListener(String eventName, Function fn, [Object scope], [boolean override]) : FunctionElement
Append a managed listener - See YAHOO.ext.EventObject for more details. Use mon() for a shorter version.
 alignTo() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.alignTo for method details.
 animate() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.animate for method details.
 appear([Float duration]) : voidActor
Fade an element in
 appendChild(String/HTMLElement/Array/Element/CompositeElement el) : YAHOO.ext.ElementElement
Appends the passed element(s) to this element
 appendTo(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Appends this element to the passed element
 applyStyles(String/Object/Function styles) : YAHOO.ext.ElementElement
More flexible version of setStyle for setting style properties.
 autoHeight() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.autoHeight for method details.
 beginMeasure() : YAHOO.ext.ElementElement
Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
 blindHide(String anchor, [Float duration], [Function easing]) : voidActor
Hide the element using a "blinds" effect
 blindShow(String anchor, [Number newSize], [Float duration], [Function easing]) : voidActor
Show the element using a "blinds" effect
 bounce() : voidActor
Bounce this element from up and down
 capture(YAHOO.ext.Actor.Action action) : voidActor
Captures an action for this actor. Generally called internally but can be called directly.
 center([String/HTMLElement/YAHOO.ext.Element centerIn]) : voidElement
Centers the Element in either the viewport, or another Element.
 clear() : voidActor
Clears any calls that have been self captured.
 clearOpacity() : voidActor
Capturing override - See YAHOO.ext.Element.clearOpacity for method details.
 clearPositioning() : voidActor
Capturing override - See YAHOO.ext.Element.clearPositioning for method details.
 clip() : voidActor
Capturing override - See YAHOO.ext.Element.clip for method details.
 createChild(Object config, [HTMLElement insertBefore]) : YAHOO.ext.ElementElement
Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child e...
 createProxy(String/Object config, [String/HTMLElement renderTo], [Boolean matchBox]) : YAHOO.ext.ElementElement
Creates a proxy element of this element
 createShim() : YAHOO.ext.ElementElement
Creates an iframe shim for this element to keep selects and other windowed objects from +showing through.
 dropOut([Float duration]) : voidActor
Fade the element as it is falling from it's current position
 enableDisplayMode() : voidActor
Capturing override - See YAHOO.ext.Element.enableDisplayMode for method details.
 endMeasure() : YAHOO.ext.ElementElement
Restores displays to before beginMeasure was called
 fade([Float duration]) : voidActor
Fade an element out
 fitToParent([Boolean monitorResize]) : YAHOO.ext.ElementElement
Sizes this element to it's parent element's dimensions performing +neccessary box adjustments.
 focus() : voidActor
Capturing override - See YAHOO.ext.Element.focus for method details.
 frame([Number color], [Number count], [Float duration]) : voidActor
Show a ripple of exploding, attenuating borders to draw attention to an Element.
 get<static>(String/HTMLElement/Element el, [Boolean autoGenerateId]) : ElementElement
<static> Static method to retreive Element objects. Uses simple caching to consistently return the same object....
 getBorderWidth(String side) : NumberElement
Gets the width of the border(s) for the specified side(s)
 getBottom(Boolean local) : NumberElement
Gets the bottom Y coordinate of the element (element Y position + element height)
 getBox([Boolean contentBox], [Boolean local]) : ObjectElement
Return a box {x, y, width, height} that can be used to set another elements +size/location to match this element.
 getCenterXY(Boolean offsetScroll) : ArrayElement
Calculates the x, y to center this element on the screen
 getChildrenByClassName(String className, [String tagName]) : ArrayElement
Gets an array of child YAHOO.ext.Element objects by class name and optional tagName
 getChildrenByTagName(String tagName) : ArrayElement
Gets an array of child YAHOO.ext.Element objects by tag name
 getHeight([Boolean contentHeight]) : NumberElement
Returns the offset height of the element
 getLeft(Boolean local) : NumberElement
Gets the left X coordinate
 getMargins([String sides]) : Object/NumberElement
Returns an object with properties top, left, right and bottom representing the margins of this element unless sides i...
 getNextSibling() : HTMLElementElement
Gets the next sibling, skipping text nodes
 getPadding(String side) : NumberElement
Gets the width of the padding(s) for the specified side(s)
 getPositioning() : ObjectElement
Gets an object with all CSS positioning properties. Useful along with setPostioning to get +snapshot before performin...
 getPrevSibling() : HTMLElementElement
Gets the previous sibling, skipping text nodes
 getRegion() : RegionElement
Returns the region of the given element. +The element must be part of the DOM tree to have a region (display:none or e...
 getRight(Boolean local) : NumberElement
Gets the right X coordinate of the element (element X position + element width)
 getSize([Boolean contentSize]) : ObjectElement
Returns the size of the element
 getStyle(String property) : StringElement
Normalizes currentStyle and ComputedStyle.
 getTop(Boolean local) : NumberElement
Gets the top Y coordinate
 getUpdateManager() : YAHOO.ext.UpdateManagerElement
Gets this elements UpdateManager
 getWidth([Boolean contentWidth]) : NumberElement
Returns the offset width of the element
 getX() : voidElement
Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 getXY() : voidElement
Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have pag...
 getY() : voidElement
Gets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 hasClass(String className) : BooleanElement
Checks if a CSS class is in use by the element.
 hide() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.hide for method details.
 highlight([String color], [String fromColor], [Float duration], [String attribute]) : voidActor
Highlight the element using a background color (or passed attribute) animation
 initDD(String group, Object config, Object overrides) : YAHOO.util.DDElement
Initializes a YAHOO.util.DD object for this element.
 initDDProxy(String group, Object config, Object overrides) : YAHOO.util.DDProxyElement
Initializes a YAHOO.util.DDProxy object for this element.
 initDDTarget(String group, Object config, Object overrides) : YAHOO.util.DDTargetElement
Initializes a YAHOO.util.DDTarget object for this element.
 insertAfter(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Inserts this element after the passed element in the DOM
 insertBefore(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Inserts this element before the passed element in the DOM
 insertHtml(String where, String html) : YAHOO.ext.ElementElement
Inserts an html fragment into this element
 isBorderBox() : BooleanElement
Tests various css rules/browsers to determine if this element uses a border box
 isDisplayed() : BooleanElement
Returns true if display is not "none"
 isVisible([Boolean deep]) : BooleanElement
Checks whether the element is currently visible using both visibility and display properties.
 load() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.load for method details.
 mon(String eventName, Function fn, [Object scope], [boolean override]) : FunctionElement
Append a managed listener (shorthanded for addManagedListener)
 move() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.move for method details.
 moveIn(String anchor, [Array to], [Float duration], [Function easing]) : voidActor
Show the element in a way that it appears as if it is flying onto the screen
 moveOut(String anchor, [Float duration], [Function easing]) : voidActor
Hide the element in a way that it appears as if it is flying off the screen
 moveTo() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.moveTo for method details.
 on(String eventName, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element (Same as addListener)
 pause(Number seconds) : voidActor
Capture a pause (in seconds).
 play([Function oncomplete]) : voidActor
Starts playback of self captured calls.
 pulsate([Number count], [Float duration]) : voidActor
Fade the element in and out the specified amount of times
 radioClass(String className) : YAHOO.ext.ElementElement
Adds the passed className to this element and removes the class from all siblings
 remove() : voidActor
Capturing override - See YAHOO.ext.Element.remove for method details.
 removeAllListeners() : YAHOO.ext.ElementElement
Removes all previous added listeners from this element
 removeClass() : voidActor
Capturing override - See YAHOO.ext.Element.removeClass for method details.
 removeListener(String sType, Function fn, Object scope) : YAHOO.ext.ElementElement
Removes an event handler from this element
 repaint() : YAHOO.ext.ElementElement
Forces the browser to repaint this element
 replace(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Replaces the passed element with this element
 replaceClass() : voidActor
Capturing override - See YAHOO.ext.Element.replaceClass for method details.
 scrollIntoView([String/HTMLElement/Element container]) : YAHOO.ext.ElementElement
Scrolls this element into view within the passed container.
 select(String selector, Boolean unique) : CompositeElement/CompositeElementLiteElement
Selects child nodes based on the passed CSS selector (the selector should not contain an id)
 select<static>(String/Array selector, [Boolean unique]) : CompositeElementLite/CompositeElementElement
<static> Selects elements based on the passed CSS selector to enable working on them as 1.
 set(Object o) : YAHOO.ext.ElementElement
Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
 setAbsolutePositioned() : voidActor
Capturing override - See YAHOO.ext.Element.setAbsolutePositioned for method details.
 setBottom(String bottom) : YAHOO.ext.ElementElement
Set the element's css bottom style
 setBounds() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setBounds for method details.
 setBox() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setBox for method details.
 setDisplayed(Boolean value) : YAHOO.ext.ElementElement
Sets the css display. Uses originalDisplay if value is a boolean true.
 setHeight() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setHeight for method details.
 setLeft() : voidActor
Capturing override - See YAHOO.ext.Element.setLeft for method details.
 setLeftTop() : YAHOO.ext.ElementElement
Quick set left and top adding default units
 setLocation() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setLocation for method details.
 setOpacity() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setOpacity for method details.
 setPositioning() : voidActor
Capturing override - See YAHOO.ext.Element.setPositioning for method details.
 setRegion(YAHOO.util.Region region, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the element's position and size the the specified region. If animation is true then width, height, x and y will ...
 setRelativePositioned() : voidActor
Capturing override - See YAHOO.ext.Element.setRelativePositioned for method details.
 setRight(String right) : YAHOO.ext.ElementElement
Set the element's css right style
 setSize() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setSize for method details.
 setStyle() : voidActor
Capturing override - See YAHOO.ext.Element.setStyle for method details.
 setTop() : voidActor
Capturing override - See YAHOO.ext.Element.setTop for method details.
 setVisibilityMode() : voidActor
Capturing override - See YAHOO.ext.Element.setVisibilityMode for method details.
 setVisible() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setVisible for method details.
 setWidth() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setWidth for method details.
 setX() : voidActor
Capturing override - See YAHOO.ext.Element.setX for method details.
 setXY() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.setXY for method details.
 setY() : voidActor
Capturing override - See YAHOO.ext.Element.setY for method details.
 shake() : voidActor
Shake this element from side to side
 show() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.show for method details.
 slideHide(String anchor, [Float duration], [Function easing]) : voidActor
Hide the element using a "slide in" effect - In order for this effect to work the element MUST have a child element c...
 slideShow(String anchor, [Number newSize], [Float duration], [Function easing]) : voidActor
Show the element using a "slide in" effect - In order for this effect to work the element MUST have a child element c...
 squish([Float duration]) : voidActor
Hide the element by "squishing" it into the corner
 startCapture() : voidActor
Start self capturing calls on this Actor. All subsequent calls are captured and executed when play() is called.
 stopCapture() : voidActor
Stop self capturing calls on this Actor.
 swallowEvent(String eventName, [Boolean preventDefault]) : YAHOO.ext.ElementElement
Stops the specified event from bubbling and optionally prevent's the default action
 switchOff([Float duration]) : voidActor
Blink the element as if it was clicked and then collapse on it's center
 toggle() : voidActor
Capturing and animation syncing override - See YAHOO.ext.Element.toggle for method details.
 toggleClass(String className) : YAHOO.ext.ElementElement
Toggles (adds or removes) the passed class.
 unclip() : voidActor
Capturing override - See YAHOO.ext.Element.unclip for method details.
 unselectable() : YAHOO.ext.ElementElement
Disables text selection for this element (normalized across browsers)
 update() : voidActor
Capturing override - See YAHOO.ext.Element.update for method details.
 wrap([Object config]) : ElementElement
Creates and wraps this element with another element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

DISPLAY<static>

+ public Number DISPLAY<static> +
+ <static> Visibility mode constant - Use display to hide element
+
This property is defined by Element.
+
+ +
+

VISIBILITY<static>

+ public Number VISIBILITY<static> +
+ <static> Visibility mode constant - Use visibility to hide element
+
This property is defined by Element.
+
+ +
+

autoBoxAdjust

+ public Object autoBoxAdjust +
+ true to automatically adjust width and height settings for box-model issues (default to true)
+
This property is defined by Element.
+
+ +
+

autoDisplayMode

+ public Object autoDisplayMode +
+ true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false). +To enable this globally:
YAHOO.ext.Element.prototype.autoDisplayMode = true;
+
This property is defined by Element.
+
+ +
+

capturing

+ public Object capturing +
+ Whether this actor is currently capturing
+
This property is defined by Actor.
+
+ +
+

defaultUnit

+ public String defaultUnit +
+ The default unit to append to CSS values where a unit isn't provided (Defaults to px).
+
This property is defined by Element.
+
+ +
+

dom

+ public HTMLElement dom +
+ The DOM element
+
This property is defined by Element.
+
+ +
+

id

+ public String id +
+ The DOM element ID
+
This property is defined by Element.
+
+ +
+

originalDisplay

+ public String originalDisplay +
+ The element's default display mode
+
This property is defined by Element.
+
+
+ + +

Constructor Details

+
+
+

Actor

+ public function Actor(String/HTMLElement el, [YAHOO.ext.Animator animator], [Boolean selfCapture]) +
+ Create new Actor.
+ Parameters: +
  • el : String/HTMLElement
    The dom element or element id
  • animator : YAHOO.ext.Animator
    (optional) The Animator that will capture this Actor's actions
  • selfCapture : Boolean
    (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false)
+
+
+
+
+ +

Method Details

+
+ +
+

addAsyncCall

+ public function addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) +
+ Capture an async function call. +
+ Parameters: +
  • fcn : Function
    The function to call
  • callbackIndex : Number
    The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED.
  • args : Array
    The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

addCall

+ public function addCall(Function fcn, [Array args], [Object scope]) +
+ Capture a function call. +
+ Parameters: +
  • fcn : Function
    The function to call
  • args : Array
    (optional) The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

addClass

+ public function addClass() +
+ Capturing override - See YAHOO.ext.Element.addClass for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

addClassOnOver

+ public function addClassOnOver(String className) +
+ Sets up event handlers to add and remove a css class when the mouse is over this element +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addHandler

+ public function addHandler(String eventName, Boolean stopPropagation, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element. The difference between this function and addListener is this +function prevents the default action, and if set stops propagation (bubbling) as well +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • stopPropagation : Boolean
    Whether to also stopPropagation (bubbling)
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addManagedListener

+ public function addManagedListener(String eventName, Function fn, [Object scope], [boolean override]) +
+ Append a managed listener - See YAHOO.ext.EventObject for more details. Use mon() for a shorter version. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The EventManager wrapped function that can be used to remove the listener
  • +
+
+
+
This method is defined by Element.
+
+ +
+

alignTo

+ public function alignTo() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.alignTo for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

animate

+ public function animate() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.animate for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

appear

+ public function appear([Float duration]) +
+ Fade an element in +
+ Parameters: +
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

appendChild

+ public function appendChild(String/HTMLElement/Array/Element/CompositeElement el) +
+ Appends the passed element(s) to this element +
+ Parameters: +
  • el : String/HTMLElement/Array/Element/CompositeElement
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

appendTo

+ public function appendTo(String/HTMLElement/Element el) +
+ Appends this element to the passed element +
+ Parameters: +
  • el : String/HTMLElement/Element
    The new parent element
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

applyStyles

+ public function applyStyles(String/Object/Function styles) +
+ More flexible version of setStyle for setting style properties. +
+ Parameters: +
  • styles : String/Object/Function
    A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns such a specification.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

autoHeight

+ public function autoHeight() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.autoHeight for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

beginMeasure

+ public function beginMeasure() +
+ Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

blindHide

+ public function blindHide(String anchor, [Float duration], [Function easing]) +
+ Hide the element using a "blinds" effect +
+ Parameters: +
  • anchor : String
    The part of the element that it should appear to collapse to. The short/long options are t/top, l/left, b/bottom, r/right.
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

blindShow

+ public function blindShow(String anchor, [Number newSize], [Float duration], [Function easing]) +
+ Show the element using a "blinds" effect +
+ Parameters: +
  • anchor : String
    The part of the element that it should appear to exapand from. The short/long options currently are t/top, l/left
  • newSize : Number
    (optional) The size to animate to. (Default to current size)
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

bounce

+ public function bounce() +
+ Bounce this element from up and down +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

capture

+ public function capture(YAHOO.ext.Actor.Action action) +
+ Captures an action for this actor. Generally called internally but can be called directly. +
+ Parameters: +
  • action : YAHOO.ext.Actor.Action
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

center

+ public function center([String/HTMLElement/YAHOO.ext.Element centerIn]) +
+ Centers the Element in either the viewport, or another Element. +
+ Parameters: +
  • centerIn : String/HTMLElement/YAHOO.ext.Element
    (optional) The element in which to center the element.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clear

+ public function clear() +
+ Clears any calls that have been self captured. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

clearOpacity

+ public function clearOpacity() +
+ Capturing override - See YAHOO.ext.Element.clearOpacity for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

clearPositioning

+ public function clearPositioning() +
+ Capturing override - See YAHOO.ext.Element.clearPositioning for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

clip

+ public function clip() +
+ Capturing override - See YAHOO.ext.Element.clip for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

createChild

+ public function createChild(Object config, [HTMLElement insertBefore]) +
+ Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child element. +
+ Parameters: +
  • config : Object
    DomHelper element config object
  • insertBefore : HTMLElement
    (optional) a child element of this element
+ Returns: +
    +
  • YAHOO.ext.Element
    The new child element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createProxy

+ public function createProxy(String/Object config, [String/HTMLElement renderTo], [Boolean matchBox]) +
+ Creates a proxy element of this element +
+ Parameters: +
  • config : String/Object
    The class name of the proxy element or a DomHelper config object
  • renderTo : String/HTMLElement
    (optional) The element or element id to render the proxy to (defaults to document.body)
  • matchBox : Boolean
    (optional) True to align and size the proxy to this element now (defaults to false)
+ Returns: +
    +
  • YAHOO.ext.Element
    The new proxy element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createShim

+ public function createShim() +
+ Creates an iframe shim for this element to keep selects and other windowed objects from +showing through. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    The new shim element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

dropOut

+ public function dropOut([Float duration]) +
+ Fade the element as it is falling from it's current position +
+ Parameters: +
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

enableDisplayMode

+ public function enableDisplayMode() +
+ Capturing override - See YAHOO.ext.Element.enableDisplayMode for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

endMeasure

+ public function endMeasure() +
+ Restores displays to before beginMeasure was called +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

fade

+ public function fade([Float duration]) +
+ Fade an element out +
+ Parameters: +
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

fitToParent

+ public function fitToParent([Boolean monitorResize]) +
+ Sizes this element to it's parent element's dimensions performing +neccessary box adjustments. +
+ Parameters: +
  • monitorResize : Boolean
    (optional) If true maintains the fit when the browser window is resized.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

focus

+ public function focus() +
+ Capturing override - See YAHOO.ext.Element.focus for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

frame

+ public function frame([Number color], [Number count], [Float duration]) +
+ Show a ripple of exploding, attenuating borders to draw attention to an Element. +
+ Parameters: +
  • color : Number
    (optional) The color of the border.
  • count : Number
    (optional) How many ripples.
  • duration : Float
    (optional) How long each ripple takes to expire
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

get<static>

+ public function get<static>(String/HTMLElement/Element el, [Boolean autoGenerateId]) +
+ <static> Static method to retreive Element objects. Uses simple caching to consistently return the same object. +Automatically fixes if an object was recreated with the same id via AJAX or DOM. +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the element or the element to wrap (must have an id). If you pass in an element, it is returned
  • autoGenerateId : Boolean
    (optional) Set this flag to true if you are passing an element without an id (like document.body). It will auto generate an id if one isn't present.
+ Returns: +
    +
  • Element
    The element object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBorderWidth

+ public function getBorderWidth(String side) +
+ Gets the width of the border(s) for the specified side(s) +
+ Parameters: +
  • side : String
    Can be t, l, r, b or any combination of those to add multiple values. For example, passing lr would get the border (l)eft width + the border (r)ight width.
+ Returns: +
    +
  • Number
    The width of the sides passed added together
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBottom

+ public function getBottom(Boolean local) +
+ Gets the bottom Y coordinate of the element (element Y position + element height) +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBox

+ public function getBox([Boolean contentBox], [Boolean local]) +
+ Return a box {x, y, width, height} that can be used to set another elements +size/location to match this element. +
+ Parameters: +
  • contentBox : Boolean
    (optional) If true a box for the content of the element is returned.
  • local : Boolean
    (optional) If true the element's left and top are returned instead of page x/y.
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getCenterXY

+ public function getCenterXY(Boolean offsetScroll) +
+ Calculates the x, y to center this element on the screen +
+ Parameters: +
  • offsetScroll : Boolean
    True to offset the documents current scroll position
+ Returns: +
    +
  • Array
    The x, y values [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getChildrenByClassName

+ public function getChildrenByClassName(String className, [String tagName]) +
+ Gets an array of child YAHOO.ext.Element objects by class name and optional tagName +
+ Parameters: +
  • className : String
  • tagName : String
    (optional)
+ Returns: +
    +
  • Array
    The children
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getChildrenByTagName

+ public function getChildrenByTagName(String tagName) +
+ Gets an array of child YAHOO.ext.Element objects by tag name +
+ Parameters: +
  • tagName : String
+ Returns: +
    +
  • Array
    The children
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getHeight

+ public function getHeight([Boolean contentHeight]) +
+ Returns the offset height of the element +
+ Parameters: +
  • contentHeight : Boolean
    (optional) true to get the height minus borders and padding
+ Returns: +
    +
  • Number
    The element's height
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getLeft

+ public function getLeft(Boolean local) +
+ Gets the left X coordinate +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getMargins

+ public function getMargins([String sides]) +
+ Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed, +then it returns the calculated width of the sides (see getPadding) +
+ Parameters: +
  • sides : String
    (optional) Any combination of l, r, t, b to get the sum of those sides
+ Returns: +
    +
  • Object/Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getNextSibling

+ public function getNextSibling() +
+ Gets the next sibling, skipping text nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    The next sibling or null
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPadding

+ public function getPadding(String side) +
+ Gets the width of the padding(s) for the specified side(s) +
+ Parameters: +
  • side : String
    Can be t, l, r, b or any combination of those to add multiple values. For example, passing lr would get the padding (l)eft + the padding (r)ight.
+ Returns: +
    +
  • Number
    The padding of the sides passed added together
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPositioning

+ public function getPositioning() +
+ Gets an object with all CSS positioning properties. Useful along with setPostioning to get +snapshot before performing an update and then restoring the element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPrevSibling

+ public function getPrevSibling() +
+ Gets the previous sibling, skipping text nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    The previous sibling or null
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getRegion

+ public function getRegion() +
+ Returns the region of the given element. +The element must be part of the DOM tree to have a region (display:none or elements not appended return false). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Region
    A YAHOO.util.Region containing "top, left, bottom, right" member data.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getRight

+ public function getRight(Boolean local) +
+ Gets the right X coordinate of the element (element X position + element width) +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getSize

+ public function getSize([Boolean contentSize]) +
+ Returns the size of the element +
+ Parameters: +
  • contentSize : Boolean
    (optional) true to get the width/size minus borders and padding
+ Returns: +
    +
  • Object
    An object containing the element's size {width: (element width), height: (element height)}
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getStyle

+ public function getStyle(String property) +
+ Normalizes currentStyle and ComputedStyle. +
+ Parameters: +
  • property : String
    The style property whose value is returned.
+ Returns: +
    +
  • String
    The current value of the style property for this element.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getTop

+ public function getTop(Boolean local) +
+ Gets the top Y coordinate +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Gets this elements UpdateManager +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getWidth

+ public function getWidth([Boolean contentWidth]) +
+ Returns the offset width of the element +
+ Parameters: +
  • contentWidth : Boolean
    (optional) true to get the width minus borders and padding
+ Returns: +
    +
  • Number
    The element's width
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getX

+ public function getX() +
+ Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The X position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getXY

+ public function getXY() +
+ Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Array} The XY position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getY

+ public function getY() +
+ Gets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The Y position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hasClass

+ public function hasClass(String className) +
+ Checks if a CSS class is in use by the element. +
+ Parameters: +
  • className : String
    The CSS class to check
+ Returns: +
    +
  • Boolean
    true or false
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hide

+ public function hide() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.hide for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

highlight

+ public function highlight([String color], [String fromColor], [Float duration], [String attribute]) +
+ Highlight the element using a background color (or passed attribute) animation +
+ Parameters: +
  • color : String
    (optional) The color to use for the highlight
  • fromColor : String
    (optional) If the element does not currently have a background color, you will need to pass in a color to animate from
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • attribute : String
    (optional) Specify a CSS attribute to use other than background color - camelCase
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

initDD

+ public function initDD(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DD object for this element. +
+ Parameters: +
  • group : String
    The group the DD object is member of
  • config : Object
    The DD config object
  • overrides : Object
    An object containing methods to override/implement on the DD object
+ Returns: +
    +
  • YAHOO.util.DD
    The DD object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDProxy

+ public function initDDProxy(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DDProxy object for this element. +
+ Parameters: +
  • group : String
    The group the DDProxy object is member of
  • config : Object
    The DDProxy config object
  • overrides : Object
    An object containing methods to override/implement on the DDProxy object
+ Returns: +
    +
  • YAHOO.util.DDProxy
    The DDProxy object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDTarget

+ public function initDDTarget(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DDTarget object for this element. +
+ Parameters: +
  • group : String
    The group the DDTarget object is member of
  • config : Object
    The DDTarget config object
  • overrides : Object
    An object containing methods to override/implement on the DDTarget object
+ Returns: +
    +
  • YAHOO.util.DDTarget
    The DDTarget object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertAfter

+ public function insertAfter(String/HTMLElement/Element el) +
+ Inserts this element after the passed element in the DOM +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to insert after
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertBefore

+ public function insertBefore(String/HTMLElement/Element el) +
+ Inserts this element before the passed element in the DOM +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to insert before
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertHtml

+ public function insertHtml(String where, String html) +
+ Inserts an html fragment into this element +
+ Parameters: +
  • where : String
    Where to insert the html in relation to the this element - beforeBegin, afterBegin, beforeEnd, afterEnd.
  • html : String
    The HTML fragment
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isBorderBox

+ public function isBorderBox() +
+ Tests various css rules/browsers to determine if this element uses a border box +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isDisplayed

+ public function isDisplayed() +
+ Returns true if display is not "none" +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isVisible

+ public function isVisible([Boolean deep]) +
+ Checks whether the element is currently visible using both visibility and display properties. +
+ Parameters: +
  • deep : Boolean
    True to walk the dom and see if parent elements are hidden.
+ Returns: +
    +
  • Boolean
    true if the element is currently visible
  • +
+
+
+
This method is defined by Element.
+
+ +
+

load

+ public function load() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.load for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

mon

+ public function mon(String eventName, Function fn, [Object scope], [boolean override]) +
+ Append a managed listener (shorthanded for addManagedListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The EventManager wrapped function that can be used to remove the listener
  • +
+
+
+
This method is defined by Element.
+
+ +
+

move

+ public function move() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.move for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

moveIn

+ public function moveIn(String anchor, [Array to], [Float duration], [Function easing]) +
+ Show the element in a way that it appears as if it is flying onto the screen +
+ Parameters: +
  • anchor : String
    The part of the page that the element should appear to move from. The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, tr/top-right, bl/bottom-left or br/bottom-right.
  • to : Array
    (optional) Array of x and y position to move to like [x, y] (Defaults to center screen)
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

moveOut

+ public function moveOut(String anchor, [Float duration], [Function easing]) +
+ Hide the element in a way that it appears as if it is flying off the screen +
+ Parameters: +
  • anchor : String
    The part of the page that the element should appear to move to. The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, tr/top-right, bl/bottom-left or br/bottom-right.
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

moveTo

+ public function moveTo() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.moveTo for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element (Same as addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

pause

+ public function pause(Number seconds) +
+ Capture a pause (in seconds). +
+ Parameters: +
  • seconds : Number
    The seconds to pause
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

play

+ public function play([Function oncomplete]) +
+ Starts playback of self captured calls. +
+ Parameters: +
  • oncomplete : Function
    (optional) Callback to execute when playback has completed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

pulsate

+ public function pulsate([Number count], [Float duration]) +
+ Fade the element in and out the specified amount of times +
+ Parameters: +
  • count : Number
    (optional) How many times to pulse (Defaults to 3)
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

radioClass

+ public function radioClass(String className) +
+ Adds the passed className to this element and removes the class from all siblings +
+ Parameters: +
  • className : String
    The className to add
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

remove

+ public function remove() +
+ Capturing override - See YAHOO.ext.Element.remove for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

removeAllListeners

+ public function removeAllListeners() +
+ Removes all previous added listeners from this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeClass

+ public function removeClass() +
+ Capturing override - See YAHOO.ext.Element.removeClass for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

removeListener

+ public function removeListener(String sType, Function fn, Object scope) +
+ Removes an event handler from this element +
+ Parameters: +
  • sType : String
    the type of event to remove
  • fn : Function
    the method the event invokes
  • scope : Object
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

repaint

+ public function repaint() +
+ Forces the browser to repaint this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replace

+ public function replace(String/HTMLElement/Element el) +
+ Replaces the passed element with this element +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to replace
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replaceClass

+ public function replaceClass() +
+ Capturing override - See YAHOO.ext.Element.replaceClass for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

scrollIntoView

+ public function scrollIntoView([String/HTMLElement/Element container]) +
+ Scrolls this element into view within the passed container. +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The container element to scroll (defaults to document.body)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select

+ public function select(String selector, Boolean unique) +
+ Selects child nodes based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • unique : Boolean
    true to create a unique YAHOO.ext.Element for each child (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElement/CompositeElementLite
    The composite element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select<static>

+ public function select<static>(String/Array selector, [Boolean unique]) +
+ <static> Selects elements based on the passed CSS selector to enable working on them as 1. +
+ Parameters: +
  • selector : String/Array
    The CSS selector or an array of elements
  • unique : Boolean
    (optional) true to create a unique YAHOO.ext.Element for each element (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElementLite/CompositeElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

set

+ public function set(Object o) +
+ Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function) +
+ Parameters: +
  • o : Object
    The object with the attributes
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setAbsolutePositioned

+ public function setAbsolutePositioned() +
+ Capturing override - See YAHOO.ext.Element.setAbsolutePositioned for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setBottom

+ public function setBottom(String bottom) +
+ Set the element's css bottom style +
+ Parameters: +
  • bottom : String
    The bottom CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBounds

+ public function setBounds() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setBounds for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setBox

+ public function setBox() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setBox for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setDisplayed

+ public function setDisplayed(Boolean value) +
+ Sets the css display. Uses originalDisplay if value is a boolean true. +
+ Parameters: +
  • value : Boolean
    Boolean to display the element using it's default display or a string to set the display directly
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setHeight

+ public function setHeight() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setHeight for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setLeft

+ public function setLeft() +
+ Capturing override - See YAHOO.ext.Element.setLeft for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setLeftTop

+ public function setLeftTop() +
+ Quick set left and top adding default units +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLocation

+ public function setLocation() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setLocation for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setOpacity

+ public function setOpacity() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setOpacity for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setPositioning

+ public function setPositioning() +
+ Capturing override - See YAHOO.ext.Element.setPositioning for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setRegion

+ public function setRegion(YAHOO.util.Region region, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the element's position and size the the specified region. If animation is true then width, height, x and y will be animated concurrently. +
+ Parameters: +
  • region : YAHOO.util.Region
    The region to fill
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRelativePositioned

+ public function setRelativePositioned() +
+ Capturing override - See YAHOO.ext.Element.setRelativePositioned for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setRight

+ public function setRight(String right) +
+ Set the element's css right style +
+ Parameters: +
  • right : String
    The right CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setSize

+ public function setSize() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setSize for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setStyle

+ public function setStyle() +
+ Capturing override - See YAHOO.ext.Element.setStyle for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setTop

+ public function setTop() +
+ Capturing override - See YAHOO.ext.Element.setTop for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setVisibilityMode

+ public function setVisibilityMode() +
+ Capturing override - See YAHOO.ext.Element.setVisibilityMode for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setVisible

+ public function setVisible() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setVisible for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setWidth

+ public function setWidth() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setWidth for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setX

+ public function setX() +
+ Capturing override - See YAHOO.ext.Element.setX for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setXY

+ public function setXY() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.setXY for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

setY

+ public function setY() +
+ Capturing override - See YAHOO.ext.Element.setY for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

shake

+ public function shake() +
+ Shake this element from side to side +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

show

+ public function show() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.show for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

slideHide

+ public function slideHide(String anchor, [Float duration], [Function easing]) +
+ Hide the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindHide effect is rendered. +
+ Parameters: +
  • anchor : String
    The part of the element that it should appear to slide to. The short/long options are t/top, l/left, b/bottom, r/right.
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

slideShow

+ public function slideShow(String anchor, [Number newSize], [Float duration], [Function easing]) +
+ Show the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindShow effect is rendered. +
+ Parameters: +
  • anchor : String
    The part of the element that it should appear to slide from. The short/long options currently are t/top, l/left
  • newSize : Number
    (optional) The size to animate to. (Default to current size)
  • duration : Float
    (optional) How long the effect lasts (in seconds)
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOuth)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

squish

+ public function squish([Float duration]) +
+ Hide the element by "squishing" it into the corner +
+ Parameters: +
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

startCapture

+ public function startCapture() +
+ Start self capturing calls on this Actor. All subsequent calls are captured and executed when play() is called. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

stopCapture

+ public function stopCapture() +
+ Stop self capturing calls on this Actor. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

swallowEvent

+ public function swallowEvent(String eventName, [Boolean preventDefault]) +
+ Stops the specified event from bubbling and optionally prevent's the default action +
+ Parameters: +
  • eventName : String
  • preventDefault : Boolean
    (optional) true to prevent the default action too
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

switchOff

+ public function switchOff([Float duration]) +
+ Blink the element as if it was clicked and then collapse on it's center +
+ Parameters: +
  • duration : Float
    (optional) How long the effect lasts (in seconds)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

toggle

+ public function toggle() +
+ Capturing and animation syncing override - See YAHOO.ext.Element.toggle for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

toggleClass

+ public function toggleClass(String className) +
+ Toggles (adds or removes) the passed class. +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unclip

+ public function unclip() +
+ Capturing override - See YAHOO.ext.Element.unclip for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

unselectable

+ public function unselectable() +
+ Disables text selection for this element (normalized across browsers) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

update

+ public function update() +
+ Capturing override - See YAHOO.ext.Element.update for method details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Actor.
+
+ +
+

wrap

+ public function wrap([Object config]) +
+ Creates and wraps this element with another element +
+ Parameters: +
  • config : Object
    (optional) DomHelper element config object for the wrapper element or null for an empty div
+ Returns: +
    +
  • Element
    The newly created wrapper element
  • +
+
+
+
This method is defined by Element.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.Animator.html b/www/extras/yui-ext/docs/output/YAHOO.ext.Animator.html new file mode 100644 index 000000000..6797ab021 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.Animator.html @@ -0,0 +1,458 @@ + + + + YAHOO.ext.Animator + + + + + +
+ +

Class YAHOO.ext.Animator

+ + + + + +
Package:YAHOO.ext
Class:Animator
Extends:Object
Defined In:Animator.js
+
+ Provides support for syncing animations for multiple YAHOO.ext.Actors.

+

This example can be seen in action here +by clicking on "Click here and I will point it out" at the end of the first paragraph.
+

+var animator = new YAHOO.ext.Animator();
+var cursor = new YAHOO.ext.Actor('cursor-img', animator);
+var click = new YAHOO.ext.Actor('click-img', animator);
+var resize = new YAHOO.ext.Actor('resize-img', animator);
+
+// start capturing
+animator.startCapture();
+
+// these animations will be run in sequence
+cursor.show();
+cursor.moveTo(500,400);
+cursor.moveTo(20, getEl('navbar').getY()+10, true, .75);
+click.show();
+click.alignTo(cursor, 'tl', [-4, -4]);
+
+// Add an async function call, pass callback to argument 1
+animator.addAsyncCall(Blog.navbar.undockDelegate, 1);
+
+// pause .5 seconds
+animator.pause(.5);
+
+// again, these animations will be run in sequence
+click.hide(true, .7);
+cursor.alignTo('splitter', 'tr', [0, +100], true, 1);
+resize.alignTo('splitter', 'tr', [-12, +100]);
+
+// start sync block: these animations will run at the same time
+animator.beginSync();
+cursor.hide();
+resize.show();
+animator.endSync();
+
+// play the captured animation sequences, call myCallback when done
+animator.play(myCallback);
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Animator(String/HTMLElement el, [YAHOO.ext.Animator animator], [Boolean selfCapture])Animator
 addActor(YAHOO.ext.Actor actor) : voidAnimator
Add an actor. The actor is also set to capturing = true.
 addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) : voidAnimator
Add an async function call to the playlist.
 addCall(Function fcn, [Array args], [Object scope]) : voidAnimator
Add a function call to the playlist.
 beginSync() : voidAnimator
Start a multi-actor sync block. By default all animations are run in sequence. While in the sync block +each actor's o...
 clear() : voidAnimator
Clear the playlist
 endSync() : voidAnimator
End the multi-actor sync block
 isCapturing(YAHOO.ext.Actor actor) : voidAnimator
Checks whether this animator is listening to a specific actor.
 isPlaying() : voidAnimator
Check if this animator is currently playing
 pause(Number seconds) : voidAnimator
Add a pause to the playlist (in seconds)
 play([Function oncomplete]) : voidAnimator
Starts playback of the playlist, also stops any capturing. To start capturing again call startCapture.
 select<static>(String/Array selector) : voidAnimator
<static> Static function to build a AnimatorComposite from a css selector (requires YAHOO.ext.Element.selectorF...
 startCapture([Boolean clearPlaylist]) : voidAnimator
Start capturing actions on the added actors.
 stop() : voidAnimator
Stop at the next available stopping point
 stopCapture() : voidAnimator
Stop capturing on all added actors.
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

Animator

+ public function Animator(String/HTMLElement el, [YAHOO.ext.Animator animator], [Boolean selfCapture]) +
+
+ Parameters: +
  • el : String/HTMLElement
    The dom element or element id
  • animator : YAHOO.ext.Animator
    (optional) The Animator that will capture this Actor's actions
  • selfCapture : Boolean
    (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false)
+
+
+
+
+ +

Method Details

+
+ +
+

addActor

+ public function addActor(YAHOO.ext.Actor actor) +
+ Add an actor. The actor is also set to capturing = true. +
+ Parameters: +
  • actor : YAHOO.ext.Actor
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

addAsyncCall

+ public function addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) +
+ Add an async function call to the playlist. +
+ Parameters: +
  • fcn : Function
    The function to call
  • callbackIndex : Number
    The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED.
  • args : Array
    The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

addCall

+ public function addCall(Function fcn, [Array args], [Object scope]) +
+ Add a function call to the playlist. +
+ Parameters: +
  • fcn : Function
    The function to call
  • args : Array
    The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

beginSync

+ public function beginSync() +
+ Start a multi-actor sync block. By default all animations are run in sequence. While in the sync block +each actor's own animations will still be sequenced, but all actors will animate at the same time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

clear

+ public function clear() +
+ Clear the playlist +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

endSync

+ public function endSync() +
+ End the multi-actor sync block +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

isCapturing

+ public function isCapturing(YAHOO.ext.Actor actor) +
+ Checks whether this animator is listening to a specific actor. +
+ Parameters: +
  • actor : YAHOO.ext.Actor
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

isPlaying

+ public function isPlaying() +
+ Check if this animator is currently playing +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

pause

+ public function pause(Number seconds) +
+ Add a pause to the playlist (in seconds) +
+ Parameters: +
  • seconds : Number
    The number of seconds to pause.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

play

+ public function play([Function oncomplete]) +
+ Starts playback of the playlist, also stops any capturing. To start capturing again call startCapture. +
+ Parameters: +
  • oncomplete : Function
    (optional) Callback to execute when playback has completed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

select<static>

+ public function select<static>(String/Array selector) +
+ <static> Static function to build a AnimatorComposite from a css selector (requires YAHOO.ext.Element.selectorFunction be defined) +
+ Parameters: +
  • selector : String/Array
    The css selector or an array of nodes to animate
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

startCapture

+ public function startCapture([Boolean clearPlaylist]) +
+ Start capturing actions on the added actors. +
+ Parameters: +
  • clearPlaylist : Boolean
    Whether to also create a new playlist
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

stop

+ public function stop() +
+ Stop at the next available stopping point +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+ +
+

stopCapture

+ public function stopCapture() +
+ Stop capturing on all added actors. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Animator.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.AnimatorComposite.html b/www/extras/yui-ext/docs/output/YAHOO.ext.AnimatorComposite.html new file mode 100644 index 000000000..5f433d4a1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.AnimatorComposite.html @@ -0,0 +1,296 @@ + + + + YAHOO.ext.AnimatorComposite + + + + + +
+ +

Class YAHOO.ext.AnimatorComposite

+ + + + + +
Package:YAHOO.ext
Class:AnimatorComposite
Extends:Object
Defined In:Animator.js
+
+ Composite class with synchronized animations. This is the class returned by getActors(selector) or YAHOO.ext.Animator.select().
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) : AnimatorCompositeAnimatorComposite
Add an async function call to the playlist.
 addCall(Function fcn, [Array args], [Object scope]) : AnimatorCompositeAnimatorComposite
Add a function call to the playlist.
 addElements(Array els) : AnimatorCompositeAnimatorComposite
Adds elements to this composite.
 each(Function fn, [Object scope]) : AnimatorCompositeAnimatorComposite
Calls the passed function passing (el, this, index) for each element in this composite.
 getAnimator() : YAHOO.ext.AnimatorAnimatorComposite
Get the YAHOO.ext.Animator that controls the animations for this composite.
 pause(Number seconds) : AnimatorCompositeAnimatorComposite
Add a pause
 play([Function callback]) : AnimatorCompositeAnimatorComposite
Play the actions queued in this composite.
 reset([Function callback]) : AnimatorCompositeAnimatorComposite
Clear all actions in the queue.
 sequence() : AnimatorCompositeAnimatorComposite
Operations called after sequence() will be performed one by one on each element in this composite.
 sync() : AnimatorCompositeAnimatorComposite
Operations called after sync() will be performed at the same time on each element in this composite.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

addAsyncCall

+ public function addAsyncCall(Function fcn, Number callbackIndex, [Array args], [Object scope]) +
+ Add an async function call to the playlist. +
+ Parameters: +
  • fcn : Function
    The function to call
  • callbackIndex : Number
    The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED.
  • args : Array
    (optional) The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

addCall

+ public function addCall(Function fcn, [Array args], [Object scope]) +
+ Add a function call to the playlist. +
+ Parameters: +
  • fcn : Function
    The function to call
  • args : Array
    (optional) The arguments to call the function with
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

addElements

+ public function addElements(Array els) +
+ Adds elements to this composite. +
+ Parameters: +
  • els : Array
    An array of elements to add
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls the passed function passing (el, this, index) for each element in this composite. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The this object (defaults to the element)
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

getAnimator

+ public function getAnimator() +
+ Get the YAHOO.ext.Animator that controls the animations for this composite. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Animator
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

pause

+ public function pause(Number seconds) +
+ Add a pause +
+ Parameters: +
  • seconds : Number
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

play

+ public function play([Function callback]) +
+ Play the actions queued in this composite. +
+ Parameters: +
  • callback : Function
    (optional) callback is called when all animations have compelted
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

reset

+ public function reset([Function callback]) +
+ Clear all actions in the queue. +
+ Parameters: +
  • callback : Function
    (optional) callback is called when all animations have compelted
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

sequence

+ public function sequence() +
+ Operations called after sequence() will be performed one by one on each element in this composite. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+ +
+

sync

+ public function sync() +
+ Operations called after sync() will be performed at the same time on each element in this composite. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • AnimatorComposite
    this
  • +
+
+
+
This method is defined by AnimatorComposite.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.Button.html b/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.Button.html new file mode 100644 index 000000000..63851f48a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.Button.html @@ -0,0 +1,271 @@ + + + + YAHOO.ext.BasicDialog.Button + + + + + +
+ +

Class YAHOO.ext.BasicDialog.Button

+ + + + + +
Package:YAHOO.ext
Class:BasicDialog.Button
Extends:Object
Defined In:BasicDialog.js
+
+ Button class returned by BasicDialog.addButton()
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 disable() : voidBasicDialog.Button
Disable this button
 enable() : voidBasicDialog.Button
Enable this button
 focus() : voidBasicDialog.Button
Focus the button
 getEl() : YAHOO.ext.ElementBasicDialog.Button
Returns the buttons element
 hide() : voidBasicDialog.Button
Hide this button
 setHandler(Function handler, [Object scope]) : voidBasicDialog.Button
Sets this buttons click handler
 setText(String text) : voidBasicDialog.Button
Set this buttons text
 setVisible(Boolean visible) : voidBasicDialog.Button
Convenience function for boolean show/hide
 show() : voidBasicDialog.Button
Show this button
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

disable

+ public function disable() +
+ Disable this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

enable

+ public function enable() +
+ Enable this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

focus

+ public function focus() +
+ Focus the button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the buttons element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

hide

+ public function hide() +
+ Hide this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

setHandler

+ public function setHandler(Function handler, [Object scope]) +
+ Sets this buttons click handler +
+ Parameters: +
  • handler : Function
    The function to call when the button is clicked
  • scope : Object
    (optional) Scope for the function passed above
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

setText

+ public function setText(String text) +
+ Set this buttons text +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible) +
+ Convenience function for boolean show/hide +
+ Parameters: +
  • visible : Boolean
    true to show/false to hide
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+ +
+

show

+ public function show() +
+ Show this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.Button.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.html b/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.html new file mode 100644 index 000000000..bc705b108 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.BasicDialog.html @@ -0,0 +1,899 @@ + + + + YAHOO.ext.BasicDialog + + + + + +
+ +

Class YAHOO.ext.BasicDialog

+ + + + + + +
Package:YAHOO.ext
Class:BasicDialog
Extends:Observable
Subclasses:LayoutDialog
Defined In:BasicDialog.js
+
+ Lightweight Dialog Class. +The code below lists all configuration options along with the default value. +If the default value is what you want you can leave it out: +

+  var dlg = new YAHOO.ext.BasicDialog('element-id', {
+       width: auto,
+       height: auto,
+       x: 200, //(defaults to center screen if blank)
+       y: 500, //(defaults to center screen if blank)
+       animateTarget: null,// (no animation) This is the id or element to animate from
+       resizable: true,
+       minHeight: 80,
+       minWidth: 200,
+       modal: false,
+       autoScroll: true,
+       closable: true,
+       constraintoviewport: true,
+       draggable: true,
+       autoTabs: false, (if true searches child nodes for elements with class ydlg-tab and converts them to tabs)
+       proxyDrag: false, (drag a proxy element rather than the dialog itself)
+       fixedcenter: false,
+       shadow: false,
+       minButtonWidth: 75,
+       shim: false // true to create an iframe shim to 
+                   // keep selects from showing through
+  });
+  
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 body : YAHOO.ext.ElementBasicDialog
The body element
 footer : YAHOO.ext.ElementBasicDialog
The footer element
 header : YAHOO.ext.ElementBasicDialog
The header element
 zseed : NumberBasicDialog
The starting z-index for BasicDialogs - defaults to 10000
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 BasicDialog(String/HTMLElement/YAHOO.ext.Element el, Object config)BasicDialog
Create a new BasicDialog.
 addButton(String/Object config, Function handler, [Object scope]) : YAHOO.ext.BasicDialog.ButtonBasicDialog
Adds a button.
 addKeyListener(Number/Array/Object key, Function fn, [Object scope]) : YAHOO.ext.BasicDialogBasicDialog
Adds a key listener for when this dialog is displayed
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 bringToFront(String/Object dlg) : YAHOO.ext.BasicDialogBasicDialog
Brings the specified dialog to the front
 center() : YAHOO.ext.BasicDialogBasicDialog
Centers this dialog
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy([Boolean removeEl]) : voidBasicDialog
Destroys this dialog
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 get(String/Object id) : YAHOO.ext.BasicDialogBasicDialog
Gets a registered dialog by id
 getEl() : YAHOO.ext.ElementBasicDialog
Returns the element for this dialog
 getTabs() : YAHOO.ext.TabPanelBasicDialog
Returns the TabPanel component (if autoTabs)
 hide([Function callback]) : YAHOO.ext.BasicDialogBasicDialog
Hides the dialog.
 isVisible() : BooleanBasicDialog
Returns true if the dialog is visible
 moveTo(Number x, Number y) : YAHOO.ext.BasicDialogBasicDialog
Moves the dialog to the specified point
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number width, Number height) : YAHOO.ext.BasicDialogBasicDialog
Resizes the dialog.
 restoreState() : YAHOO.ext.BasicDialogBasicDialog
Restores the previous state of the dialog if YAHOO.ext.state is configured
 sendToBack(String/Object dlg) : YAHOO.ext.BasicDialogBasicDialog
Sends the specified dialog to the back
 setDefaultButton(YAHOO.ext.BasicDialog.Button btn) : YAHOO.ext.BasicDialogBasicDialog
Sets the default button to be focused when the dialog is displayed
 show([String/HTMLElement/YAHOO.ext.Element animateTarget]) : YAHOO.ext.BasicDialogBasicDialog
Shows the dialog.
 toBack() : YAHOO.ext.BasicDialogBasicDialog
Sends this dialog to the back (under) of any other visible dialogs
 toFront() : YAHOO.ext.BasicDialogBasicDialog
Brings this dialog to the front of any other visible dialogs
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforehide : (YAHOO.ext.BasicDialog this)BasicDialog
Fires before this dialog is hidden.
 beforeshow : (YAHOO.ext.BasicDialog this)BasicDialog
Fires before this dialog is shown.
 hide : (YAHOO.ext.BasicDialog this)BasicDialog
Fires when this dialog is hidden.
 keydown : (YAHOO.ext.BasicDialog this, YAHOO.ext.EventObject e)BasicDialog
Fires when a key is pressed
 move : (YAHOO.ext.BasicDialog this, Number x, Number y)BasicDialog
Fires when this dialog is moved by the user.
 resize : (YAHOO.ext.BasicDialog this, Number width, Number height)BasicDialog
Fires when this dialog is resized by the user.
 show : (YAHOO.ext.BasicDialog this)BasicDialog
Fires when this dialog is shown.
+ +

Property Details

+
+ +
+

body

+ public YAHOO.ext.Element body +
+ The body element
+
This property is defined by BasicDialog.
+
+ +
+

footer

+ public YAHOO.ext.Element footer +
+ The footer element
+
This property is defined by BasicDialog.
+
+ +
+

header

+ public YAHOO.ext.Element header +
+ The header element
+
This property is defined by BasicDialog.
+
+ +
+

zseed

+ public Number zseed +
+ The starting z-index for BasicDialogs - defaults to 10000
+
This property is defined by BasicDialog.
+
+
+ + +

Constructor Details

+
+
+

BasicDialog

+ public function BasicDialog(String/HTMLElement/YAHOO.ext.Element el, Object config) +
+ Create a new BasicDialog.
+ Parameters: +
  • el : String/HTMLElement/YAHOO.ext.Element
    The id of or container element
  • config : Object
    configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addButton

+ public function addButton(String/Object config, Function handler, [Object scope]) +
+ Adds a button. +
+ Parameters: +
  • config : String/Object
    A string becomes the button text, an object is expected to be a valid YAHOO.ext.DomHelper element config
  • handler : Function
    The function called when the button is clicked
  • scope : Object
    (optional) The scope of the handler function
+ Returns: +
    +
  • YAHOO.ext.BasicDialog.Button
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object key, Function fn, [Object scope]) +
+ Adds a key listener for when this dialog is displayed +
+ Parameters: +
  • key : Number/Array/Object
    Either the numeric key code, array of key codes or an object with the following options: {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

bringToFront

+ public function bringToFront(String/Object dlg) +
+ Brings the specified dialog to the front +
+ Parameters: +
  • dlg : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

center

+ public function center() +
+ Centers this dialog +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy([Boolean removeEl]) +
+ Destroys this dialog +
+ Parameters: +
  • removeEl : Boolean
    (optional) true to remove the element from the DOM
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

get

+ public function get(String/Object id) +
+ Gets a registered dialog by id +
+ Parameters: +
  • id : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element for this dialog +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getTabs

+ public function getTabs() +
+ Returns the TabPanel component (if autoTabs) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.TabPanel
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

hide

+ public function hide([Function callback]) +
+ Hides the dialog. +
+ Parameters: +
  • callback : Function
    (optional) Function to call when the dialog is hidden
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if the dialog is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

moveTo

+ public function moveTo(Number x, Number y) +
+ Moves the dialog to the specified point +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

resizeTo

+ public function resizeTo(Number width, Number height) +
+ Resizes the dialog. +
+ Parameters: +
  • width : Number
  • height : Number
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

restoreState

+ public function restoreState() +
+ Restores the previous state of the dialog if YAHOO.ext.state is configured +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

sendToBack

+ public function sendToBack(String/Object dlg) +
+ Sends the specified dialog to the back +
+ Parameters: +
  • dlg : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

setDefaultButton

+ public function setDefaultButton(YAHOO.ext.BasicDialog.Button btn) +
+ Sets the default button to be focused when the dialog is displayed +
+ Parameters: +
  • btn : YAHOO.ext.BasicDialog.Button
    The button object returned by addButton
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

show

+ public function show([String/HTMLElement/YAHOO.ext.Element animateTarget]) +
+ Shows the dialog. +
+ Parameters: +
  • animateTarget : String/HTMLElement/YAHOO.ext.Element
    (optional) Reset the animation target
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

toBack

+ public function toBack() +
+ Sends this dialog to the back (under) of any other visible dialogs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

toFront

+ public function toFront() +
+ Brings this dialog to the front of any other visible dialogs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+
+ +

Event Details

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before this dialog is shown. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

hide

+ public event hide +
+ Fires when this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

keydown

+ public event keydown +
+ Fires when a key is pressed +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by BasicDialog.
+
+ +
+

move

+ public event move +
+ Fires when this dialog is moved by the user. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • x : Number
    The new page X
  • y : Number
    The new page Y
+
+
+
This event is defined by BasicDialog.
+
+ +
+

resize

+ public event resize +
+ Fires when this dialog is resized by the user. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • width : Number
    The new width
  • height : Number
    The new height
+
+
+
This event is defined by BasicDialog.
+
+ +
+

show

+ public event show +
+ Fires when this dialog is shown. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.BorderLayout.html b/www/extras/yui-ext/docs/output/YAHOO.ext.BorderLayout.html new file mode 100644 index 000000000..331ab83ac --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.BorderLayout.html @@ -0,0 +1,714 @@ + + + + YAHOO.ext.BorderLayout + + + + + +
+ +

Class YAHOO.ext.BorderLayout

+ + + + + +
Package:YAHOO.ext
Class:BorderLayout
Extends:LayoutManager
Defined In:BorderLayout.js
+
+ This class represents a common layout manager used in desktop applications. For screenshots and more details, +please see:

+Cross Browser Layouts - Part 1
+Cross Browser Layouts - Part 2

+Example: +

+ var layout = new YAHOO.ext.BorderLayout(document.body, {
+    north: {
+        initialSize: 25,
+        titlebar: false
+    },
+    west: {
+        split:true,
+        initialSize: 200,
+        minSize: 175,
+        maxSize: 400,
+        titlebar: true,
+        collapsible: true
+    },
+    east: {
+        split:true,
+        initialSize: 202,
+        minSize: 175,
+        maxSize: 400,
+        titlebar: true,
+        collapsible: true
+    },
+    south: {
+        split:true,
+        initialSize: 100,
+        minSize: 100,
+        maxSize: 200,
+        titlebar: true,
+        collapsible: true
+    },
+    center: {
+        titlebar: true,
+        autoScroll:true,
+        resizeTabs: true,
+        minTabWidth: 50,
+        preferredTabWidth: 150
+    }
+});
+
+// shorthand
+var CP = YAHOO.ext.ContentPanel;
+
+layout.beginUpdate();
+layout.add('north', new CP('north', 'North'));
+layout.add('south', new CP('south', {title: 'South', closable: true}));
+layout.add('west', new CP('west', {title: 'West'}));
+layout.add('east', new CP('autoTabs', {title: 'Auto Tabs', closable: true}));
+layout.add('center', new CP('center1', {title: 'Close Me', closable: true}));
+layout.add('center', new CP('center2', {title: 'Center Panel', closable: false}));
+layout.getRegion('center').showPanel('center1');
+layout.endUpdate();
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 hideOnLayout : BooleanBorderLayout
True to hide the center panel while performing layouts. This helps when the center region contains +heavy components ...
 monitorWindowResize : BooleanLayoutManager
false to disable window resize monitoring
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 BorderLayout(String/HTMLElement/Element container, Object config)BorderLayout
Create a new BorderLayout
 add(String target, YAHOO.ext.ContentPanel panel) : YAHOO.ext.ContentPanelBorderLayout
Adds a ContentPanel (or subclass) to this layout.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addRegion(String target, Object config) : BorderLayoutRegionBorderLayout
Creates and adds a new region if it doesn't already exist.
 beginUpdate() : voidLayoutManager
Suspend the LayoutManager from doing auto-layouts while +making multiple add or remove calls
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 endUpdate(Boolean noLayout) : voidLayoutManager
Restore auto-layouts and optionally disable the manager from performing a layout
 findPanel(String panelId) : YAHOO.ext.ContentPanelBorderLayout
Searches all regions for a panel with the specified id
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementLayoutManager
Returns the element this layout is bound to.
 getRegion(String target) : YAHOO.ext.LayoutRegionLayoutManager
Returns the specified region.
 getViewSize() : ObjectLayoutManager
Returns the size of the current view, This method normalizes document.body and element embedded layouts and +performs ...
 isUpdating() : BooleanLayoutManager
Returns true if this layout is currently being updated
 layout() : voidBorderLayout
Performs a layout update.
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(String target, Number/String/YAHOO.ext.ContentPanel panel) : YAHOO.ext.ContentPanelBorderLayout
Adds a ContentPanel (or subclass) to this layout.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 restoreState([YAHOO.ext.state.Provider provider]) : voidBorderLayout
Restores this layouts state using YAHOO.ext.state.Manager or the state provided by the passed provider.
 showPanel(String/ContentPanel panelId) : YAHOO.ext.ContentPanelBorderLayout
Searches all regions for a panel with the specified id and activates (shows) it.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 layout : (YAHOO.ext.LayoutManager this)LayoutManager
Fires when a layout is performed.
 regioncollapsed : (YAHOO.ext.LayoutRegion region)LayoutManager
Fires when a region is collapsed.
 regionexpanded : (YAHOO.ext.LayoutRegion region)LayoutManager
Fires when a region is expanded.
 regionresized : (YAHOO.ext.LayoutRegion region, Number newSize)LayoutManager
Fires when the user resizes a region.
+ +

Property Details

+
+ +
+

hideOnLayout

+ public Boolean hideOnLayout +
+ True to hide the center panel while performing layouts. This helps when the center region contains +heavy components such as a yui-ext grid.
+
This property is defined by BorderLayout.
+
+ +
+

monitorWindowResize

+ public Boolean monitorWindowResize +
+ false to disable window resize monitoring
+
This property is defined by LayoutManager.
+
+
+ + +

Constructor Details

+
+
+

BorderLayout

+ public function BorderLayout(String/HTMLElement/Element container, Object config) +
+ Create a new BorderLayout
+ Parameters: +
  • container : String/HTMLElement/Element
    The container this layout is bound to
  • config : Object
    Configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(String target, YAHOO.ext.ContentPanel panel) +
+ Adds a ContentPanel (or subclass) to this layout. +
+ Parameters: +
  • target : String
    The target region key (north, south, east, west or center).
  • panel : YAHOO.ext.ContentPanel
    The panel to add
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The added panel
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addRegion

+ public function addRegion(String target, Object config) +
+ Creates and adds a new region if it doesn't already exist. +
+ Parameters: +
  • target : String
    The target region key (north, south, east, west or center).
  • config : Object
    The regions config object
+ Returns: +
    +
  • BorderLayoutRegion
    The new region
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

beginUpdate

+ public function beginUpdate() +
+ Suspend the LayoutManager from doing auto-layouts while +making multiple add or remove calls +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

endUpdate

+ public function endUpdate(Boolean noLayout) +
+ Restore auto-layouts and optionally disable the manager from performing a layout +
+ Parameters: +
  • noLayout : Boolean
    true to disable a layout update
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

findPanel

+ public function findPanel(String panelId) +
+ Searches all regions for a panel with the specified id +
+ Parameters: +
  • panelId : String
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The panel or null if it wasn't found
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this layout is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

getRegion

+ public function getRegion(String target) +
+ Returns the specified region. +
+ Parameters: +
  • target : String
    The region key
+ Returns: +
    +
  • YAHOO.ext.LayoutRegion
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

getViewSize

+ public function getViewSize() +
+ Returns the size of the current view, This method normalizes document.body and element embedded layouts and +performs box-model adjustments. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    The size as an object {width: (the width), height: (the height)}
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

isUpdating

+ public function isUpdating() +
+ Returns true if this layout is currently being updated +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

layout

+ public function layout() +
+ Performs a layout update. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

remove

+ public function remove(String target, Number/String/YAHOO.ext.ContentPanel panel) +
+ Adds a ContentPanel (or subclass) to this layout. +
+ Parameters: +
  • target : String
    The target region key (north, south, east, west or center).
  • panel : Number/String/YAHOO.ext.ContentPanel
    The index, id or panel to remove
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The removed panel
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

restoreState

+ public function restoreState([YAHOO.ext.state.Provider provider]) +
+ Restores this layouts state using YAHOO.ext.state.Manager or the state provided by the passed provider. +
+ Parameters: +
  • provider : YAHOO.ext.state.Provider
    (optional) An alternate state provider
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BorderLayout.
+
+ +
+

showPanel

+ public function showPanel(String/ContentPanel panelId) +
+ Searches all regions for a panel with the specified id and activates (shows) it. +
+ Parameters: +
  • panelId : String/ContentPanel
    The panels id or the panel itself
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by BorderLayout.
+
+
+ +

Event Details

+
+ +
+

layout

+ public event layout +
+ Fires when a layout is performed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutManager
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regioncollapsed

+ public event regioncollapsed +
+ Fires when a region is collapsed. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regionexpanded

+ public event regionexpanded +
+ Fires when a region is expanded. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regionresized

+ public event regionresized +
+ Fires when the user resizes a region. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutManager.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElement.html b/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElement.html new file mode 100644 index 000000000..a4d80987c --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElement.html @@ -0,0 +1,111 @@ + + + + YAHOO.ext.CompositeElement + + + + + +
+ +

Class YAHOO.ext.CompositeElement

+ + + + + + +
Package:YAHOO.ext
Class:CompositeElement
Extends:Object
Subclasses:CompositeElementLite
Defined In:CompositeElement.js
+
+ Standard composite class. Creates a YAHOO.ext.Element for every element in the collection. +

+NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element +actions will be performed on all the elements in this collection. +

+All methods return this and can be chained. +

+ var els = getEls('#some-el div.some-class');
+ // or
+ var els = YAHOO.ext.Element.select('#some-el div.some-class');
+ els.setWidth(100); // all elements become 100 width
+ els.hide(true); // all elements fade out and hide
+ // or
+ els.setWidth(100).hide(true);
+ 
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(String/Array els) : CompositeElementCompositeElement
Adds elements to this composite.
 each(Function fn, [Object scope]) : CompositeElementCompositeElement
Calls the passed function passing (el, this, index) for each element in this composite.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

add

+ public function add(String/Array els) +
+ Adds elements to this composite. +
+ Parameters: +
  • els : String/Array
    A string CSS selector, an array of elements or an element
+ Returns: +
    +
  • CompositeElement
    this
  • +
+
+
+
This method is defined by CompositeElement.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls the passed function passing (el, this, index) for each element in this composite. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The this object (defaults to the element)
+ Returns: +
    +
  • CompositeElement
    this
  • +
+
+
+
This method is defined by CompositeElement.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElementLite.html b/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElementLite.html new file mode 100644 index 000000000..31e45a609 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.CompositeElementLite.html @@ -0,0 +1,99 @@ + + + + YAHOO.ext.CompositeElementLite + + + + + +
+ +

Class YAHOO.ext.CompositeElementLite

+ + + + + +
Package:YAHOO.ext
Class:CompositeElementLite
Extends:CompositeElement
Defined In:CompositeElement.js
+
+ Flyweight composite class. Reuses the same YAHOO.ext.Element for element operations. +

+NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element +actions will be performed on all the elements in this collection.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(String/Array els) : CompositeElementCompositeElement
Adds elements to this composite.
 each(Function fn, [Object scope]) : CompositeElementCompositeElement
Calls the passed function passing (el, this, index) for each element in this composite.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

add

+ public function add(String/Array els) +
+ Adds elements to this composite. +
+ Parameters: +
  • els : String/Array
    A string CSS selector, an array of elements or an element
+ Returns: +
    +
  • CompositeElement
    this
  • +
+
+
+
This method is defined by CompositeElement.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls the passed function passing (el, this, index) for each element in this composite. +
+ Parameters: +
  • fn : Function
    The function to call
  • scope : Object
    (optional) The this object (defaults to the element)
+ Returns: +
    +
  • CompositeElement
    this
  • +
+
+
+
This method is defined by CompositeElement.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.ContentPanel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.ContentPanel.html new file mode 100644 index 000000000..65ec29d97 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.ContentPanel.html @@ -0,0 +1,495 @@ + + + + YAHOO.ext.ContentPanel + + + + + +
+ +

Class YAHOO.ext.ContentPanel

+ + + + + + +
Package:YAHOO.ext
Class:ContentPanel
Extends:Observable
Subclasses:GridPanel, NestedLayoutPanel
Defined In:ContentPanels.js
+
+ A basic ContentPanel element.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ContentPanel(String/HTMLElement/Element el, String/Object config, [String content])ContentPanel
Create a new ContentPanel.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementContentPanel
Returns this panel's element
 getId() : StringContentPanel
Returns this panel's id
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : YAHOO.ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured
 getUpdateManager() : YAHOO.ext.UpdateManagerContentPanel
Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setContent(String content, [Boolean loadScripts]) : voidContentPanel
Updates this panel's element
 setTitle(String title) : voidContentPanel
Set this panel's title
 setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) : YAHOO.ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
+ + + +

Constructor Details

+
+
+

ContentPanel

+ public function ContentPanel(String/HTMLElement/Element el, String/Object config, [String content]) +
+ Create a new ContentPanel.
+ Parameters: +
  • el : String/HTMLElement/Element
    The container element for this panel
  • config : String/Object
    A string to set only the title or a config object
  • content : String
    (optional) Set the HTML content for this panel
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Destroys this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns this panel's element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getId

+ public function getId() +
+ Returns this panel's id +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getTitle

+ public function getTitle() +
+ Returns this panel's title +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getToolbar

+ public function getToolbar() +
+ Returns the toolbar for this Panel if one was configured +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

isClosable

+ public function isClosable() +
+ Returns true is this panel was configured to be closable +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setContent

+ public function setContent(String content, [Boolean loadScripts]) +
+ Updates this panel's element +
+ Parameters: +
  • content : String
    The new content
  • loadScripts : Boolean
    (optional) true to look for and process scripts
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setTitle

+ public function setTitle(String title) +
+ Set this panel's title +
+ Parameters: +
  • title : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setUrl

+ public function setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) +
+ Set a URL to be used to load the content for this panel. +
+ Parameters: +
  • url : String/Function
    The url to load the content from or a function to call to get the url
  • params : String/Object
    (optional) The string params for the update call or an object of the params. See YAHOO.ext.UpdateManager.update for more details. (Defaults to null)
  • loadOnce : Boolean
    (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this panel is activated. (Defaults to false)
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+
+ +

Event Details

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.Template.html b/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.Template.html new file mode 100644 index 000000000..c5c7cad16 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.Template.html @@ -0,0 +1,221 @@ + + + + YAHOO.ext.DomHelper.Template + + + + + +
+ +

Class YAHOO.ext.DomHelper.Template

+ + + + + +
Package:YAHOO.ext
Class:DomHelper.Template
Extends:Object
Defined In:DomHelper.js
+
+ Represents an HTML fragment template. +For more information see this blog post with examples. +
+This class is also available as YAHOO.ext.Template.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DomHelper.Template(String html)DomHelper.Template
 append(HTMLElement el, Object values, [Boolean returnElement]) : HTMLElementDomHelper.Template
Applies the supplied values to the template and append the new node(s) to el
 applyTemplate(Object values) : StringDomHelper.Template
Returns an HTML fragment of this template with the specified values applied
 compile() : voidDomHelper.Template
Compiles the template into an internal function, eliminating the RegEx overhead
 insertAfter(HTMLElement el, Object values, [Boolean returnElement]) : HTMLElementDomHelper.Template
Applies the supplied values to the template and inserts the new node(s) after el
 insertBefore(HTMLElement el, Object values, [Boolean returnElement]) : HTMLElementDomHelper.Template
Applies the supplied values to the template and inserts the new node(s) before el
 overwrite(HTMLElement el, Object values, [Boolean returnElement]) : HTMLElementDomHelper.Template
Applies the supplied values to the template and overwrites the content of el with the new node(s)
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

DomHelper.Template

+ public function DomHelper.Template(String html) +
+
+ Parameters: +
  • html : String
    The HTML fragment
+
+
+
+
+ +

Method Details

+
+ +
+

append

+ public function append(HTMLElement el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and append the new node(s) to el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • values : Object
    The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+ +
+

applyTemplate

+ public function applyTemplate(Object values) +
+ Returns an HTML fragment of this template with the specified values applied +
+ Parameters: +
  • values : Object
    The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+ +
+

compile

+ public function compile() +
+ Compiles the template into an internal function, eliminating the RegEx overhead +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+ +
+

insertAfter

+ public function insertAfter(HTMLElement el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) after el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • values : Object
    The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+ +
+

insertBefore

+ public function insertBefore(HTMLElement el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and inserts the new node(s) before el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • values : Object
    The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+ +
+

overwrite

+ public function overwrite(HTMLElement el, Object values, [Boolean returnElement]) +
+ Applies the supplied values to the template and overwrites the content of el with the new node(s) +
+ Parameters: +
  • el : HTMLElement
    The context element
  • values : Object
    The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'})
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.Template.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.html b/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.html new file mode 100644 index 000000000..8b38df1f4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.DomHelper.html @@ -0,0 +1,247 @@ + + + + YAHOO.ext.DomHelper + + + + + +
+ +

Class YAHOO.ext.DomHelper

+ + + + + +
Package:YAHOO.ext
Class:DomHelper
Extends:Object
Defined In:DomHelper.js
+
+ Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM. +For more information see this blog post with examples.

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 useDom : BooleanDomHelper
True to force the use of DOM instead of html fragments
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 append(HTMLElement el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and appends them to el
 applyStyles(String/HTMLElement el, String/Object/Function styles) : voidDomHelper
Applies a style specification to an element
 createTemplate(Object o) : YAHOO.ext.DomHelper.TemplateDomHelper
Creates a new YAHOO.ext.DomHelper.Template from the Dom object spec
 insertAfter(HTMLElement el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and inserts them after el
 insertBefore(HTMLElement el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and inserts them before el
 insertHtml(String where, HTMLElement el, String html) : HTMLElementDomHelper
Inserts an HTML fragment into the Dom
 overwrite(HTMLElement el, Object o, [Boolean returnElement]) : HTMLElementDomHelper
Creates new Dom element(s) and overwrites the contents of el with them
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

useDom

+ public Boolean useDom +
+ True to force the use of DOM instead of html fragments
+
This property is defined by DomHelper.
+
+
+ + +

Method Details

+
+ +
+

append

+ public function append(HTMLElement el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and appends them to el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

applyStyles

+ public function applyStyles(String/HTMLElement el, String/Object/Function styles) +
+ Applies a style specification to an element +
+ Parameters: +
  • el : String/HTMLElement
    The element to apply styles to
  • styles : String/Object/Function
    A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns such a specification.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

createTemplate

+ public function createTemplate(Object o) +
+ Creates a new YAHOO.ext.DomHelper.Template from the Dom object spec +
+ Parameters: +
  • o : Object
    The Dom object spec (and children)
+ Returns: +
    +
  • YAHOO.ext.DomHelper.Template
    The new template
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

insertAfter

+ public function insertAfter(HTMLElement el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and inserts them after el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

insertBefore

+ public function insertBefore(HTMLElement el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and inserts them before el +
+ Parameters: +
  • el : HTMLElement
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

insertHtml

+ public function insertHtml(String where, HTMLElement el, String html) +
+ Inserts an HTML fragment into the Dom +
+ Parameters: +
  • where : String
    Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd.
  • el : HTMLElement
    The context element
  • html : String
    The HTML fragmenet
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.
+
+ +
+

overwrite

+ public function overwrite(HTMLElement el, Object o, [Boolean returnElement]) +
+ Creates new Dom element(s) and overwrites the contents of el with them +
+ Parameters: +
  • el : HTMLElement
    The context element
  • o : Object
    The Dom object spec (and children)
  • returnElement : Boolean
    (optional) true to return a YAHOO.ext.Element
+ Returns: +
    +
  • HTMLElement
    The new node
  • +
+
+
+
This method is defined by DomHelper.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.Element.html b/www/extras/yui-ext/docs/output/YAHOO.ext.Element.html new file mode 100644 index 000000000..d315f40ee --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.Element.html @@ -0,0 +1,2896 @@ + + + + YAHOO.ext.Element + + + + + +
+ +

Class YAHOO.ext.Element

+ + + + + + +
Package:YAHOO.ext
Class:Element
Extends:Object
Subclasses:Actor
Defined In:Element.js
+
+ Wraps around a DOM element and provides convenient access to Yahoo +UI library functionality (and more).

+Usage:
+

+var el = YAHOO.ext.Element.get('myElementId');
+// or the shorter
+var el = getEl('myElementId');
+
+Using YAHOO.ext.Element.get() instead of calling the constructor directly ensures you get the same object +each call instead of constructing a new one.

+For working with collections of Elements, see YAHOO.ext.CompositeElement
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 DISPLAY<static> : NumberElement
<static> Visibility mode constant - Use display to hide element
 VISIBILITY<static> : NumberElement
<static> Visibility mode constant - Use visibility to hide element
 autoBoxAdjust : ObjectElement
true to automatically adjust width and height settings for box-model issues (default to true)
 autoDisplayMode : ObjectElement
true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false...
 defaultUnit : StringElement
The default unit to append to CSS values where a unit isn't provided (Defaults to px).
 dom : HTMLElementElement
The DOM element
 id : StringElement
The DOM element ID
 originalDisplay : StringElement
The element's default display mode
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Element(String/HTMLElement element, [Boolean forceNew])Element
Create a new Element directly.
 addClass(String className) : YAHOO.ext.ElementElement
Add a CSS class to the element.
 addClassOnOver(String className) : YAHOO.ext.ElementElement
Sets up event handlers to add and remove a css class when the mouse is over this element
 addHandler(String eventName, Boolean stopPropagation, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element. The difference between this function and addListener is this +function preve...
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element
 addManagedListener(String eventName, Function fn, [Object scope], [boolean override]) : FunctionElement
Append a managed listener - See YAHOO.ext.EventObject for more details. Use mon() for a shorter version.
 alignTo(String/HTMLElement/YAHOO.ext.Element element, String position, [Array offsets], [Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Align this element with another element.
 animate(Object args, [Float duration], [Function onComplete], [Function easing], [Function animType]) : YAHOO.ext.ElementElement
Perform Yahoo UI animation on this element.
 appendChild(String/HTMLElement/Array/Element/CompositeElement el) : YAHOO.ext.ElementElement
Appends the passed element(s) to this element
 appendTo(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Appends this element to the passed element
 applyStyles(String/Object/Function styles) : YAHOO.ext.ElementElement
More flexible version of setStyle for setting style properties.
 autoHeight([Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Measures the elements content height and updates height to match. Note, this function uses setTimeout and +the new he...
 beginMeasure() : YAHOO.ext.ElementElement
Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done.
 center([String/HTMLElement/YAHOO.ext.Element centerIn]) : voidElement
Centers the Element in either the viewport, or another Element.
 clearOpacity() : YAHOO.ext.ElementElement
Clears any opacity settings from this element. Required in some cases for IE.
 clearPositioning() : YAHOO.ext.ElementElement
Clear positioning back to the default when the document was loaded
 clip() : YAHOO.ext.ElementElement
Store the current overflow setting and clip overflow on the element - use unclip to remove
 createChild(Object config, [HTMLElement insertBefore]) : YAHOO.ext.ElementElement
Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child e...
 createProxy(String/Object config, [String/HTMLElement renderTo], [Boolean matchBox]) : YAHOO.ext.ElementElement
Creates a proxy element of this element
 createShim() : YAHOO.ext.ElementElement
Creates an iframe shim for this element to keep selects and other windowed objects from +showing through.
 enableDisplayMode([String display]) : YAHOO.ext.ElementElement
Convenience method for setVisibilityMode(Element.DISPLAY)
 endMeasure() : YAHOO.ext.ElementElement
Restores displays to before beginMeasure was called
 fitToParent([Boolean monitorResize]) : YAHOO.ext.ElementElement
Sizes this element to it's parent element's dimensions performing +neccessary box adjustments.
 focus() : YAHOO.ext.ElementElement
Tries to focus the element. Any exceptions are caught.
 get<static>(String/HTMLElement/Element el, [Boolean autoGenerateId]) : ElementElement
<static> Static method to retreive Element objects. Uses simple caching to consistently return the same object....
 getBorderWidth(String side) : NumberElement
Gets the width of the border(s) for the specified side(s)
 getBottom(Boolean local) : NumberElement
Gets the bottom Y coordinate of the element (element Y position + element height)
 getBox([Boolean contentBox], [Boolean local]) : ObjectElement
Return a box {x, y, width, height} that can be used to set another elements +size/location to match this element.
 getCenterXY(Boolean offsetScroll) : ArrayElement
Calculates the x, y to center this element on the screen
 getChildrenByClassName(String className, [String tagName]) : ArrayElement
Gets an array of child YAHOO.ext.Element objects by class name and optional tagName
 getChildrenByTagName(String tagName) : ArrayElement
Gets an array of child YAHOO.ext.Element objects by tag name
 getHeight([Boolean contentHeight]) : NumberElement
Returns the offset height of the element
 getLeft(Boolean local) : NumberElement
Gets the left X coordinate
 getMargins([String sides]) : Object/NumberElement
Returns an object with properties top, left, right and bottom representing the margins of this element unless sides i...
 getNextSibling() : HTMLElementElement
Gets the next sibling, skipping text nodes
 getPadding(String side) : NumberElement
Gets the width of the padding(s) for the specified side(s)
 getPositioning() : ObjectElement
Gets an object with all CSS positioning properties. Useful along with setPostioning to get +snapshot before performin...
 getPrevSibling() : HTMLElementElement
Gets the previous sibling, skipping text nodes
 getRegion() : RegionElement
Returns the region of the given element. +The element must be part of the DOM tree to have a region (display:none or e...
 getRight(Boolean local) : NumberElement
Gets the right X coordinate of the element (element X position + element width)
 getSize([Boolean contentSize]) : ObjectElement
Returns the size of the element
 getStyle(String property) : StringElement
Normalizes currentStyle and ComputedStyle.
 getTop(Boolean local) : NumberElement
Gets the top Y coordinate
 getUpdateManager() : YAHOO.ext.UpdateManagerElement
Gets this elements UpdateManager
 getWidth([Boolean contentWidth]) : NumberElement
Returns the offset width of the element
 getX() : voidElement
Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 getXY() : voidElement
Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have pag...
 getY() : voidElement
Gets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to have p...
 hasClass(String className) : BooleanElement
Checks if a CSS class is in use by the element.
 hide([Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Hide this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible.
 initDD(String group, Object config, Object overrides) : YAHOO.util.DDElement
Initializes a YAHOO.util.DD object for this element.
 initDDProxy(String group, Object config, Object overrides) : YAHOO.util.DDProxyElement
Initializes a YAHOO.util.DDProxy object for this element.
 initDDTarget(String group, Object config, Object overrides) : YAHOO.util.DDTargetElement
Initializes a YAHOO.util.DDTarget object for this element.
 insertAfter(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Inserts this element after the passed element in the DOM
 insertBefore(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Inserts this element before the passed element in the DOM
 insertHtml(String where, String html) : YAHOO.ext.ElementElement
Inserts an html fragment into this element
 isBorderBox() : BooleanElement
Tests various css rules/browsers to determine if this element uses a border box
 isDisplayed() : BooleanElement
Returns true if display is not "none"
 isVisible([Boolean deep]) : BooleanElement
Checks whether the element is currently visible using both visibility and display properties.
 load(String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : YAHOO.ext.ElementElement
Direct access to the UpdateManager update() method (takes the same parameters).
 mon(String eventName, Function fn, [Object scope], [boolean override]) : FunctionElement
Append a managed listener (shorthanded for addManagedListener)
 move(String direction, Number distance, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Move this element relative to it's current position.
 moveTo(Number x, Number y, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be...
 on(String eventName, Function handler, [Object scope], [boolean override]) : YAHOO.ext.ElementElement
Appends an event handler to this element (Same as addListener)
 radioClass(String className) : YAHOO.ext.ElementElement
Adds the passed className to this element and removes the class from all siblings
 remove() : voidElement
Removes this element from the DOM and deletes it from the cache
 removeAllListeners() : YAHOO.ext.ElementElement
Removes all previous added listeners from this element
 removeClass(String className) : YAHOO.ext.ElementElement
Removes a CSS class from the element.
 removeListener(String sType, Function fn, Object scope) : YAHOO.ext.ElementElement
Removes an event handler from this element
 repaint() : YAHOO.ext.ElementElement
Forces the browser to repaint this element
 replace(String/HTMLElement/Element el) : YAHOO.ext.ElementElement
Replaces the passed element with this element
 replaceClass(String oldClassName, String newClassName) : YAHOO.ext.ElementElement
Replaces a CSS class on the element with another.
 scrollIntoView([String/HTMLElement/Element container]) : YAHOO.ext.ElementElement
Scrolls this element into view within the passed container.
 select(String selector, Boolean unique) : CompositeElement/CompositeElementLiteElement
Selects child nodes based on the passed CSS selector (the selector should not contain an id)
 select<static>(String/Array selector, [Boolean unique]) : CompositeElementLite/CompositeElementElement
<static> Selects elements based on the passed CSS selector to enable working on them as 1.
 set(Object o) : YAHOO.ext.ElementElement
Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function)
 setAbsolutePositioned([Number zIndex]) : YAHOO.ext.ElementElement
Set the element as absolute positioned with the specified z-index
 setBottom(String bottom) : YAHOO.ext.ElementElement
Set the element's css bottom style
 setBounds(Number x, Number y, Number width, Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated c...
 setBox(Object box, [Boolean adjust], [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the element's box. Use getBox() on another element to get a box obj. If animate is true then width, height, x an...
 setDisplayed(Boolean value) : YAHOO.ext.ElementElement
Sets the css display. Uses originalDisplay if value is a boolean true.
 setHeight(Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the height of the element
 setLeft(String left) : YAHOO.ext.ElementElement
Set the element's left position directly using CSS style (instead of setX())
 setLeftTop() : YAHOO.ext.ElementElement
Quick set left and top adding default units
 setLocation(Number x, Number y, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be...
 setOpacity(Float opacity, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the opacity of the element
 setPositioning(Object posCfg) : YAHOO.ext.ElementElement
Set positioning with an object returned by getPositioning().
 setRegion(YAHOO.util.Region region, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the element's position and size the the specified region. If animation is true then width, height, x and y will ...
 setRelativePositioned([Number zIndex]) : YAHOO.ext.ElementElement
Set the element as relative positioned with the specified z-index
 setRight(String right) : YAHOO.ext.ElementElement
Set the element's css right style
 setSize(Number width, Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the size of the element. If animation is true, both width an height will be animated concurrently.
 setStyle(String/Object property, [String val]) : YAHOO.ext.ElementElement
Wrapper for setting style properties, also takes single object parameter of multiple styles
 setTop(String top) : YAHOO.ext.ElementElement
Set the element's top position directly using CSS style (instead of setY())
 setVisibilityMode(visMode Element.VISIBILITY) : YAHOO.ext.ElementElement
Sets the elements visibility mode. When setVisible() is called it +will use this to determine whether to set the visib...
 setVisible(Boolean visible, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the visibility of the element (see details). If the visibilityMode is set to Element.DISPLAY, it will use +the d...
 setWidth(Number width, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the width of the element
 setX(Number The, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the X position of the element based on page coordinates. Element must be part of the DOM tree to have page coor...
 setXY(Array pos, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be...
 setY(Number The, [Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Sets the Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coor...
 show([Boolean animate], [Float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible.
 swallowEvent(String eventName, [Boolean preventDefault]) : YAHOO.ext.ElementElement
Stops the specified event from bubbling and optionally prevent's the default action
 toggle([Boolean animate], [float duration], [Function onComplete], [Function easing]) : YAHOO.ext.ElementElement
Toggles the elements visibility or display, depending on visibility mode.
 toggleClass(String className) : YAHOO.ext.ElementElement
Toggles (adds or removes) the passed class.
 unclip() : YAHOO.ext.ElementElement
Return clipping (overflow) to original clipping before clip() was called
 unselectable() : YAHOO.ext.ElementElement
Disables text selection for this element (normalized across browsers)
 update(String html, [Boolean loadScripts], Function callback) : YAHOO.ext.ElementElement
Update the innerHTML of this element, optionally searching for and processing scripts
 wrap([Object config]) : ElementElement
Creates and wraps this element with another element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

DISPLAY<static>

+ public Number DISPLAY<static> +
+ <static> Visibility mode constant - Use display to hide element
+
This property is defined by Element.
+
+ +
+

VISIBILITY<static>

+ public Number VISIBILITY<static> +
+ <static> Visibility mode constant - Use visibility to hide element
+
This property is defined by Element.
+
+ +
+

autoBoxAdjust

+ public Object autoBoxAdjust +
+ true to automatically adjust width and height settings for box-model issues (default to true)
+
This property is defined by Element.
+
+ +
+

autoDisplayMode

+ public Object autoDisplayMode +
+ true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false). +To enable this globally:
YAHOO.ext.Element.prototype.autoDisplayMode = true;
+
This property is defined by Element.
+
+ +
+

defaultUnit

+ public String defaultUnit +
+ The default unit to append to CSS values where a unit isn't provided (Defaults to px).
+
This property is defined by Element.
+
+ +
+

dom

+ public HTMLElement dom +
+ The DOM element
+
This property is defined by Element.
+
+ +
+

id

+ public String id +
+ The DOM element ID
+
This property is defined by Element.
+
+ +
+

originalDisplay

+ public String originalDisplay +
+ The element's default display mode
+
This property is defined by Element.
+
+
+ + +

Constructor Details

+
+
+

Element

+ public function Element(String/HTMLElement element, [Boolean forceNew]) +
+ Create a new Element directly.
+ Parameters: +
  • element : String/HTMLElement
  • forceNew : Boolean
    (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class).
+
+
+
+
+ +

Method Details

+
+ +
+

addClass

+ public function addClass(String className) +
+ Add a CSS class to the element. +
+ Parameters: +
  • className : String
    The CSS class to add
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addClassOnOver

+ public function addClassOnOver(String className) +
+ Sets up event handlers to add and remove a css class when the mouse is over this element +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addHandler

+ public function addHandler(String eventName, Boolean stopPropagation, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element. The difference between this function and addListener is this +function prevents the default action, and if set stops propagation (bubbling) as well +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • stopPropagation : Boolean
    Whether to also stopPropagation (bubbling)
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addManagedListener

+ public function addManagedListener(String eventName, Function fn, [Object scope], [boolean override]) +
+ Append a managed listener - See YAHOO.ext.EventObject for more details. Use mon() for a shorter version. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The EventManager wrapped function that can be used to remove the listener
  • +
+
+
+
This method is defined by Element.
+
+ +
+

alignTo

+ public function alignTo(String/HTMLElement/YAHOO.ext.Element element, String position, [Array offsets], [Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Align this element with another element. +
+ Parameters: +
  • element : String/HTMLElement/YAHOO.ext.Element
    The element to align to.
  • position : String
    The position to align to. Possible values are 'tl' - top left, 'tr' - top right, 'bl' - bottom left, and 'br' - bottom right.
  • offsets : Array
    (optional) Offset the positioning by [x, y]
  • animate : Boolean
    (optional) Animate the movement (Default is false)
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

animate

+ public function animate(Object args, [Float duration], [Function onComplete], [Function easing], [Function animType]) +
+ Perform Yahoo UI animation on this element. +
+ Parameters: +
  • args : Object
    The YUI animation control args
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
  • animType : Function
    (optional) YAHOO.util.Anim subclass to use. For example: YAHOO.util.Motion
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

appendChild

+ public function appendChild(String/HTMLElement/Array/Element/CompositeElement el) +
+ Appends the passed element(s) to this element +
+ Parameters: +
  • el : String/HTMLElement/Array/Element/CompositeElement
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

appendTo

+ public function appendTo(String/HTMLElement/Element el) +
+ Appends this element to the passed element +
+ Parameters: +
  • el : String/HTMLElement/Element
    The new parent element
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

applyStyles

+ public function applyStyles(String/Object/Function styles) +
+ More flexible version of setStyle for setting style properties. +
+ Parameters: +
  • styles : String/Object/Function
    A style specification string eg "width:100px", or object in the form {width:"100px"}, or a function which returns such a specification.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

autoHeight

+ public function autoHeight([Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Measures the elements content height and updates height to match. Note, this function uses setTimeout and +the new height may not be available immediately. +
+ Parameters: +
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : Float
    (optional) Length of the animation. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

beginMeasure

+ public function beginMeasure() +
+ Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

center

+ public function center([String/HTMLElement/YAHOO.ext.Element centerIn]) +
+ Centers the Element in either the viewport, or another Element. +
+ Parameters: +
  • centerIn : String/HTMLElement/YAHOO.ext.Element
    (optional) The element in which to center the element.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clearOpacity

+ public function clearOpacity() +
+ Clears any opacity settings from this element. Required in some cases for IE. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clearPositioning

+ public function clearPositioning() +
+ Clear positioning back to the default when the document was loaded +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

clip

+ public function clip() +
+ Store the current overflow setting and clip overflow on the element - use unclip to remove +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createChild

+ public function createChild(Object config, [HTMLElement insertBefore]) +
+ Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child element. +
+ Parameters: +
  • config : Object
    DomHelper element config object
  • insertBefore : HTMLElement
    (optional) a child element of this element
+ Returns: +
    +
  • YAHOO.ext.Element
    The new child element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createProxy

+ public function createProxy(String/Object config, [String/HTMLElement renderTo], [Boolean matchBox]) +
+ Creates a proxy element of this element +
+ Parameters: +
  • config : String/Object
    The class name of the proxy element or a DomHelper config object
  • renderTo : String/HTMLElement
    (optional) The element or element id to render the proxy to (defaults to document.body)
  • matchBox : Boolean
    (optional) True to align and size the proxy to this element now (defaults to false)
+ Returns: +
    +
  • YAHOO.ext.Element
    The new proxy element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

createShim

+ public function createShim() +
+ Creates an iframe shim for this element to keep selects and other windowed objects from +showing through. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    The new shim element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

enableDisplayMode

+ public function enableDisplayMode([String display]) +
+ Convenience method for setVisibilityMode(Element.DISPLAY) +
+ Parameters: +
  • display : String
    (optional) What to set display to when visible
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

endMeasure

+ public function endMeasure() +
+ Restores displays to before beginMeasure was called +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

fitToParent

+ public function fitToParent([Boolean monitorResize]) +
+ Sizes this element to it's parent element's dimensions performing +neccessary box adjustments. +
+ Parameters: +
  • monitorResize : Boolean
    (optional) If true maintains the fit when the browser window is resized.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

focus

+ public function focus() +
+ Tries to focus the element. Any exceptions are caught. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

get<static>

+ public function get<static>(String/HTMLElement/Element el, [Boolean autoGenerateId]) +
+ <static> Static method to retreive Element objects. Uses simple caching to consistently return the same object. +Automatically fixes if an object was recreated with the same id via AJAX or DOM. +
+ Parameters: +
  • el : String/HTMLElement/Element
    The id of the element or the element to wrap (must have an id). If you pass in an element, it is returned
  • autoGenerateId : Boolean
    (optional) Set this flag to true if you are passing an element without an id (like document.body). It will auto generate an id if one isn't present.
+ Returns: +
    +
  • Element
    The element object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBorderWidth

+ public function getBorderWidth(String side) +
+ Gets the width of the border(s) for the specified side(s) +
+ Parameters: +
  • side : String
    Can be t, l, r, b or any combination of those to add multiple values. For example, passing lr would get the border (l)eft width + the border (r)ight width.
+ Returns: +
    +
  • Number
    The width of the sides passed added together
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBottom

+ public function getBottom(Boolean local) +
+ Gets the bottom Y coordinate of the element (element Y position + element height) +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getBox

+ public function getBox([Boolean contentBox], [Boolean local]) +
+ Return a box {x, y, width, height} that can be used to set another elements +size/location to match this element. +
+ Parameters: +
  • contentBox : Boolean
    (optional) If true a box for the content of the element is returned.
  • local : Boolean
    (optional) If true the element's left and top are returned instead of page x/y.
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getCenterXY

+ public function getCenterXY(Boolean offsetScroll) +
+ Calculates the x, y to center this element on the screen +
+ Parameters: +
  • offsetScroll : Boolean
    True to offset the documents current scroll position
+ Returns: +
    +
  • Array
    The x, y values [x, y]
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getChildrenByClassName

+ public function getChildrenByClassName(String className, [String tagName]) +
+ Gets an array of child YAHOO.ext.Element objects by class name and optional tagName +
+ Parameters: +
  • className : String
  • tagName : String
    (optional)
+ Returns: +
    +
  • Array
    The children
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getChildrenByTagName

+ public function getChildrenByTagName(String tagName) +
+ Gets an array of child YAHOO.ext.Element objects by tag name +
+ Parameters: +
  • tagName : String
+ Returns: +
    +
  • Array
    The children
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getHeight

+ public function getHeight([Boolean contentHeight]) +
+ Returns the offset height of the element +
+ Parameters: +
  • contentHeight : Boolean
    (optional) true to get the height minus borders and padding
+ Returns: +
    +
  • Number
    The element's height
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getLeft

+ public function getLeft(Boolean local) +
+ Gets the left X coordinate +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getMargins

+ public function getMargins([String sides]) +
+ Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed, +then it returns the calculated width of the sides (see getPadding) +
+ Parameters: +
  • sides : String
    (optional) Any combination of l, r, t, b to get the sum of those sides
+ Returns: +
    +
  • Object/Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getNextSibling

+ public function getNextSibling() +
+ Gets the next sibling, skipping text nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    The next sibling or null
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPadding

+ public function getPadding(String side) +
+ Gets the width of the padding(s) for the specified side(s) +
+ Parameters: +
  • side : String
    Can be t, l, r, b or any combination of those to add multiple values. For example, passing lr would get the padding (l)eft + the padding (r)ight.
+ Returns: +
    +
  • Number
    The padding of the sides passed added together
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPositioning

+ public function getPositioning() +
+ Gets an object with all CSS positioning properties. Useful along with setPostioning to get +snapshot before performing an update and then restoring the element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getPrevSibling

+ public function getPrevSibling() +
+ Gets the previous sibling, skipping text nodes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    The previous sibling or null
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getRegion

+ public function getRegion() +
+ Returns the region of the given element. +The element must be part of the DOM tree to have a region (display:none or elements not appended return false). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Region
    A YAHOO.util.Region containing "top, left, bottom, right" member data.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getRight

+ public function getRight(Boolean local) +
+ Gets the right X coordinate of the element (element X position + element width) +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getSize

+ public function getSize([Boolean contentSize]) +
+ Returns the size of the element +
+ Parameters: +
  • contentSize : Boolean
    (optional) true to get the width/size minus borders and padding
+ Returns: +
    +
  • Object
    An object containing the element's size {width: (element width), height: (element height)}
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getStyle

+ public function getStyle(String property) +
+ Normalizes currentStyle and ComputedStyle. +
+ Parameters: +
  • property : String
    The style property whose value is returned.
+ Returns: +
    +
  • String
    The current value of the style property for this element.
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getTop

+ public function getTop(Boolean local) +
+ Gets the top Y coordinate +
+ Parameters: +
  • local : Boolean
    True to get the local css position instead of page coordinate
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Gets this elements UpdateManager +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getWidth

+ public function getWidth([Boolean contentWidth]) +
+ Returns the offset width of the element +
+ Parameters: +
  • contentWidth : Boolean
    (optional) true to get the width minus borders and padding
+ Returns: +
    +
  • Number
    The element's width
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getX

+ public function getX() +
+ Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The X position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getXY

+ public function getXY() +
+ Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Array} The XY position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getY

+ public function getY() +
+ Gets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The Y position of the element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hasClass

+ public function hasClass(String className) +
+ Checks if a CSS class is in use by the element. +
+ Parameters: +
  • className : String
    The CSS class to check
+ Returns: +
    +
  • Boolean
    true or false
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hide

+ public function hide([Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Hide this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean
    (optional) Animate (fade) the transition (Default is false)
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDD

+ public function initDD(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DD object for this element. +
+ Parameters: +
  • group : String
    The group the DD object is member of
  • config : Object
    The DD config object
  • overrides : Object
    An object containing methods to override/implement on the DD object
+ Returns: +
    +
  • YAHOO.util.DD
    The DD object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDProxy

+ public function initDDProxy(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DDProxy object for this element. +
+ Parameters: +
  • group : String
    The group the DDProxy object is member of
  • config : Object
    The DDProxy config object
  • overrides : Object
    An object containing methods to override/implement on the DDProxy object
+ Returns: +
    +
  • YAHOO.util.DDProxy
    The DDProxy object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initDDTarget

+ public function initDDTarget(String group, Object config, Object overrides) +
+ Initializes a YAHOO.util.DDTarget object for this element. +
+ Parameters: +
  • group : String
    The group the DDTarget object is member of
  • config : Object
    The DDTarget config object
  • overrides : Object
    An object containing methods to override/implement on the DDTarget object
+ Returns: +
    +
  • YAHOO.util.DDTarget
    The DDTarget object
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertAfter

+ public function insertAfter(String/HTMLElement/Element el) +
+ Inserts this element after the passed element in the DOM +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to insert after
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertBefore

+ public function insertBefore(String/HTMLElement/Element el) +
+ Inserts this element before the passed element in the DOM +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to insert before
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertHtml

+ public function insertHtml(String where, String html) +
+ Inserts an html fragment into this element +
+ Parameters: +
  • where : String
    Where to insert the html in relation to the this element - beforeBegin, afterBegin, beforeEnd, afterEnd.
  • html : String
    The HTML fragment
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isBorderBox

+ public function isBorderBox() +
+ Tests various css rules/browsers to determine if this element uses a border box +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isDisplayed

+ public function isDisplayed() +
+ Returns true if display is not "none" +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Element.
+
+ +
+

isVisible

+ public function isVisible([Boolean deep]) +
+ Checks whether the element is currently visible using both visibility and display properties. +
+ Parameters: +
  • deep : Boolean
    True to walk the dom and see if parent elements are hidden.
+ Returns: +
    +
  • Boolean
    true if the element is currently visible
  • +
+
+
+
This method is defined by Element.
+
+ +
+

load

+ public function load(String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Direct access to the UpdateManager update() method (takes the same parameters). +
+ Parameters: +
  • url : String/Function
    The url for this request or a function to call to get the url
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
  • discardUrl : Boolean
    (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

mon

+ public function mon(String eventName, Function fn, [Object scope], [boolean override]) +
+ Append a managed listener (shorthanded for addManagedListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • fn : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The EventManager wrapped function that can be used to remove the listener
  • +
+
+
+
This method is defined by Element.
+
+ +
+

move

+ public function move(String direction, Number distance, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Move this element relative to it's current position. +
+ Parameters: +
  • direction : String
    Possible values are: 'l','left' - 'r','right' - 't','top','up' - 'b','bottom','down'.
  • distance : Number
    How far to move the element in pixels
  • animate : Boolean
    (optional) Animate the movement (Default is false)
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

moveTo

+ public function moveTo(Number x, Number y, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • x : Number
    X value for new position (coordinates are page-based)
  • y : Number
    Y value for new position (coordinates are page-based)
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

on

+ public function on(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element (Same as addListener) +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    (optional) If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

radioClass

+ public function radioClass(String className) +
+ Adds the passed className to this element and removes the class from all siblings +
+ Parameters: +
  • className : String
    The className to add
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

remove

+ public function remove() +
+ Removes this element from the DOM and deletes it from the cache +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeAllListeners

+ public function removeAllListeners() +
+ Removes all previous added listeners from this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeClass

+ public function removeClass(String className) +
+ Removes a CSS class from the element. +
+ Parameters: +
  • className : String
    The CSS class to remove
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeListener

+ public function removeListener(String sType, Function fn, Object scope) +
+ Removes an event handler from this element +
+ Parameters: +
  • sType : String
    the type of event to remove
  • fn : Function
    the method the event invokes
  • scope : Object
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

repaint

+ public function repaint() +
+ Forces the browser to repaint this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replace

+ public function replace(String/HTMLElement/Element el) +
+ Replaces the passed element with this element +
+ Parameters: +
  • el : String/HTMLElement/Element
    The element to replace
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replaceClass

+ public function replaceClass(String oldClassName, String newClassName) +
+ Replaces a CSS class on the element with another. +
+ Parameters: +
  • oldClassName : String
    The CSS class to replace
  • newClassName : String
    The replacement CSS class
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

scrollIntoView

+ public function scrollIntoView([String/HTMLElement/Element container]) +
+ Scrolls this element into view within the passed container. +
+ Parameters: +
  • container : String/HTMLElement/Element
    (optional) The container element to scroll (defaults to document.body)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select

+ public function select(String selector, Boolean unique) +
+ Selects child nodes based on the passed CSS selector (the selector should not contain an id) +
+ Parameters: +
  • selector : String
    The CSS selector
  • unique : Boolean
    true to create a unique YAHOO.ext.Element for each child (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElement/CompositeElementLite
    The composite element
  • +
+
+
+
This method is defined by Element.
+
+ +
+

select<static>

+ public function select<static>(String/Array selector, [Boolean unique]) +
+ <static> Selects elements based on the passed CSS selector to enable working on them as 1. +
+ Parameters: +
  • selector : String/Array
    The CSS selector or an array of elements
  • unique : Boolean
    (optional) true to create a unique YAHOO.ext.Element for each element (defaults to a shared flyweight object)
+ Returns: +
    +
  • CompositeElementLite/CompositeElement
  • +
+
+
+
This method is defined by Element.
+
+ +
+

set

+ public function set(Object o) +
+ Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function) +
+ Parameters: +
  • o : Object
    The object with the attributes
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setAbsolutePositioned

+ public function setAbsolutePositioned([Number zIndex]) +
+ Set the element as absolute positioned with the specified z-index +
+ Parameters: +
  • zIndex : Number
    (optional)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBottom

+ public function setBottom(String bottom) +
+ Set the element's css bottom style +
+ Parameters: +
  • bottom : String
    The bottom CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBounds

+ public function setBounds(Number x, Number y, Number width, Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated concurrently. +
+ Parameters: +
  • x : Number
    X value for new position (coordinates are page-based)
  • y : Number
    Y value for new position (coordinates are page-based)
  • width : Number
    The new width
  • height : Number
    The new height
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setBox

+ public function setBox(Object box, [Boolean adjust], [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the element's box. Use getBox() on another element to get a box obj. If animate is true then width, height, x and y will be animated concurrently. +
+ Parameters: +
  • box : Object
    The box to fill {x, y, width, height}
  • adjust : Boolean
    (optional) Whether to adjust for box-model issues automatically
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setDisplayed

+ public function setDisplayed(Boolean value) +
+ Sets the css display. Uses originalDisplay if value is a boolean true. +
+ Parameters: +
  • value : Boolean
    Boolean to display the element using it's default display or a string to set the display directly
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setHeight

+ public function setHeight(Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the height of the element +
+ Parameters: +
  • height : Number
    The new height
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLeft

+ public function setLeft(String left) +
+ Set the element's left position directly using CSS style (instead of setX()) +
+ Parameters: +
  • left : String
    The left CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLeftTop

+ public function setLeftTop() +
+ Quick set left and top adding default units +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setLocation

+ public function setLocation(Number x, Number y, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • x : Number
    X value for new position (coordinates are page-based)
  • y : Number
    Y value for new position (coordinates are page-based)
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setOpacity

+ public function setOpacity(Float opacity, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Set the opacity of the element +
+ Parameters: +
  • opacity : Float
    The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc
  • animate : Boolean
    (optional) Animate (fade) the transition (Default is false)
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setPositioning

+ public function setPositioning(Object posCfg) +
+ Set positioning with an object returned by getPositioning(). +
+ Parameters: +
  • posCfg : Object
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRegion

+ public function setRegion(YAHOO.util.Region region, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the element's position and size the the specified region. If animation is true then width, height, x and y will be animated concurrently. +
+ Parameters: +
  • region : YAHOO.util.Region
    The region to fill
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRelativePositioned

+ public function setRelativePositioned([Number zIndex]) +
+ Set the element as relative positioned with the specified z-index +
+ Parameters: +
  • zIndex : Number
    (optional)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setRight

+ public function setRight(String right) +
+ Set the element's css right style +
+ Parameters: +
  • right : String
    The right CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setSize

+ public function setSize(Number width, Number height, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the size of the element. If animation is true, both width an height will be animated concurrently. +
+ Parameters: +
  • width : Number
    The new width
  • height : Number
    The new height
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setStyle

+ public function setStyle(String/Object property, [String val]) +
+ Wrapper for setting style properties, also takes single object parameter of multiple styles +
+ Parameters: +
  • property : String/Object
    The style property to be set or an object of multiple styles.
  • val : String
    (optional) The value to apply to the given property or null if an object was passed.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setTop

+ public function setTop(String top) +
+ Set the element's top position directly using CSS style (instead of setY()) +
+ Parameters: +
  • top : String
    The top CSS property value
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setVisibilityMode

+ public function setVisibilityMode(visMode Element.VISIBILITY) +
+ Sets the elements visibility mode. When setVisible() is called it +will use this to determine whether to set the visibility or the display property. +
+ Parameters: +
  • Element.VISIBILITY : visMode
    or Element.DISPLAY
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setVisible

+ public function setVisible(Boolean visible, [Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Sets the visibility of the element (see details). If the visibilityMode is set to Element.DISPLAY, it will use +the display property to hide the element, otherwise it uses visibility. The default is to hide and show using the visibility property. +
+ Parameters: +
  • visible : Boolean
    Whether the element is visible
  • animate : Boolean
    (optional) Fade the element in or out (Default is false)
  • duration : Float
    (optional) How long the fade effect lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setWidth

+ public function setWidth(Number width, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the width of the element +
+ Parameters: +
  • width : Number
    The new width
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if width is larger or YAHOO.util.Easing.easeIn if it is smaller)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setX

+ public function setX(Number The, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the X position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • The : Number
    X position of the element
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setXY

+ public function setXY(Array pos, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Set the position of the element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • pos : Array
    Contains X & Y [x, y] values for new position (coordinates are page-based)
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setY

+ public function setY(Number The, [Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Sets the Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • The : Number
    Y position of the element
  • animate : Boolean
    (optional) Animate the transition (Default is false)
  • duration : float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

show

+ public function show([Boolean animate], [Float duration], [Function onComplete], [Function easing]) +
+ Show this element - Uses display mode to determine whether to use "display" or "visibility". See setVisible. +
+ Parameters: +
  • animate : Boolean
    (optional) Animate (fade in) the transition (Default is false)
  • duration : Float
    (optional) How long the animation lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

swallowEvent

+ public function swallowEvent(String eventName, [Boolean preventDefault]) +
+ Stops the specified event from bubbling and optionally prevent's the default action +
+ Parameters: +
  • eventName : String
  • preventDefault : Boolean
    (optional) true to prevent the default action too
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

toggle

+ public function toggle([Boolean animate], [float duration], [Function onComplete], [Function easing]) +
+ Toggles the elements visibility or display, depending on visibility mode. +
+ Parameters: +
  • animate : Boolean
    (optional) Fade the element in or out (Default is false)
  • duration : float
    (optional) How long the fade effect lasts. (Defaults to .35 seconds)
  • onComplete : Function
    (optional) Function to call when animation completes.
  • easing : Function
    (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing)
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

toggleClass

+ public function toggleClass(String className) +
+ Toggles (adds or removes) the passed class. +
+ Parameters: +
  • className : String
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unclip

+ public function unclip() +
+ Return clipping (overflow) to original clipping before clip() was called +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

unselectable

+ public function unselectable() +
+ Disables text selection for this element (normalized across browsers) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

update

+ public function update(String html, [Boolean loadScripts], Function callback) +
+ Update the innerHTML of this element, optionally searching for and processing scripts +
+ Parameters: +
  • html : String
    The new HTML
  • loadScripts : Boolean
    (optional) true to look for and process scripts
  • callback : Function
    For async script loading you can be noticed when the update completes
+ Returns: +
    +
  • YAHOO.ext.Element
    this
  • +
+
+
+
This method is defined by Element.
+
+ +
+

wrap

+ public function wrap([Object config]) +
+ Creates and wraps this element with another element +
+ Parameters: +
  • config : Object
    (optional) DomHelper element config object for the wrapper element or null for an empty div
+ Returns: +
    +
  • Element
    The newly created wrapper element
  • +
+
+
+
This method is defined by Element.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.EventManager.html b/www/extras/yui-ext/docs/output/YAHOO.ext.EventManager.html new file mode 100644 index 000000000..b51c310db --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.EventManager.html @@ -0,0 +1,225 @@ + + + + YAHOO.ext.EventManager + + + + + +
+ +

Class YAHOO.ext.EventManager

+ + + + + +
Package:YAHOO.ext
Class:EventManager
Extends:Object
Defined In:EventManager.js
+
+ Registers event handlers that want to receive a normalized EventObject instead of the standard browser event and provides +several useful events directly. +See YAHOO.ext.EventObject for more details on normalized event objects.

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(Object element, String eventName, Function fn, Object scope, boolean override) : FunctionEventManager
Appends an event handler
 on(Object element, String eventName, Function fn, Object scope, boolean override) : FunctionEventManager
Appends an event handler (shorthand for addListener)
 onDocumentReady(Function fn, Object scope, boolean override) : voidEventManager
Fires when the document is ready (before onload and before images are loaded)
 onWindowResize(Function fn, Object scope, boolean override) : voidEventManager
Fires when the window is resized and provides resize event buffering (50 milliseconds), passes new viewport width and...
 removeListener(Object element, String eventName, Function wrappedFn) : BooleanEventManager
Removes an event handler
 removeResizeListener(Function fn, Object scope) : voidEventManager
Removes the passed window resize listener.
 wrap(Function fn, Object scope, boolean override) : FunctionEventManager
Places a simple wrapper around an event handler to override the browser event +object with a YAHOO.ext.EventObject
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(Object element, String eventName, Function fn, Object scope, boolean override) +
+ Appends an event handler +
+ Parameters: +
  • element : Object
    The html element to assign the event to
  • eventName : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The wrapper function created (to be used to remove the listener if necessary)
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

on

+ public function on(Object element, String eventName, Function fn, Object scope, boolean override) +
+ Appends an event handler (shorthand for addListener) +
+ Parameters: +
  • element : Object
    The html element to assign the event to
  • eventName : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • scope : Object
    An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The wrapper function created (to be used to remove the listener if necessary)
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

onDocumentReady

+ public function onDocumentReady(Function fn, Object scope, boolean override) +
+ Fires when the document is ready (before onload and before images are loaded) +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

onWindowResize

+ public function onWindowResize(Function fn, Object scope, boolean override) +
+ Fires when the window is resized and provides resize event buffering (50 milliseconds), passes new viewport width and height to handlers. +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

removeListener

+ public function removeListener(Object element, String eventName, Function wrappedFn) +
+ Removes an event handler +
+ Parameters: +
  • element : Object
    The html element to remove the event from
  • eventName : String
    The type of event to append
  • wrappedFn : Function
    The wrapper method returned when adding the listener
+ Returns: +
    +
  • Boolean
    True if a listener was actually removed
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

removeResizeListener

+ public function removeResizeListener(Function fn, Object scope) +
+ Removes the passed window resize listener. +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    The scope of handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventManager.
+
+ +
+

wrap

+ public function wrap(Function fn, Object scope, boolean override) +
+ Places a simple wrapper around an event handler to override the browser event +object with a YAHOO.ext.EventObject +
+ Parameters: +
  • fn : Function
    The method the event invokes
  • scope : Object
    An object that becomes the scope of the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • Function
    The wrapped function
  • +
+
+
+
This method is defined by EventManager.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.EventObject.html b/www/extras/yui-ext/docs/output/YAHOO.ext.EventObject.html new file mode 100644 index 000000000..b064c048f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.EventObject.html @@ -0,0 +1,743 @@ + + + + YAHOO.ext.EventObject + + + + + +
+ +

Class YAHOO.ext.EventObject

+ + + + + +
Package:YAHOO.ext
Class:EventObject
Extends:Object
Defined In:EventManager.js
+
+ EventObject exposes the Yahoo! UI Event functionality directly on the object +passed to your event handler. It exists mostly for convenience. It also fixes the annoying null checks automatically to cleanup your code +(All the YAHOO.util.Event methods throw javascript errors if the passed event is null). +To get an EventObject instead of the standard browser event, +your must register your listener thru the YAHOO.ext.EventManager or directly on an Element +with YAHOO.ext.Element#addManagedListener.html">YAHOO.ext.Element.html#mon">YAHOO.ext.Element#addManagedListener or the shorthanded equivalent {@link YAHOO.ext.Element.mon.
+Example: +

+ fu<>nction handleClick(e){ // e is not a standard event object, it is a YAHOO.ext.EventObject
+    e.preventDefault();
+    var target = e.getTarget();
+    ...
+ }
+ var myDiv = getEl('myDiv');
+ myDiv.mon('click', handleClick);
+ //or
+ YAHOO.ext.EventManager.on('myDiv', 'click', handleClick);
+ YAHOO.ext.EventManager.addListener('myDiv', 'click', handleClick);
+ 


This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 BACKSPACE : NumberEventObject
Key constant
 DELETE : NumberEventObject
Key constant
 DOWN : NumberEventObject
Key constant
 END : NumberEventObject
Key constant
 ESC : NumberEventObject
Key constant
 F5 : NumberEventObject
Key constant
 HOME : NumberEventObject
Key constant
 LEFT : NumberEventObject
Key constant
 PAGEDOWN : NumberEventObject
Key constant
 PAGEUP : NumberEventObject
Key constant
 RETURN : NumberEventObject
Key constant
 RIGHT : NumberEventObject
Key constant
 SPACE : NumberEventObject
Key constant
 TAB : NumberEventObject
Key constant
 UP : NumberEventObject
Key constant
 altKey : ObjectEventObject
True if the alt key was down during the event
 browserEvent : ObjectEventObject
The normal browser event
 button : ObjectEventObject
The button pressed in a mouse event
 ctrlKey : ObjectEventObject
True if the control key was down during the event
 shiftKey : ObjectEventObject
True if the shift key was down during the event
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 findTarget(String className, [String tagName]) : HTMLelementEventObject
Walk up the DOM looking for a particular target - if the default target matches, it is returned.
 getCharCode() : NumberEventObject
Gets the key code for the event. Returns value from YAHOO.util.Event.getCharCode() if the event is not null.
 getKey() : NumberEventObject
Returns a browsers key for a keydown event
 getPageX() : NumberEventObject
Gets the x coordinate of the event. Returns value from YAHOO.util.Event.getPageX() if the event is not null.
 getPageY() : NumberEventObject
Gets the y coordinate of the event. Returns value from YAHOO.util.Event.getPageY() if the event is not null.
 getRelatedTarget() : HTMLElementEventObject
Gets the related target. Returns value from YAHOO.util.Event.getRelatedTarget() if the event is not null.
 getTarget() : HTMLelementEventObject
Gets the target for the event. Returns value from YAHOO.util.Event.getTarget() if the event is not null.
 getTime() : NumberEventObject
Gets the time of the event. Returns value from YAHOO.util.Event.getTime() if the event is not null.
 getWheelDelta() : NumberEventObject
Normalizes mouse wheel delta across browsers
 getXY() : ArrayEventObject
Gets the page coordinates of the event. Returns value from YAHOO.util.Event.getXY() if the event is not null.
 hasModifier() : BooleanEventObject
Returns true if the control, shift or alt key was pressed during this event.
 preventDefault() : voidEventObject
Prevents the browsers default handling of the event. Calls YAHOO.util.Event.preventDefault() if the event is not null.
 stopEvent() : voidEventObject
Stop the event. Calls YAHOO.util.Event.stopEvent() if the event is not null.
 stopPropagation() : voidEventObject
Cancels bubbling of the event. Calls YAHOO.util.Event.stopPropagation() if the event is not null.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

BACKSPACE

+ public Number BACKSPACE +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

DELETE

+ public Number DELETE +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

DOWN

+ public Number DOWN +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

END

+ public Number END +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

ESC

+ public Number ESC +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

F5

+ public Number F5 +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

HOME

+ public Number HOME +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

LEFT

+ public Number LEFT +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

PAGEDOWN

+ public Number PAGEDOWN +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

PAGEUP

+ public Number PAGEUP +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

RETURN

+ public Number RETURN +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

RIGHT

+ public Number RIGHT +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

SPACE

+ public Number SPACE +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

TAB

+ public Number TAB +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

UP

+ public Number UP +
+ Key constant
+
This property is defined by EventObject.
+
+ +
+

altKey

+ public Object altKey +
+ True if the alt key was down during the event
+
This property is defined by EventObject.
+
+ +
+

browserEvent

+ public Object browserEvent +
+ The normal browser event
+
This property is defined by EventObject.
+
+ +
+

button

+ public Object button +
+ The button pressed in a mouse event
+
This property is defined by EventObject.
+
+ +
+

ctrlKey

+ public Object ctrlKey +
+ True if the control key was down during the event
+
This property is defined by EventObject.
+
+ +
+

shiftKey

+ public Object shiftKey +
+ True if the shift key was down during the event
+
This property is defined by EventObject.
+
+
+ + +

Method Details

+
+ +
+

findTarget

+ public function findTarget(String className, [String tagName]) +
+ Walk up the DOM looking for a particular target - if the default target matches, it is returned. +
+ Parameters: +
  • className : String
    The class name to look for or null
  • tagName : String
    (optional) The tag name to look for
+ Returns: +
    +
  • HTMLelement
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getCharCode

+ public function getCharCode() +
+ Gets the key code for the event. Returns value from YAHOO.util.Event.getCharCode() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getKey

+ public function getKey() +
+ Returns a browsers key for a keydown event +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The key code
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getPageX

+ public function getPageX() +
+ Gets the x coordinate of the event. Returns value from YAHOO.util.Event.getPageX() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getPageY

+ public function getPageY() +
+ Gets the y coordinate of the event. Returns value from YAHOO.util.Event.getPageY() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getRelatedTarget

+ public function getRelatedTarget() +
+ Gets the related target. Returns value from YAHOO.util.Event.getRelatedTarget() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getTarget

+ public function getTarget() +
+ Gets the target for the event. Returns value from YAHOO.util.Event.getTarget() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLelement
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getTime

+ public function getTime() +
+ Gets the time of the event. Returns value from YAHOO.util.Event.getTime() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getWheelDelta

+ public function getWheelDelta() +
+ Normalizes mouse wheel delta across browsers +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The delta
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

getXY

+ public function getXY() +
+ Gets the page coordinates of the event. Returns value from YAHOO.util.Event.getXY() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    The xy values like [x, y]
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

hasModifier

+ public function hasModifier() +
+ Returns true if the control, shift or alt key was pressed during this event. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

preventDefault

+ public function preventDefault() +
+ Prevents the browsers default handling of the event. Calls YAHOO.util.Event.preventDefault() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

stopEvent

+ public function stopEvent() +
+ Stop the event. Calls YAHOO.util.Event.stopEvent() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+ +
+

stopPropagation

+ public function stopPropagation() +
+ Cancels bubbling of the event. Calls YAHOO.util.Event.stopPropagation() if the event is not null. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by EventObject.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.GridPanel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.GridPanel.html new file mode 100644 index 000000000..06bd8e87a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.GridPanel.html @@ -0,0 +1,519 @@ + + + + YAHOO.ext.GridPanel + + + + + +
+ +

Class YAHOO.ext.GridPanel

+ + + + + +
Package:YAHOO.ext
Class:GridPanel
Extends:ContentPanel
Defined In:ContentPanels.js
+
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 GridPanel(YAHOO.ext.grid.Grid grid, String/Object config)GridPanel
Create a new GridPanel.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementContentPanel
Returns this panel's element
 getGrid() : YAHOO.ext.grid.GridGridPanel
Returns the grid for this panel
 getId() : StringContentPanel
Returns this panel's id
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : YAHOO.ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured
 getUpdateManager() : YAHOO.ext.UpdateManagerContentPanel
Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setContent(String content, [Boolean loadScripts]) : voidContentPanel
Updates this panel's element
 setTitle(String title) : voidContentPanel
Set this panel's title
 setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) : YAHOO.ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
+ + + +

Constructor Details

+
+
+

GridPanel

+ public function GridPanel(YAHOO.ext.grid.Grid grid, String/Object config) +
+ Create a new GridPanel.
+ Parameters: +
  • grid : YAHOO.ext.grid.Grid
    The grid for this panel
  • config : String/Object
    A string to set only the title or a config object
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Destroys this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns this panel's element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getGrid

+ public function getGrid() +
+ Returns the grid for this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.grid.Grid
  • +
+
+
+
This method is defined by GridPanel.
+
+ +
+

getId

+ public function getId() +
+ Returns this panel's id +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getTitle

+ public function getTitle() +
+ Returns this panel's title +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getToolbar

+ public function getToolbar() +
+ Returns the toolbar for this Panel if one was configured +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

isClosable

+ public function isClosable() +
+ Returns true is this panel was configured to be closable +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setContent

+ public function setContent(String content, [Boolean loadScripts]) +
+ Updates this panel's element +
+ Parameters: +
  • content : String
    The new content
  • loadScripts : Boolean
    (optional) true to look for and process scripts
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setTitle

+ public function setTitle(String title) +
+ Set this panel's title +
+ Parameters: +
  • title : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setUrl

+ public function setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) +
+ Set a URL to be used to load the content for this panel. +
+ Parameters: +
  • url : String/Function
    The url to load the content from or a function to call to get the url
  • params : String/Object
    (optional) The string params for the update call or an object of the params. See YAHOO.ext.UpdateManager.update for more details. (Defaults to null)
  • loadOnce : Boolean
    (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this panel is activated. (Defaults to false)
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+
+ +

Event Details

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.JsonView.html b/www/extras/yui-ext/docs/output/YAHOO.ext.JsonView.html new file mode 100644 index 000000000..88ebd14fd --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.JsonView.html @@ -0,0 +1,758 @@ + + + + YAHOO.ext.JsonView + + + + + +
+ +

Class YAHOO.ext.JsonView

+ + + + + +
Package:YAHOO.ext
Class:JsonView
Extends:View
Defined In:TemplateView.js
+
+ Shortcut class to create a JSON + UpdateManager template view. Usage: +

+var view = new YAHOO.ext.View('my-element', 
+           '<div id="{id}">{foo} - {bar}</div>', // auto create template
+           { multiSelect: true, jsonRoot: 'data' });
+
+// listen for node click?
+view.on('click', function(vw, index, node, e){
+    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
+});
+
+// direct load of JSON data
+view.load('foobar.php');
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 jsonRoot : StringView
The root property in the loaded json object that contains the data
 selectedClass : YAHOO.ext.DomHelper.TemplateView
The css class to add to selected nodes
 tpl : YAHOO.ext.DomHelper.TemplateView
The template used by this View
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 JsonView(String/HTMLElement/Element container, DomHelper.Template tpl, Object config)JsonView
Create a new JsonView
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 clearSelections([Boolean suppressEvent]) : voidView
Clear all selections
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 findItemFromChild(HTMLElement node) : HTMLElementView
Returns the template node the passed child belongs to or null if it doesn't belong to one.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementView
Returns the element this view is bound to.
 getNode(HTMLElement/String/Number nodeInfo) : HTMLElementView
Gets a template node.
 getNodes(Number startIndex, Number endIndex) : ArrayView
Gets a range template nodes.
 getSelectedIndexes() : ArrayView
Get the indexes of the selected nodes.
 getSelectedNodes() : ArrayView
Get the currently selected nodes.
 getSelectionCount() : NumberView
Get the number of selected nodes.
 indexOf(HTMLElement/String/Number nodeInfo) : NumberView
Finds the index of the passed node
 load(String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : voidJsonView
Direct access to the elements UpdateManager update() method (takes the same parameters).
 prepareData(Array/Object data, Number index) : voidView
Function to override to reformat the data that is sent to +the template for each node.
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidView
Refreshes the view.
 refreshNode(Number index) : voidView
Refresh an individual node.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 select(Array/HTMLElement/String/Number nodeInfo, [Boolean keepExisting], [Boolean suppressEvent]) : voidView
Selects nodes.
 setDataModel(DataModel dataModel) : voidView
Changes the data model this view uses and refresh the view.
 unplugDataModel(DataModel dataModel) : voidView
Unplug the data model and stop updates.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 click : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is clicked.
 contextmenu : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is right clicked.
 dblclick : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is double clicked.
 selectionchange : (YAHOO.ext.View this, Array selections)View
Fires when the selected nodes change.
+ +

Property Details

+
+ +
+

jsonRoot

+ public String jsonRoot +
+ The root property in the loaded json object that contains the data
+
This property is defined by View.
+
+ +
+

selectedClass

+ public YAHOO.ext.DomHelper.Template selectedClass +
+ The css class to add to selected nodes
+
This property is defined by View.
+
+ +
+

tpl

+ public YAHOO.ext.DomHelper.Template tpl +
+ The template used by this View
+
This property is defined by View.
+
+
+ + +

Constructor Details

+
+
+

JsonView

+ public function JsonView(String/HTMLElement/Element container, DomHelper.Template tpl, Object config) +
+ Create a new JsonView
+ Parameters: +
  • container : String/HTMLElement/Element
    The container element where the view is to be rendered.
  • tpl : DomHelper.Template
    The rendering template
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections([Boolean suppressEvent]) +
+ Clear all selections +
+ Parameters: +
  • suppressEvent : Boolean
    (optional) true to skip firing of the selectionchange event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

findItemFromChild

+ public function findItemFromChild(HTMLElement node) +
+ Returns the template node the passed child belongs to or null if it doesn't belong to one. +
+ Parameters: +
  • node : HTMLElement
+ Returns: +
    +
  • HTMLElement
    The template node
  • +
+
+
+
This method is defined by View.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this view is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by View.
+
+ +
+

getNode

+ public function getNode(HTMLElement/String/Number nodeInfo) +
+ Gets a template node. +
+ Parameters: +
  • nodeInfo : HTMLElement/String/Number
    An HTMLElement template node, index of a template node or the id of a template node
+ Returns: +
    +
  • HTMLElement
    The node or null if it wasn't found
  • +
+
+
+
This method is defined by View.
+
+ +
+

getNodes

+ public function getNodes(Number startIndex, Number endIndex) +
+ Gets a range template nodes. +
+ Parameters: +
  • startIndex : Number
  • endIndex : Number
+ Returns: +
    +
  • Array
    An array of nodes
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectedIndexes

+ public function getSelectedIndexes() +
+ Get the indexes of the selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectedNodes

+ public function getSelectedNodes() +
+ Get the currently selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    An array of HTMLElements
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectionCount

+ public function getSelectionCount() +
+ Get the number of selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by View.
+
+ +
+

indexOf

+ public function indexOf(HTMLElement/String/Number nodeInfo) +
+ Finds the index of the passed node +
+ Parameters: +
  • nodeInfo : HTMLElement/String/Number
    An HTMLElement template node, index of a template node or the id of a template node
+ Returns: +
    +
  • Number
    The index of the node or -1
  • +
+
+
+
This method is defined by View.
+
+ +
+

load

+ public function load(String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Direct access to the elements UpdateManager update() method (takes the same parameters). +
+ Parameters: +
  • url : String/Function
    The url for this request or a function to call to get the url
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
  • discardUrl : Boolean
    (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JsonView.
+
+ +
+

prepareData

+ public function prepareData(Array/Object data, Number index) +
+ Function to override to reformat the data that is sent to +the template for each node. +
+ Parameters: +
  • data : Array/Object
    The raw data (array of colData for a data model bound view or a JSON object for an UpdateManager bound view).
  • index : Number
    The index of the data within the data model
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

refresh

+ public function refresh() +
+ Refreshes the view. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

refreshNode

+ public function refreshNode(Number index) +
+ Refresh an individual node. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

select

+ public function select(Array/HTMLElement/String/Number nodeInfo, [Boolean keepExisting], [Boolean suppressEvent]) +
+ Selects nodes. +
+ Parameters: +
  • nodeInfo : Array/HTMLElement/String/Number
    An HTMLElement template node, index of a template node, id of a template node or an array of any of those to select
  • keepExisting : Boolean
    (optional) true to keep existing selections
  • suppressEvent : Boolean
    (optional) true to skip firing of the selectionchange vent
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

setDataModel

+ public function setDataModel(DataModel dataModel) +
+ Changes the data model this view uses and refresh the view. +
+ Parameters: +
  • dataModel : DataModel
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

unplugDataModel

+ public function unplugDataModel(DataModel dataModel) +
+ Unplug the data model and stop updates. +
+ Parameters: +
  • dataModel : DataModel
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+
+ +

Event Details

+
+ +
+

click

+ public event click +
+ Fires when a template node is clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

contextmenu

+ public event contextmenu +
+ Fires when a template node is right clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

dblclick

+ public event dblclick +
+ Fires when a template node is double clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selected nodes change. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • selections : Array
    Array of the selected nodes
+
+
+
This event is defined by View.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutDialog.html b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutDialog.html new file mode 100644 index 000000000..14c7efb34 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutDialog.html @@ -0,0 +1,995 @@ + + + + YAHOO.ext.LayoutDialog + + + + + +
+ +

Class YAHOO.ext.LayoutDialog

+ + + + + +
Package:YAHOO.ext
Class:LayoutDialog
Extends:BasicDialog
Defined In:BasicDialog.js
+
+ Dialog which provides adjustments for working with a layout in a Dialog. +Add your neccessary layout config options to the dialogs config.
+Example Usage (including a nested layout): +
    if(!dialog){
+    dialog = new YAHOO.ext.LayoutDialog("download-dlg", { 
+            modal: true,
+            width:600,
+            height:450,
+            shadow:true,
+            minWidth:500,
+            minHeight:350,
+            autoTabs:true,
+            proxyDrag:true,
+            // layout config merges with the dialog config
+            center:{
+                tabPosition: 'top',
+                alwaysShowTabs: true
+            }
+    });
+    dialog.addKeyListener(27, dialog.hide, dialog);
+    dialog.setDefaultButton(dialog.addButton('Close', dialog.hide, dialog));
+    dialog.addButton('Build It!', this.getDownload, this);
+    
+    // we can even add nested layouts
+    var innerLayout = new YAHOO.ext.BorderLayout('dl-inner', {
+        east: {
+            initialSize: 200,
+            autoScroll:true,
+            split:true
+        },
+        center: {
+            autoScroll:true
+        }
+    });
+    innerLayout.beginUpdate();
+    innerLayout.add('east', new YAHOO.ext.ContentPanel('dl-details'));
+    innerLayout.add('center', new YAHOO.ext.ContentPanel('selection-panel'));
+    innerLayout.endUpdate(true);
+    
+    // when doing updates to the top level layout in a dialog, you need to 
+    // use dialog.beginUpdate()/endUpdate() instead of layout.beginUpdate()/endUpdate()
+    var layout = dialog.getLayout();
+    dialog.beginUpdate();
+    layout.add('center', new YAHOO.ext.ContentPanel('standard-panel', 
+                        {title: 'Download the Source', fitToFrame:true}));
+    layout.add('center', new YAHOO.ext.NestedLayoutPanel(innerLayout, 
+               {title: 'Build your own yui-ext.js'}));
+    layout.getRegion('center').showPanel(sp);
+    dialog.endUpdate();
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 body : YAHOO.ext.ElementBasicDialog
The body element
 footer : YAHOO.ext.ElementBasicDialog
The footer element
 header : YAHOO.ext.ElementBasicDialog
The header element
 zseed : NumberBasicDialog
The starting z-index for BasicDialogs - defaults to 10000
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LayoutDialog(String/HTMLElement/YAHOO.ext.Element el, Object config)LayoutDialog
 addButton(String/Object config, Function handler, [Object scope]) : YAHOO.ext.BasicDialog.ButtonBasicDialog
Adds a button.
 addKeyListener(Number/Array/Object key, Function fn, [Object scope]) : YAHOO.ext.BasicDialogBasicDialog
Adds a key listener for when this dialog is displayed
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 beginUpdate() : voidLayoutDialog
Deprecated. Begins an update of the layout and sets display to block and visibility to hidden. Use standard beginUpda...
 bringToFront(String/Object dlg) : YAHOO.ext.BasicDialogBasicDialog
Brings the specified dialog to the front
 center() : YAHOO.ext.BasicDialogBasicDialog
Centers this dialog
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy([Boolean removeEl]) : voidBasicDialog
Destroys this dialog
 endUpdate() : voidLayoutDialog
Deprecated. Ends update of the layout and resets display to none. Use standard beginUpdate/endUpdate on the layout.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 get(String/Object id) : YAHOO.ext.BasicDialogBasicDialog
Gets a registered dialog by id
 getEl() : YAHOO.ext.ElementBasicDialog
Returns the element for this dialog
 getLayout() : YAHOO.ext.BorderLayoutLayoutDialog
Get the BorderLayout for this dialog
 getTabs() : YAHOO.ext.TabPanelBasicDialog
Returns the TabPanel component (if autoTabs)
 hide([Function callback]) : YAHOO.ext.BasicDialogBasicDialog
Hides the dialog.
 isVisible() : BooleanBasicDialog
Returns true if the dialog is visible
 moveTo(Number x, Number y) : YAHOO.ext.BasicDialogBasicDialog
Moves the dialog to the specified point
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number width, Number height) : YAHOO.ext.BasicDialogBasicDialog
Resizes the dialog.
 restoreState() : YAHOO.ext.BasicDialogBasicDialog
Restores the previous state of the dialog if YAHOO.ext.state is configured
 sendToBack(String/Object dlg) : YAHOO.ext.BasicDialogBasicDialog
Sends the specified dialog to the back
 setDefaultButton(YAHOO.ext.BasicDialog.Button btn) : YAHOO.ext.BasicDialogBasicDialog
Sets the default button to be focused when the dialog is displayed
 show([String/HTMLElement/YAHOO.ext.Element animateTarget]) : YAHOO.ext.BasicDialogBasicDialog
Shows the dialog.
 toBack() : YAHOO.ext.BasicDialogBasicDialog
Sends this dialog to the back (under) of any other visible dialogs
 toFront() : YAHOO.ext.BasicDialogBasicDialog
Brings this dialog to the front of any other visible dialogs
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforehide : (YAHOO.ext.BasicDialog this)BasicDialog
Fires before this dialog is hidden.
 beforeshow : (YAHOO.ext.BasicDialog this)BasicDialog
Fires before this dialog is shown.
 hide : (YAHOO.ext.BasicDialog this)BasicDialog
Fires when this dialog is hidden.
 keydown : (YAHOO.ext.BasicDialog this, YAHOO.ext.EventObject e)BasicDialog
Fires when a key is pressed
 move : (YAHOO.ext.BasicDialog this, Number x, Number y)BasicDialog
Fires when this dialog is moved by the user.
 resize : (YAHOO.ext.BasicDialog this, Number width, Number height)BasicDialog
Fires when this dialog is resized by the user.
 show : (YAHOO.ext.BasicDialog this)BasicDialog
Fires when this dialog is shown.
+ +

Property Details

+
+ +
+

body

+ public YAHOO.ext.Element body +
+ The body element
+
This property is defined by BasicDialog.
+
+ +
+

footer

+ public YAHOO.ext.Element footer +
+ The footer element
+
This property is defined by BasicDialog.
+
+ +
+

header

+ public YAHOO.ext.Element header +
+ The header element
+
This property is defined by BasicDialog.
+
+ +
+

zseed

+ public Number zseed +
+ The starting z-index for BasicDialogs - defaults to 10000
+
This property is defined by BasicDialog.
+
+
+ + +

Constructor Details

+
+
+

LayoutDialog

+ public function LayoutDialog(String/HTMLElement/YAHOO.ext.Element el, Object config) +
+
+ Parameters: +
  • el : String/HTMLElement/YAHOO.ext.Element
    The id of or container element
  • config : Object
    configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addButton

+ public function addButton(String/Object config, Function handler, [Object scope]) +
+ Adds a button. +
+ Parameters: +
  • config : String/Object
    A string becomes the button text, an object is expected to be a valid YAHOO.ext.DomHelper element config
  • handler : Function
    The function called when the button is clicked
  • scope : Object
    (optional) The scope of the handler function
+ Returns: +
    +
  • YAHOO.ext.BasicDialog.Button
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addKeyListener

+ public function addKeyListener(Number/Array/Object key, Function fn, [Object scope]) +
+ Adds a key listener for when this dialog is displayed +
+ Parameters: +
  • key : Number/Array/Object
    Either the numeric key code, array of key codes or an object with the following options: {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)}
  • fn : Function
    The function to call
  • scope : Object
    (optional) The scope of the function
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

beginUpdate

+ public function beginUpdate() +
+ Deprecated. Begins an update of the layout and sets display to block and visibility to hidden. Use standard beginUpdate/endUpdate on the layout. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutDialog.
+
+ +
+

bringToFront

+ public function bringToFront(String/Object dlg) +
+ Brings the specified dialog to the front +
+ Parameters: +
  • dlg : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

center

+ public function center() +
+ Centers this dialog +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy([Boolean removeEl]) +
+ Destroys this dialog +
+ Parameters: +
  • removeEl : Boolean
    (optional) true to remove the element from the DOM
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

endUpdate

+ public function endUpdate() +
+ Deprecated. Ends update of the layout and resets display to none. Use standard beginUpdate/endUpdate on the layout. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutDialog.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

get

+ public function get(String/Object id) +
+ Gets a registered dialog by id +
+ Parameters: +
  • id : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element for this dialog +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

getLayout

+ public function getLayout() +
+ Get the BorderLayout for this dialog +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BorderLayout
  • +
+
+
+
This method is defined by LayoutDialog.
+
+ +
+

getTabs

+ public function getTabs() +
+ Returns the TabPanel component (if autoTabs) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.TabPanel
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

hide

+ public function hide([Function callback]) +
+ Hides the dialog. +
+ Parameters: +
  • callback : Function
    (optional) Function to call when the dialog is hidden
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if the dialog is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

moveTo

+ public function moveTo(Number x, Number y) +
+ Moves the dialog to the specified point +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

resizeTo

+ public function resizeTo(Number width, Number height) +
+ Resizes the dialog. +
+ Parameters: +
  • width : Number
  • height : Number
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

restoreState

+ public function restoreState() +
+ Restores the previous state of the dialog if YAHOO.ext.state is configured +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

sendToBack

+ public function sendToBack(String/Object dlg) +
+ Sends the specified dialog to the back +
+ Parameters: +
  • dlg : String/Object
    The id of the dialog or a dialog
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

setDefaultButton

+ public function setDefaultButton(YAHOO.ext.BasicDialog.Button btn) +
+ Sets the default button to be focused when the dialog is displayed +
+ Parameters: +
  • btn : YAHOO.ext.BasicDialog.Button
    The button object returned by addButton
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

show

+ public function show([String/HTMLElement/YAHOO.ext.Element animateTarget]) +
+ Shows the dialog. +
+ Parameters: +
  • animateTarget : String/HTMLElement/YAHOO.ext.Element
    (optional) Reset the animation target
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

toBack

+ public function toBack() +
+ Sends this dialog to the back (under) of any other visible dialogs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+ +
+

toFront

+ public function toFront() +
+ Brings this dialog to the front of any other visible dialogs +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BasicDialog
    this
  • +
+
+
+
This method is defined by BasicDialog.
+
+
+ +

Event Details

+
+ +
+

beforehide

+ public event beforehide +
+ Fires before this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

beforeshow

+ public event beforeshow +
+ Fires before this dialog is shown. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

hide

+ public event hide +
+ Fires when this dialog is hidden. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+ +
+

keydown

+ public event keydown +
+ Fires when a key is pressed +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by BasicDialog.
+
+ +
+

move

+ public event move +
+ Fires when this dialog is moved by the user. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • x : Number
    The new page X
  • y : Number
    The new page Y
+
+
+
This event is defined by BasicDialog.
+
+ +
+

resize

+ public event resize +
+ Fires when this dialog is resized by the user. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
  • width : Number
    The new width
  • height : Number
    The new height
+
+
+
This event is defined by BasicDialog.
+
+ +
+

show

+ public event show +
+ Fires when this dialog is shown. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.BasicDialog
+
+
+
This event is defined by BasicDialog.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutManager.html b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutManager.html new file mode 100644 index 000000000..185741573 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutManager.html @@ -0,0 +1,444 @@ + + + + YAHOO.ext.LayoutManager + + + + + +
+ +

Class YAHOO.ext.LayoutManager

+ + + + + + +
Package:YAHOO.ext
Class:LayoutManager
Extends:Observable
Subclasses:BorderLayout
Defined In:LayoutManager.js
+
+ Base class for layout managers.
+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 monitorWindowResize : BooleanLayoutManager
false to disable window resize monitoring
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 beginUpdate() : voidLayoutManager
Suspend the LayoutManager from doing auto-layouts while +making multiple add or remove calls
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 endUpdate(Boolean noLayout) : voidLayoutManager
Restore auto-layouts and optionally disable the manager from performing a layout
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementLayoutManager
Returns the element this layout is bound to.
 getRegion(String target) : YAHOO.ext.LayoutRegionLayoutManager
Returns the specified region.
 getViewSize() : ObjectLayoutManager
Returns the size of the current view, This method normalizes document.body and element embedded layouts and +performs ...
 isUpdating() : BooleanLayoutManager
Returns true if this layout is currently being updated
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 layout : (YAHOO.ext.LayoutManager this)LayoutManager
Fires when a layout is performed.
 regioncollapsed : (YAHOO.ext.LayoutRegion region)LayoutManager
Fires when a region is collapsed.
 regionexpanded : (YAHOO.ext.LayoutRegion region)LayoutManager
Fires when a region is expanded.
 regionresized : (YAHOO.ext.LayoutRegion region, Number newSize)LayoutManager
Fires when the user resizes a region.
+ +

Property Details

+
+ +
+

monitorWindowResize

+ public Boolean monitorWindowResize +
+ false to disable window resize monitoring
+
This property is defined by LayoutManager.
+
+
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

beginUpdate

+ public function beginUpdate() +
+ Suspend the LayoutManager from doing auto-layouts while +making multiple add or remove calls +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

endUpdate

+ public function endUpdate(Boolean noLayout) +
+ Restore auto-layouts and optionally disable the manager from performing a layout +
+ Parameters: +
  • noLayout : Boolean
    true to disable a layout update
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this layout is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

getRegion

+ public function getRegion(String target) +
+ Returns the specified region. +
+ Parameters: +
  • target : String
    The region key
+ Returns: +
    +
  • YAHOO.ext.LayoutRegion
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

getViewSize

+ public function getViewSize() +
+ Returns the size of the current view, This method normalizes document.body and element embedded layouts and +performs box-model adjustments. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    The size as an object {width: (the width), height: (the height)}
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

isUpdating

+ public function isUpdating() +
+ Returns true if this layout is currently being updated +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutManager.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+
+ +

Event Details

+
+ +
+

layout

+ public event layout +
+ Fires when a layout is performed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutManager
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regioncollapsed

+ public event regioncollapsed +
+ Fires when a region is collapsed. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regionexpanded

+ public event regionexpanded +
+ Fires when a region is expanded. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutManager.
+
+ +
+

regionresized

+ public event regionresized +
+ Fires when the user resizes a region. +
+ Subscribers will be called with the following parameters: +
  • region : YAHOO.ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutManager.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutRegion.html b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutRegion.html new file mode 100644 index 000000000..47432cc1b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.LayoutRegion.html @@ -0,0 +1,881 @@ + + + + YAHOO.ext.LayoutRegion + + + + + +
+ +

Class YAHOO.ext.LayoutRegion

+ + + + + + +
Package:YAHOO.ext
Class:LayoutRegion
Extends:Observable
Subclasses:SplitLayoutRegion
Defined In:LayoutRegion.js
+
+ This class represents a region in a layout manager.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : YAHOO.ext.ElementLayoutRegion
This regions body element
 collapsedEl : YAHOO.ext.ElementLayoutRegion
This regions collapsed element
 el : YAHOO.ext.ElementLayoutRegion
This regions container element
 panels : YAHOO.ext.util.MixedCollectionLayoutRegion
A collection of panels in this region.
 titleEl : YAHOO.ext.ElementLayoutRegion
This regions title element
 titleTextEl : HTMLElementLayoutRegion
This regions title text element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(ContentPanel... panel) : YAHOO.ext.ContentPanelLayoutRegion
Add the passed ContentPanel(s)
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 collapse([Boolean skipAnim]) : voidLayoutRegion
Collapses this region.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 expand(YAHOO.ext.EventObject e, [Boolean skipAnim]) : voidLayoutRegion
Expand this region if it was previously collapsed.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getActivePanel() : YAHOO.ext.ContentPanelLayoutRegion
Get the active panel for this region.
 getEl() : YAHOO.ext.ElementLayoutRegion
Returns the container element for this region.
 getPanel(Number/String/ContentPanel panel) : YAHOO.ext.ContentPanelLayoutRegion
Returns the panel specified or null if it's not in this region.
 getPosition() : StringLayoutRegion
Returns this regions position (north/south/east/west/center).
 getTabs() : YAHOO.ext.TabPanelLayoutRegion
Returns the TabPanel component used by this region
 hasPanel(Number/String/ContentPanel panel) : BooleanLayoutRegion
Returns true if the panel is in this region.
 hide() : voidLayoutRegion
Hides this region.
 hidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Hides the tab for the specified panel.
 isVisible() : BooleanLayoutRegion
Returns true if this region is currently visible.
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Number/String/ContentPanel panel, Boolean preservePanel) : YAHOO.ext.ContentPanelLayoutRegion
Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number newSize) : voidLayoutRegion
Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (...
 show() : voidLayoutRegion
Shows this region if it was previously hidden.
 showPanel(Number/String/ContentPanel panelId) : YAHOO.ext.ContentPanelLayoutRegion
Show the specified panel.
 unhidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Unhides the tab for a previously hidden panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 collapsed : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when this region is collapsed.
 expanded : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when this region is expanded.
 invalidated : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when the layout for this region is changed.
 panelactivated : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is activated.
 paneladded : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is added.
 panelremoved : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is removed.
 resized : (YAHOO.ext.LayoutRegion this, Number newSize)LayoutRegion
Fires when the user resizes this region.
 visibilitychange : (YAHOO.ext.LayoutRegion this, Boolean visibility)LayoutRegion
Fires when this region is shown or hidden
+ +

Property Details

+
+ +
+

bodyEl

+ public YAHOO.ext.Element bodyEl +
+ This regions body element
+
This property is defined by LayoutRegion.
+
+ +
+

collapsedEl

+ public YAHOO.ext.Element collapsedEl +
+ This regions collapsed element
+
This property is defined by LayoutRegion.
+
+ +
+

el

+ public YAHOO.ext.Element el +
+ This regions container element
+
This property is defined by LayoutRegion.
+
+ +
+

panels

+ public YAHOO.ext.util.MixedCollection panels +
+ A collection of panels in this region.
+
This property is defined by LayoutRegion.
+
+ +
+

titleEl

+ public YAHOO.ext.Element titleEl +
+ This regions title element
+
This property is defined by LayoutRegion.
+
+ +
+

titleTextEl

+ public HTMLElement titleTextEl +
+ This regions title text element
+
This property is defined by LayoutRegion.
+
+
+ + +

Method Details

+
+ +
+

add

+ public function add(ContentPanel... panel) +
+ Add the passed ContentPanel(s) +
+ Parameters: +
  • panel : ContentPanel...
    The ContentPanel(s) to add (you can pass more than one)
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The panel added (if only one was added)
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

collapse

+ public function collapse([Boolean skipAnim]) +
+ Collapses this region. +
+ Parameters: +
  • skipAnim : Boolean
    (optional) true to collapse the element without animation (if animate is true)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

expand

+ public function expand(YAHOO.ext.EventObject e, [Boolean skipAnim]) +
+ Expand this region if it was previously collapsed. +
+ Parameters: +
  • e : YAHOO.ext.EventObject
    The event that triggered the expand (or null if calling manually)
  • skipAnim : Boolean
    (optional) true to expand the element without animation (if animate is true)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getActivePanel

+ public function getActivePanel() +
+ Get the active panel for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The active panel or null
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the container element for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getPanel

+ public function getPanel(Number/String/ContentPanel panel) +
+ Returns the panel specified or null if it's not in this region. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getPosition

+ public function getPosition() +
+ Returns this regions position (north/south/east/west/center). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getTabs

+ public function getTabs() +
+ Returns the TabPanel component used by this region +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.TabPanel
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hasPanel

+ public function hasPanel(Number/String/ContentPanel panel) +
+ Returns true if the panel is in this region. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hide

+ public function hide() +
+ Hides this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hidePanel

+ public function hidePanel(Number/String/ContentPanel panel) +
+ Hides the tab for the specified panel. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this region is currently visible. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

remove

+ public function remove(Number/String/ContentPanel panel, Boolean preservePanel) +
+ Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
  • preservePanel : Boolean
    Overrides the config preservePanel option
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The panel that was removed
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

resizeTo

+ public function resizeTo(Number newSize) +
+ Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (north, south) the height. +
+ Parameters: +
  • newSize : Number
    The new width or height
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

show

+ public function show() +
+ Shows this region if it was previously hidden. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

showPanel

+ public function showPanel(Number/String/ContentPanel panelId) +
+ Show the specified panel. +
+ Parameters: +
  • panelId : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

unhidePanel

+ public function unhidePanel(Number/String/ContentPanel panel) +
+ Unhides the tab for a previously hidden panel. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+
+ +

Event Details

+
+ +
+

collapsed

+ public event collapsed +
+ Fires when this region is collapsed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

expanded

+ public event expanded +
+ Fires when this region is expanded. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

invalidated

+ public event invalidated +
+ Fires when the layout for this region is changed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

panelactivated

+ public event panelactivated +
+ Fires when a panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The activated panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

paneladded

+ public event paneladded +
+ Fires when a panel is added. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

panelremoved

+ public event panelremoved +
+ Fires when a panel is removed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

resized

+ public event resized +
+ Fires when the user resizes this region. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

visibilitychange

+ public event visibilitychange +
+ Fires when this region is shown or hidden +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • visibility : Boolean
    true or false
+
+
+
This event is defined by LayoutRegion.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.NestedLayoutPanel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.NestedLayoutPanel.html new file mode 100644 index 000000000..dcff01a35 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.NestedLayoutPanel.html @@ -0,0 +1,519 @@ + + + + YAHOO.ext.NestedLayoutPanel + + + + + +
+ +

Class YAHOO.ext.NestedLayoutPanel

+ + + + + +
Package:YAHOO.ext
Class:NestedLayoutPanel
Extends:ContentPanel
Defined In:ContentPanels.js
+
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 NestedLayoutPanel(YAHOO.ext.BorderLayout layout, String/Object config)NestedLayoutPanel
Create a new NestedLayoutPanel.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy() : voidContentPanel
Destroys this panel
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementContentPanel
Returns this panel's element
 getId() : StringContentPanel
Returns this panel's id
 getLayout() : YAHOO.ext.BorderLayoutNestedLayoutPanel
Returns the nested BorderLayout for this panel
 getTitle() : StringContentPanel
Returns this panel's title
 getToolbar() : YAHOO.ext.ToolbarContentPanel
Returns the toolbar for this Panel if one was configured
 getUpdateManager() : YAHOO.ext.UpdateManagerContentPanel
Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates.
 isClosable() : BooleanContentPanel
Returns true is this panel was configured to be closable
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setContent(String content, [Boolean loadScripts]) : voidContentPanel
Updates this panel's element
 setTitle(String title) : voidContentPanel
Set this panel's title
 setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) : YAHOO.ext.UpdateManagerContentPanel
Set a URL to be used to load the content for this panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
 deactivate : (YAHOO.ext.ContentPanel this)ContentPanel
Fires when this panel is activated.
+ + + +

Constructor Details

+
+
+

NestedLayoutPanel

+ public function NestedLayoutPanel(YAHOO.ext.BorderLayout layout, String/Object config) +
+ Create a new NestedLayoutPanel.
+ Parameters: +
  • layout : YAHOO.ext.BorderLayout
    The layout for this panel
  • config : String/Object
    A string to set only the title or a config object
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy() +
+ Destroys this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns this panel's element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getId

+ public function getId() +
+ Returns this panel's id +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getLayout

+ public function getLayout() +
+ Returns the nested BorderLayout for this panel +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.BorderLayout
  • +
+
+
+
This method is defined by NestedLayoutPanel.
+
+ +
+

getTitle

+ public function getTitle() +
+ Returns this panel's title +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getToolbar

+ public function getToolbar() +
+ Returns the toolbar for this Panel if one was configured +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Toolbar
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Get the YAHOO.ext.UpdateManager for this panel. Enables you to perform Ajax updates. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

isClosable

+ public function isClosable() +
+ Returns true is this panel was configured to be closable +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setContent

+ public function setContent(String content, [Boolean loadScripts]) +
+ Updates this panel's element +
+ Parameters: +
  • content : String
    The new content
  • loadScripts : Boolean
    (optional) true to look for and process scripts
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setTitle

+ public function setTitle(String title) +
+ Set this panel's title +
+ Parameters: +
  • title : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContentPanel.
+
+ +
+

setUrl

+ public function setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) +
+ Set a URL to be used to load the content for this panel. +
+ Parameters: +
  • url : String/Function
    The url to load the content from or a function to call to get the url
  • params : String/Object
    (optional) The string params for the update call or an object of the params. See YAHOO.ext.UpdateManager.update for more details. (Defaults to null)
  • loadOnce : Boolean
    (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this panel is activated. (Defaults to false)
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by ContentPanel.
+
+
+ +

Event Details

+
+ +
+

activate

+ public event activate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.ContentPanel
+
+
+
This event is defined by ContentPanel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.Resizable.html b/www/extras/yui-ext/docs/output/YAHOO.ext.Resizable.html new file mode 100644 index 000000000..c870167d1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.Resizable.html @@ -0,0 +1,740 @@ + + + + YAHOO.ext.Resizable + + + + + +
+ +

Class YAHOO.ext.Resizable

+ + + + + +
Package:YAHOO.ext
Class:Resizable
Extends:Observable
Defined In:Resizable.js
+
+

Applies drag handles to an element to make it resizable. The drag handles are inserted into the element +and positioned absolute. Some elements, such as a textarea or image, don't support this. To overcome that, you can wrap +the textarea in a div and set "resizeChild" to true (or the id of the textarea), or set wrap:true in your config and +the element will be wrapped for you automatically.


+Here's a Resizable with every possible config option and it's default value: +

+var resizer = new YAHOO.ext.Resizable('element-id', {
+    resizeChild : false,
+    adjustments : [0, 0],
+    minWidth : 5,
+    minHeight : 5,
+    maxWidth : 10000,
+    maxHeight : 10000,
+    enabled : true,
+    wrap: false, // true to wrap the element
+    width: null, // initial size
+    height: null, // initial size
+    animate : false,
+    duration : .35,
+    dynamic : false,
+    handles : false,
+    multiDirectional : false,
+    disableTrackOver : false,
+    easing : YAHOO.util.Easing ? YAHOO.util.Easing.easeOutStrong : null,
+    widthIncrement : 0,
+    heightIncrement : 0,
+    pinned : false,
+    width : null,
+    height : null,
+    preserveRatio : false,
+    transparent: false,
+    minX: 0,
+    minY: 0,
+    draggable: false
+});
+resizer.on('resize', myHandler);
+
+

+To hide a particular handle, set it's display to none in CSS, or through script:
+resizer.east.setDisplayed(false); +

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 adjustments : Array/StringResizable
String "auto" or an array [width, height] with values to be added to the resize operation's new size.
 animate : BooleanResizable
True to animate the resize (not compatible with dynamic sizing)
 disableTrackOver : BooleanResizable
true to disable mouse tracking. This is only applied at config time.
 draggable : BooleanResizable
convenience to initialize drag drop.
 duration : FloatResizable
Animation duration
 dynamic : BooleanResizable
True to resize the element while dragging instead of using a proxy
 easing : YAHOO.util.EasingResizable
Animation easing
 enabled : BooleanResizable
false to disable resizing
 handles : StringResizable
String consisting of the resize handles to display. Valid handles are +n (north), s (south) e (east), w (west), ne (n...
 height : NumberResizable
The initial height for the element
 heightIncrement : NumberResizable
The increment to snap the height resize in pixels (dynamic must be true)
 maxHeight : NumberResizable
The maximum height for the element
 maxWidth : NumberResizable
The maximum width for the element
 minHeight : NumberResizable
The minimum height for the element
 minWidth : NumberResizable
The minimum width for the element
 minX : NumberResizable
The minimum allowed page X for the element (only used for west resizing, defaults to 0)
 minY : NumberResizable
The minimum allowed page Y for the element (only used for north resizing, defaults to 0)
 pinned : BooleanResizable
true to pin the resize handles. This is only applied at config time.
 preserveRatio : BooleanResizable
true to preserve the initial size ratio.
 resizeChild : YAHOO.ext.ElementResizable
True to resizeSize the first child or id/element to resize
 transparent : BooleanResizable
true for transparent handles. This is only applied at config time.
 width : NumberResizable
The initial width for the element
 widthIncrement : NumberResizable
The increment to snap the width resize in pixels (dynamic must be true)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Resizable(String/HTMLElement/YAHOO.ext.Element el, Object config)Resizable
Create a new resizable component
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementResizable
Returns the element this component is bound to.
 getResizeChild() : YAHOO.ext.ElementResizable
Returns the resizeChild element (or null).
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number width, Number height) : voidResizable
Perform a manual resize
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeresize : (YAHOO.ext.Resizable this, YAHOO.ext.EventObject e)Resizable
Fired before resize is allowed. Set enabled to false to cancel resize.
 resize : (YAHOO.ext.Resizable this, Number width, Number height, YAHOO.ext.EventObject e)Resizable
Fired after a resize.
+ +

Property Details

+
+ +
+

adjustments

+ public Array/String adjustments +
+ String "auto" or an array [width, height] with values to be added to the resize operation's new size.
+
This property is defined by Resizable.
+
+ +
+

animate

+ public Boolean animate +
+ True to animate the resize (not compatible with dynamic sizing)
+
This property is defined by Resizable.
+
+ +
+

disableTrackOver

+ public Boolean disableTrackOver +
+ true to disable mouse tracking. This is only applied at config time.
+
This property is defined by Resizable.
+
+ +
+

draggable

+ public Boolean draggable +
+ convenience to initialize drag drop.
+
This property is defined by Resizable.
+
+ +
+

duration

+ public Float duration +
+ Animation duration
+
This property is defined by Resizable.
+
+ +
+

dynamic

+ public Boolean dynamic +
+ True to resize the element while dragging instead of using a proxy
+
This property is defined by Resizable.
+
+ +
+

easing

+ public YAHOO.util.Easing easing +
+ Animation easing
+
This property is defined by Resizable.
+
+ +
+

enabled

+ public Boolean enabled +
+ false to disable resizing
+
This property is defined by Resizable.
+
+ +
+

handles

+ public String handles +
+ String consisting of the resize handles to display. Valid handles are +n (north), s (south) e (east), w (west), ne (northeast), nw (northwest), se (southeast), sw (southwest) +and all (which applies them all). If this is blank it defaults to "e,s,se". Handles can be delimited using +a space, comma or semi-colon. This is only applied at config time.
+
This property is defined by Resizable.
+
+ +
+

height

+ public Number height +
+ The initial height for the element
+
This property is defined by Resizable.
+
+ +
+

heightIncrement

+ public Number heightIncrement +
+ The increment to snap the height resize in pixels (dynamic must be true)
+
This property is defined by Resizable.
+
+ +
+

maxHeight

+ public Number maxHeight +
+ The maximum height for the element
+
This property is defined by Resizable.
+
+ +
+

maxWidth

+ public Number maxWidth +
+ The maximum width for the element
+
This property is defined by Resizable.
+
+ +
+

minHeight

+ public Number minHeight +
+ The minimum height for the element
+
This property is defined by Resizable.
+
+ +
+

minWidth

+ public Number minWidth +
+ The minimum width for the element
+
This property is defined by Resizable.
+
+ +
+

minX

+ public Number minX +
+ The minimum allowed page X for the element (only used for west resizing, defaults to 0)
+
This property is defined by Resizable.
+
+ +
+

minY

+ public Number minY +
+ The minimum allowed page Y for the element (only used for north resizing, defaults to 0)
+
This property is defined by Resizable.
+
+ +
+

pinned

+ public Boolean pinned +
+ true to pin the resize handles. This is only applied at config time.
+
This property is defined by Resizable.
+
+ +
+

preserveRatio

+ public Boolean preserveRatio +
+ true to preserve the initial size ratio.
+
This property is defined by Resizable.
+
+ +
+

resizeChild

+ public YAHOO.ext.Element resizeChild +
+ True to resizeSize the first child or id/element to resize
+
This property is defined by Resizable.
+
+ +
+

transparent

+ public Boolean transparent +
+ true for transparent handles. This is only applied at config time.
+
This property is defined by Resizable.
+
+ +
+

width

+ public Number width +
+ The initial width for the element
+
This property is defined by Resizable.
+
+ +
+

widthIncrement

+ public Number widthIncrement +
+ The increment to snap the width resize in pixels (dynamic must be true)
+
This property is defined by Resizable.
+
+
+ + +

Constructor Details

+
+
+

Resizable

+ public function Resizable(String/HTMLElement/YAHOO.ext.Element el, Object config) +
+ Create a new resizable component
+ Parameters: +
  • el : String/HTMLElement/YAHOO.ext.Element
    The id or element to resize
  • config : Object
    configuration options
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this component is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by Resizable.
+
+ +
+

getResizeChild

+ public function getResizeChild() +
+ Returns the resizeChild element (or null). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by Resizable.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

resizeTo

+ public function resizeTo(Number width, Number height) +
+ Perform a manual resize +
+ Parameters: +
  • width : Number
  • height : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Resizable.
+
+
+ +

Event Details

+
+ +
+

beforeresize

+ public event beforeresize +
+ Fired before resize is allowed. Set enabled to false to cancel resize. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.Resizable
  • e : YAHOO.ext.EventObject
    The mousedown event
+
+
+
This event is defined by Resizable.
+
+ +
+

resize

+ public event resize +
+ Fired after a resize. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.Resizable
  • width : Number
    The new width
  • height : Number
    The new height
  • e : YAHOO.ext.EventObject
    The mouseup event
+
+
+
This event is defined by Resizable.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.html b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.html new file mode 100644 index 000000000..e24f80f2a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.html @@ -0,0 +1,202 @@ + + + + YAHOO.ext.SplitBar.AbsoluteLayoutAdapter + + + + + +
+ +

Class YAHOO.ext.SplitBar.AbsoluteLayoutAdapter

+ + + + + +
Package:YAHOO.ext
Class:SplitBar.AbsoluteLayoutAdapter
Extends:SplitBar.BasicLayoutAdapter
Defined In:SplitBar.js
+
+ Adapter that moves the splitter element to align with the resized sizing element. +Used with an absolute positioned SplitBar.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 BOTTOM<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is positioned under splitter element
 HORIZONTAL<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Orientation constant - Create a horizontal SplitBar
 LEFT<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is to the left of the splitter element
 RIGHT<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is to the right of the splitter element
 TOP<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Placement constant - The resizing element is positioned above the splitter element
 VERTICAL<static> : NumberSplitBar.AbsoluteLayoutAdapter
<static> Orientation constant - Create a vertical SplitBar
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getElementSize(YAHOO.ext.SplitBar s) : voidSplitBar.BasicLayoutAdapter
Called before drag operations to get the current size of the resizing element.
 setElementSize(YAHOO.ext.SplitBar s, Number newSize, Function onComplete) : voidSplitBar.BasicLayoutAdapter
Called after drag operations to set the size of the resizing element.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

BOTTOM<static>

+ public Number BOTTOM<static> +
+ <static> Placement constant - The resizing element is positioned under splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

HORIZONTAL<static>

+ public Number HORIZONTAL<static> +
+ <static> Orientation constant - Create a horizontal SplitBar
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

LEFT<static>

+ public Number LEFT<static> +
+ <static> Placement constant - The resizing element is to the left of the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

RIGHT<static>

+ public Number RIGHT<static> +
+ <static> Placement constant - The resizing element is to the right of the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

TOP<static>

+ public Number TOP<static> +
+ <static> Placement constant - The resizing element is positioned above the splitter element
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+ +
+

VERTICAL<static>

+ public Number VERTICAL<static> +
+ <static> Orientation constant - Create a vertical SplitBar
+
This property is defined by SplitBar.AbsoluteLayoutAdapter.
+
+
+ + +

Method Details

+
+ +
+

getElementSize

+ public function getElementSize(YAHOO.ext.SplitBar s) +
+ Called before drag operations to get the current size of the resizing element. +
+ Parameters: +
  • s : YAHOO.ext.SplitBar
    The SplitBar using this adapter
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+ +
+

setElementSize

+ public function setElementSize(YAHOO.ext.SplitBar s, Number newSize, Function onComplete) +
+ Called after drag operations to set the size of the resizing element. +
+ Parameters: +
  • s : YAHOO.ext.SplitBar
    The SplitBar using this adapter
  • newSize : Number
    The new size to set
  • onComplete : Function
    A function to be invoke when resizing is complete
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.BasicLayoutAdapter.html b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.BasicLayoutAdapter.html new file mode 100644 index 000000000..86644a88b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.BasicLayoutAdapter.html @@ -0,0 +1,98 @@ + + + + YAHOO.ext.SplitBar.BasicLayoutAdapter + + + + + +
+ +

Class YAHOO.ext.SplitBar.BasicLayoutAdapter

+ + + + + + +
Package:YAHOO.ext
Class:SplitBar.BasicLayoutAdapter
Extends:Object
Subclasses:SplitBar.AbsoluteLayoutAdapter
Defined In:SplitBar.js
+
+ Default Adapter. It assumes the splitter and resizing element are not positioned +elements and only gets/sets the width of the element. Generally used for table based layouts.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getElementSize(YAHOO.ext.SplitBar s) : voidSplitBar.BasicLayoutAdapter
Called before drag operations to get the current size of the resizing element.
 setElementSize(YAHOO.ext.SplitBar s, Number newSize, Function onComplete) : voidSplitBar.BasicLayoutAdapter
Called after drag operations to set the size of the resizing element.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

getElementSize

+ public function getElementSize(YAHOO.ext.SplitBar s) +
+ Called before drag operations to get the current size of the resizing element. +
+ Parameters: +
  • s : YAHOO.ext.SplitBar
    The SplitBar using this adapter
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+ +
+

setElementSize

+ public function setElementSize(YAHOO.ext.SplitBar s, Number newSize, Function onComplete) +
+ Called after drag operations to set the size of the resizing element. +
+ Parameters: +
  • s : YAHOO.ext.SplitBar
    The SplitBar using this adapter
  • newSize : Number
    The new size to set
  • onComplete : Function
    A function to be invoke when resizing is complete
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.BasicLayoutAdapter.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.html b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.html new file mode 100644 index 000000000..c2dfffbac --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitBar.html @@ -0,0 +1,524 @@ + + + + YAHOO.ext.SplitBar + + + + + +
+ +

Class YAHOO.ext.SplitBar

+ + + + + +
Package:YAHOO.ext
Class:SplitBar
Extends:Observable
Defined In:SplitBar.js
+
+ Creates draggable splitter bar functionality from two elements. +

+Usage: +

+var split = new YAHOO.ext.SplitBar('elementToDrag', 'elementToSize', 
+                   YAHOO.ext.SplitBar.HORIZONTAL, YAHOO.ext.SplitBar.LEFT);
+split.setAdapter(new YAHOO.ext.SplitBar.AbsoluteLayoutAdapter("container"));
+split.minSize = 100;
+split.maxSize = 600;
+split.animate = true;
+split.onMoved.subscribe(splitterMoved);
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 animate : BooleanSplitBar
Whether to animate the transition to the new size
 maxSize : NumberSplitBar
The maximum size of the resizing element. (Defaults to 2000)
 minSize : NumberSplitBar
The minimum size of the resizing element. (Defaults to 0)
 useShim : BooleanSplitBar
Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 SplitBar(String/HTMLElement/Element dragElement, String/HTMLElement/Element resizingElement, [Number orientation], [Number placement])SplitBar
Create a new SplitBar
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getAdapter() : TheSplitBar
Get the adapter this SplitBar uses
 getMaximumSize() : NumberSplitBar
Gets the maximum size for the resizing element
 getMinimumSize() : NumberSplitBar
Gets the minimum size for the resizing element
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setAdapter(Object adapter) : voidSplitBar
Set the adapter this SplitBar uses
 setCurrentSize(Number size) : voidSplitBar
Sets the initialize size for the resizing element
 setMaximumSize(Number maxSize) : voidSplitBar
Sets the maximum size for the resizing element
 setMinimumSize(Number minSize) : voidSplitBar
Sets the minimum size for the resizing element
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeresize : (YAHOO.ext.SplitBar this)SplitBar
Fires before the splitter is dragged
 moved : (YAHOO.ext.SplitBar this, Number newSize)SplitBar
Fires when the splitter is moved
 resize : (YAHOO.ext.SplitBar this, Number newSize)SplitBar
Fires when the splitter is moved (alias for moved)
+ +

Property Details

+
+ +
+

animate

+ public Boolean animate +
+ Whether to animate the transition to the new size
+
This property is defined by SplitBar.
+
+ +
+

maxSize

+ public Number maxSize +
+ The maximum size of the resizing element. (Defaults to 2000)
+
This property is defined by SplitBar.
+
+ +
+

minSize

+ public Number minSize +
+ The minimum size of the resizing element. (Defaults to 0)
+
This property is defined by SplitBar.
+
+ +
+

useShim

+ public Boolean useShim +
+ Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes.
+
This property is defined by SplitBar.
+
+
+ + +

Constructor Details

+
+
+

SplitBar

+ public function SplitBar(String/HTMLElement/Element dragElement, String/HTMLElement/Element resizingElement, [Number orientation], [Number placement]) +
+ Create a new SplitBar
+ Parameters: +
  • dragElement : String/HTMLElement/Element
    The element to be dragged and act as the SplitBar.
  • resizingElement : String/HTMLElement/Element
    The element to be resized based on where the SplitBar element is dragged
  • orientation : Number
    (optional) Either YAHOO.ext.SplitBar.HORIZONTAL or YAHOO.ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL)
  • placement : Number
    (optional) Either YAHOO.ext.SplitBar.LEFT or YAHOO.ext.SplitBar.RIGHT for horizontal or YAHOO.ext.SplitBar.TOP or YAHOO.ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position position of the SplitBar).
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getAdapter

+ public function getAdapter() +
+ Get the adapter this SplitBar uses +
+ Parameters: +
  • None.
+ Returns: +
    +
  • The
    adapter object
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

getMaximumSize

+ public function getMaximumSize() +
+ Gets the maximum size for the resizing element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The maximum size
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

getMinimumSize

+ public function getMinimumSize() +
+ Gets the minimum size for the resizing element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    The minimum size
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setAdapter

+ public function setAdapter(Object adapter) +
+ Set the adapter this SplitBar uses +
+ Parameters: +
  • adapter : Object
    A SplitBar adapter object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

setCurrentSize

+ public function setCurrentSize(Number size) +
+ Sets the initialize size for the resizing element +
+ Parameters: +
  • size : Number
    The initial size
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

setMaximumSize

+ public function setMaximumSize(Number maxSize) +
+ Sets the maximum size for the resizing element +
+ Parameters: +
  • maxSize : Number
    The maximum size
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.
+
+ +
+

setMinimumSize

+ public function setMinimumSize(Number minSize) +
+ Sets the minimum size for the resizing element +
+ Parameters: +
  • minSize : Number
    The minimum size
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by SplitBar.
+
+
+ +

Event Details

+
+ +
+

beforeresize

+ public event beforeresize +
+ Fires before the splitter is dragged +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.SplitBar
+
+
+
This event is defined by SplitBar.
+
+ +
+

moved

+ public event moved +
+ Fires when the splitter is moved +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.SplitBar
  • newSize : Number
    the new width or height
+
+
+
This event is defined by SplitBar.
+
+ +
+

resize

+ public event resize +
+ Fires when the splitter is moved (alias for moved) +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.SplitBar
  • newSize : Number
    the new width or height
+
+
+
This event is defined by SplitBar.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.SplitLayoutRegion.html b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitLayoutRegion.html new file mode 100644 index 000000000..baeb4c10e --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.SplitLayoutRegion.html @@ -0,0 +1,921 @@ + + + + YAHOO.ext.SplitLayoutRegion + + + + + +
+ +

Class YAHOO.ext.SplitLayoutRegion

+ + + + + +
Package:YAHOO.ext
Class:SplitLayoutRegion
Extends:LayoutRegion
Defined In:SplitLayoutRegion.js
+
+ Adds a splitbar and other (private) useful functionality to a LayoutRegion
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : YAHOO.ext.ElementLayoutRegion
This regions body element
 collapsedEl : YAHOO.ext.ElementLayoutRegion
This regions collapsed element
 el : YAHOO.ext.ElementLayoutRegion
This regions container element
 panels : YAHOO.ext.util.MixedCollectionLayoutRegion
A collection of panels in this region.
 split : YAHOO.ext.SplitBarSplitLayoutRegion
The SplitBar for this region
 titleEl : YAHOO.ext.ElementLayoutRegion
This regions title element
 titleTextEl : HTMLElementLayoutRegion
This regions title text element
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(ContentPanel... panel) : YAHOO.ext.ContentPanelLayoutRegion
Add the passed ContentPanel(s)
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 collapse([Boolean skipAnim]) : voidLayoutRegion
Collapses this region.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 expand(YAHOO.ext.EventObject e, [Boolean skipAnim]) : voidLayoutRegion
Expand this region if it was previously collapsed.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getActivePanel() : YAHOO.ext.ContentPanelLayoutRegion
Get the active panel for this region.
 getEl() : YAHOO.ext.ElementLayoutRegion
Returns the container element for this region.
 getPanel(Number/String/ContentPanel panel) : YAHOO.ext.ContentPanelLayoutRegion
Returns the panel specified or null if it's not in this region.
 getPosition() : StringLayoutRegion
Returns this regions position (north/south/east/west/center).
 getSplitBar() : YAHOO.ext.SplitBarSplitLayoutRegion
Returns the SplitBar for this region.
 getTabs() : YAHOO.ext.TabPanelLayoutRegion
Returns the TabPanel component used by this region
 hasPanel(Number/String/ContentPanel panel) : BooleanLayoutRegion
Returns true if the panel is in this region.
 hide() : voidLayoutRegion
Hides this region.
 hidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Hides the tab for the specified panel.
 isVisible() : BooleanLayoutRegion
Returns true if this region is currently visible.
 purgeListeners() : voidObservable
Removes all listeners for this object
 remove(Number/String/ContentPanel panel, Boolean preservePanel) : YAHOO.ext.ContentPanelLayoutRegion
Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 resizeTo(Number newSize) : voidLayoutRegion
Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (...
 show() : voidLayoutRegion
Shows this region if it was previously hidden.
 showPanel(Number/String/ContentPanel panelId) : YAHOO.ext.ContentPanelLayoutRegion
Show the specified panel.
 unhidePanel(Number/String/ContentPanel panel) : voidLayoutRegion
Unhides the tab for a previously hidden panel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 collapsed : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when this region is collapsed.
 expanded : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when this region is expanded.
 invalidated : (YAHOO.ext.LayoutRegion this)LayoutRegion
Fires when the layout for this region is changed.
 panelactivated : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is activated.
 paneladded : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is added.
 panelremoved : (YAHOO.ext.LayoutRegion this, YAHOO.ext.ContentPanel panel)LayoutRegion
Fires when a panel is removed.
 resized : (YAHOO.ext.LayoutRegion this, Number newSize)LayoutRegion
Fires when the user resizes this region.
 visibilitychange : (YAHOO.ext.LayoutRegion this, Boolean visibility)LayoutRegion
Fires when this region is shown or hidden
+ +

Property Details

+
+ +
+

bodyEl

+ public YAHOO.ext.Element bodyEl +
+ This regions body element
+
This property is defined by LayoutRegion.
+
+ +
+

collapsedEl

+ public YAHOO.ext.Element collapsedEl +
+ This regions collapsed element
+
This property is defined by LayoutRegion.
+
+ +
+

el

+ public YAHOO.ext.Element el +
+ This regions container element
+
This property is defined by LayoutRegion.
+
+ +
+

panels

+ public YAHOO.ext.util.MixedCollection panels +
+ A collection of panels in this region.
+
This property is defined by LayoutRegion.
+
+ +
+

split

+ public YAHOO.ext.SplitBar split +
+ The SplitBar for this region
+
This property is defined by SplitLayoutRegion.
+
+ +
+

titleEl

+ public YAHOO.ext.Element titleEl +
+ This regions title element
+
This property is defined by LayoutRegion.
+
+ +
+

titleTextEl

+ public HTMLElement titleTextEl +
+ This regions title text element
+
This property is defined by LayoutRegion.
+
+
+ + +

Method Details

+
+ +
+

add

+ public function add(ContentPanel... panel) +
+ Add the passed ContentPanel(s) +
+ Parameters: +
  • panel : ContentPanel...
    The ContentPanel(s) to add (you can pass more than one)
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The panel added (if only one was added)
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

collapse

+ public function collapse([Boolean skipAnim]) +
+ Collapses this region. +
+ Parameters: +
  • skipAnim : Boolean
    (optional) true to collapse the element without animation (if animate is true)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

expand

+ public function expand(YAHOO.ext.EventObject e, [Boolean skipAnim]) +
+ Expand this region if it was previously collapsed. +
+ Parameters: +
  • e : YAHOO.ext.EventObject
    The event that triggered the expand (or null if calling manually)
  • skipAnim : Boolean
    (optional) true to expand the element without animation (if animate is true)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getActivePanel

+ public function getActivePanel() +
+ Get the active panel for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The active panel or null
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the container element for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getPanel

+ public function getPanel(Number/String/ContentPanel panel) +
+ Returns the panel specified or null if it's not in this region. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getPosition

+ public function getPosition() +
+ Returns this regions position (north/south/east/west/center). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

getSplitBar

+ public function getSplitBar() +
+ Returns the SplitBar for this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.SplitBar
  • +
+
+
+
This method is defined by SplitLayoutRegion.
+
+ +
+

getTabs

+ public function getTabs() +
+ Returns the TabPanel component used by this region +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.TabPanel
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hasPanel

+ public function hasPanel(Number/String/ContentPanel panel) +
+ Returns true if the panel is in this region. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hide

+ public function hide() +
+ Hides this region. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

hidePanel

+ public function hidePanel(Number/String/ContentPanel panel) +
+ Hides the tab for the specified panel. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

isVisible

+ public function isVisible() +
+ Returns true if this region is currently visible. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

remove

+ public function remove(Number/String/ContentPanel panel, Boolean preservePanel) +
+ Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
  • preservePanel : Boolean
    Overrides the config preservePanel option
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The panel that was removed
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

resizeTo

+ public function resizeTo(Number newSize) +
+ Resizes the region to the specified size. For vertical regions (west, east) this adjusts +the width, for horizontal (north, south) the height. +
+ Parameters: +
  • newSize : Number
    The new width or height
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

show

+ public function show() +
+ Shows this region if it was previously hidden. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

showPanel

+ public function showPanel(Number/String/ContentPanel panelId) +
+ Show the specified panel. +
+ Parameters: +
  • panelId : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • YAHOO.ext.ContentPanel
    The shown panel or null
  • +
+
+
+
This method is defined by LayoutRegion.
+
+ +
+

unhidePanel

+ public function unhidePanel(Number/String/ContentPanel panel) +
+ Unhides the tab for a previously hidden panel. +
+ Parameters: +
  • panel : Number/String/ContentPanel
    The panels index, id or the panel itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LayoutRegion.
+
+
+ +

Event Details

+
+ +
+

collapsed

+ public event collapsed +
+ Fires when this region is collapsed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

expanded

+ public event expanded +
+ Fires when this region is expanded. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

invalidated

+ public event invalidated +
+ Fires when the layout for this region is changed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

panelactivated

+ public event panelactivated +
+ Fires when a panel is activated. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The activated panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

paneladded

+ public event paneladded +
+ Fires when a panel is added. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

panelremoved

+ public event panelremoved +
+ Fires when a panel is removed. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • panel : YAHOO.ext.ContentPanel
    The panel
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

resized

+ public event resized +
+ Fires when the user resizes this region. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • newSize : Number
    The new size (width for east/west, height for north/south)
+
+
+
This event is defined by LayoutRegion.
+
+ +
+

visibilitychange

+ public event visibilitychange +
+ Fires when this region is shown or hidden +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.LayoutRegion
  • visibility : Boolean
    true or false
+
+
+
This event is defined by LayoutRegion.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanel.html new file mode 100644 index 000000000..2b75d35ad --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanel.html @@ -0,0 +1,813 @@ + + + + YAHOO.ext.TabPanel + + + + + +
+ +

Class YAHOO.ext.TabPanel

+ + + + + +
Package:YAHOO.ext
Class:TabPanel
Extends:Observable
Defined In:TabPanel.js
+
+ Creates a lightweight TabPanel component using Yahoo! UI. +

+Usage: +

+    // basic tabs 1, built from existing content
+    var tabs = new YAHOO.ext.TabPanel('tabs1');
+    tabs.addTab('script', "View Script");
+    tabs.addTab('markup', "View Markup");
+    tabs.activate('script');
+    
+    // more advanced tabs, built from javascript
+    var jtabs = new YAHOO.ext.TabPanel('jtabs');
+    jtabs.addTab('jtabs-1', "Normal Tab", "My content was added during construction.");
+    
+    // set up the UpdateManager
+    var tab2 = jtabs.addTab('jtabs-2', "Ajax Tab 1");
+    var updater = tab2.getUpdateManager();
+    updater.setDefaultUrl('ajax1.htm');
+    tab2.onActivate.subscribe(updater.refresh, updater, true);
+    
+    // Use setUrl for Ajax loading
+    var tab3 = jtabs.addTab('jtabs-3', "Ajax Tab 2");
+    tab3.setUrl('ajax2.htm', null, true);
+    
+    // Disabled tab
+    var tab4 = jtabs.addTab('tabs1-5', "Disabled Tab", "Can't see me cause I'm disabled");
+    tab4.disable();
+    
+    jtabs.activate('jtabs-1');
+}
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : YAHOO.ext.ElementTabPanel
The body element that contains TabPaneItem bodies.
 el : YAHOO.ext.ElementTabPanel
The container element for this TabPanel.
 maxTabWidth : NumberTabPanel
The maximum width of a tab (ignored if resizeTabs is not true).
 minTabWidth : NumberTabPanel
The minimum width of a tab (ignored if resizeTabs is not true).
 monitorResize : BooleanTabPanel
Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true).
 preferredTabWidth : NumberTabPanel
The preferred (default) width of a tab (ignored if resizeTabs is not true).
 resizeTabs : BooleanTabPanel
Set this to true to enable dynamic tab resizing.
 tabPosition : StringTabPanel
The position of the tabs. Can be 'top' or 'bottom'
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 TabPanel(String/HTMLElement/Element container, Boolean config)TabPanel
Create new TabPanel.
 activate(String/Number id) : voidTabPanel
Activate a TabPanelItem. The currently active will be deactivated.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addTab(String id, String text, [String content], [Boolean closable]) : YAHOO.ext.TabPanelItemTabPanel
Creates a new TabPanelItem by looking for an existing element with the provided id - if it's not found it creates one.
 addTabItem(YAHOO.ext.TabPanelItem item) : voidTabPanel
Add an existing TabPanelItem.
 autoSizeTabs() : voidTabPanel
Manual call to resize the tabs (if resizeTabs is false this does nothing)
 beginUpdate() : voidTabPanel
Disables tab resizing while tabs are being added (if resizeTabs is false this does nothing)
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 destroy([Boolean removeEl]) : voidTabPanel
Destroys this TabPanel
 disableTab(String/Number id) : voidTabPanel
Disable a TabPanelItem. It cannot be the active tab, if it is this call is ignored..
 enableTab(String/Number id) : voidTabPanel
Enable a TabPanelItem that is disabled.
 endUpdate() : voidTabPanel
Stops an update and resizes the tabs (if resizeTabs is false this does nothing)
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getActiveTab() : YAHOO.ext.TabPanelItemTabPanel
Get the active TabPanelItem
 getTab(String/Number id) : YAHOO.ext.TabPanelItemTabPanel
Returns the TabPanelItem with the specified id/index
 hideTab(String/Number id) : voidTabPanel
Hides the TabPanelItem with the specified id/index
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 removeTab(String/Number id) : voidTabPanel
Remove a TabPanelItem.
 setTabWidth(Number The) : voidTabPanel
Resizes all the tabs to the passed width
 syncHeight([Number targetHeight]) : voidTabPanel
Updates the tab body element to fit the height of the container element +for overflow scrolling
 unhideTab(String/Number id) : voidTabPanel
"Unhides" the TabPanelItem with the specified id/index
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforetabchange : (YAHOO.ext.TabPanel this, Object e, YAHOO.ext.TabPanelItem tab)TabPanel
Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change
 tabchange : (YAHOO.ext.TabPanel this, YAHOO.ext.TabPanelItem activePanel)TabPanel
Fires when the active tab changes
+ +

Property Details

+
+ +
+

bodyEl

+ public YAHOO.ext.Element bodyEl +
+ The body element that contains TabPaneItem bodies.
+
This property is defined by TabPanel.
+
+ +
+

el

+ public YAHOO.ext.Element el +
+ The container element for this TabPanel.
+
This property is defined by TabPanel.
+
+ +
+

maxTabWidth

+ public Number maxTabWidth +
+ The maximum width of a tab (ignored if resizeTabs is not true).
+
This property is defined by TabPanel.
+
+ +
+

minTabWidth

+ public Number minTabWidth +
+ The minimum width of a tab (ignored if resizeTabs is not true).
+
This property is defined by TabPanel.
+
+ +
+

monitorResize

+ public Boolean monitorResize +
+ Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true).
+
This property is defined by TabPanel.
+
+ +
+

preferredTabWidth

+ public Number preferredTabWidth +
+ The preferred (default) width of a tab (ignored if resizeTabs is not true).
+
This property is defined by TabPanel.
+
+ +
+

resizeTabs

+ public Boolean resizeTabs +
+ Set this to true to enable dynamic tab resizing.
+
This property is defined by TabPanel.
+
+ +
+

tabPosition

+ public String tabPosition +
+ The position of the tabs. Can be 'top' or 'bottom'
+
This property is defined by TabPanel.
+
+
+ + +

Constructor Details

+
+
+

TabPanel

+ public function TabPanel(String/HTMLElement/Element container, Boolean config) +
+ Create new TabPanel.
+ Parameters: +
  • container : String/HTMLElement/Element
    The id, DOM element or YAHOO.ext.Element container where this TabPanel is to be rendered.
  • config : Boolean
    Config object to set any properties for this TabPanel or true to render the tabs on the bottom.
+
+
+
+
+ +

Method Details

+
+ +
+

activate

+ public function activate(String/Number id) +
+ Activate a TabPanelItem. The currently active will be deactivated. +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to activate.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addTab

+ public function addTab(String id, String text, [String content], [Boolean closable]) +
+ Creates a new TabPanelItem by looking for an existing element with the provided id - if it's not found it creates one. +
+ Parameters: +
  • id : String
    The id of the div to use or create
  • text : String
    The text for the tab
  • content : String
    (optional) Content to put in the TabPanelItem body
  • closable : Boolean
    (optional) True to create a close icon on the tab
+ Returns: +
    +
  • YAHOO.ext.TabPanelItem
    The created TabPanelItem
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

addTabItem

+ public function addTabItem(YAHOO.ext.TabPanelItem item) +
+ Add an existing TabPanelItem. +
+ Parameters: +
  • item : YAHOO.ext.TabPanelItem
    The TabPanelItem to add
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

autoSizeTabs

+ public function autoSizeTabs() +
+ Manual call to resize the tabs (if resizeTabs is false this does nothing) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

beginUpdate

+ public function beginUpdate() +
+ Disables tab resizing while tabs are being added (if resizeTabs is false this does nothing) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

destroy

+ public function destroy([Boolean removeEl]) +
+ Destroys this TabPanel +
+ Parameters: +
  • removeEl : Boolean
    (optional) True to remove the element from the DOM as well
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

disableTab

+ public function disableTab(String/Number id) +
+ Disable a TabPanelItem. It cannot be the active tab, if it is this call is ignored.. +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to disable.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

enableTab

+ public function enableTab(String/Number id) +
+ Enable a TabPanelItem that is disabled. +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to enable.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

endUpdate

+ public function endUpdate() +
+ Stops an update and resizes the tabs (if resizeTabs is false this does nothing) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getActiveTab

+ public function getActiveTab() +
+ Get the active TabPanelItem +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.TabPanelItem
    The active TabPanelItem or null if none are active.
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

getTab

+ public function getTab(String/Number id) +
+ Returns the TabPanelItem with the specified id/index +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to fetch.
+ Returns: +
    +
  • YAHOO.ext.TabPanelItem
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

hideTab

+ public function hideTab(String/Number id) +
+ Hides the TabPanelItem with the specified id/index +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to hide.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeTab

+ public function removeTab(String/Number id) +
+ Remove a TabPanelItem. +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to remove.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

setTabWidth

+ public function setTabWidth(Number The) +
+ Resizes all the tabs to the passed width +
+ Parameters: +
  • The : Number
    new width
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

syncHeight

+ public function syncHeight([Number targetHeight]) +
+ Updates the tab body element to fit the height of the container element +for overflow scrolling +
+ Parameters: +
  • targetHeight : Number
    (optional) Override the starting height from the elements height
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+ +
+

unhideTab

+ public function unhideTab(String/Number id) +
+ "Unhides" the TabPanelItem with the specified id/index +
+ Parameters: +
  • id : String/Number
    The id or index of the TabPanelItem to unhide.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanel.
+
+
+ +

Event Details

+
+ +
+

beforetabchange

+ public event beforetabchange +
+ Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.TabPanel
  • e : Object
    Set cancel to true on this object to cancel the tab change
  • tab : YAHOO.ext.TabPanelItem
    The tab being changed to
+
+
+
This event is defined by TabPanel.
+
+ +
+

tabchange

+ public event tabchange +
+ Fires when the active tab changes +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.TabPanel
  • activePanel : YAHOO.ext.TabPanelItem
    The new active tab
+
+
+
This event is defined by TabPanel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanelItem.html b/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanelItem.html new file mode 100644 index 000000000..b3b3b8ccf --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.TabPanelItem.html @@ -0,0 +1,537 @@ + + + + YAHOO.ext.TabPanelItem + + + + + +
+ +

Class YAHOO.ext.TabPanelItem

+ + + + + +
Package:YAHOO.ext
Class:TabPanelItem
Extends:Observable
Defined In:TabPanel.js
+
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bodyEl : YAHOO.ext.ElementTabPanelItem
The body element for this TabPanelItem
 closeText : StringTabPanelItem
The text displayed in the tooltip for the close icon.
 id : StringTabPanelItem
The id for this TabPanelItem
 tabPanel : YAHOO.ext.TabPanelTabPanelItem
The TabPanel this TabPanelItem belongs to
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 activate() : voidTabPanelItem
Activate this TabPanelItem - this does deactivate the currently active TabPanelItem.
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 disable() : voidTabPanelItem
Disable this TabPanelItem - this call is ignore if this is the active TabPanelItem.
 enable() : voidTabPanelItem
Enable this TabPanelItem if it was previously disabled.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getUpdateManager() : YAHOO.ext.UpdateManagerTabPanelItem
Get the YAHOO.ext.UpdateManager for the body of this TabPanelItem. Enables you to perform Ajax updates.
 hide() : voidTabPanelItem
Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd.
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setContent(String content, Boolean loadScripts) : voidTabPanelItem
Set the content for this TabPanelItem.
 setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) : YAHOO.ext.UpdateManagerTabPanelItem
Set a URL to be used to load the content for this TabPanelItem.
 show() : voidTabPanelItem
Show this TabPanelItem - this does not deactivate the currently active TabPanelItem.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 activate : (YAHOO.ext.TabPanel tabPanel, YAHOO.ext.TabPanelItem this)TabPanelItem
Fires when this tab becomes the active tab
 beforeclose : (YAHOO.ext.TabPanelItem this, Object e)TabPanelItem
Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true)
 close : (YAHOO.ext.TabPanelItem this)TabPanelItem
Fires when this tab is closed
 deactivate : (YAHOO.ext.TabPanel tabPanel, YAHOO.ext.TabPanelItem this)TabPanelItem
Fires when this tab is no longer the active tab
+ +

Property Details

+
+ +
+

bodyEl

+ public YAHOO.ext.Element bodyEl +
+ The body element for this TabPanelItem
+
This property is defined by TabPanelItem.
+
+ +
+

closeText

+ public String closeText +
+ The text displayed in the tooltip for the close icon.
+
This property is defined by TabPanelItem.
+
+ +
+

id

+ public String id +
+ The id for this TabPanelItem
+
This property is defined by TabPanelItem.
+
+ +
+

tabPanel

+ public YAHOO.ext.TabPanel tabPanel +
+ The TabPanel this TabPanelItem belongs to
+
This property is defined by TabPanelItem.
+
+
+ + +

Method Details

+
+ +
+

activate

+ public function activate() +
+ Activate this TabPanelItem - this does deactivate the currently active TabPanelItem. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

disable

+ public function disable() +
+ Disable this TabPanelItem - this call is ignore if this is the active TabPanelItem. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

enable

+ public function enable() +
+ Enable this TabPanelItem if it was previously disabled. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getUpdateManager

+ public function getUpdateManager() +
+ Get the YAHOO.ext.UpdateManager for the body of this TabPanelItem. Enables you to perform Ajax updates. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

hide

+ public function hide() +
+ Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setContent

+ public function setContent(String content, Boolean loadScripts) +
+ Set the content for this TabPanelItem. +
+ Parameters: +
  • content : String
    The content
  • loadScripts : Boolean
    true to look for and load scripts
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

setUrl

+ public function setUrl(String/Function url, [String/Object params], [Boolean loadOnce]) +
+ Set a URL to be used to load the content for this TabPanelItem. +
+ Parameters: +
  • url : String/Function
    The url to load the content from or a function to call to get the url
  • params : String/Object
    (optional) The string params for the update call or an object of the params. See YAHOO.ext.UpdateManager.update for more details. (Defaults to null)
  • loadOnce : Boolean
    (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this TabPanelItem is activated. (Defaults to false)
+ Returns: +
    +
  • YAHOO.ext.UpdateManager
    The UpdateManager
  • +
+
+
+
This method is defined by TabPanelItem.
+
+ +
+

show

+ public function show() +
+ Show this TabPanelItem - this does not deactivate the currently active TabPanelItem. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by TabPanelItem.
+
+
+ +

Event Details

+
+ +
+

activate

+ public event activate +
+ Fires when this tab becomes the active tab +
+ Subscribers will be called with the following parameters: +
  • tabPanel : YAHOO.ext.TabPanel
  • this : YAHOO.ext.TabPanelItem
+
+
+
This event is defined by TabPanelItem.
+
+ +
+

beforeclose

+ public event beforeclose +
+ Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true) +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.TabPanelItem
  • e : Object
    Set cancel to true on this object to cancel the close.
+
+
+
This event is defined by TabPanelItem.
+
+ +
+

close

+ public event close +
+ Fires when this tab is closed +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.TabPanelItem
+
+
+
This event is defined by TabPanelItem.
+
+ +
+

deactivate

+ public event deactivate +
+ Fires when this tab is no longer the active tab +
+ Subscribers will be called with the following parameters: +
  • tabPanel : YAHOO.ext.TabPanel
  • this : YAHOO.ext.TabPanelItem
+
+
+
This event is defined by TabPanelItem.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.Toolbar.html b/www/extras/yui-ext/docs/output/YAHOO.ext.Toolbar.html new file mode 100644 index 000000000..6e7e75468 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.Toolbar.html @@ -0,0 +1,199 @@ + + + + YAHOO.ext.Toolbar + + + + + +
+ +

Class YAHOO.ext.Toolbar

+ + + + + +
Package:YAHOO.ext
Class:Toolbar
Extends:Object
Defined In:Toolbar.js
+
+ Basic Toolbar used by the Grid to create the paging toolbar. This class is reusable but functionality +is limited. Look for more functionality in a future version.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 add(Mixed arg) : voidToolbar
Adds element(s) to the toolbar - this function takes a variable number of +arguments of mixed type and adds them to t...
 addButton(Object/Array config) : YAHOO.ext.ToolbarButton/ArrayToolbar
Add a button (or buttons), see YAHOO.ext.ToolbarButton for more info on the config
 addSeparator() : voidToolbar
Adds a separator
 addText(String text) : HTMLElementToolbar
Adds text to the toolbar
 getEl() : YAHOO.ext.ElementToolbar
Returns the element for this toolbar
 insertButton(Number index, Object/Array config) : YAHOO.ext.ToolbarButton/ArrayToolbar
Inserts a button (or buttons) at the specified index
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

add

+ public function add(Mixed arg) +
+ Adds element(s) to the toolbar - this function takes a variable number of +arguments of mixed type and adds them to the toolbar... +
+ Parameters: +
  • arg : Mixed
    If arg is a ToolbarButton, it is added. If arg is a string, it is wrapped in a ytb-text element and added unless the text is "separator" in which case a separator is added. Otherwise, it is assumed the element is an HTMLElement and it is added directly.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addButton

+ public function addButton(Object/Array config) +
+ Add a button (or buttons), see YAHOO.ext.ToolbarButton for more info on the config +
+ Parameters: +
  • config : Object/Array
    A button config or array of configs
+ Returns: +
    +
  • YAHOO.ext.ToolbarButton/Array
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addSeparator

+ public function addSeparator() +
+ Adds a separator +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

addText

+ public function addText(String text) +
+ Adds text to the toolbar +
+ Parameters: +
  • text : String
    The text to add
+ Returns: +
    +
  • HTMLElement
    The span element created which you can use to update the text.
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element for this toolbar +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by Toolbar.
+
+ +
+

insertButton

+ public function insertButton(Number index, Object/Array config) +
+ Inserts a button (or buttons) at the specified index +
+ Parameters: +
  • index : Number
    The index where the buttons are to be inserted
  • config : Object/Array
    A button config or array of configs
+ Returns: +
    +
  • YAHOO.ext.ToolbarButton/Array
  • +
+
+
+
This method is defined by Toolbar.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.ToolbarButton.html b/www/extras/yui-ext/docs/output/YAHOO.ext.ToolbarButton.html new file mode 100644 index 000000000..d5e788638 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.ToolbarButton.html @@ -0,0 +1,256 @@ + + + + YAHOO.ext.ToolbarButton + + + + + +
+ +

Class YAHOO.ext.ToolbarButton

+ + + + + +
Package:YAHOO.ext
Class:ToolbarButton
Extends:Object
Defined In:Toolbar.js
+
+ A toolbar button. The config has the following options: +
    +
  • className - The CSS class for the button. Use this to attach a background image for an icon.
  • +
  • text - The button's text
  • +
  • tooltip - The buttons tooltip text
  • +
  • click - function to call when the button is clicked
  • +
  • mouseover - function to call when the mouse moves over the button
  • +
  • mouseout - function to call when the mouse moves off the button
  • +
  • scope - The scope of the above event handlers
  • +
  • +
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 disable() : voidToolbarButton
Disable this button
 enable() : voidToolbarButton
Enable this button
 hide() : voidToolbarButton
Hide this button
 isDisabled() : BooleanToolbarButton
Returns true if this button is disabled.
 setHandler(Function click, [Object scope]) : voidToolbarButton
Sets this buttons click handler
 setText(String text) : voidToolbarButton
Set this buttons text
 setTooltip(String text) : voidToolbarButton
Set this buttons tooltip text
 show() : voidToolbarButton
Show this button
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

disable

+ public function disable() +
+ Disable this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

enable

+ public function enable() +
+ Enable this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

hide

+ public function hide() +
+ Hide this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

isDisabled

+ public function isDisabled() +
+ Returns true if this button is disabled. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

setHandler

+ public function setHandler(Function click, [Object scope]) +
+ Sets this buttons click handler +
+ Parameters: +
  • click : Function
    The function to call when the button is clicked
  • scope : Object
    (optional) Scope for the function passed above
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

setText

+ public function setText(String text) +
+ Set this buttons text +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

setTooltip

+ public function setTooltip(String text) +
+ Set this buttons tooltip text +
+ Parameters: +
  • text : String
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+ +
+

show

+ public function show() +
+ Show this button +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ToolbarButton.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.BasicRenderer.html b/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.BasicRenderer.html new file mode 100644 index 000000000..e04390e6b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.BasicRenderer.html @@ -0,0 +1,74 @@ + + + + YAHOO.ext.UpdateManager.BasicRenderer + + + + + +
+ +

Class YAHOO.ext.UpdateManager.BasicRenderer

+ + + + + +
Package:YAHOO.ext
Class:UpdateManager.BasicRenderer
Extends:Object
Defined In:UpdateManager.js
+
+ Default Content renderer. Updates the elements innerHTML with the responseText.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 render(YAHOO.ext.Element el, Object response, UpdateManager updateManager, Function callback) : voidUpdateManager.BasicRenderer
This is called when the transaction is completed and it's time to update the element - The BasicRenderer +updates the...
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

render

+ public function render(YAHOO.ext.Element el, Object response, UpdateManager updateManager, Function callback) +
+ This is called when the transaction is completed and it's time to update the element - The BasicRenderer +updates the elements innerHTML with the responseText - To perform a custom render (i.e. XML or JSON processing), +create an object with a "render(el, response)" method and pass it to setRenderer on the UpdateManager. +
+ Parameters: +
  • el : YAHOO.ext.Element
    The element being rendered
  • response : Object
    The YUI Connect response object
  • updateManager : UpdateManager
    The calling update manager
  • callback : Function
    A callback that will need to be called if loadScripts is true on the UpdateManager
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.BasicRenderer.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.html b/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.html new file mode 100644 index 000000000..fc1807d9b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.UpdateManager.html @@ -0,0 +1,801 @@ + + + + YAHOO.ext.UpdateManager + + + + + +
+ +

Class YAHOO.ext.UpdateManager

+ + + + + +
Package:YAHOO.ext
Class:UpdateManager
Extends:Observable
Defined In:UpdateManager.js
+
+ Provides AJAX-style update for Element object using Yahoo +UI library YAHOO.util.Connect functionality.

+Usage:
+

+// Get it from a YAHOO.ext.Element object
+var el = getEl('foo');
+var mgr = el.getUpdateManager();
+mgr.update('http://myserver.com/index.php', 'param1=1&param2=2');
+...
+mgr.formUpdate('myFormId', 'http://myserver.com/index.php');
+
+// or directly (returns the same UpdateManager instance) +var mgr = new YAHOO.ext.UpdateManager('myElementId'); +mgr.startAutoRefresh(60, 'http://myserver.com/index.php'); +mgr.onUpdate.subscribe(myFcnNeedsToKnow); +
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 defaultUrl : StringUpdateManager
Cached url to use for refreshes. Overwritten every time update() is called unless 'discardUrl' param is set to true.
 disableCaching : BooleanUpdateManager
Whether to append unique parameter on get request to disable caching (Defaults to false).
 el : YAHOO.ext.ElementUpdateManager
The Element object
 formUpdateDelegate : FunctionUpdateManager
Delegate for formUpdate() prebound to 'this', use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arg...
 indicatorText : StringUpdateManager
Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>').
 loadScripts : NumberUpdateManager
True to process scripts by default (Defaults to false).
 refreshDelegate : FunctionUpdateManager
Delegate for refresh() prebound to 'this', use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments
 renderer : ObjectUpdateManager
The renderer for this UpdateManager. Defaults to YAHOO.ext.UpdateManager.BasicRenderer.
 showLoadIndicator : StringUpdateManager
Whether to show indicatorText when loading (Defaults to true).
 sslBlankUrl : StringUpdateManager
Blank page URL to use with SSL file uploads (Defaults to 'about:blank').
 timeout : NumberUpdateManager
Timeout for requests or form posts in seconds (Defaults 30 seconds).
 transaction : ObjectUpdateManager
YAHOO.util.Connect transaction object of current executing transaction
 updateDelegate : FunctionUpdateManager
Delegate for update() prebound to 'this', use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 UpdateManager(String/HTMLElement/YAHOO.ext.Element el, [Boolean forceNew])UpdateManager
Create new UpdateManager directly.
 abort() : voidUpdateManager
Aborts the executing transaction
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 formUpdate(String/HTMLElement form, [String url], [Boolean reset], [Function callback]) : voidUpdateManager
Performs an async form post, updating this element with the response. If the form has the attribute enctype="multipar...
 getEl() : YAHOO.ext.ElementUpdateManager
Get the Element this UpdateManager is bound to
 isUpdating() : BooleanUpdateManager
Returns true if an update is in progress
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh([Function callback]) : voidUpdateManager
Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setDefaultUrl(String/Function defaultUrl) : voidUpdateManager
Set the defaultUrl used for updates
 setRenderer(Object renderer) : voidUpdateManager
Set the content renderer for this UpdateManager. See YAHOO.ext.UpdateManager.BasicRenderer.render for more details.
 showLoading() : voidUpdateManager
Called to update the element to "Loading" state. Override to perform custom action.
 startAutoRefresh(Number interval, [String/Function url], [String/Object params], [Function callback], [Boolean refreshNow]) : voidUpdateManager
Set this element to auto refresh.
 stopAutoRefresh() : voidUpdateManager
Stop auto refresh on this element.
 update(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) : voidUpdateManager
Performs an async request, updating this element with the response. If params are specified it uses POST, otherwise i...
 updateElement<static>(String/HTMLElement/YAHOO.ext.Element el, String url, [String/Object params], [Object options]) : voidUpdateManager
<static> Static convenience method, Usage: +
YAHOO.ext.UpdateManager.update('my-div', 'stuff.php');
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeupdate : (YAHOO.ext.Element el, String/Object/Function url, String/Object params)UpdateManager
Fired before an update is made, return false from your handler and the update is cancelled.
 failure : (YAHOO.ext.Element el, Object oResponseObject)UpdateManager
Fired on update failure. Uses fireDirect with signature: (oElement, oResponseObject)
 update : (YAHOO.ext.Element el, Object oResponseObject)UpdateManager
Fired after successful update is made.
+ +

Property Details

+
+ +
+

defaultUrl

+ public String defaultUrl +
+ Cached url to use for refreshes. Overwritten every time update() is called unless 'discardUrl' param is set to true.
+
This property is defined by UpdateManager.
+
+ +
+

disableCaching

+ public Boolean disableCaching +
+ Whether to append unique parameter on get request to disable caching (Defaults to false).
+
This property is defined by UpdateManager.
+
+ +
+

el

+ public YAHOO.ext.Element el +
+ The Element object
+
This property is defined by UpdateManager.
+
+ +
+

formUpdateDelegate

+ public Function formUpdateDelegate +
+ Delegate for formUpdate() prebound to 'this', use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arguments
+
This property is defined by UpdateManager.
+
+ +
+

indicatorText

+ public String indicatorText +
+ Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>').
+
This property is defined by UpdateManager.
+
+ +
+

loadScripts

+ public Number loadScripts +
+ True to process scripts by default (Defaults to false).
+
This property is defined by UpdateManager.
+
+ +
+

refreshDelegate

+ public Function refreshDelegate +
+ Delegate for refresh() prebound to 'this', use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments
+
This property is defined by UpdateManager.
+
+ +
+

renderer

+ public Object renderer +
+ The renderer for this UpdateManager. Defaults to YAHOO.ext.UpdateManager.BasicRenderer.
+
This property is defined by UpdateManager.
+
+ +
+

showLoadIndicator

+ public String showLoadIndicator +
+ Whether to show indicatorText when loading (Defaults to true).
+
This property is defined by UpdateManager.
+
+ +
+

sslBlankUrl

+ public String sslBlankUrl +
+ Blank page URL to use with SSL file uploads (Defaults to 'about:blank').
+
This property is defined by UpdateManager.
+
+ +
+

timeout

+ public Number timeout +
+ Timeout for requests or form posts in seconds (Defaults 30 seconds).
+
This property is defined by UpdateManager.
+
+ +
+

transaction

+ public Object transaction +
+ YAHOO.util.Connect transaction object of current executing transaction
+
This property is defined by UpdateManager.
+
+ +
+

updateDelegate

+ public Function updateDelegate +
+ Delegate for update() prebound to 'this', use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments
+
This property is defined by UpdateManager.
+
+
+ + +

Constructor Details

+
+
+

UpdateManager

+ public function UpdateManager(String/HTMLElement/YAHOO.ext.Element el, [Boolean forceNew]) +
+ Create new UpdateManager directly.
+ Parameters: +
  • el : String/HTMLElement/YAHOO.ext.Element
    The element to update
  • forceNew : Boolean
    (optional) By default the constructor checks to see if the passed element already has an UpdateManager and if it does it returns the same instance. This will skip that check (useful for extending this class).
+
+
+
+
+ +

Method Details

+
+ +
+

abort

+ public function abort() +
+ Aborts the executing transaction +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

formUpdate

+ public function formUpdate(String/HTMLElement form, [String url], [Boolean reset], [Function callback]) +
+ Performs an async form post, updating this element with the response. If the form has the attribute enctype="multipart/form-data", it assumes it's a file upload. +Uses this.sslBlankUrl for SSL file uploads to prevent IE security warning. See YUI docs for more info. +
+ Parameters: +
  • form : String/HTMLElement
    The form Id or form element
  • url : String
    (optional) The url to pass the form to. If omitted the action attribute on the form will be used.
  • reset : Boolean
    (optional) Whether to try to reset the form after the update
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

getEl

+ public function getEl() +
+ Get the Element this UpdateManager is bound to +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
    The element
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

isUpdating

+ public function isUpdating() +
+ Returns true if an update is in progress +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

refresh

+ public function refresh([Function callback]) +
+ Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately +
+ Parameters: +
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setDefaultUrl

+ public function setDefaultUrl(String/Function defaultUrl) +
+ Set the defaultUrl used for updates +
+ Parameters: +
  • defaultUrl : String/Function
    The url or a function to call to get the url
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

setRenderer

+ public function setRenderer(Object renderer) +
+ Set the content renderer for this UpdateManager. See YAHOO.ext.UpdateManager.BasicRenderer.render for more details. +
+ Parameters: +
  • renderer : Object
    The object implementing the render() method
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

showLoading

+ public function showLoading() +
+ Called to update the element to "Loading" state. Override to perform custom action. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

startAutoRefresh

+ public function startAutoRefresh(Number interval, [String/Function url], [String/Object params], [Function callback], [Boolean refreshNow]) +
+ Set this element to auto refresh. +
+ Parameters: +
  • interval : Number
    How often to update (in seconds).
  • url : String/Function
    (optional) The url for this request or a function to call to get the url (Defaults to the last used url)
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "¶m1=1¶m2=2" or as an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
  • refreshNow : Boolean
    (optional) Whether to execute the refresh now, or wait the interval
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

stopAutoRefresh

+ public function stopAutoRefresh() +
+ Stop auto refresh on this element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

update

+ public function update(Object/String/Function url, [String/Object params], [Function callback], [Boolean discardUrl]) +
+ Performs an async request, updating this element with the response. If params are specified it uses POST, otherwise it uses GET. +
+ Parameters: +
  • url : Object/String/Function
    The url for this request or a function to call to get the url or a config object containing any of the following options:
     um.update({ url: 'your-url.php', params: {param1: 'foo', param2: 'bar'}, // or a URL encoded string callback: yourFunction, scope: yourObject, //(optional scope) discardUrl: false, disableCaching: false, indicatorText: 'Loading...', timeout: 30, loadScripts: false }); 
    The only required property is url. The optional properties nocache, text and scripts are shorthand for disableCaching, indicatorText and loadScripts and are used to set their associated property on this UpdateManager instance.
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when transaction is complete - called with signature (oElement, bSuccess)
  • discardUrl : Boolean
    (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+ +
+

updateElement<static>

+ public function updateElement<static>(String/HTMLElement/YAHOO.ext.Element el, String url, [String/Object params], [Object options]) +
+ <static> Static convenience method, Usage: +
YAHOO.ext.UpdateManager.update('my-div', 'stuff.php');
+
+ Parameters: +
  • el : String/HTMLElement/YAHOO.ext.Element
    The element to update
  • url : String
    The url
  • params : String/Object
    (optional) Url encoded param string or an object of name/value pairs
  • options : Object
    (optional) A config object with any of the UpdateManager properties you want to set - for example: {disableCaching:true, indicatorText: 'Loading data...'}
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by UpdateManager.
+
+
+ +

Event Details

+
+ +
+

beforeupdate

+ public event beforeupdate +
+ Fired before an update is made, return false from your handler and the update is cancelled. +
+ Subscribers will be called with the following parameters: +
  • el : YAHOO.ext.Element
  • url : String/Object/Function
  • params : String/Object
+
+
+
This event is defined by UpdateManager.
+
+ +
+

failure

+ public event failure +
+ Fired on update failure. Uses fireDirect with signature: (oElement, oResponseObject) +
+ Subscribers will be called with the following parameters: +
  • el : YAHOO.ext.Element
  • oResponseObject : Object
    The YAHOO.util.Connect response Object
+
+
+
This event is defined by UpdateManager.
+
+ +
+

update

+ public event update +
+ Fired after successful update is made. +
+ Subscribers will be called with the following parameters: +
  • el : YAHOO.ext.Element
  • oResponseObject : Object
    The YAHOO.util.Connect response Object
+
+
+
This event is defined by UpdateManager.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.View.html b/www/extras/yui-ext/docs/output/YAHOO.ext.View.html new file mode 100644 index 000000000..d5892751a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.View.html @@ -0,0 +1,744 @@ + + + + YAHOO.ext.View + + + + + +
+ +

Class YAHOO.ext.View

+ + + + + + +
Package:YAHOO.ext
Class:View
Extends:Observable
Subclasses:JsonView
Defined In:TemplateView.js
+
+ Create a "View" for an element based on a data model or UpdateManager and the supplied DomHelper template. +This class also supports single and multi selection modes.
+Create a data model bound view: +

+var dataModel = new YAHOO.ext.grid.XMLDataModel(...);
+var view = new YAHOO.ext.View('my-element', 
+           '<div id="{0}">{2} - {1}</div>', // auto create template
+           dataModel, { 
+              singleSelect: true, 
+              selectedClass: 'ydataview-selected'
+           });
+
+// listen for node click?
+view.on('click', function(vw, index, node, e){
+    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
+});
+
+// load XML data
+dataModel.load('foobar.xml');
+
+For an example of creating a JSON/UpdateManager view, see YAHOO.ext.JsonView. +

+Note: The root of your template must be a single node. Table/row implementations may work but are not supported due to +IE's limited insertion support with tables and Opera's faulty event bubbling.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 jsonRoot : StringView
The root property in the loaded json object that contains the data
 selectedClass : YAHOO.ext.DomHelper.TemplateView
The css class to add to selected nodes
 tpl : YAHOO.ext.DomHelper.TemplateView
The template used by this View
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 View(String/HTMLElement/Element container, String/DomHelper.Template tpl, DataModel dataModel, Object config)View
Create a new View
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 clearSelections([Boolean suppressEvent]) : voidView
Clear all selections
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 findItemFromChild(HTMLElement node) : HTMLElementView
Returns the template node the passed child belongs to or null if it doesn't belong to one.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getEl() : YAHOO.ext.ElementView
Returns the element this view is bound to.
 getNode(HTMLElement/String/Number nodeInfo) : HTMLElementView
Gets a template node.
 getNodes(Number startIndex, Number endIndex) : ArrayView
Gets a range template nodes.
 getSelectedIndexes() : ArrayView
Get the indexes of the selected nodes.
 getSelectedNodes() : ArrayView
Get the currently selected nodes.
 getSelectionCount() : NumberView
Get the number of selected nodes.
 indexOf(HTMLElement/String/Number nodeInfo) : NumberView
Finds the index of the passed node
 prepareData(Array/Object data, Number index) : voidView
Function to override to reformat the data that is sent to +the template for each node.
 purgeListeners() : voidObservable
Removes all listeners for this object
 refresh() : voidView
Refreshes the view.
 refreshNode(Number index) : voidView
Refresh an individual node.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 select(Array/HTMLElement/String/Number nodeInfo, [Boolean keepExisting], [Boolean suppressEvent]) : voidView
Selects nodes.
 setDataModel(DataModel dataModel) : voidView
Changes the data model this view uses and refresh the view.
 unplugDataModel(DataModel dataModel) : voidView
Unplug the data model and stop updates.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 click : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is clicked.
 contextmenu : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is right clicked.
 dblclick : (YAHOO.ext.View this, Number index, HTMLElement node, YAHOO.ext.EventObject e)View
Fires when a template node is double clicked.
 selectionchange : (YAHOO.ext.View this, Array selections)View
Fires when the selected nodes change.
+ +

Property Details

+
+ +
+

jsonRoot

+ public String jsonRoot +
+ The root property in the loaded json object that contains the data
+
This property is defined by View.
+
+ +
+

selectedClass

+ public YAHOO.ext.DomHelper.Template selectedClass +
+ The css class to add to selected nodes
+
This property is defined by View.
+
+ +
+

tpl

+ public YAHOO.ext.DomHelper.Template tpl +
+ The template used by this View
+
This property is defined by View.
+
+
+ + +

Constructor Details

+
+
+

View

+ public function View(String/HTMLElement/Element container, String/DomHelper.Template tpl, DataModel dataModel, Object config) +
+ Create a new View
+ Parameters: +
  • container : String/HTMLElement/Element
    The container element where the view is to be rendered.
  • tpl : String/DomHelper.Template
    The rendering template or a string to create a template with
  • dataModel : DataModel
    The bound data model
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections([Boolean suppressEvent]) +
+ Clear all selections +
+ Parameters: +
  • suppressEvent : Boolean
    (optional) true to skip firing of the selectionchange event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

findItemFromChild

+ public function findItemFromChild(HTMLElement node) +
+ Returns the template node the passed child belongs to or null if it doesn't belong to one. +
+ Parameters: +
  • node : HTMLElement
+ Returns: +
    +
  • HTMLElement
    The template node
  • +
+
+
+
This method is defined by View.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getEl

+ public function getEl() +
+ Returns the element this view is bound to. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Element
  • +
+
+
+
This method is defined by View.
+
+ +
+

getNode

+ public function getNode(HTMLElement/String/Number nodeInfo) +
+ Gets a template node. +
+ Parameters: +
  • nodeInfo : HTMLElement/String/Number
    An HTMLElement template node, index of a template node or the id of a template node
+ Returns: +
    +
  • HTMLElement
    The node or null if it wasn't found
  • +
+
+
+
This method is defined by View.
+
+ +
+

getNodes

+ public function getNodes(Number startIndex, Number endIndex) +
+ Gets a range template nodes. +
+ Parameters: +
  • startIndex : Number
  • endIndex : Number
+ Returns: +
    +
  • Array
    An array of nodes
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectedIndexes

+ public function getSelectedIndexes() +
+ Get the indexes of the selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectedNodes

+ public function getSelectedNodes() +
+ Get the currently selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    An array of HTMLElements
  • +
+
+
+
This method is defined by View.
+
+ +
+

getSelectionCount

+ public function getSelectionCount() +
+ Get the number of selected nodes. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by View.
+
+ +
+

indexOf

+ public function indexOf(HTMLElement/String/Number nodeInfo) +
+ Finds the index of the passed node +
+ Parameters: +
  • nodeInfo : HTMLElement/String/Number
    An HTMLElement template node, index of a template node or the id of a template node
+ Returns: +
    +
  • Number
    The index of the node or -1
  • +
+
+
+
This method is defined by View.
+
+ +
+

prepareData

+ public function prepareData(Array/Object data, Number index) +
+ Function to override to reformat the data that is sent to +the template for each node. +
+ Parameters: +
  • data : Array/Object
    The raw data (array of colData for a data model bound view or a JSON object for an UpdateManager bound view).
  • index : Number
    The index of the data within the data model
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

refresh

+ public function refresh() +
+ Refreshes the view. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

refreshNode

+ public function refreshNode(Number index) +
+ Refresh an individual node. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

select

+ public function select(Array/HTMLElement/String/Number nodeInfo, [Boolean keepExisting], [Boolean suppressEvent]) +
+ Selects nodes. +
+ Parameters: +
  • nodeInfo : Array/HTMLElement/String/Number
    An HTMLElement template node, index of a template node, id of a template node or an array of any of those to select
  • keepExisting : Boolean
    (optional) true to keep existing selections
  • suppressEvent : Boolean
    (optional) true to skip firing of the selectionchange vent
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

setDataModel

+ public function setDataModel(DataModel dataModel) +
+ Changes the data model this view uses and refresh the view. +
+ Parameters: +
  • dataModel : DataModel
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+ +
+

unplugDataModel

+ public function unplugDataModel(DataModel dataModel) +
+ Unplug the data model and stop updates. +
+ Parameters: +
  • dataModel : DataModel
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by View.
+
+
+ +

Event Details

+
+ +
+

click

+ public event click +
+ Fires when a template node is clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

contextmenu

+ public event contextmenu +
+ Fires when a template node is right clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

dblclick

+ public event dblclick +
+ Fires when a template node is double clicked. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • index : Number
    The index of the target node
  • node : HTMLElement
    The target node
  • e : YAHOO.ext.EventObject
    The raw event object
+
+
+
This event is defined by View.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selected nodes change. +
+ Subscribers will be called with the following parameters: +
  • this : YAHOO.ext.View
  • selections : Array
    Array of the selected nodes
+
+
+
This event is defined by View.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractColumnModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractColumnModel.html new file mode 100644 index 000000000..54ae6eab8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractColumnModel.html @@ -0,0 +1,466 @@ + + + + YAHOO.ext.grid.AbstractColumnModel + + + + + +
+ +

Class YAHOO.ext.grid.AbstractColumnModel

+ + + + + + +
Package:YAHOO.ext.grid
Class:AbstractColumnModel
Extends:Observable
Subclasses:DefaultColumnModel
Defined In:AbstractColumnModel.js
+
+ This abstract class defines the ColumnModel interface and provides default implementations of the events required by the Grid.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 AbstractColumnModel()AbstractColumnModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getColumnCount() : NumberAbstractColumnModel
Interface method - Returns the number of columns.
 getColumnHeader(Number col) : StringAbstractColumnModel
Interface method - Returns the header for the specified column.
 getColumnWidth(Number col) : NumberAbstractColumnModel
Interface method - Returns the width for the specified column.
 getRenderer(Number col) : FunctionAbstractColumnModel
Interface method - Returns the rendering (formatting) function defined for the column.
 getSortType(Number col) : FunctionAbstractColumnModel
Interface method - Returns the sorting comparison function defined for the column (defaults to sortTypes.none).
 getTotalWidth() : NumberAbstractColumnModel
Interface method - Returns the total width of all columns.
 isHidden(Number col) : BooleanAbstractColumnModel
Interface method - Returns true if the specified column is hidden.
 isSortable(Number col) : BooleanAbstractColumnModel
Interface method - Returns true if the specified column is sortable.
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 headerchange : (ColumnModel this, Number columnIndex, Number newText)AbstractColumnModel
Fires when the text of a header changes
 hiddenchange : (ColumnModel this, Number columnIndex, Number hidden)AbstractColumnModel
Fires when a column is hidden or "unhidden"
 widthchange : (ColumnModel this, Number columnIndex, Number newWidth)AbstractColumnModel
Fires when the width of a column changes
+ + + +

Constructor Details

+
+
+

AbstractColumnModel

+ public function AbstractColumnModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getColumnCount

+ public function getColumnCount() +
+ Interface method - Returns the number of columns. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

getColumnHeader

+ public function getColumnHeader(Number col) +
+ Interface method - Returns the header for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

getColumnWidth

+ public function getColumnWidth(Number col) +
+ Interface method - Returns the width for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

getRenderer

+ public function getRenderer(Number col) +
+ Interface method - Returns the rendering (formatting) function defined for the column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

getSortType

+ public function getSortType(Number col) +
+ Interface method - Returns the sorting comparison function defined for the column (defaults to sortTypes.none). +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

getTotalWidth

+ public function getTotalWidth() +
+ Interface method - Returns the total width of all columns. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

isHidden

+ public function isHidden(Number col) +
+ Interface method - Returns true if the specified column is hidden. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

isSortable

+ public function isSortable(Number col) +
+ Interface method - Returns true if the specified column is sortable. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by AbstractColumnModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+
+ +

Event Details

+
+ +
+

headerchange

+ public event headerchange +
+ Fires when the text of a header changes +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • newText : Number
    The new header text
+
+
+
This event is defined by AbstractColumnModel.
+
+ +
+

hiddenchange

+ public event hiddenchange +
+ Fires when a column is hidden or "unhidden" +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • hidden : Number
    true if hidden, false otherwise
+
+
+
This event is defined by AbstractColumnModel.
+
+ +
+

widthchange

+ public event widthchange +
+ Fires when the width of a column changes +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • newWidth : Number
    The new width
+
+
+
This event is defined by AbstractColumnModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractDataModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractDataModel.html new file mode 100644 index 000000000..83576d193 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.AbstractDataModel.html @@ -0,0 +1,330 @@ + + + + YAHOO.ext.grid.AbstractDataModel + + + + + +
+ +

Class YAHOO.ext.grid.AbstractDataModel

+ + + + + + +
Package:YAHOO.ext.grid
Class:AbstractDataModel
Extends:Observable
Subclasses:DefaultDataModel
Defined In:AbstractDataModel.js
+
+ This abstract class provides default implementations of the events required by the Grid. + It takes care of the creating the CustomEvents and provides some convenient methods for firing the events.

+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 AbstractDataModel()AbstractDataModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 cellupdated : (DataModel this, Number rowIndex, Number columnIndex)AbstractDataModel
Fires when a cell is updated
 datachanged : (DataModel this)AbstractDataModel
Fires when the entire data structure has changed
 rowsdeleted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been deleted
 rowsinserted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been inserted
 rowssorted : (DataModel this)AbstractDataModel
Fires when the data has been sorted
 rowsupdated : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been updated
+ + + +

Constructor Details

+
+
+

AbstractDataModel

+ public function AbstractDataModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+
+ +

Event Details

+
+ +
+

cellupdated

+ public event cellupdated +
+ Fires when a cell is updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the entire data structure has changed +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsdeleted

+ public event rowsdeleted +
+ Fires when a range of rows have been deleted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsinserted

+ public event rowsinserted +
+ Fires when a range of rows have been inserted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowssorted

+ public event rowssorted +
+ Fires when the data has been sorted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsupdated

+ public event rowsupdated +
+ Fires when a range of rows have been updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CellEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CellEditor.html new file mode 100644 index 000000000..b7e590f0a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CellEditor.html @@ -0,0 +1,38 @@ + + + + YAHOO.ext.grid.CellEditor + + + + + +
+ +

Class YAHOO.ext.grid.CellEditor

+ + + + + + +
Package:YAHOO.ext.grid
Class:CellEditor
Extends:Object
Subclasses:CheckboxEditor, DateEditor, NumberEditor, SelectEditor, TextEditor
Defined In:CellEditor.js
+
+ Base class for all EditorGrid editors
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+
This class has no public methods.
+

Public Events

+
This class has no public events.
+ + + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CheckboxEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CheckboxEditor.html new file mode 100644 index 000000000..7c6c87a59 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.CheckboxEditor.html @@ -0,0 +1,66 @@ + + + + YAHOO.ext.grid.CheckboxEditor + + + + + +
+ +

Class YAHOO.ext.grid.CheckboxEditor

+ + + + + +
Package:YAHOO.ext.grid
Class:CheckboxEditor
Extends:CellEditor
Defined In:CheckboxEditor.js
+
+ Provides a checkbox for editing boolean values. It currently has no configuration options.

+For more information on using this editor, see this blog post.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 CheckboxEditor()CheckboxEditor
Create a new CheckboxEditor
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

CheckboxEditor

+ public function CheckboxEditor() +
+ Create a new CheckboxEditor
+ Parameters: +
  • None.
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DateEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DateEditor.html new file mode 100644 index 000000000..399a764ae --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DateEditor.html @@ -0,0 +1,82 @@ + + + + YAHOO.ext.grid.DateEditor + + + + + +
+ +

Class YAHOO.ext.grid.DateEditor

+ + + + + +
Package:YAHOO.ext.grid
Class:DateEditor
Extends:CellEditor
Defined In:DateEditor.js
+
+ Provides a date editor field, and optionally a DatePicker. The DateEditor provides a method to override (showCalendar) if you don't want to use the built in DatePicker control. The reason I chose to use my own DatePicker control rather than the nice YUI Calendar component is my control was very easy to override events to make it work well with the grid. It's also only 5k compressed, while the YUI Calendar is 40k compressed. The DatePicker supports left/right keys to move months, up/down keys to move years and the mouse wheel to quickly go through the months. The DateEditor supports the following configuration options: +
    +
  • format - The date format for the editor. The format is identical to PHP date() and text is allowed. Credit for that goes to this fantastic date library. This format is for the editor only and doesn't affect the rendering of the cell when not in edit mode. Your rendering function can use any date format it wants.
  • +
  • minValue - The minimum allowed date. Can be either a Javascript date object or a string date in the specified format.
  • +
  • maxValue - The maximum allowed date. Can be either a Javascript date object or a string date in the specified format.
  • +
  • minText - The tooltip to display when the date in the cell is before minValue.
  • +
  • maxText - The tooltip to display when the date in the cell is after maxValue.
  • +
  • invalidText - The text to display when the date in the field is invalid (for example: 02/31/06)
  • +
  • disabledDays - An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday.
  • +
  • disabledDaysText - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled day.
  • +
  • disabledDates - An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so they are very powerful. For example, ["03/08/2003", "09/16/2003"] would disable those dates, but ["03/08", "09/16"] would disable them for every year. If you are using short years, you will want to use ^ to tell the regular expression to only match the beginning like ["^03/08"]. To disable March of 2006: ["03/../2006"] or every March ["^03"]. In order to support regular expressions, if you are using a date format that has "." in it, you will have to escape the dot when restricting dates. For example: ["03\\.08\\.03"].
  • +
  • disabledDatesText - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled date.
  • +
  • allowBlank - True if the cell is allowed to be empty.
  • +
  • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
  • +
  • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
  • +
  • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
  • +
+For more information on using this editor, see this blog post.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 DateEditor(Object config)DateEditor
Create a new DateEditor
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

DateEditor

+ public function DateEditor(Object config) +
+ Create a new DateEditor
+ Parameters: +
  • config : Object
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultColumnModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultColumnModel.html new file mode 100644 index 000000000..310bc66b7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultColumnModel.html @@ -0,0 +1,882 @@ + + + + YAHOO.ext.grid.DefaultColumnModel + + + + + +
+ +

Class YAHOO.ext.grid.DefaultColumnModel

+ + + + + +
Package:YAHOO.ext.grid
Class:DefaultColumnModel
Extends:AbstractColumnModel
Defined In:DefaultColumnModel.js
+
+ This is the default implementation of a ColumnModel used by the Grid. It defines +the columns in the grid. +
Usage:
+

+ var sort = YAHOO.ext.grid.DefaultColumnModel.sortTypes;
+ var myColumns = [
+	{header: "Ticker", width: 60, sortable: true, sortType: sort.asUCString}, 
+	{header: "Company Name", width: 150, sortable: true, sortType: sort.asUCString}, 
+	{header: "Market Cap.", width: 100, sortable: true, sortType: sort.asFloat}, 
+	{header: "$ Sales", width: 100, sortable: true, sortType: sort.asFloat, renderer: money}, 
+	{header: "Employees", width: 100, sortable: true, sortType: sort.asFloat}
+ ];
+ var colModel = new YAHOO.ext.grid.DefaultColumnModel(myColumns);
+ 
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 config : ObjectDefaultColumnModel
The config passed into the constructor
 defaultSortable : BooleanDefaultColumnModel
Default sortable of columns which have no sortable specified (defaults to false)
 defaultWidth : NumberDefaultColumnModel
The width of columns which have no width specified (defaults to 100)
 sortTypes<static> : ObjectDefaultColumnModel
<static> Defines the default sorting (casting?) comparison functions used when sorting data: +  sortTy...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DefaultColumnModel(Object config)DefaultColumnModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getCellEditor(Number colIndex, Number rowIndex) : ObjectDefaultColumnModel
Returns the editor defined for the cell/column.
 getColumnCount() : NumberDefaultColumnModel
Returns the number of columns.
 getColumnHeader(Number col) : StringDefaultColumnModel
Returns the header for the specified column.
 getColumnWidth(Number col) : NumberDefaultColumnModel
Returns the width for the specified column.
 getDataIndex(Number col) : NumberDefaultColumnModel
Returns the dataIndex for the specified column.
 getRenderer(Number col) : FunctionDefaultColumnModel
Returns the rendering (formatting) function defined for the column.
 getSortType(Number col) : FunctionDefaultColumnModel
Returns the sorting comparison function defined for the column (defaults to sortTypes.none).
 getTotalWidth(Boolean includeHidden) : NumberDefaultColumnModel
Returns the total width of all columns.
 isCellEditable(Number colIndex, Number rowIndex) : BooleanDefaultColumnModel
Returns true if the cell is editable.
 isFixed() : voidDefaultColumnModel
Returns true if the column width cannot be changed
 isHidden(Number colIndex) : BooleanDefaultColumnModel
Returns true if the column is hidden.
 isResizable() : voidDefaultColumnModel
Returns true if the column cannot be resized
 isSortable(Number col) : BooleanDefaultColumnModel
Returns true if the specified column is sortable.
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 setColumnHeader(Number col, String header) : voidDefaultColumnModel
Sets the header for a column.
 setColumnWidth(Number col, Number width) : voidDefaultColumnModel
Sets the width for a column.
 setDataIndex(Number col, Number dataIndex) : voidDefaultColumnModel
Sets the dataIndex for a column.
 setEditable(Number col, Boolean editable) : voidDefaultColumnModel
Sets if a column is editable.
 setEditor(Number col, Object editor) : voidDefaultColumnModel
Sets the editor for a column.
 setHidden(Number colIndex) : voidDefaultColumnModel
Sets if a column is hidden.
 setRenderer(Number col, Function fn) : voidDefaultColumnModel
Sets the rendering (formatting) function for a column.
 setSortType(Number col, Function fn) : voidDefaultColumnModel
Sets the sorting comparison function for a column.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 headerchange : (ColumnModel this, Number columnIndex, Number newText)AbstractColumnModel
Fires when the text of a header changes
 hiddenchange : (ColumnModel this, Number columnIndex, Number hidden)AbstractColumnModel
Fires when a column is hidden or "unhidden"
 widthchange : (ColumnModel this, Number columnIndex, Number newWidth)AbstractColumnModel
Fires when the width of a column changes
+ +

Property Details

+
+ +
+

config

+ public Object config +
+ The config passed into the constructor
+
This property is defined by DefaultColumnModel.
+
+ +
+

defaultSortable

+ public Boolean defaultSortable +
+ Default sortable of columns which have no sortable specified (defaults to false)
+
This property is defined by DefaultColumnModel.
+
+ +
+

defaultWidth

+ public Number defaultWidth +
+ The width of columns which have no width specified (defaults to 100)
+
This property is defined by DefaultColumnModel.
+
+ +
+

sortTypes<static>

+ public Object sortTypes<static> +
+ <static> Defines the default sorting (casting?) comparison functions used when sorting data: +
  sortTypes.none - sorts data as it is without casting or parsing (the default) +
  sortTypes.asUCString - case insensitive string +
  sortTypes.asDate - attempts to parse data as a date +
  sortTypes.asFloat +
  sortTypes.asInt
+
This property is defined by DefaultColumnModel.
+
+
+ + +

Constructor Details

+
+
+

DefaultColumnModel

+ public function DefaultColumnModel(Object config) +
+
+ Parameters: +
  • config : Object
    The config object
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getCellEditor

+ public function getCellEditor(Number colIndex, Number rowIndex) +
+ Returns the editor defined for the cell/column. +
+ Parameters: +
  • colIndex : Number
    The column index
  • rowIndex : Number
    The row index
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getColumnCount

+ public function getColumnCount() +
+ Returns the number of columns. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getColumnHeader

+ public function getColumnHeader(Number col) +
+ Returns the header for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getColumnWidth

+ public function getColumnWidth(Number col) +
+ Returns the width for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getDataIndex

+ public function getDataIndex(Number col) +
+ Returns the dataIndex for the specified column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getRenderer

+ public function getRenderer(Number col) +
+ Returns the rendering (formatting) function defined for the column. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getSortType

+ public function getSortType(Number col) +
+ Returns the sorting comparison function defined for the column (defaults to sortTypes.none). +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

getTotalWidth

+ public function getTotalWidth(Boolean includeHidden) +
+ Returns the total width of all columns. +
+ Parameters: +
  • includeHidden : Boolean
    True to include hidden column widths
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

isCellEditable

+ public function isCellEditable(Number colIndex, Number rowIndex) +
+ Returns true if the cell is editable. +
+ Parameters: +
  • colIndex : Number
    The column index
  • rowIndex : Number
    The row index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

isFixed

+ public function isFixed() +
+ Returns true if the column width cannot be changed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

isHidden

+ public function isHidden(Number colIndex) +
+ Returns true if the column is hidden. +
+ Parameters: +
  • colIndex : Number
    The column index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

isResizable

+ public function isResizable() +
+ Returns true if the column cannot be resized +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

isSortable

+ public function isSortable(Number col) +
+ Returns true if the specified column is sortable. +
+ Parameters: +
  • col : Number
    The column index
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

setColumnHeader

+ public function setColumnHeader(Number col, String header) +
+ Sets the header for a column. +
+ Parameters: +
  • col : Number
    The column index
  • header : String
    The new header
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setColumnWidth

+ public function setColumnWidth(Number col, Number width) +
+ Sets the width for a column. +
+ Parameters: +
  • col : Number
    The column index
  • width : Number
    The new width
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setDataIndex

+ public function setDataIndex(Number col, Number dataIndex) +
+ Sets the dataIndex for a column. +
+ Parameters: +
  • col : Number
    The column index
  • dataIndex : Number
    The new dataIndex
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setEditable

+ public function setEditable(Number col, Boolean editable) +
+ Sets if a column is editable. +
+ Parameters: +
  • col : Number
    The column index
  • editable : Boolean
    True if the column is editable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setEditor

+ public function setEditor(Number col, Object editor) +
+ Sets the editor for a column. +
+ Parameters: +
  • col : Number
    The column index
  • editor : Object
    The editor object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setHidden

+ public function setHidden(Number colIndex) +
+ Sets if a column is hidden. +
+ Parameters: +
  • colIndex : Number
    The column index
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setRenderer

+ public function setRenderer(Number col, Function fn) +
+ Sets the rendering (formatting) function for a column. +
+ Parameters: +
  • col : Number
    The column index
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+ +
+

setSortType

+ public function setSortType(Number col, Function fn) +
+ Sets the sorting comparison function for a column. +
+ Parameters: +
  • col : Number
    The column index
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultColumnModel.
+
+
+ +

Event Details

+
+ +
+

headerchange

+ public event headerchange +
+ Fires when the text of a header changes +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • newText : Number
    The new header text
+
+
+
This event is defined by AbstractColumnModel.
+
+ +
+

hiddenchange

+ public event hiddenchange +
+ Fires when a column is hidden or "unhidden" +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • hidden : Number
    true if hidden, false otherwise
+
+
+
This event is defined by AbstractColumnModel.
+
+ +
+

widthchange

+ public event widthchange +
+ Fires when the width of a column changes +
+ Subscribers will be called with the following parameters: +
  • this : ColumnModel
  • columnIndex : Number
    The column index
  • newWidth : Number
    The new width
+
+
+
This event is defined by AbstractColumnModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultDataModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultDataModel.html new file mode 100644 index 000000000..82cf0e1a2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultDataModel.html @@ -0,0 +1,752 @@ + + + + YAHOO.ext.grid.DefaultDataModel + + + + + +
+ +

Class YAHOO.ext.grid.DefaultDataModel

+ + + + + + +
Package:YAHOO.ext.grid
Class:DefaultDataModel
Extends:AbstractDataModel
Subclasses:LoadableDataModel
Defined In:DefaultDataModel.js
+
+ This is the default implementation of a DataModel used by the Grid. It works +with multi-dimensional array based data. Using the event system in the base class +YAHOO.ext.grid.AbstractDataModel, all updates to this DataModel are automatically +reflected in the user interface. +
Usage:
+

+var myData = [
+	["MSFT","Microsoft Corporation", "314,571.156", "32,187.000", "55000"],
+	["ORCL", "Oracle Corporation", "62,615.266", "9,519.000", "40650"]
+];
+var dataModel = new YAHOO.ext.grid.DefaultDataModel(myData);
+
+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 sortTypes<static> : ObjectDefaultDataModel
<static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DefaultDataModel(Array data)DefaultDataModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addRow(Array cellValues) : NumberDefaultDataModel
Adds a row to the dataset.
 applySort() : voidDefaultDataModel
Applies the last used sort to the current data.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 each(Function fn, [Object scope]) : voidDefaultDataModel
Calls passed function with each rows data - if the function returns false it stops.
 filter(Object query) : NumberDefaultDataModel
Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getRow() : ArrayDefaultDataModel
Returns the column data for the specified row.
 getRowCount() : NumberDefaultDataModel
Returns the number of rows in the dataset
 getRowId() : NumberDefaultDataModel
Returns the ID of the specified row. By default it return the value of the first column. +Override to provide more ad...
 getRows(Array indexes) : ArrayDefaultDataModel
Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of ...
 getValueAt(Number rowIndex, Number colIndex) : ObjectDefaultDataModel
Returns the value at the specified data position
 insertRow(Number index, Array cellValues) : NumberDefaultDataModel
Inserts a row a the specified location in the dataset.
 purgeListeners() : voidObservable
Removes all listeners for this object
 query(Object spec, Boolean returnUnmatched) : ArrayDefaultDataModel
Query the DataModel rows by the filters defined in spec, for example... + +// column 1 starts with Jack, column 2 filte...
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 removeRow(Number index) : voidDefaultDataModel
Remove a row.
 setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sets the default sort info. Note: this function does not actually apply the sort.
 setValueAt(Object value, Number rowIndex, Number colIndex) : voidDefaultDataModel
Sets the specified value at the specified data position
 sort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 cellupdated : (DataModel this, Number rowIndex, Number columnIndex)AbstractDataModel
Fires when a cell is updated
 datachanged : (DataModel this)AbstractDataModel
Fires when the entire data structure has changed
 rowsdeleted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been deleted
 rowsinserted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been inserted
 rowssorted : (DataModel this)AbstractDataModel
Fires when the data has been sorted
 rowsupdated : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been updated
+ +

Property Details

+
+ +
+

sortTypes<static>

+ public Object sortTypes<static> +
+ <static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+
This property is defined by DefaultDataModel.
+
+
+ + +

Constructor Details

+
+
+

DefaultDataModel

+ public function DefaultDataModel(Array data) +
+
+ Parameters: +
  • data : Array
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addRow

+ public function addRow(Array cellValues) +
+ Adds a row to the dataset. +
+ Parameters: +
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index of the added row
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

applySort

+ public function applySort() +
+ Applies the last used sort to the current data. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls passed function with each rows data - if the function returns false it stops. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

filter

+ public function filter(Object query) +
+ Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec. +
+ Parameters: +
  • query : Object
    The query spec query
+ Returns: +
    +
  • Number
    The number of rows removed
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getRow

+ public function getRow() +
+ Returns the column data for the specified row. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowCount

+ public function getRowCount() +
+ Returns the number of rows in the dataset +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowId

+ public function getRowId() +
+ Returns the ID of the specified row. By default it return the value of the first column. +Override to provide more advanced ID handling. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRows

+ public function getRows(Array indexes) +
+ Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. +
+ Parameters: +
  • indexes : Array
    The row indexes to fetch
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getValueAt

+ public function getValueAt(Number rowIndex, Number colIndex) +
+ Returns the value at the specified data position +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

insertRow

+ public function insertRow(Number index, Array cellValues) +
+ Inserts a row a the specified location in the dataset. +
+ Parameters: +
  • index : Number
    The index where the row should be inserted
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index the row was inserted in
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

query

+ public function query(Object spec, Boolean returnUnmatched) +
+ Query the DataModel rows by the filters defined in spec, for example... +

+// column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
+dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
+
+
+ Parameters: +
  • spec : Object
    The spec is generally an object literal consisting of column index and filter type. The filter type can be a string/number (exact match), a regular expression to test using String.search() or a function to call. If it's a function, it will be called with the value for the specified column and an array of the all column values for that row: yourFcn(value, columnData). If it returns anything other than true, the row is not a match. If you have modified Object.prototype this method may fail.
  • returnUnmatched : Boolean
    True to return rows which don't match the query instead of rows that do match
+ Returns: +
    +
  • Array
    An array of row indexes that match
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeRow

+ public function removeRow(Number index) +
+ Remove a row. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sets the default sort info. Note: this function does not actually apply the sort. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setValueAt

+ public function setValueAt(Object value, Number rowIndex, Number colIndex) +
+ Sets the specified value at the specified data position +
+ Parameters: +
  • value : Object
    The new value
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

sort

+ public function sort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+
+ +

Event Details

+
+ +
+

cellupdated

+ public event cellupdated +
+ Fires when a cell is updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the entire data structure has changed +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsdeleted

+ public event rowsdeleted +
+ Fires when a range of rows have been deleted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsinserted

+ public event rowsinserted +
+ Fires when a range of rows have been inserted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowssorted

+ public event rowssorted +
+ Fires when the data has been sorted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsupdated

+ public event rowsupdated +
+ Fires when a range of rows have been updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultSelectionModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultSelectionModel.html new file mode 100644 index 000000000..9616e5991 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.DefaultSelectionModel.html @@ -0,0 +1,771 @@ + + + + YAHOO.ext.grid.DefaultSelectionModel + + + + + +
+ +

Class YAHOO.ext.grid.DefaultSelectionModel

+ + + + + + +
Package:YAHOO.ext.grid
Class:DefaultSelectionModel
Extends:Observable
Subclasses:EditorSelectionModel, SingleSelectionModel
Defined In:SelectionModel.js
+
+ The default SelectionModel used by YAHOO.ext.grid.Grid. + It supports multiple selections and keyboard selection/navigation.

+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DefaultSelectionModel()DefaultSelectionModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 clearSelections() : voidDefaultSelectionModel
Clears all selections.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) : voidDefaultSelectionModel
Deselects a range of rows. All rows in between startRow and endRow are also deselected.
 deselectRow(Number/HTMLElement row) : voidDefaultSelectionModel
Deselects a row.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focusRow(HTMLElement row) : voidDefaultSelectionModel
Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow...
 getCount() : NumberDefaultSelectionModel
Gets the number of selected rows.
 getSelectedRowIds() : ArrayDefaultSelectionModel
Returns the selected row ids.
 getSelectedRows() : ArrayDefaultSelectionModel
Returns the selected rows.
 hasSelection() : BooleanDefaultSelectionModel
Returns True if there is a selection.
 isLocked() : BooleanDefaultSelectionModel
Returns true if the selections are locked
 isSelectable(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selectable.
 isSelected(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selected.
 lock() : voidDefaultSelectionModel
Lock the selections
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 selectAll() : voidDefaultSelectionModel
Selects all rows.
 selectFirstRow() : voidDefaultSelectionModel
Selects the first row in the grid.
 selectNext([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row immediately following the last selected row.
 selectPrevious([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row that precedes the last selected row.
 selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a range of rows. All rows in between startRow and endRow are also selected.
 selectRow(Number/HTMLElement row, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a row.
 selectRows(Array rows, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects multiple rows.
 selectRowsById(String/Array id, [Boolean keepExisting]) : voidDefaultSelectionModel
Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index).
 unlock() : voidDefaultSelectionModel
Unlock the selections
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 dragenter : (SelectionModel this, HTMLElement row, Boolean selected)DefaultSelectionModel
Fires when a row is selected or deselected
 selectionchange : (SelectionModel this, Array rows, String ids)DefaultSelectionModel
Fires when the selection changes
+ + + +

Constructor Details

+
+
+

DefaultSelectionModel

+ public function DefaultSelectionModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clears all selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

deselectRange

+ public function deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) +
+ Deselects a range of rows. All rows in between startRow and endRow are also deselected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

deselectRow

+ public function deselectRow(Number/HTMLElement row) +
+ Deselects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to deselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

focusRow

+ public function focusRow(HTMLElement row) +
+ Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow() instead. +
+ Parameters: +
  • row : HTMLElement
    The row to focus
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRowIds

+ public function getSelectedRowIds() +
+ Returns the selected row ids. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of String ids
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRows

+ public function getSelectedRows() +
+ Returns the selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of DOM row elements
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Returns True if there is a selection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelectable

+ public function isSelectable(HTMLElement row) +
+ Returns True if the specified row is selectable. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelected

+ public function isSelected(HTMLElement row) +
+ Returns True if the specified row is selected. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

selectAll

+ public function selectAll() +
+ Selects all rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectFirstRow

+ public function selectFirstRow() +
+ Selects the first row in the grid. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectNext

+ public function selectNext([Boolean keepExisting]) +
+ Selects the row immediately following the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectPrevious

+ public function selectPrevious([Boolean keepExisting]) +
+ Selects the row that precedes the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRange

+ public function selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) +
+ Selects a range of rows. All rows in between startRow and endRow are also selected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRow

+ public function selectRow(Number/HTMLElement row, [Boolean keepExisting]) +
+ Selects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRows

+ public function selectRows(Array rows, [Boolean keepExisting]) +
+ Selects multiple rows. +
+ Parameters: +
  • rows : Array
    Array of the rows or indexes of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRowsById

+ public function selectRowsById(String/Array id, [Boolean keepExisting]) +
+ Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index). +
+ Parameters: +
  • id : String/Array
    The id(s) to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+
+ +

Event Details

+
+ +
+

dragenter

+ public event dragenter +
+ Fires when a row is selected or deselected +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • row : HTMLElement
    The row element
  • selected : Boolean
    true if the row was selected, false if deselected
+
+
+
This event is defined by DefaultSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selection changes +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rows : Array
    Array of row elements that are selected
  • ids : String
    Array of ids that are selected
+
+
+
This event is defined by DefaultSelectionModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorAndSelectionModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorAndSelectionModel.html new file mode 100644 index 000000000..dff52b39a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorAndSelectionModel.html @@ -0,0 +1,37 @@ + + + + YAHOO.ext.grid.EditorAndSelectionModel + + + + + +
+ +

Class YAHOO.ext.grid.EditorAndSelectionModel

+ + + + + +
Package:YAHOO.ext.grid
Class:EditorAndSelectionModel
Extends:Object
Defined In:EditorSelectionModel.js
+
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+
This class has no public methods.
+

Public Events

+
This class has no public events.
+ + + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorGrid.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorGrid.html new file mode 100644 index 000000000..74b9689eb --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorGrid.html @@ -0,0 +1,1785 @@ + + + + YAHOO.ext.grid.EditorGrid + + + + + +
+ +

Class YAHOO.ext.grid.EditorGrid

+ + + + + +
Package:YAHOO.ext.grid
Class:EditorGrid
Extends:Grid
Defined In:EditorGrid.js
+
+ Shortcut class for creating and editable grid.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 allowTextSelectionPattern : ObjectGrid
A regular expression defining tagNames +allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i)
 autoHeight : BooleanGrid
True to fit the height of the grid container to the height of the data (defaults to false)
 autoSizeColumns : BooleanGrid
True to automatically resize the columns to fit their content on initial render
 autoSizeHeaders : BooleanGrid
True to measure headers with column data when auto sizing columns
 autoWidth : BooleanGrid
True to fit the width of the grid container to the width of the columns (defaults to false)
 ddText : StringGrid
Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected...
 enableDragDrop : BooleanGrid
True to enable drag and drop of rows
 maxRowsToMeasure : NumberGrid
If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of +rows measured to get a columns size - d...
 minColumnWidth : NumberGrid
The minimum width a column can be resized to. (Defaults to 25)
 monitorWindowResize : ObjectGrid
True to autoSize the grid when the window resizes - defaults to true
 stripeRows : BooleanGrid
True to stripe the rows (default is true)
 trackMouseOver : BooleanGrid
True to highlight rows when the mouse is over (default is false)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 autoSize() : voidGrid
Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, +but if manual update ...
 bindToField(String The) : voidGrid
Binds this grid to the field with the specified id. Initially reads and parses the comma +delimited ids in the field ...
 clearSelections() : voidGrid
Convenience method for getSelectionModel().clearSelections() - +See YAHOO.ext.grid.DefaultSelectionModel.clearSelecti...
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getCellAfter(HTMLElement cell, Boolean includeHidden) : HTMLElementGrid
Returns the cell that comes after the specified cell - text nodes are skipped.
 getCellBefore(HTMLElement cell, Boolean includeHidden) : HTMLElementGrid
Returns the cell that comes before the specified cell - text nodes are skipped.
 getCellFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the cell that contains the specified child element.
 getColumnModel() : ColumnModelGrid
Returns the grid's ColumnModel.
 getDataModel() : DataModelGrid
Returns the grid's DataModel.
 getDragDropText() : StringGrid
Called to get grid's drag proxy text, by default returns this.ddText.
 getFirstCell(HTMLElement row, Boolean includeHidden) : HTMLElementGrid
Returns the first cell for the row - text nodes and hidden columns are skipped.
 getHeaderFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the header element that contains the specified child element.
 getLastCell(HTMLElement row, Boolean includeHidden) : HTMLElementGrid
Returns the last cell for the row - text nodes and hidden columns are skipped.
 getRow(Number index) : HTMLElementGrid
Returns the table row at the specified index
 getRowAfter(HTMLElement row) : HTMLElementGrid
Returns the row that comes after the specified row - text nodes are skipped.
 getRowBefore(HTMLElement row) : HTMLElementGrid
Returns the row that comes before the specified row - text nodes are skipped.
 getRowFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the row that contains the specified child element.
 getRowsById(String/Array An) : HtmlElement/ArrayGrid
Returns the rows that have the specified id(s). The id value for a row is provided +by the DataModel. See YAHOO.ext.g...
 getSelectedRow() : HTMLElementGrid
Convenience method for getSelectionModel().getSelectedRows()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelect...
 getSelectedRowId() : StringGrid
Convenience method for getSelectionModel().getSelectedRowIds()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSele...
 getSelectedRowIds() : ArrayGrid
Convenience method for getSelectionModel().getSelectedRowIds() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelecte...
 getSelectedRowIndex() : NumberGrid
Gets the first selected row or -1 if none are selected
 getSelectedRowIndexes() : ArrayGrid
Get the selected row indexes
 getSelectedRows() : ArrayGrid
Convenience method for getSelectionModel().getSelectedRows() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedR...
 getSelectionCount() : NumberGrid
Convenience method for getSelectionModel().getCount() - +See YAHOO.ext.grid.DefaultSelectionModel.getCount for more d...
 getSelectionModel() : SelectionModelGrid
Returns the grid's SelectionModel.
 getView() : GridViewGrid
Returns the grid's GridView object.
 hasSelection() : BooleanGrid
Convenience method for getSelectionModel().hasSelection() - +See YAHOO.ext.grid.DefaultSelectionModel.hasSelection fo...
 purgeListeners() : voidObservable
Removes all listeners for this object
 readField() : voidGrid
Causes the grid to read and select the ids from the bound field - See bindToField.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : voidGrid
Called once after all setup has been completed and the grid is ready to be rendered.
 scrollTo(Number/HTMLElement row) : voidGrid
Scrolls the grid to the specified row
 selectAll() : voidGrid
Convenience method for getSelectionModel().selectAll() - +See YAHOO.ext.grid.DefaultSelectionModel.selectAll for more...
 setDataModel(DataModel dm) : voidGrid
Replace the current data model with a new one (experimental)
 startEditing(Number rowIndex, Number colIndex) : voidGrid
Starts editing the specified for the specified row/column
 stopEditing() : voidGrid
Stops any active editing
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 afteredit : (Grid this, Number rowIndex, Number columnIndex)Grid
Fires after a cell is edited
 beforeedit : (Grid this, Number rowIndex, Number columnIndex)Grid
Fires before a cell is edited
 bodyscroll : (Number scrollLeft, Number scrollTop)Grid
Fires when the body element is scrolled
 cellclick : (Grid this, Number rowIndex, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is clicked
 celldblclick : (Grid this, Number rowIndex, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is double clicked
 click : (YAHOO.ext.EventObject e)Grid
The raw click event for the entire grid.
 columnresize : (Number columnIndex, Number newSize)Grid
Fires when the user resizes a column
 dblclick : (YAHOO.ext.EventObject e)Grid
The raw dblclick event for the entire grid.
 dragdrop : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when dragged row(s) are dropped on a valid DD target
 dragenter : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) first cross another DD target while being dragged
 dragout : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) leave another DD target while being dragged
 dragover : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dr...
 enddrag : (Grid this, YAHOO.ext.GridDD dd, event e)Grid
Fires when a drag operation is complete
 headerclick : (Grid this, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a header is clicked
 headercontextmenu : (Grid this, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a header is right clicked
 keydown : (YAHOO.ext.EventObject e)Grid
The raw keydown event for the entire grid.
 keypress : (YAHOO.ext.EventObject e)Grid
The raw keypress event for the entire grid.
 mousedown : (YAHOO.ext.EventObject e)Grid
The raw mousedown event for the entire grid.
 mouseout : (YAHOO.ext.EventObject e)Grid
The raw mouseout event for the entire grid.
 mouseover : (YAHOO.ext.EventObject e)Grid
The raw mouseover event for the entire grid.
 mouseup : (YAHOO.ext.EventObject e)Grid
The raw mouseup event for the entire grid.
 rowclick : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a row is clicked
 rowcontextmenu : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a row is right clicked
 rowdblclick : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is double clicked
 startdrag : (Grid this, YAHOO.ext.GridDD dd, event e)Grid
Fires when row(s) start being dragged
+ +

Property Details

+
+ +
+

allowTextSelectionPattern

+ public Object allowTextSelectionPattern +
+ A regular expression defining tagNames +allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i)
+
This property is defined by Grid.
+
+ +
+

autoHeight

+ public Boolean autoHeight +
+ True to fit the height of the grid container to the height of the data (defaults to false)
+
This property is defined by Grid.
+
+ +
+

autoSizeColumns

+ public Boolean autoSizeColumns +
+ True to automatically resize the columns to fit their content on initial render
+
This property is defined by Grid.
+
+ +
+

autoSizeHeaders

+ public Boolean autoSizeHeaders +
+ True to measure headers with column data when auto sizing columns
+
This property is defined by Grid.
+
+ +
+

autoWidth

+ public Boolean autoWidth +
+ True to fit the width of the grid container to the width of the columns (defaults to false)
+
This property is defined by Grid.
+
+ +
+

ddText

+ public String ddText +
+ Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected rows.
+
This property is defined by Grid.
+
+ +
+

enableDragDrop

+ public Boolean enableDragDrop +
+ True to enable drag and drop of rows
+
This property is defined by Grid.
+
+ +
+

maxRowsToMeasure

+ public Number maxRowsToMeasure +
+ If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of +rows measured to get a columns size - defaults to 0 (all rows).
+
This property is defined by Grid.
+
+ +
+

minColumnWidth

+ public Number minColumnWidth +
+ The minimum width a column can be resized to. (Defaults to 25)
+
This property is defined by Grid.
+
+ +
+

monitorWindowResize

+ public Object monitorWindowResize +
+ True to autoSize the grid when the window resizes - defaults to true
+
This property is defined by Grid.
+
+ +
+

stripeRows

+ public Boolean stripeRows +
+ True to stripe the rows (default is true)
+
This property is defined by Grid.
+
+ +
+

trackMouseOver

+ public Boolean trackMouseOver +
+ True to highlight rows when the mouse is over (default is false)
+
This property is defined by Grid.
+
+
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

autoSize

+ public function autoSize() +
+ Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, +but if manual update is required this method will initiate it. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

bindToField

+ public function bindToField(String The) +
+ Binds this grid to the field with the specified id. Initially reads and parses the comma +delimited ids in the field and selects those items. All selections made in the grid +will be persisted to the field by their ids comma delimited. +
+ Parameters: +
  • The : String
    id of the field to bind to
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Convenience method for getSelectionModel().clearSelections() - +See YAHOO.ext.grid.DefaultSelectionModel.clearSelections for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getCellAfter

+ public function getCellAfter(HTMLElement cell, Boolean includeHidden) +
+ Returns the cell that comes after the specified cell - text nodes are skipped. +
+ Parameters: +
  • cell : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getCellBefore

+ public function getCellBefore(HTMLElement cell, Boolean includeHidden) +
+ Returns the cell that comes before the specified cell - text nodes are skipped. +
+ Parameters: +
  • cell : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getCellFromChild

+ public function getCellFromChild(HTMLElement childEl) +
+ Returns the cell that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getColumnModel

+ public function getColumnModel() +
+ Returns the grid's ColumnModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • ColumnModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDataModel

+ public function getDataModel() +
+ Returns the grid's DataModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • DataModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDragDropText

+ public function getDragDropText() +
+ Called to get grid's drag proxy text, by default returns this.ddText. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getFirstCell

+ public function getFirstCell(HTMLElement row, Boolean includeHidden) +
+ Returns the first cell for the row - text nodes and hidden columns are skipped. +
+ Parameters: +
  • row : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getHeaderFromChild

+ public function getHeaderFromChild(HTMLElement childEl) +
+ Returns the header element that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getLastCell

+ public function getLastCell(HTMLElement row, Boolean includeHidden) +
+ Returns the last cell for the row - text nodes and hidden columns are skipped. +
+ Parameters: +
  • row : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRow

+ public function getRow(Number index) +
+ Returns the table row at the specified index +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowAfter

+ public function getRowAfter(HTMLElement row) +
+ Returns the row that comes after the specified row - text nodes are skipped. +
+ Parameters: +
  • row : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowBefore

+ public function getRowBefore(HTMLElement row) +
+ Returns the row that comes before the specified row - text nodes are skipped. +
+ Parameters: +
  • row : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowFromChild

+ public function getRowFromChild(HTMLElement childEl) +
+ Returns the row that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowsById

+ public function getRowsById(String/Array An) +
+ Returns the rows that have the specified id(s). The id value for a row is provided +by the DataModel. See YAHOO.ext.grid.DefaultDataModel.getRowId. +
+ Parameters: +
  • An : String/Array
    id to find or an array of ids
+ Returns: +
    +
  • HtmlElement/Array
    If one id was passed in, it returns one result. If an array of ids was specified, it returns an Array of HTMLElements
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRow

+ public function getSelectedRow() +
+ Convenience method for getSelectionModel().getSelectedRows()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRows for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowId

+ public function getSelectedRowId() +
+ Convenience method for getSelectionModel().getSelectedRowIds()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRowIds for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIds

+ public function getSelectedRowIds() +
+ Convenience method for getSelectionModel().getSelectedRowIds() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRowIds for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIndex

+ public function getSelectedRowIndex() +
+ Gets the first selected row or -1 if none are selected +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIndexes

+ public function getSelectedRowIndexes() +
+ Get the selected row indexes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of indexes
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRows

+ public function getSelectedRows() +
+ Convenience method for getSelectionModel().getSelectedRows() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRows for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectionCount

+ public function getSelectionCount() +
+ Convenience method for getSelectionModel().getCount() - +See YAHOO.ext.grid.DefaultSelectionModel.getCount for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectionModel

+ public function getSelectionModel() +
+ Returns the grid's SelectionModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • SelectionModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getView

+ public function getView() +
+ Returns the grid's GridView object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • GridView
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Convenience method for getSelectionModel().hasSelection() - +See YAHOO.ext.grid.DefaultSelectionModel.hasSelection for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

readField

+ public function readField() +
+ Causes the grid to read and select the ids from the bound field - See bindToField. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

render

+ public function render() +
+ Called once after all setup has been completed and the grid is ready to be rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

scrollTo

+ public function scrollTo(Number/HTMLElement row) +
+ Scrolls the grid to the specified row +
+ Parameters: +
  • row : Number/HTMLElement
    The row object or index of the row
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

selectAll

+ public function selectAll() +
+ Convenience method for getSelectionModel().selectAll() - +See YAHOO.ext.grid.DefaultSelectionModel.selectAll for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

setDataModel

+ public function setDataModel(DataModel dm) +
+ Replace the current data model with a new one (experimental) +
+ Parameters: +
  • dm : DataModel
    The new data model @pram {Boolean} rerender true to render the grid rows from scratch
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

startEditing

+ public function startEditing(Number rowIndex, Number colIndex) +
+ Starts editing the specified for the specified row/column +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

stopEditing

+ public function stopEditing() +
+ Stops any active editing +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+
+ +

Event Details

+
+ +
+

afteredit

+ public event afteredit +
+ Fires after a cell is edited +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by Grid.
+
+ +
+

beforeedit

+ public event beforeedit +
+ Fires before a cell is edited +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by Grid.
+
+ +
+

bodyscroll

+ public event bodyscroll +
+ Fires when the body element is scrolled +
+ Subscribers will be called with the following parameters: +
  • scrollLeft : Number
  • scrollTop : Number
+
+
+
This event is defined by Grid.
+
+ +
+

cellclick

+ public event cellclick +
+ Fires when a cell is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

celldblclick

+ public event celldblclick +
+ Fires when a cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

click

+ public event click +
+ The raw click event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

columnresize

+ public event columnresize +
+ Fires when the user resizes a column +
+ Subscribers will be called with the following parameters: +
  • columnIndex : Number
  • newSize : Number
+
+
+
This event is defined by Grid.
+
+ +
+

dblclick

+ public event dblclick +
+ The raw dblclick event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

dragdrop

+ public event dragdrop +
+ Fires when dragged row(s) are dropped on a valid DD target +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragenter

+ public event dragenter +
+ Fires when the dragged row(s) first cross another DD target while being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragout

+ public event dragout +
+ Fires when the dragged row(s) leave another DD target while being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragover

+ public event dragover +
+ Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dragged over. +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

enddrag

+ public event enddrag +
+ Fires when a drag operation is complete +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

headerclick

+ public event headerclick +
+ Fires when a header is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

headercontextmenu

+ public event headercontextmenu +
+ Fires when a header is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

keydown

+ public event keydown +
+ The raw keydown event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

keypress

+ public event keypress +
+ The raw keypress event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mousedown

+ public event mousedown +
+ The raw mousedown event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseout

+ public event mouseout +
+ The raw mouseout event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseover

+ public event mouseover +
+ The raw mouseover event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseup

+ public event mouseup +
+ The raw mouseup event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowclick

+ public event rowclick +
+ Fires when a row is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowcontextmenu

+ public event rowcontextmenu +
+ Fires when a row is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowdblclick

+ public event rowdblclick +
+ Fires when a cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

startdrag

+ public event startdrag +
+ Fires when row(s) start being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorSelectionModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorSelectionModel.html new file mode 100644 index 000000000..8ccf3398b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.EditorSelectionModel.html @@ -0,0 +1,794 @@ + + + + YAHOO.ext.grid.EditorSelectionModel + + + + + +
+ +

Class YAHOO.ext.grid.EditorSelectionModel

+ + + + + +
Package:YAHOO.ext.grid
Class:EditorSelectionModel
Extends:DefaultSelectionModel
Defined In:EditorSelectionModel.js
+
+ Extends YAHOO.ext.grid.DefaultSelectionModel to enable cell navigation.

+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 clicksToActivateCell : NumberEditorSelectionModel
Number of clicks to activate a cell (for editing) - valid values are 1 or 2
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 EditorSelectionModel()EditorSelectionModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 clearSelections() : voidDefaultSelectionModel
Clears all selections.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) : voidDefaultSelectionModel
Deselects a range of rows. All rows in between startRow and endRow are also deselected.
 deselectRow(Number/HTMLElement row) : voidDefaultSelectionModel
Deselects a row.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focusRow(HTMLElement row) : voidDefaultSelectionModel
Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow...
 getCount() : NumberDefaultSelectionModel
Gets the number of selected rows.
 getSelectedRowIds() : ArrayDefaultSelectionModel
Returns the selected row ids.
 getSelectedRows() : ArrayDefaultSelectionModel
Returns the selected rows.
 hasSelection() : BooleanDefaultSelectionModel
Returns True if there is a selection.
 isLocked() : BooleanDefaultSelectionModel
Returns true if the selections are locked
 isSelectable(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selectable.
 isSelected(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selected.
 lock() : voidDefaultSelectionModel
Lock the selections
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 selectAll() : voidDefaultSelectionModel
Selects all rows.
 selectFirstRow() : voidDefaultSelectionModel
Selects the first row in the grid.
 selectNext([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row immediately following the last selected row.
 selectPrevious([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row that precedes the last selected row.
 selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a range of rows. All rows in between startRow and endRow are also selected.
 selectRow(Number/HTMLElement row, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a row.
 selectRows(Array rows, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects multiple rows.
 selectRowsById(String/Array id, [Boolean keepExisting]) : voidDefaultSelectionModel
Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index).
 unlock() : voidDefaultSelectionModel
Unlock the selections
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 dragenter : (SelectionModel this, HTMLElement row, Boolean selected)DefaultSelectionModel
Fires when a row is selected or deselected
 selectionchange : (SelectionModel this, Array rows, String ids)DefaultSelectionModel
Fires when the selection changes
+ +

Property Details

+
+ +
+

clicksToActivateCell

+ public Number clicksToActivateCell +
+ Number of clicks to activate a cell (for editing) - valid values are 1 or 2
+
This property is defined by EditorSelectionModel.
+
+
+ + +

Constructor Details

+
+
+

EditorSelectionModel

+ public function EditorSelectionModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clears all selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

deselectRange

+ public function deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) +
+ Deselects a range of rows. All rows in between startRow and endRow are also deselected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

deselectRow

+ public function deselectRow(Number/HTMLElement row) +
+ Deselects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to deselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

focusRow

+ public function focusRow(HTMLElement row) +
+ Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow() instead. +
+ Parameters: +
  • row : HTMLElement
    The row to focus
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRowIds

+ public function getSelectedRowIds() +
+ Returns the selected row ids. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of String ids
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRows

+ public function getSelectedRows() +
+ Returns the selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of DOM row elements
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Returns True if there is a selection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelectable

+ public function isSelectable(HTMLElement row) +
+ Returns True if the specified row is selectable. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelected

+ public function isSelected(HTMLElement row) +
+ Returns True if the specified row is selected. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

selectAll

+ public function selectAll() +
+ Selects all rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectFirstRow

+ public function selectFirstRow() +
+ Selects the first row in the grid. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectNext

+ public function selectNext([Boolean keepExisting]) +
+ Selects the row immediately following the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectPrevious

+ public function selectPrevious([Boolean keepExisting]) +
+ Selects the row that precedes the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRange

+ public function selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) +
+ Selects a range of rows. All rows in between startRow and endRow are also selected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRow

+ public function selectRow(Number/HTMLElement row, [Boolean keepExisting]) +
+ Selects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRows

+ public function selectRows(Array rows, [Boolean keepExisting]) +
+ Selects multiple rows. +
+ Parameters: +
  • rows : Array
    Array of the rows or indexes of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRowsById

+ public function selectRowsById(String/Array id, [Boolean keepExisting]) +
+ Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index). +
+ Parameters: +
  • id : String/Array
    The id(s) to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+
+ +

Event Details

+
+ +
+

dragenter

+ public event dragenter +
+ Fires when a row is selected or deselected +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • row : HTMLElement
    The row element
  • selected : Boolean
    true if the row was selected, false if deselected
+
+
+
This event is defined by DefaultSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selection changes +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rows : Array
    Array of row elements that are selected
  • ids : String
    Array of ids that are selected
+
+
+
This event is defined by DefaultSelectionModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.Grid.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.Grid.html new file mode 100644 index 000000000..f30020a72 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.Grid.html @@ -0,0 +1,1822 @@ + + + + YAHOO.ext.grid.Grid + + + + + +
+ +

Class YAHOO.ext.grid.Grid

+ + + + + + +
Package:YAHOO.ext.grid
Class:Grid
Extends:Observable
Subclasses:EditorGrid
Defined In:Grid.js
+
+ This class represents the primary interface of a component based grid control. +

Usage:

+var grid = new YAHOO.ext.grid.Grid('my-container-id', dataModel, columnModel);
+// set any options
+grid.render();
+
+Common Problems: +- Grid does not resize properly when going smaller: Setting overflow hidden on the container +element will correct this +- If you get el.style[camel]= NaNpx or -2px or something related, be certain you have given your container element +dimensions. The grid adapts to your container's size, if your container has no size defined then the results +are unpredictable. +- Do not put render the grid into an element with display:none. Use visibility:hidden +and position:absolute - at least until the grid is rendered. Otherwise there is no way for the +grid to calculate dimension/offsets.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 allowTextSelectionPattern : ObjectGrid
A regular expression defining tagNames +allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i)
 autoHeight : BooleanGrid
True to fit the height of the grid container to the height of the data (defaults to false)
 autoSizeColumns : BooleanGrid
True to automatically resize the columns to fit their content on initial render
 autoSizeHeaders : BooleanGrid
True to measure headers with column data when auto sizing columns
 autoWidth : BooleanGrid
True to fit the width of the grid container to the width of the columns (defaults to false)
 ddText : StringGrid
Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected...
 enableDragDrop : BooleanGrid
True to enable drag and drop of rows
 maxRowsToMeasure : NumberGrid
If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of +rows measured to get a columns size - d...
 minColumnWidth : NumberGrid
The minimum width a column can be resized to. (Defaults to 25)
 monitorWindowResize : ObjectGrid
True to autoSize the grid when the window resizes - defaults to true
 stripeRows : BooleanGrid
True to stripe the rows (default is true)
 trackMouseOver : BooleanGrid
True to highlight rows when the mouse is over (default is false)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Grid(String/HTMLElement/YAHOO.ext.Element container, Object dataModel, Object colModel, [Object selectionModel])Grid
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 autoSize() : voidGrid
Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, +but if manual update ...
 bindToField(String The) : voidGrid
Binds this grid to the field with the specified id. Initially reads and parses the comma +delimited ids in the field ...
 clearSelections() : voidGrid
Convenience method for getSelectionModel().clearSelections() - +See YAHOO.ext.grid.DefaultSelectionModel.clearSelecti...
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getCellAfter(HTMLElement cell, Boolean includeHidden) : HTMLElementGrid
Returns the cell that comes after the specified cell - text nodes are skipped.
 getCellBefore(HTMLElement cell, Boolean includeHidden) : HTMLElementGrid
Returns the cell that comes before the specified cell - text nodes are skipped.
 getCellFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the cell that contains the specified child element.
 getColumnModel() : ColumnModelGrid
Returns the grid's ColumnModel.
 getDataModel() : DataModelGrid
Returns the grid's DataModel.
 getDragDropText() : StringGrid
Called to get grid's drag proxy text, by default returns this.ddText.
 getFirstCell(HTMLElement row, Boolean includeHidden) : HTMLElementGrid
Returns the first cell for the row - text nodes and hidden columns are skipped.
 getHeaderFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the header element that contains the specified child element.
 getLastCell(HTMLElement row, Boolean includeHidden) : HTMLElementGrid
Returns the last cell for the row - text nodes and hidden columns are skipped.
 getRow(Number index) : HTMLElementGrid
Returns the table row at the specified index
 getRowAfter(HTMLElement row) : HTMLElementGrid
Returns the row that comes after the specified row - text nodes are skipped.
 getRowBefore(HTMLElement row) : HTMLElementGrid
Returns the row that comes before the specified row - text nodes are skipped.
 getRowFromChild(HTMLElement childEl) : HTMLElementGrid
Returns the row that contains the specified child element.
 getRowsById(String/Array An) : HtmlElement/ArrayGrid
Returns the rows that have the specified id(s). The id value for a row is provided +by the DataModel. See YAHOO.ext.g...
 getSelectedRow() : HTMLElementGrid
Convenience method for getSelectionModel().getSelectedRows()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelect...
 getSelectedRowId() : StringGrid
Convenience method for getSelectionModel().getSelectedRowIds()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSele...
 getSelectedRowIds() : ArrayGrid
Convenience method for getSelectionModel().getSelectedRowIds() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelecte...
 getSelectedRowIndex() : NumberGrid
Gets the first selected row or -1 if none are selected
 getSelectedRowIndexes() : ArrayGrid
Get the selected row indexes
 getSelectedRows() : ArrayGrid
Convenience method for getSelectionModel().getSelectedRows() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedR...
 getSelectionCount() : NumberGrid
Convenience method for getSelectionModel().getCount() - +See YAHOO.ext.grid.DefaultSelectionModel.getCount for more d...
 getSelectionModel() : SelectionModelGrid
Returns the grid's SelectionModel.
 getView() : GridViewGrid
Returns the grid's GridView object.
 hasSelection() : BooleanGrid
Convenience method for getSelectionModel().hasSelection() - +See YAHOO.ext.grid.DefaultSelectionModel.hasSelection fo...
 purgeListeners() : voidObservable
Removes all listeners for this object
 readField() : voidGrid
Causes the grid to read and select the ids from the bound field - See bindToField.
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 render() : voidGrid
Called once after all setup has been completed and the grid is ready to be rendered.
 scrollTo(Number/HTMLElement row) : voidGrid
Scrolls the grid to the specified row
 selectAll() : voidGrid
Convenience method for getSelectionModel().selectAll() - +See YAHOO.ext.grid.DefaultSelectionModel.selectAll for more...
 setDataModel(DataModel dm) : voidGrid
Replace the current data model with a new one (experimental)
 startEditing(Number rowIndex, Number colIndex) : voidGrid
Starts editing the specified for the specified row/column
 stopEditing() : voidGrid
Stops any active editing
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 afteredit : (Grid this, Number rowIndex, Number columnIndex)Grid
Fires after a cell is edited
 beforeedit : (Grid this, Number rowIndex, Number columnIndex)Grid
Fires before a cell is edited
 bodyscroll : (Number scrollLeft, Number scrollTop)Grid
Fires when the body element is scrolled
 cellclick : (Grid this, Number rowIndex, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is clicked
 celldblclick : (Grid this, Number rowIndex, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is double clicked
 click : (YAHOO.ext.EventObject e)Grid
The raw click event for the entire grid.
 columnresize : (Number columnIndex, Number newSize)Grid
Fires when the user resizes a column
 dblclick : (YAHOO.ext.EventObject e)Grid
The raw dblclick event for the entire grid.
 dragdrop : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when dragged row(s) are dropped on a valid DD target
 dragenter : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) first cross another DD target while being dragged
 dragout : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires when the dragged row(s) leave another DD target while being dragged
 dragover : (Grid this, YAHOO.ext.GridDD dd, String targetId, event e)Grid
Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dr...
 enddrag : (Grid this, YAHOO.ext.GridDD dd, event e)Grid
Fires when a drag operation is complete
 headerclick : (Grid this, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a header is clicked
 headercontextmenu : (Grid this, Number columnIndex, YAHOO.ext.EventObject e)Grid
Fires when a header is right clicked
 keydown : (YAHOO.ext.EventObject e)Grid
The raw keydown event for the entire grid.
 keypress : (YAHOO.ext.EventObject e)Grid
The raw keypress event for the entire grid.
 mousedown : (YAHOO.ext.EventObject e)Grid
The raw mousedown event for the entire grid.
 mouseout : (YAHOO.ext.EventObject e)Grid
The raw mouseout event for the entire grid.
 mouseover : (YAHOO.ext.EventObject e)Grid
The raw mouseover event for the entire grid.
 mouseup : (YAHOO.ext.EventObject e)Grid
The raw mouseup event for the entire grid.
 rowclick : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a row is clicked
 rowcontextmenu : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a row is right clicked
 rowdblclick : (Grid this, Number rowIndex, YAHOO.ext.EventObject e)Grid
Fires when a cell is double clicked
 startdrag : (Grid this, YAHOO.ext.GridDD dd, event e)Grid
Fires when row(s) start being dragged
+ +

Property Details

+
+ +
+

allowTextSelectionPattern

+ public Object allowTextSelectionPattern +
+ A regular expression defining tagNames +allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i)
+
This property is defined by Grid.
+
+ +
+

autoHeight

+ public Boolean autoHeight +
+ True to fit the height of the grid container to the height of the data (defaults to false)
+
This property is defined by Grid.
+
+ +
+

autoSizeColumns

+ public Boolean autoSizeColumns +
+ True to automatically resize the columns to fit their content on initial render
+
This property is defined by Grid.
+
+ +
+

autoSizeHeaders

+ public Boolean autoSizeHeaders +
+ True to measure headers with column data when auto sizing columns
+
This property is defined by Grid.
+
+ +
+

autoWidth

+ public Boolean autoWidth +
+ True to fit the width of the grid container to the width of the columns (defaults to false)
+
This property is defined by Grid.
+
+ +
+

ddText

+ public String ddText +
+ Configures the text is the drag proxy (defaults to "%0 selected row(s)"). +%0 is replaced with the number of selected rows.
+
This property is defined by Grid.
+
+ +
+

enableDragDrop

+ public Boolean enableDragDrop +
+ True to enable drag and drop of rows
+
This property is defined by Grid.
+
+ +
+

maxRowsToMeasure

+ public Number maxRowsToMeasure +
+ If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of +rows measured to get a columns size - defaults to 0 (all rows).
+
This property is defined by Grid.
+
+ +
+

minColumnWidth

+ public Number minColumnWidth +
+ The minimum width a column can be resized to. (Defaults to 25)
+
This property is defined by Grid.
+
+ +
+

monitorWindowResize

+ public Object monitorWindowResize +
+ True to autoSize the grid when the window resizes - defaults to true
+
This property is defined by Grid.
+
+ +
+

stripeRows

+ public Boolean stripeRows +
+ True to stripe the rows (default is true)
+
This property is defined by Grid.
+
+ +
+

trackMouseOver

+ public Boolean trackMouseOver +
+ True to highlight rows when the mouse is over (default is false)
+
This property is defined by Grid.
+
+
+ + +

Constructor Details

+
+
+

Grid

+ public function Grid(String/HTMLElement/YAHOO.ext.Element container, Object dataModel, Object colModel, [Object selectionModel]) +
+
+ Parameters: +
  • container : String/HTMLElement/YAHOO.ext.Element
    The element into which this grid will be rendered - The container MUST have some type of size defined for the grid to fill. The container will be automatically set to position relative if it isn't already.
  • dataModel : Object
    The data model to bind to
  • colModel : Object
    The column model with info about this grid's columns
  • selectionModel : Object
    (optional) The selection model for this grid (defaults to DefaultSelectionModel)
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

autoSize

+ public function autoSize() +
+ Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, +but if manual update is required this method will initiate it. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

bindToField

+ public function bindToField(String The) +
+ Binds this grid to the field with the specified id. Initially reads and parses the comma +delimited ids in the field and selects those items. All selections made in the grid +will be persisted to the field by their ids comma delimited. +
+ Parameters: +
  • The : String
    id of the field to bind to
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Convenience method for getSelectionModel().clearSelections() - +See YAHOO.ext.grid.DefaultSelectionModel.clearSelections for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getCellAfter

+ public function getCellAfter(HTMLElement cell, Boolean includeHidden) +
+ Returns the cell that comes after the specified cell - text nodes are skipped. +
+ Parameters: +
  • cell : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getCellBefore

+ public function getCellBefore(HTMLElement cell, Boolean includeHidden) +
+ Returns the cell that comes before the specified cell - text nodes are skipped. +
+ Parameters: +
  • cell : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getCellFromChild

+ public function getCellFromChild(HTMLElement childEl) +
+ Returns the cell that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getColumnModel

+ public function getColumnModel() +
+ Returns the grid's ColumnModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • ColumnModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDataModel

+ public function getDataModel() +
+ Returns the grid's DataModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • DataModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getDragDropText

+ public function getDragDropText() +
+ Called to get grid's drag proxy text, by default returns this.ddText. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getFirstCell

+ public function getFirstCell(HTMLElement row, Boolean includeHidden) +
+ Returns the first cell for the row - text nodes and hidden columns are skipped. +
+ Parameters: +
  • row : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getHeaderFromChild

+ public function getHeaderFromChild(HTMLElement childEl) +
+ Returns the header element that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getLastCell

+ public function getLastCell(HTMLElement row, Boolean includeHidden) +
+ Returns the last cell for the row - text nodes and hidden columns are skipped. +
+ Parameters: +
  • row : HTMLElement
  • includeHidden : Boolean
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRow

+ public function getRow(Number index) +
+ Returns the table row at the specified index +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowAfter

+ public function getRowAfter(HTMLElement row) +
+ Returns the row that comes after the specified row - text nodes are skipped. +
+ Parameters: +
  • row : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowBefore

+ public function getRowBefore(HTMLElement row) +
+ Returns the row that comes before the specified row - text nodes are skipped. +
+ Parameters: +
  • row : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowFromChild

+ public function getRowFromChild(HTMLElement childEl) +
+ Returns the row that contains the specified child element. +
+ Parameters: +
  • childEl : HTMLElement
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getRowsById

+ public function getRowsById(String/Array An) +
+ Returns the rows that have the specified id(s). The id value for a row is provided +by the DataModel. See YAHOO.ext.grid.DefaultDataModel.getRowId. +
+ Parameters: +
  • An : String/Array
    id to find or an array of ids
+ Returns: +
    +
  • HtmlElement/Array
    If one id was passed in, it returns one result. If an array of ids was specified, it returns an Array of HTMLElements
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRow

+ public function getSelectedRow() +
+ Convenience method for getSelectionModel().getSelectedRows()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRows for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowId

+ public function getSelectedRowId() +
+ Convenience method for getSelectionModel().getSelectedRowIds()[0] - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRowIds for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIds

+ public function getSelectedRowIds() +
+ Convenience method for getSelectionModel().getSelectedRowIds() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRowIds for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIndex

+ public function getSelectedRowIndex() +
+ Gets the first selected row or -1 if none are selected +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRowIndexes

+ public function getSelectedRowIndexes() +
+ Get the selected row indexes +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of indexes
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectedRows

+ public function getSelectedRows() +
+ Convenience method for getSelectionModel().getSelectedRows() - +See YAHOO.ext.grid.DefaultSelectionModel.getSelectedRows for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectionCount

+ public function getSelectionCount() +
+ Convenience method for getSelectionModel().getCount() - +See YAHOO.ext.grid.DefaultSelectionModel.getCount for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getSelectionModel

+ public function getSelectionModel() +
+ Returns the grid's SelectionModel. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • SelectionModel
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

getView

+ public function getView() +
+ Returns the grid's GridView object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • GridView
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Convenience method for getSelectionModel().hasSelection() - +See YAHOO.ext.grid.DefaultSelectionModel.hasSelection for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

readField

+ public function readField() +
+ Causes the grid to read and select the ids from the bound field - See bindToField. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

render

+ public function render() +
+ Called once after all setup has been completed and the grid is ready to be rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

scrollTo

+ public function scrollTo(Number/HTMLElement row) +
+ Scrolls the grid to the specified row +
+ Parameters: +
  • row : Number/HTMLElement
    The row object or index of the row
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

selectAll

+ public function selectAll() +
+ Convenience method for getSelectionModel().selectAll() - +See YAHOO.ext.grid.DefaultSelectionModel.selectAll for more details. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

setDataModel

+ public function setDataModel(DataModel dm) +
+ Replace the current data model with a new one (experimental) +
+ Parameters: +
  • dm : DataModel
    The new data model @pram {Boolean} rerender true to render the grid rows from scratch
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

startEditing

+ public function startEditing(Number rowIndex, Number colIndex) +
+ Starts editing the specified for the specified row/column +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+ +
+

stopEditing

+ public function stopEditing() +
+ Stops any active editing +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Grid.
+
+
+ +

Event Details

+
+ +
+

afteredit

+ public event afteredit +
+ Fires after a cell is edited +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by Grid.
+
+ +
+

beforeedit

+ public event beforeedit +
+ Fires before a cell is edited +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by Grid.
+
+ +
+

bodyscroll

+ public event bodyscroll +
+ Fires when the body element is scrolled +
+ Subscribers will be called with the following parameters: +
  • scrollLeft : Number
  • scrollTop : Number
+
+
+
This event is defined by Grid.
+
+ +
+

cellclick

+ public event cellclick +
+ Fires when a cell is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

celldblclick

+ public event celldblclick +
+ Fires when a cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

click

+ public event click +
+ The raw click event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

columnresize

+ public event columnresize +
+ Fires when the user resizes a column +
+ Subscribers will be called with the following parameters: +
  • columnIndex : Number
  • newSize : Number
+
+
+
This event is defined by Grid.
+
+ +
+

dblclick

+ public event dblclick +
+ The raw dblclick event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

dragdrop

+ public event dragdrop +
+ Fires when dragged row(s) are dropped on a valid DD target +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragenter

+ public event dragenter +
+ Fires when the dragged row(s) first cross another DD target while being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragout

+ public event dragout +
+ Fires when the dragged row(s) leave another DD target while being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

dragover

+ public event dragover +
+ Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dragged over. +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • targetId : String
    The target drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

enddrag

+ public event enddrag +
+ Fires when a drag operation is complete +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+ +
+

headerclick

+ public event headerclick +
+ Fires when a header is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

headercontextmenu

+ public event headercontextmenu +
+ Fires when a header is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • columnIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

keydown

+ public event keydown +
+ The raw keydown event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

keypress

+ public event keypress +
+ The raw keypress event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mousedown

+ public event mousedown +
+ The raw mousedown event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseout

+ public event mouseout +
+ The raw mouseout event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseover

+ public event mouseover +
+ The raw mouseover event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

mouseup

+ public event mouseup +
+ The raw mouseup event for the entire grid. +
+ Subscribers will be called with the following parameters: +
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowclick

+ public event rowclick +
+ Fires when a row is clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowcontextmenu

+ public event rowcontextmenu +
+ Fires when a row is right clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

rowdblclick

+ public event rowdblclick +
+ Fires when a cell is double clicked +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • rowIndex : Number
  • e : YAHOO.ext.EventObject
+
+
+
This event is defined by Grid.
+
+ +
+

startdrag

+ public event startdrag +
+ Fires when row(s) start being dragged +
+ Subscribers will be called with the following parameters: +
  • this : Grid
  • dd : YAHOO.ext.GridDD
    The drag drop object
  • e : event
    The raw browser event
+
+
+
This event is defined by Grid.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridDD.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridDD.html new file mode 100644 index 000000000..6beb77477 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridDD.html @@ -0,0 +1,71 @@ + + + + YAHOO.ext.grid.GridDD + + + + + +
+ +

Class YAHOO.ext.grid.GridDD

+ + + + + +
Package:YAHOO.ext.grid
Class:GridDD
Extends:YAHOO.util.DDProxy
Defined In:GridDD.js
+
+ Custom implementation of YAHOO.util.DDProxy used internally by the grid
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 setDropStatus(Boolean dropStatus) : voidGridDD
Updates the DD visual element to allow/not allow a drop
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

setDropStatus

+ public function setDropStatus(Boolean dropStatus) +
+ Updates the DD visual element to allow/not allow a drop +
+ Parameters: +
  • dropStatus : Boolean
    True if drop is allowed on the target
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridDD.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridView.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridView.html new file mode 100644 index 000000000..42cad28d1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.GridView.html @@ -0,0 +1,246 @@ + + + + YAHOO.ext.grid.GridView + + + + + +
+ +

Class YAHOO.ext.grid.GridView

+ + + + + + +
Package:YAHOO.ext.grid
Class:GridView
Extends:Object
Subclasses:PagedGridView
Defined In:GridView.js
+
+ Default UI code used internally by the Grid. This is the object returned by YAHOO.ext.grid.Grid.getView.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 GridView()GridView
 autoSizeColumn(Number colIndex, Boolean forceMinSize) : voidGridView
Autofit a column to it's content.
 autoSizeColumns() : voidGridView
Autofits all columns to their content and then expands to fit any extra space in the grid
 ensureVisible(Number/HTMLElement row, Boolean disableDelay) : voidGridView
Scrolls the specified row into view. This call is automatically buffered (delayed), to disable +the delay, pass true f...
 fitColumns() : voidGridView
Autofits all columns to the grid's width proportionate with their current size
 focusRow(Number/HTMLElement row) : voidGridView
Focuses the specified row. The preferred way to scroll to a row is ensureVisible.
 getCellAtPoint(Number x, Number y) : ArrayGridView
Returns the rowIndex/columnIndex of the cell found at the passed page coordinates
 setCSSStyle(Number colIndex, String name, String value) : voidGridView
Set a css style for a column dynamically.
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

GridView

+ public function GridView() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

autoSizeColumn

+ public function autoSizeColumn(Number colIndex, Boolean forceMinSize) +
+ Autofit a column to it's content. +
+ Parameters: +
  • colIndex : Number
  • forceMinSize : Boolean
    true to force the column to go smaller if possible
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

autoSizeColumns

+ public function autoSizeColumns() +
+ Autofits all columns to their content and then expands to fit any extra space in the grid +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

ensureVisible

+ public function ensureVisible(Number/HTMLElement row, Boolean disableDelay) +
+ Scrolls the specified row into view. This call is automatically buffered (delayed), to disable +the delay, pass true for disableDelay. +
+ Parameters: +
  • row : Number/HTMLElement
    The index of a row or the row itself
  • disableDelay : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

fitColumns

+ public function fitColumns() +
+ Autofits all columns to the grid's width proportionate with their current size +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

focusRow

+ public function focusRow(Number/HTMLElement row) +
+ Focuses the specified row. The preferred way to scroll to a row is ensureVisible. +
+ Parameters: +
  • row : Number/HTMLElement
    The index of a row or the row itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getCellAtPoint

+ public function getCellAtPoint(Number x, Number y) +
+ Returns the rowIndex/columnIndex of the cell found at the passed page coordinates +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • Array
    [rowIndex, columnIndex]
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

setCSSStyle

+ public function setCSSStyle(Number colIndex, String name, String value) +
+ Set a css style for a column dynamically. +
+ Parameters: +
  • colIndex : Number
    The index of the column
  • name : String
    The css property name
  • value : String
    The css value
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.JSONDataModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.JSONDataModel.html new file mode 100644 index 000000000..8c17ced24 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.JSONDataModel.html @@ -0,0 +1,1260 @@ + + + + YAHOO.ext.grid.JSONDataModel + + + + + +
+ +

Class YAHOO.ext.grid.JSONDataModel

+ + + + + +
Package:YAHOO.ext.grid
Class:JSONDataModel
Extends:LoadableDataModel
Defined In:JSONDataModel.js
+
+ This is an implementation of a DataModel used by the Grid. It works +with JSON data. +
Example schema: +

+var schema = {
+root: 'Results.Result',
+id: 'ASIN',
+fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
+};
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 baseParams : ObjectLoadableDataModel
An object of key/value pairs to be passed as parameters +when loading pages/sorting
 loadedPage : NumberLoadableDataModel
The active page
 pageSize : NumberLoadableDataModel
The number of records per page
 pageUrl : StringLoadableDataModel
The script/page to call to provide paged/sorted data
 paramMap : ObjectLoadableDataModel
Maps named params to url parameters - Override to specify your own param names
 remoteSort : BooleanLoadableDataModel
True to use remote sorting, initPaging automatically sets this to true
 sortTypes<static> : ObjectDefaultDataModel
<static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 JSONDataModel()JSONDataModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addPostprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string b...
 addPreprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates.
 addRow(Array cellValues) : NumberDefaultDataModel
Adds a row to the dataset.
 applySort() : voidDefaultDataModel
Applies the last used sort to the current data.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 each(Function fn, [Object scope]) : voidDefaultDataModel
Calls passed function with each rows data - if the function returns false it stops.
 filter(Object query) : NumberDefaultDataModel
Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getPageSize() : NumberLoadableDataModel
Returns the number of records per page
 getPostprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the postprocessor function for the specified column.
 getPreprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the preprocessor function for the specified column.
 getRow() : ArrayDefaultDataModel
Returns the column data for the specified row.
 getRowCount() : NumberDefaultDataModel
Returns the number of rows in the dataset
 getRowId(Number rowIndex) : NumberJSONDataModel
Overrides getRowId in DefaultDataModel to return the ID value of the specified node.
 getRows(Array indexes) : ArrayDefaultDataModel
Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of ...
 getTotalPages() : NumberLoadableDataModel
Returns the total number of pages available
 getTotalRowCount() : NumberLoadableDataModel
Returns the total number of records available, override if needed
 getValueAt(Number rowIndex, Number colIndex) : ObjectDefaultDataModel
Returns the value at the specified data position
 initPaging(String url, Number pageSize, [Object baseParams]) : voidLoadableDataModel
Initializes paging for this model.
 insertRow(Number index, Array cellValues) : NumberDefaultDataModel
Inserts a row a the specified location in the dataset.
 isPaged() : BooleanLoadableDataModel
Returns true if this model uses paging
 load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) : voidLoadableDataModel
Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event.
 loadData(Object data, Function callback) : voidJSONDataModel
Overrides loadData in LoadableDataModel to process JSON data
 loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) : voidLoadableDataModel
Loads a page of data.
 purgeListeners() : voidObservable
Removes all listeners for this object
 query(Object spec, Boolean returnUnmatched) : ArrayDefaultDataModel
Query the DataModel rows by the filters defined in spec, for example... + +// column 1 starts with Jack, column 2 filte...
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 removePostprocessor(Number columnIndex) : voidLoadableDataModel
Removes a postprocessor function.
 removePreprocessor(Number columnIndex) : voidLoadableDataModel
Removes a preprocessor function.
 removeRow(Number index) : voidDefaultDataModel
Remove a row.
 setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sets the default sort info. Note: this function does not actually apply the sort.
 setValueAt(Object value, Number rowIndex, Number colIndex) : voidDefaultDataModel
Sets the specified value at the specified data position
 sort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeload : (DataModel this)LoadableDataModel
Fires before a load takes place
 cellupdated : (DataModel this, Number rowIndex, Number columnIndex)AbstractDataModel
Fires when a cell is updated
 datachanged : (DataModel this)AbstractDataModel
Fires when the entire data structure has changed
 load : (DataModel this)LoadableDataModel
Fires when new data has successfully been loaded
 loadexception : (DataModel this, Exception e, Object response)LoadableDataModel
Fires when there's an error loading data
 rowsdeleted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been deleted
 rowsinserted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been inserted
 rowssorted : (DataModel this)AbstractDataModel
Fires when the data has been sorted
 rowsupdated : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been updated
+ +

Property Details

+
+ +
+

baseParams

+ public Object baseParams +
+ An object of key/value pairs to be passed as parameters +when loading pages/sorting
+
This property is defined by LoadableDataModel.
+
+ +
+

loadedPage

+ public Number loadedPage +
+ The active page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageSize

+ public Number pageSize +
+ The number of records per page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageUrl

+ public String pageUrl +
+ The script/page to call to provide paged/sorted data
+
This property is defined by LoadableDataModel.
+
+ +
+

paramMap

+ public Object paramMap +
+ Maps named params to url parameters - Override to specify your own param names
+
This property is defined by LoadableDataModel.
+
+ +
+

remoteSort

+ public Boolean remoteSort +
+ True to use remote sorting, initPaging automatically sets this to true
+
This property is defined by LoadableDataModel.
+
+ +
+

sortTypes<static>

+ public Object sortTypes<static> +
+ <static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+
This property is defined by DefaultDataModel.
+
+
+ + +

Constructor Details

+
+
+

JSONDataModel

+ public function JSONDataModel() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addPostprocessor

+ public function addPostprocessor(Number columnIndex, Function fn) +
+ Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string before updating XML document). +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addPreprocessor

+ public function addPreprocessor(Number columnIndex, Function fn) +
+ Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates. +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addRow

+ public function addRow(Array cellValues) +
+ Adds a row to the dataset. +
+ Parameters: +
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index of the added row
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

applySort

+ public function applySort() +
+ Applies the last used sort to the current data. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls passed function with each rows data - if the function returns false it stops. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

filter

+ public function filter(Object query) +
+ Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec. +
+ Parameters: +
  • query : Object
    The query spec query
+ Returns: +
    +
  • Number
    The number of rows removed
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getPageSize

+ public function getPageSize() +
+ Returns the number of records per page +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPostprocessor

+ public function getPostprocessor(Number columnIndex) +
+ Gets the postprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPreprocessor

+ public function getPreprocessor(Number columnIndex) +
+ Gets the preprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getRow

+ public function getRow() +
+ Returns the column data for the specified row. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowCount

+ public function getRowCount() +
+ Returns the number of rows in the dataset +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowId

+ public function getRowId(Number rowIndex) +
+ Overrides getRowId in DefaultDataModel to return the ID value of the specified node. +
+ Parameters: +
  • rowIndex : Number
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by JSONDataModel.
+
+ +
+

getRows

+ public function getRows(Array indexes) +
+ Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. +
+ Parameters: +
  • indexes : Array
    The row indexes to fetch
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getTotalPages

+ public function getTotalPages() +
+ Returns the total number of pages available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getTotalRowCount

+ public function getTotalRowCount() +
+ Returns the total number of records available, override if needed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getValueAt

+ public function getValueAt(Number rowIndex, Number colIndex) +
+ Returns the value at the specified data position +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

initPaging

+ public function initPaging(String url, Number pageSize, [Object baseParams]) +
+ Initializes paging for this model. +
+ Parameters: +
  • url : String
  • pageSize : Number
  • baseParams : Object
    (optional) Object containing key/value pairs to add to all requests
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

insertRow

+ public function insertRow(Number index, Array cellValues) +
+ Inserts a row a the specified location in the dataset. +
+ Parameters: +
  • index : Number
    The index where the row should be inserted
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index the row was inserted in
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

isPaged

+ public function isPaged() +
+ Returns true if this model uses paging +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

load

+ public function load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) +
+ Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event. +
+ Parameters: +
  • url : Object/String
    The url from which the data can be loaded
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or as an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when load is complete - called with signature (this, rowCountLoaded)
  • insertIndex : Number
    (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

loadData

+ public function loadData(Object data, Function callback) +
+ Overrides loadData in LoadableDataModel to process JSON data +
+ Parameters: +
  • data : Object
    The JSON object to load
  • callback : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by JSONDataModel.
+
+ +
+

loadPage

+ public function loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) +
+ Loads a page of data. +
+ Parameters: +
  • pageNum : Number
    Which page to load. The first page is 1.
  • callback : Function
    (optional) Optional callback when loading is complete
  • keepExisting : Boolean
    (optional) true to keep existing data and append the new data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

query

+ public function query(Object spec, Boolean returnUnmatched) +
+ Query the DataModel rows by the filters defined in spec, for example... +

+// column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
+dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
+
+
+ Parameters: +
  • spec : Object
    The spec is generally an object literal consisting of column index and filter type. The filter type can be a string/number (exact match), a regular expression to test using String.search() or a function to call. If it's a function, it will be called with the value for the specified column and an array of the all column values for that row: yourFcn(value, columnData). If it returns anything other than true, the row is not a match. If you have modified Object.prototype this method may fail.
  • returnUnmatched : Boolean
    True to return rows which don't match the query instead of rows that do match
+ Returns: +
    +
  • Array
    An array of row indexes that match
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removePostprocessor

+ public function removePostprocessor(Number columnIndex) +
+ Removes a postprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removePreprocessor

+ public function removePreprocessor(Number columnIndex) +
+ Removes a preprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removeRow

+ public function removeRow(Number index) +
+ Remove a row. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sets the default sort info. Note: this function does not actually apply the sort. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setValueAt

+ public function setValueAt(Object value, Number rowIndex, Number colIndex) +
+ Sets the specified value at the specified data position +
+ Parameters: +
  • value : Object
    The new value
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

sort

+ public function sort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+
+ +

Event Details

+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a load takes place +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

cellupdated

+ public event cellupdated +
+ Fires when a cell is updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the entire data structure has changed +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

load

+ public event load +
+ Fires when new data has successfully been loaded +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires when there's an error loading data +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • e : Exception
    The exception object or null
  • response : Object
    The Connect response object
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

rowsdeleted

+ public event rowsdeleted +
+ Fires when a range of rows have been deleted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsinserted

+ public event rowsinserted +
+ Fires when a range of rows have been inserted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowssorted

+ public event rowssorted +
+ Fires when the data has been sorted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsupdated

+ public event rowsupdated +
+ Fires when a range of rows have been updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.LoadableDataModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.LoadableDataModel.html new file mode 100644 index 000000000..6b7d4f181 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.LoadableDataModel.html @@ -0,0 +1,1255 @@ + + + + YAHOO.ext.grid.LoadableDataModel + + + + + +
+ +

Class YAHOO.ext.grid.LoadableDataModel

+ + + + + + +
Package:YAHOO.ext.grid
Class:LoadableDataModel
Extends:DefaultDataModel
Subclasses:JSONDataModel, XMLDataModel
Defined In:LoadableDataModel.js
+
+ This class extends DefaultDataModel and adds the core functionality to load data remotely. Generally you will want to use one of it's subclasses.

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 baseParams : ObjectLoadableDataModel
An object of key/value pairs to be passed as parameters +when loading pages/sorting
 loadedPage : NumberLoadableDataModel
The active page
 pageSize : NumberLoadableDataModel
The number of records per page
 pageUrl : StringLoadableDataModel
The script/page to call to provide paged/sorted data
 paramMap : ObjectLoadableDataModel
Maps named params to url parameters - Override to specify your own param names
 remoteSort : BooleanLoadableDataModel
True to use remote sorting, initPaging automatically sets this to true
 sortTypes<static> : ObjectDefaultDataModel
<static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 LoadableDataModel(String dataType)LoadableDataModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addPostprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string b...
 addPreprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates.
 addRow(Array cellValues) : NumberDefaultDataModel
Adds a row to the dataset.
 applySort() : voidDefaultDataModel
Applies the last used sort to the current data.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 each(Function fn, [Object scope]) : voidDefaultDataModel
Calls passed function with each rows data - if the function returns false it stops.
 filter(Object query) : NumberDefaultDataModel
Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getPageSize() : NumberLoadableDataModel
Returns the number of records per page
 getPostprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the postprocessor function for the specified column.
 getPreprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the preprocessor function for the specified column.
 getRow() : ArrayDefaultDataModel
Returns the column data for the specified row.
 getRowCount() : NumberDefaultDataModel
Returns the number of rows in the dataset
 getRowId() : NumberDefaultDataModel
Returns the ID of the specified row. By default it return the value of the first column. +Override to provide more ad...
 getRows(Array indexes) : ArrayDefaultDataModel
Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of ...
 getTotalPages() : NumberLoadableDataModel
Returns the total number of pages available
 getTotalRowCount() : NumberLoadableDataModel
Returns the total number of records available, override if needed
 getValueAt(Number rowIndex, Number colIndex) : ObjectDefaultDataModel
Returns the value at the specified data position
 initPaging(String url, Number pageSize, [Object baseParams]) : voidLoadableDataModel
Initializes paging for this model.
 insertRow(Number index, Array cellValues) : NumberDefaultDataModel
Inserts a row a the specified location in the dataset.
 isPaged() : BooleanLoadableDataModel
Returns true if this model uses paging
 load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) : voidLoadableDataModel
Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event.
 loadData() : voidLoadableDataModel
Empty interface method - Called to process the data returned by the XHR - Classes which extend LoadableDataModel shou...
 loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) : voidLoadableDataModel
Loads a page of data.
 purgeListeners() : voidObservable
Removes all listeners for this object
 query(Object spec, Boolean returnUnmatched) : ArrayDefaultDataModel
Query the DataModel rows by the filters defined in spec, for example... + +// column 1 starts with Jack, column 2 filte...
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 removePostprocessor(Number columnIndex) : voidLoadableDataModel
Removes a postprocessor function.
 removePreprocessor(Number columnIndex) : voidLoadableDataModel
Removes a preprocessor function.
 removeRow(Number index) : voidDefaultDataModel
Remove a row.
 setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sets the default sort info. Note: this function does not actually apply the sort.
 setValueAt(Object value, Number rowIndex, Number colIndex) : voidDefaultDataModel
Sets the specified value at the specified data position
 sort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeload : (DataModel this)LoadableDataModel
Fires before a load takes place
 cellupdated : (DataModel this, Number rowIndex, Number columnIndex)AbstractDataModel
Fires when a cell is updated
 datachanged : (DataModel this)AbstractDataModel
Fires when the entire data structure has changed
 load : (DataModel this)LoadableDataModel
Fires when new data has successfully been loaded
 loadexception : (DataModel this, Exception e, Object response)LoadableDataModel
Fires when there's an error loading data
 rowsdeleted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been deleted
 rowsinserted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been inserted
 rowssorted : (DataModel this)AbstractDataModel
Fires when the data has been sorted
 rowsupdated : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been updated
+ +

Property Details

+
+ +
+

baseParams

+ public Object baseParams +
+ An object of key/value pairs to be passed as parameters +when loading pages/sorting
+
This property is defined by LoadableDataModel.
+
+ +
+

loadedPage

+ public Number loadedPage +
+ The active page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageSize

+ public Number pageSize +
+ The number of records per page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageUrl

+ public String pageUrl +
+ The script/page to call to provide paged/sorted data
+
This property is defined by LoadableDataModel.
+
+ +
+

paramMap

+ public Object paramMap +
+ Maps named params to url parameters - Override to specify your own param names
+
This property is defined by LoadableDataModel.
+
+ +
+

remoteSort

+ public Boolean remoteSort +
+ True to use remote sorting, initPaging automatically sets this to true
+
This property is defined by LoadableDataModel.
+
+ +
+

sortTypes<static>

+ public Object sortTypes<static> +
+ <static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+
This property is defined by DefaultDataModel.
+
+
+ + +

Constructor Details

+
+
+

LoadableDataModel

+ public function LoadableDataModel(String dataType) +
+
+ Parameters: +
  • dataType : String
    YAHOO.ext.grid.LoadableDataModel.XML, YAHOO.ext.grid.LoadableDataModel.TEXT or YAHOO.ext.grid.JSON
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addPostprocessor

+ public function addPostprocessor(Number columnIndex, Function fn) +
+ Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string before updating XML document). +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addPreprocessor

+ public function addPreprocessor(Number columnIndex, Function fn) +
+ Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates. +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addRow

+ public function addRow(Array cellValues) +
+ Adds a row to the dataset. +
+ Parameters: +
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index of the added row
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

applySort

+ public function applySort() +
+ Applies the last used sort to the current data. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls passed function with each rows data - if the function returns false it stops. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

filter

+ public function filter(Object query) +
+ Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec. +
+ Parameters: +
  • query : Object
    The query spec query
+ Returns: +
    +
  • Number
    The number of rows removed
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getPageSize

+ public function getPageSize() +
+ Returns the number of records per page +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPostprocessor

+ public function getPostprocessor(Number columnIndex) +
+ Gets the postprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPreprocessor

+ public function getPreprocessor(Number columnIndex) +
+ Gets the preprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getRow

+ public function getRow() +
+ Returns the column data for the specified row. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowCount

+ public function getRowCount() +
+ Returns the number of rows in the dataset +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowId

+ public function getRowId() +
+ Returns the ID of the specified row. By default it return the value of the first column. +Override to provide more advanced ID handling. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRows

+ public function getRows(Array indexes) +
+ Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. +
+ Parameters: +
  • indexes : Array
    The row indexes to fetch
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getTotalPages

+ public function getTotalPages() +
+ Returns the total number of pages available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getTotalRowCount

+ public function getTotalRowCount() +
+ Returns the total number of records available, override if needed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getValueAt

+ public function getValueAt(Number rowIndex, Number colIndex) +
+ Returns the value at the specified data position +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

initPaging

+ public function initPaging(String url, Number pageSize, [Object baseParams]) +
+ Initializes paging for this model. +
+ Parameters: +
  • url : String
  • pageSize : Number
  • baseParams : Object
    (optional) Object containing key/value pairs to add to all requests
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

insertRow

+ public function insertRow(Number index, Array cellValues) +
+ Inserts a row a the specified location in the dataset. +
+ Parameters: +
  • index : Number
    The index where the row should be inserted
  • cellValues : Array
    The array of values for the new row
+ Returns: +
    +
  • Number
    The index the row was inserted in
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

isPaged

+ public function isPaged() +
+ Returns true if this model uses paging +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

load

+ public function load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) +
+ Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event. +
+ Parameters: +
  • url : Object/String
    The url from which the data can be loaded
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or as an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when load is complete - called with signature (this, rowCountLoaded)
  • insertIndex : Number
    (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

loadData

+ public function loadData() +
+ Empty interface method - Called to process the data returned by the XHR - Classes which extend LoadableDataModel should implement this method. +See YAHOO.ext.XMLDataModel for an example implementation. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

loadPage

+ public function loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) +
+ Loads a page of data. +
+ Parameters: +
  • pageNum : Number
    Which page to load. The first page is 1.
  • callback : Function
    (optional) Optional callback when loading is complete
  • keepExisting : Boolean
    (optional) true to keep existing data and append the new data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

query

+ public function query(Object spec, Boolean returnUnmatched) +
+ Query the DataModel rows by the filters defined in spec, for example... +

+// column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
+dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
+
+
+ Parameters: +
  • spec : Object
    The spec is generally an object literal consisting of column index and filter type. The filter type can be a string/number (exact match), a regular expression to test using String.search() or a function to call. If it's a function, it will be called with the value for the specified column and an array of the all column values for that row: yourFcn(value, columnData). If it returns anything other than true, the row is not a match. If you have modified Object.prototype this method may fail.
  • returnUnmatched : Boolean
    True to return rows which don't match the query instead of rows that do match
+ Returns: +
    +
  • Array
    An array of row indexes that match
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removePostprocessor

+ public function removePostprocessor(Number columnIndex) +
+ Removes a postprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removePreprocessor

+ public function removePreprocessor(Number columnIndex) +
+ Removes a preprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removeRow

+ public function removeRow(Number index) +
+ Remove a row. +
+ Parameters: +
  • index : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sets the default sort info. Note: this function does not actually apply the sort. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setValueAt

+ public function setValueAt(Object value, Number rowIndex, Number colIndex) +
+ Sets the specified value at the specified data position +
+ Parameters: +
  • value : Object
    The new value
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

sort

+ public function sort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+
+ +

Event Details

+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a load takes place +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

cellupdated

+ public event cellupdated +
+ Fires when a cell is updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the entire data structure has changed +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

load

+ public event load +
+ Fires when new data has successfully been loaded +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires when there's an error loading data +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • e : Exception
    The exception object or null
  • response : Object
    The Connect response object
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

rowsdeleted

+ public event rowsdeleted +
+ Fires when a range of rows have been deleted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsinserted

+ public event rowsinserted +
+ Fires when a range of rows have been inserted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowssorted

+ public event rowssorted +
+ Fires when the data has been sorted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsupdated

+ public event rowsupdated +
+ Fires when a range of rows have been updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.NumberEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.NumberEditor.html new file mode 100644 index 000000000..f6840c45d --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.NumberEditor.html @@ -0,0 +1,83 @@ + + + + YAHOO.ext.grid.NumberEditor + + + + + +
+ +

Class YAHOO.ext.grid.NumberEditor

+ + + + + +
Package:YAHOO.ext.grid
Class:NumberEditor
Extends:CellEditor
Defined In:NumberEditor.js
+
+ Provides a masked editor for numeric values. Invalid keys are ignored. It supports the following configuration options: +
    +
  • allowDecimals - True if the cell can have decimal values.
  • +
  • decimalSeparator - Character(s) to allow as the decimal separator.
  • +
  • decimalPrecision - Set the maximum decimal precision.
  • +
  • decimalPrecisionFcn - Define the function to call to remove extra precision (ie. Math.floor, Math.round, Math.ceil or your own function).
  • +
  • allowNegative - True if the cell allows negative values.
  • +
  • selectOnFocus - True to select the text when the editor is activated.
  • +
  • minValue - The minimum value the cell will allow.
  • +
  • maxValue - The maximum value the cell will allow.
  • +
  • minText - The tooltip to display when the value in the cell is below the minimum.
  • +
  • maxText - The tooltip to display when the value in the cell is above the maximum.
  • +
  • nanText - The tooltip to display when the value in the cell is not a valid number (for example, negatives are allowed and the value in the cell is just "-" with no numbers).
  • +
  • allowBlank - True if the cell is allowed to be empty.
  • +
  • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
  • +
  • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
  • +
  • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
  • +
+For more information on using this editor, see this blog post.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 NumberEditor(Object config)NumberEditor
Create a new NumberEditor
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

NumberEditor

+ public function NumberEditor(Object config) +
+ Create a new NumberEditor
+ Parameters: +
  • config : Object
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.PagedGridView.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.PagedGridView.html new file mode 100644 index 000000000..a5e5289fa --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.PagedGridView.html @@ -0,0 +1,391 @@ + + + + YAHOO.ext.grid.PagedGridView + + + + + +
+ +

Class YAHOO.ext.grid.PagedGridView

+ + + + + +
Package:YAHOO.ext.grid
Class:PagedGridView
Extends:GridView
Defined In:PagedGridView.js
+
+ Extends the default GridView to add a paging interface.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 afterPageText : StringPagedGridView
Customizable piece of the default paging text (defaults to "of %0")
 beforePageText : StringPagedGridView
Customizable piece of the default paging text (defaults to "Page")
 firstText : StringPagedGridView
Customizable piece of the default paging text (defaults to "First Page")
 lastText : StringPagedGridView
Customizable piece of the default paging text (defaults to "Last Page")
 nextText : StringPagedGridView
Customizable piece of the default paging text (defaults to "Next Page")
 prevText : StringPagedGridView
Customizable piece of the default paging text (defaults to "Previous Page")
 refreshText : StringPagedGridView
Customizable piece of the default paging text (defaults to "Refresh")
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 PagedGridView()PagedGridView
This class is created for you automatically if your data model is set to use paging.
 autoSizeColumn(Number colIndex, Boolean forceMinSize) : voidGridView
Autofit a column to it's content.
 autoSizeColumns() : voidGridView
Autofits all columns to their content and then expands to fit any extra space in the grid
 ensureVisible(Number/HTMLElement row, Boolean disableDelay) : voidGridView
Scrolls the specified row into view. This call is automatically buffered (delayed), to disable +the delay, pass true f...
 fitColumns() : voidGridView
Autofits all columns to the grid's width proportionate with their current size
 focusRow(Number/HTMLElement row) : voidGridView
Focuses the specified row. The preferred way to scroll to a row is ensureVisible.
 getCellAtPoint(Number x, Number y) : ArrayGridView
Returns the rowIndex/columnIndex of the cell found at the passed page coordinates
 getPageToolbar() : YAHOO.ext.ToolbarPagedGridView
Returns the toolbar used for paging so you can add new buttons.
 setCSSStyle(Number colIndex, String name, String value) : voidGridView
Set a css style for a column dynamically.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

afterPageText

+ public String afterPageText +
+ Customizable piece of the default paging text (defaults to "of %0")
+
This property is defined by PagedGridView.
+
+ +
+

beforePageText

+ public String beforePageText +
+ Customizable piece of the default paging text (defaults to "Page")
+
This property is defined by PagedGridView.
+
+ +
+

firstText

+ public String firstText +
+ Customizable piece of the default paging text (defaults to "First Page")
+
This property is defined by PagedGridView.
+
+ +
+

lastText

+ public String lastText +
+ Customizable piece of the default paging text (defaults to "Last Page")
+
This property is defined by PagedGridView.
+
+ +
+

nextText

+ public String nextText +
+ Customizable piece of the default paging text (defaults to "Next Page")
+
This property is defined by PagedGridView.
+
+ +
+

prevText

+ public String prevText +
+ Customizable piece of the default paging text (defaults to "Previous Page")
+
This property is defined by PagedGridView.
+
+ +
+

refreshText

+ public String refreshText +
+ Customizable piece of the default paging text (defaults to "Refresh")
+
This property is defined by PagedGridView.
+
+
+ + +

Constructor Details

+
+
+

PagedGridView

+ public function PagedGridView() +
+ This class is created for you automatically if your data model is set to use paging.
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

autoSizeColumn

+ public function autoSizeColumn(Number colIndex, Boolean forceMinSize) +
+ Autofit a column to it's content. +
+ Parameters: +
  • colIndex : Number
  • forceMinSize : Boolean
    true to force the column to go smaller if possible
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

autoSizeColumns

+ public function autoSizeColumns() +
+ Autofits all columns to their content and then expands to fit any extra space in the grid +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

ensureVisible

+ public function ensureVisible(Number/HTMLElement row, Boolean disableDelay) +
+ Scrolls the specified row into view. This call is automatically buffered (delayed), to disable +the delay, pass true for disableDelay. +
+ Parameters: +
  • row : Number/HTMLElement
    The index of a row or the row itself
  • disableDelay : Boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

fitColumns

+ public function fitColumns() +
+ Autofits all columns to the grid's width proportionate with their current size +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

focusRow

+ public function focusRow(Number/HTMLElement row) +
+ Focuses the specified row. The preferred way to scroll to a row is ensureVisible. +
+ Parameters: +
  • row : Number/HTMLElement
    The index of a row or the row itself
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getCellAtPoint

+ public function getCellAtPoint(Number x, Number y) +
+ Returns the rowIndex/columnIndex of the cell found at the passed page coordinates +
+ Parameters: +
  • x : Number
  • y : Number
+ Returns: +
    +
  • Array
    [rowIndex, columnIndex]
  • +
+
+
+
This method is defined by GridView.
+
+ +
+

getPageToolbar

+ public function getPageToolbar() +
+ Returns the toolbar used for paging so you can add new buttons. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • YAHOO.ext.Toolbar
  • +
+
+
+
This method is defined by PagedGridView.
+
+ +
+

setCSSStyle

+ public function setCSSStyle(Number colIndex, String name, String value) +
+ Set a css style for a column dynamically. +
+ Parameters: +
  • colIndex : Number
    The index of the column
  • name : String
    The css property name
  • value : String
    The css value
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by GridView.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SelectEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SelectEditor.html new file mode 100644 index 000000000..80e4574b1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SelectEditor.html @@ -0,0 +1,81 @@ + + + + YAHOO.ext.grid.SelectEditor + + + + + +
+ +

Class YAHOO.ext.grid.SelectEditor

+ + + + + +
Package:YAHOO.ext.grid
Class:SelectEditor
Extends:CellEditor
Defined In:SelectEditor.js
+
+ Creates an editor out of an existing select field. You can create the select element through DOM in Javascript and pass it to the SelectEditor's constructor or an easier way is like this: +

+Define the select field in your document, giving it the ygrid-editor class. +

+<select id="light" class="ygrid-editor">
+	<option value="Shade">Shade</option>
+	<option value="Mostly Shady">Mostly Shady</option>
+	<option value="Sun or Shade">Sun or Shade</option>
+	<option value="Mostly Sunny">Mostly Sunny</option>
+	<option value="Sunny">Sunny</option>
+</select>
+
+Create the SelectEditor object, passing in the id of your select field. +

+var editor = new YAHOO.ext.grid.SelectEditor('light'); 
+
+For more information on using this editor, see this blog post.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 SelectEditor(HTMLElement/String element)SelectEditor
Create a new SelectEditor
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

SelectEditor

+ public function SelectEditor(HTMLElement/String element) +
+ Create a new SelectEditor
+ Parameters: +
  • element : HTMLElement/String
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SingleSelectionModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SingleSelectionModel.html new file mode 100644 index 000000000..738257848 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.SingleSelectionModel.html @@ -0,0 +1,769 @@ + + + + YAHOO.ext.grid.SingleSelectionModel + + + + + +
+ +

Class YAHOO.ext.grid.SingleSelectionModel

+ + + + + +
Package:YAHOO.ext.grid
Class:SingleSelectionModel
Extends:DefaultSelectionModel
Defined In:SelectionModel.js
+
+ Allows only one row to be selected at a time.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 SingleSelectionModel()SingleSelectionModel
Create new SingleSelectionModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 clearSelections() : voidDefaultSelectionModel
Clears all selections.
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) : voidDefaultSelectionModel
Deselects a range of rows. All rows in between startRow and endRow are also deselected.
 deselectRow(Number/HTMLElement row) : voidDefaultSelectionModel
Deselects a row.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 focusRow(HTMLElement row) : voidDefaultSelectionModel
Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow...
 getCount() : NumberDefaultSelectionModel
Gets the number of selected rows.
 getSelectedRowIds() : ArrayDefaultSelectionModel
Returns the selected row ids.
 getSelectedRows() : ArrayDefaultSelectionModel
Returns the selected rows.
 hasSelection() : BooleanDefaultSelectionModel
Returns True if there is a selection.
 isLocked() : BooleanDefaultSelectionModel
Returns true if the selections are locked
 isSelectable(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selectable.
 isSelected(HTMLElement row) : BooleanDefaultSelectionModel
Returns True if the specified row is selected.
 lock() : voidDefaultSelectionModel
Lock the selections
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 selectAll() : voidDefaultSelectionModel
Selects all rows.
 selectFirstRow() : voidDefaultSelectionModel
Selects the first row in the grid.
 selectNext([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row immediately following the last selected row.
 selectPrevious([Boolean keepExisting]) : voidDefaultSelectionModel
Selects the row that precedes the last selected row.
 selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a range of rows. All rows in between startRow and endRow are also selected.
 selectRow(Number/HTMLElement row, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects a row.
 selectRows(Array rows, [Boolean keepExisting]) : voidDefaultSelectionModel
Selects multiple rows.
 selectRowsById(String/Array id, [Boolean keepExisting]) : voidDefaultSelectionModel
Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index).
 unlock() : voidDefaultSelectionModel
Unlock the selections
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 dragenter : (SelectionModel this, HTMLElement row, Boolean selected)DefaultSelectionModel
Fires when a row is selected or deselected
 selectionchange : (SelectionModel this, Array rows, String ids)DefaultSelectionModel
Fires when the selection changes
+ + + +

Constructor Details

+
+
+

SingleSelectionModel

+ public function SingleSelectionModel() +
+ Create new SingleSelectionModel
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

clearSelections

+ public function clearSelections() +
+ Clears all selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

deselectRange

+ public function deselectRange(Number/HTMLElement startRow, Number/HTMLElement endRow) +
+ Deselects a range of rows. All rows in between startRow and endRow are also deselected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

deselectRow

+ public function deselectRow(Number/HTMLElement row) +
+ Deselects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to deselect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

focusRow

+ public function focusRow(HTMLElement row) +
+ Deprecated. Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow() instead. +
+ Parameters: +
  • row : HTMLElement
    The row to focus
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getCount

+ public function getCount() +
+ Gets the number of selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRowIds

+ public function getSelectedRowIds() +
+ Returns the selected row ids. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of String ids
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

getSelectedRows

+ public function getSelectedRows() +
+ Returns the selected rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    Array of DOM row elements
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

hasSelection

+ public function hasSelection() +
+ Returns True if there is a selection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if the selections are locked +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelectable

+ public function isSelectable(HTMLElement row) +
+ Returns True if the specified row is selectable. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

isSelected

+ public function isSelected(HTMLElement row) +
+ Returns True if the specified row is selected. +
+ Parameters: +
  • row : HTMLElement
    The row to check
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

lock

+ public function lock() +
+ Lock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

selectAll

+ public function selectAll() +
+ Selects all rows. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectFirstRow

+ public function selectFirstRow() +
+ Selects the first row in the grid. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectNext

+ public function selectNext([Boolean keepExisting]) +
+ Selects the row immediately following the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectPrevious

+ public function selectPrevious([Boolean keepExisting]) +
+ Selects the row that precedes the last selected row. +
+ Parameters: +
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRange

+ public function selectRange(Number/HTMLElement startRow, Number/HTMLElement endRow, [Boolean keepExisting]) +
+ Selects a range of rows. All rows in between startRow and endRow are also selected. +
+ Parameters: +
  • startRow : Number/HTMLElement
    The row or index of the first row in the range
  • endRow : Number/HTMLElement
    The row or index of the last row in the range
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRow

+ public function selectRow(Number/HTMLElement row, [Boolean keepExisting]) +
+ Selects a row. +
+ Parameters: +
  • row : Number/HTMLElement
    The row or index of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRows

+ public function selectRows(Array rows, [Boolean keepExisting]) +
+ Selects multiple rows. +
+ Parameters: +
  • rows : Array
    Array of the rows or indexes of the row to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

selectRowsById

+ public function selectRowsById(String/Array id, [Boolean keepExisting]) +
+ Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index). +
+ Parameters: +
  • id : String/Array
    The id(s) to select
  • keepExisting : Boolean
    (optional) True to retain existing selections
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock the selections +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultSelectionModel.
+
+
+ +

Event Details

+
+ +
+

dragenter

+ public event dragenter +
+ Fires when a row is selected or deselected +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • row : HTMLElement
    The row element
  • selected : Boolean
    true if the row was selected, false if deselected
+
+
+
This event is defined by DefaultSelectionModel.
+
+ +
+

selectionchange

+ public event selectionchange +
+ Fires when the selection changes +
+ Subscribers will be called with the following parameters: +
  • this : SelectionModel
  • rows : Array
    Array of row elements that are selected
  • ids : String
    Array of ids that are selected
+
+
+
This event is defined by DefaultSelectionModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.TextEditor.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.TextEditor.html new file mode 100644 index 000000000..3beded52e --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.TextEditor.html @@ -0,0 +1,79 @@ + + + + YAHOO.ext.grid.TextEditor + + + + + +
+ +

Class YAHOO.ext.grid.TextEditor

+ + + + + +
Package:YAHOO.ext.grid
Class:TextEditor
Extends:CellEditor
Defined In:TextEditor.js
+
+ Provides basic text editing for a cells and supports the following configuration options: +
    +
  • allowBlank - True if the cell is allowed to be empty.
  • +
  • minLength - The minimum length the cell will accept.
  • +
  • maxLength - The maximum length the cell will allow.
  • +
  • minText - The tooltip to display when the length of the value in the cell is below the minimum.
  • +
  • maxText - The tooltip to display when the length of the value in the cell is above the maximum.
  • +
  • selectOnFocus - True to select the text when the editor is activated.
  • +
  • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
  • +
  • regex - A regular expression to match if the value is valid. If the regex.test(value) returns false, the value is considered invalid.
  • +
  • regexText - The tooltip (error message) to display when regex does not match.
  • +
  • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
  • +
  • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
  • +
+For more information on using this editor, see this blog post.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 TextEditor(Object config)TextEditor
Create a new TextEditor
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

TextEditor

+ public function TextEditor(Object config) +
+ Create a new TextEditor
+ Parameters: +
  • config : Object
+
+
+
+
+ + +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.grid.XMLDataModel.html b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.XMLDataModel.html new file mode 100644 index 000000000..fd8c450e2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.grid.XMLDataModel.html @@ -0,0 +1,1288 @@ + + + + YAHOO.ext.grid.XMLDataModel + + + + + +
+ +

Class YAHOO.ext.grid.XMLDataModel

+ + + + + +
Package:YAHOO.ext.grid
Class:XMLDataModel
Extends:LoadableDataModel
Defined In:XMLDataModel.js
+
+ This is an implementation of a DataModel used by the Grid. It works +with XML data. +
Example schema from Amazon search: +

+var schema = {
+tagName: 'Item',
+id: 'ASIN',
+fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
+};
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 baseParams : ObjectLoadableDataModel
An object of key/value pairs to be passed as parameters +when loading pages/sorting
 loadedPage : NumberLoadableDataModel
The active page
 pageSize : NumberLoadableDataModel
The number of records per page
 pageUrl : StringLoadableDataModel
The script/page to call to provide paged/sorted data
 paramMap : ObjectLoadableDataModel
Maps named params to url parameters - Override to specify your own param names
 remoteSort : BooleanLoadableDataModel
True to use remote sorting, initPaging automatically sets this to true
 sortTypes<static> : ObjectDefaultDataModel
<static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 XMLDataModel(Object schema, XMLDocument xml)XMLDataModel
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 addPostprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string b...
 addPreprocessor(Number columnIndex, Function fn) : voidLoadableDataModel
Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates.
 addRow(String id, Array cellValues) : NumberXMLDataModel
Adds a row to this DataModel and syncs the XML document
 applySort() : voidDefaultDataModel
Applies the last used sort to the current data.
 createNode(XMLDocument xmlDoc, String/Number id, Array colData) : XMLNodeXMLDataModel
Override this method to define your own node creation routine for when new rows are added. +By default this method clo...
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 each(Function fn, [Object scope]) : voidDefaultDataModel
Calls passed function with each rows data - if the function returns false it stops.
 filter(Object query) : NumberDefaultDataModel
Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 getPageSize() : NumberLoadableDataModel
Returns the number of records per page
 getPostprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the postprocessor function for the specified column.
 getPreprocessor(Number columnIndex) : FunctionLoadableDataModel
Gets the preprocessor function for the specified column.
 getRow() : ArrayDefaultDataModel
Returns the column data for the specified row.
 getRowCount() : NumberDefaultDataModel
Returns the number of rows in the dataset
 getRowId(Number rowIndex) : NumberXMLDataModel
Overrides getRowId in DefaultDataModel to return the ID value of the specified node.
 getRows(Array indexes) : ArrayDefaultDataModel
Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of ...
 getTotalPages() : NumberLoadableDataModel
Returns the total number of pages available
 getTotalRowCount() : NumberLoadableDataModel
Returns the total number of records available, override if needed
 getValueAt(Number rowIndex, Number colIndex) : ObjectDefaultDataModel
Returns the value at the specified data position
 initPaging(String url, Number pageSize, [Object baseParams]) : voidLoadableDataModel
Initializes paging for this model.
 insertRow(Number index, String id, Array cellValues) : NumberXMLDataModel
Inserts a row into this DataModel and syncs the XML document
 isPaged() : BooleanLoadableDataModel
Returns true if this model uses paging
 load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) : voidLoadableDataModel
Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event.
 loadData(XMLDocument doc, [Function callback], [Boolean keepExisting], [Number insertIndex]) : voidXMLDataModel
Overrides loadData in LoadableDataModel to process XML
 loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) : voidLoadableDataModel
Loads a page of data.
 purgeListeners() : voidObservable
Removes all listeners for this object
 query(Object spec, Boolean returnUnmatched) : ArrayDefaultDataModel
Query the DataModel rows by the filters defined in spec, for example... + +// column 1 starts with Jack, column 2 filte...
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
 removePostprocessor(Number columnIndex) : voidLoadableDataModel
Removes a postprocessor function.
 removePreprocessor(Number columnIndex) : voidLoadableDataModel
Removes a preprocessor function.
 removeRow(Number index) : voidXMLDataModel
Removes the row from DataModel and syncs the XML document
 setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sets the default sort info. Note: this function does not actually apply the sort.
 setValueAt(Object value, Number rowIndex, Number colIndex) : voidXMLDataModel
Overrides DefaultDataModel.setValueAt to update the underlying XML Document
 sort(Function/Object sortInfo, Number columnIndex, String direction) : voidDefaultDataModel
Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeload : (DataModel this)LoadableDataModel
Fires before a load takes place
 cellupdated : (DataModel this, Number rowIndex, Number columnIndex)AbstractDataModel
Fires when a cell is updated
 datachanged : (DataModel this)AbstractDataModel
Fires when the entire data structure has changed
 load : (DataModel this)LoadableDataModel
Fires when new data has successfully been loaded
 loadexception : (DataModel this, Exception e, Object response)LoadableDataModel
Fires when there's an error loading data
 rowsdeleted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been deleted
 rowsinserted : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been inserted
 rowssorted : (DataModel this)AbstractDataModel
Fires when the data has been sorted
 rowsupdated : (DataModel this, Number firstRowIndex, Number lastRowIndex)AbstractDataModel
Fires when a range of rows have been updated
+ +

Property Details

+
+ +
+

baseParams

+ public Object baseParams +
+ An object of key/value pairs to be passed as parameters +when loading pages/sorting
+
This property is defined by LoadableDataModel.
+
+ +
+

loadedPage

+ public Number loadedPage +
+ The active page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageSize

+ public Number pageSize +
+ The number of records per page
+
This property is defined by LoadableDataModel.
+
+ +
+

pageUrl

+ public String pageUrl +
+ The script/page to call to provide paged/sorted data
+
This property is defined by LoadableDataModel.
+
+ +
+

paramMap

+ public Object paramMap +
+ Maps named params to url parameters - Override to specify your own param names
+
This property is defined by LoadableDataModel.
+
+ +
+

remoteSort

+ public Boolean remoteSort +
+ True to use remote sorting, initPaging automatically sets this to true
+
This property is defined by LoadableDataModel.
+
+ +
+

sortTypes<static>

+ public Object sortTypes<static> +
+ <static> Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes
+
This property is defined by DefaultDataModel.
+
+
+ + +

Constructor Details

+
+
+

XMLDataModel

+ public function XMLDataModel(Object schema, XMLDocument xml) +
+
+ Parameters: +
  • schema : Object
    The schema to use
  • xml : XMLDocument
    An XML document to load immediately
+
+
+
+
+ +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

addPostprocessor

+ public function addPostprocessor(Number columnIndex, Function fn) +
+ Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string before updating XML document). +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addPreprocessor

+ public function addPreprocessor(Number columnIndex, Function fn) +
+ Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates. +
+ Parameters: +
  • columnIndex : Number
  • fn : Function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

addRow

+ public function addRow(String id, Array cellValues) +
+ Adds a row to this DataModel and syncs the XML document +
+ Parameters: +
  • id : String
    The id of the row, if null the next row index is used
  • cellValues : Array
    The cell values for this row
+ Returns: +
    +
  • Number
    The index of the new row (if the model is sorted this index may not be accurate)
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

applySort

+ public function applySort() +
+ Applies the last used sort to the current data. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

createNode

+ public function createNode(XMLDocument xmlDoc, String/Number id, Array colData) +
+ Override this method to define your own node creation routine for when new rows are added. +By default this method clones the first node and sets the column values in the newly cloned node. +In many instances this will not work and you will have to create the node manually. +
+ Parameters: +
  • xmlDoc : XMLDocument
    The xml document being used by this model
  • id : String/Number
    The row id
  • colData : Array
    The column data for the new node
+ Returns: +
    +
  • XMLNode
    The created node
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Calls passed function with each rows data - if the function returns false it stops. +
+ Parameters: +
  • fn : Function
  • scope : Object
    (optional)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

filter

+ public function filter(Object query) +
+ Filter the DataModel rows by the query defined in spec, see query for more details +on the query spec. +
+ Parameters: +
  • query : Object
    The query spec query
+ Returns: +
    +
  • Number
    The number of rows removed
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

getPageSize

+ public function getPageSize() +
+ Returns the number of records per page +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPostprocessor

+ public function getPostprocessor(Number columnIndex) +
+ Gets the postprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getPreprocessor

+ public function getPreprocessor(Number columnIndex) +
+ Gets the preprocessor function for the specified column. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • Function
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getRow

+ public function getRow() +
+ Returns the column data for the specified row. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowCount

+ public function getRowCount() +
+ Returns the number of rows in the dataset +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getRowId

+ public function getRowId(Number rowIndex) +
+ Overrides getRowId in DefaultDataModel to return the ID value of the specified node. +
+ Parameters: +
  • rowIndex : Number
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

getRows

+ public function getRows(Array indexes) +
+ Returns the column data for the specified rows as a +multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. +
+ Parameters: +
  • indexes : Array
    The row indexes to fetch
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

getTotalPages

+ public function getTotalPages() +
+ Returns the total number of pages available +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getTotalRowCount

+ public function getTotalRowCount() +
+ Returns the total number of records available, override if needed +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

getValueAt

+ public function getValueAt(Number rowIndex, Number colIndex) +
+ Returns the value at the specified data position +
+ Parameters: +
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • Object
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

initPaging

+ public function initPaging(String url, Number pageSize, [Object baseParams]) +
+ Initializes paging for this model. +
+ Parameters: +
  • url : String
  • pageSize : Number
  • baseParams : Object
    (optional) Object containing key/value pairs to add to all requests
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

insertRow

+ public function insertRow(Number index, String id, Array cellValues) +
+ Inserts a row into this DataModel and syncs the XML document +
+ Parameters: +
  • index : Number
    The index to insert the row
  • id : String
    The id of the row, if null the next row index is used
  • cellValues : Array
    The cell values for this row
+ Returns: +
    +
  • Number
    The index of the new row (if the model is sorted this index may not be accurate)
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

isPaged

+ public function isPaged() +
+ Returns true if this model uses paging +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

load

+ public function load(Object/String url, [String/Object params], [Function callback], [Number insertIndex]) +
+ Initiates the loading of the data from the specified URL - Failed load attempts will +fire the loadexception event. +
+ Parameters: +
  • url : Object/String
    The url from which the data can be loaded
  • params : String/Object
    (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or as an object {param1: 1, param2: 2}
  • callback : Function
    (optional) Callback when load is complete - called with signature (this, rowCountLoaded)
  • insertIndex : Number
    (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

loadData

+ public function loadData(XMLDocument doc, [Function callback], [Boolean keepExisting], [Number insertIndex]) +
+ Overrides loadData in LoadableDataModel to process XML +
+ Parameters: +
  • doc : XMLDocument
    The document to load
  • callback : Function
    (optional) callback to call when loading is complete
  • keepExisting : Boolean
    (optional) true to keep existing data
  • insertIndex : Number
    (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

loadPage

+ public function loadPage(Number pageNum, [Function callback], [Boolean keepExisting]) +
+ Loads a page of data. +
+ Parameters: +
  • pageNum : Number
    Which page to load. The first page is 1.
  • callback : Function
    (optional) Optional callback when loading is complete
  • keepExisting : Boolean
    (optional) true to keep existing data and append the new data
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

query

+ public function query(Object spec, Boolean returnUnmatched) +
+ Query the DataModel rows by the filters defined in spec, for example... +

+// column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
+dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
+
+
+ Parameters: +
  • spec : Object
    The spec is generally an object literal consisting of column index and filter type. The filter type can be a string/number (exact match), a regular expression to test using String.search() or a function to call. If it's a function, it will be called with the value for the specified column and an array of the all column values for that row: yourFcn(value, columnData). If it returns anything other than true, the row is not a match. If you have modified Object.prototype this method may fail.
  • returnUnmatched : Boolean
    True to return rows which don't match the query instead of rows that do match
+ Returns: +
    +
  • Array
    An array of row indexes that match
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removePostprocessor

+ public function removePostprocessor(Number columnIndex) +
+ Removes a postprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removePreprocessor

+ public function removePreprocessor(Number columnIndex) +
+ Removes a preprocessor function. +
+ Parameters: +
  • columnIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by LoadableDataModel.
+
+ +
+

removeRow

+ public function removeRow(Number index) +
+ Removes the row from DataModel and syncs the XML document +
+ Parameters: +
  • index : Number
    The index of the row to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

setDefaultSort

+ public function setDefaultSort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sets the default sort info. Note: this function does not actually apply the sort. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+ +
+

setValueAt

+ public function setValueAt(Object value, Number rowIndex, Number colIndex) +
+ Overrides DefaultDataModel.setValueAt to update the underlying XML Document +
+ Parameters: +
  • value : Object
    The new value
  • rowIndex : Number
  • colIndex : Number
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by XMLDataModel.
+
+ +
+

sort

+ public function sort(Function/Object sortInfo, Number columnIndex, String direction) +
+ Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel. +
+ Parameters: +
  • sortInfo : Function/Object
    A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like a grid column model.
  • columnIndex : Number
    The column index to sort by
  • direction : String
    The direction of the sort ('DESC' or 'ASC')
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DefaultDataModel.
+
+
+ +

Event Details

+
+ +
+

beforeload

+ public event beforeload +
+ Fires before a load takes place +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

cellupdated

+ public event cellupdated +
+ Fires when a cell is updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • rowIndex : Number
  • columnIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

datachanged

+ public event datachanged +
+ Fires when the entire data structure has changed +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

load

+ public event load +
+ Fires when new data has successfully been loaded +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

loadexception

+ public event loadexception +
+ Fires when there's an error loading data +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • e : Exception
    The exception object or null
  • response : Object
    The Connect response object
+
+
+
This event is defined by LoadableDataModel.
+
+ +
+

rowsdeleted

+ public event rowsdeleted +
+ Fires when a range of rows have been deleted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsinserted

+ public event rowsinserted +
+ Fires when a range of rows have been inserted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowssorted

+ public event rowssorted +
+ Fires when the data has been sorted +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
+
+
+
This event is defined by AbstractDataModel.
+
+ +
+

rowsupdated

+ public event rowsupdated +
+ Fires when a range of rows have been updated +
+ Subscribers will be called with the following parameters: +
  • this : DataModel
  • firstRowIndex : Number
  • lastRowIndex : Number
+
+
+
This event is defined by AbstractDataModel.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.state.CookieProvider.html b/www/extras/yui-ext/docs/output/YAHOO.ext.state.CookieProvider.html new file mode 100644 index 000000000..64bbc25eb --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.state.CookieProvider.html @@ -0,0 +1,233 @@ + + + + YAHOO.ext.state.CookieProvider + + + + + +
+ +

Class YAHOO.ext.state.CookieProvider

+ + + + + +
Package:YAHOO.ext.state
Class:CookieProvider
Extends:Provider
Defined In:State.js
+
+ The default Provider implementation. The example below includes all valid configuration options and their +default values. +

+   var cp = new YAHOO.ext.state.CookieProvider({
+       path: '/',
+       expires: new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
+       domain: null,
+       secure: false       
+   })
+   YAHOO.ext.state.Manager.setProvider(cp);
+ 
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CookieProvider(Object config)CookieProvider
Create a new CookieProvider
 clear() : voidProvider
Clear a value from the state.
 decodeValue(String value) : MixedProvider
Decodes a string previously encoded with encodeValue.
 encodeValue(Mixed value) : StringProvider
Encode a value including type information.
 get(String name, Mixed defaultValue) : MixedProvider
Get the current value for a key.
 set(String name, Mixed value) : voidProvider
Set the value for a key.
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 statechange : (Provider this, String key, String value)Provider
Fires when a state change occurs.
+ + + +

Constructor Details

+
+
+

CookieProvider

+ public function CookieProvider(Object config) +
+ Create a new CookieProvider
+ Parameters: +
  • config : Object
    The configuration object
+
+
+
+
+ +

Method Details

+
+ +
+

clear

+ public function clear() +
+ Clear a value from the state. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

decodeValue

+ public function decodeValue(String value) +
+ Decodes a string previously encoded with encodeValue. +
+ Parameters: +
  • value : String
+ Returns: +
    +
  • Mixed
    The value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

encodeValue

+ public function encodeValue(Mixed value) +
+ Encode a value including type information. +
+ Parameters: +
  • value : Mixed
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Get the current value for a key. +
+ Parameters: +
  • name : String
  • defaultValue : Mixed
+ Returns: +
    +
  • Mixed
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Set the value for a key. +
+ Parameters: +
  • name : String
  • value : Mixed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+
+ +

Event Details

+
+ +
+

statechange

+ public event statechange +
+ Fires when a state change occurs. +
+ Subscribers will be called with the following parameters: +
  • this : Provider
  • key : String
    The state key which was changed
  • value : String
    The encoded value for the state
+
+
+
This event is defined by Provider.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.state.Manager.html b/www/extras/yui-ext/docs/output/YAHOO.ext.state.Manager.html new file mode 100644 index 000000000..0f7f964cc --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.state.Manager.html @@ -0,0 +1,185 @@ + + + + YAHOO.ext.state.Manager + + + + + +
+ +

Class YAHOO.ext.state.Manager

+ + + + + +
Package:YAHOO.ext.state
Class:Manager
Extends:Object
Defined In:State.js
+
+ This is the global state manager. By default all components that are "state aware" check this class +for state information if you don't pass them a custom state provider. In order for this class +to be useful, it must be initialized with a provider when your application initializes. +

+// in your initialization function
+init : function(){
+   YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider());
+   ...
+   // supposed you have a YAHOO.ext.BorderLayout
+   var layout = new YAHOO.ext.BorderLayout(...);
+   layout.restoreState();
+   // or a {YAHOO.ext.BasicDialog}
+   var dialog = new YAHOO.ext.BasicDialog(...);
+   dialog.restoreState();
+ 


This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 clear() : voidManager
Clear a value from the state.
 get(String name, Mixed defaultValue) : MixedManager
Get the current value for a key.
 getProvider() : ProviderManager
Gets the currently configured provider.
 set(String name, Mixed value) : voidManager
Set the value for a key.
 setProvider(Provider stateProvider) : voidManager
Configures the default provider for your application.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

clear

+ public function clear() +
+ Clear a value from the state. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Get the current value for a key. +
+ Parameters: +
  • name : String
  • defaultValue : Mixed
+ Returns: +
    +
  • Mixed
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

getProvider

+ public function getProvider() +
+ Gets the currently configured provider. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Provider
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Set the value for a key. +
+ Parameters: +
  • name : String
  • value : Mixed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+ +
+

setProvider

+ public function setProvider(Provider stateProvider) +
+ Configures the default provider for your application. +
+ Parameters: +
  • stateProvider : Provider
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Manager.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.state.Provider.html b/www/extras/yui-ext/docs/output/YAHOO.ext.state.Provider.html new file mode 100644 index 000000000..66a1224a3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.state.Provider.html @@ -0,0 +1,204 @@ + + + + YAHOO.ext.state.Provider + + + + + +
+ +

Class YAHOO.ext.state.Provider

+ + + + + + +
Package:YAHOO.ext.state
Class:Provider
Extends:Object
Subclasses:CookieProvider
Defined In:State.js
+
+ Abstract base class for provider implementations. This class provides methods +for encoding and decoding typed variables including dates and defines the +Provider interface.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 clear() : voidProvider
Clear a value from the state.
 decodeValue(String value) : MixedProvider
Decodes a string previously encoded with encodeValue.
 encodeValue(Mixed value) : StringProvider
Encode a value including type information.
 get(String name, Mixed defaultValue) : MixedProvider
Get the current value for a key.
 set(String name, Mixed value) : voidProvider
Set the value for a key.
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 statechange : (Provider this, String key, String value)Provider
Fires when a state change occurs.
+ + + +

Method Details

+
+ +
+

clear

+ public function clear() +
+ Clear a value from the state. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

decodeValue

+ public function decodeValue(String value) +
+ Decodes a string previously encoded with encodeValue. +
+ Parameters: +
  • value : String
+ Returns: +
    +
  • Mixed
    The value
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

encodeValue

+ public function encodeValue(Mixed value) +
+ Encode a value including type information. +
+ Parameters: +
  • value : Mixed
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

get

+ public function get(String name, Mixed defaultValue) +
+ Get the current value for a key. +
+ Parameters: +
  • name : String
  • defaultValue : Mixed
+ Returns: +
    +
  • Mixed
  • +
+
+
+
This method is defined by Provider.
+
+ +
+

set

+ public function set(String name, Mixed value) +
+ Set the value for a key. +
+ Parameters: +
  • name : String
  • value : Mixed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Provider.
+
+
+ +

Event Details

+
+ +
+

statechange

+ public event statechange +
+ Fires when a state change occurs. +
+ Subscribers will be called with the following parameters: +
  • this : Provider
  • key : String
    The state key which was changed
  • value : String
    The encoded value for the state
+
+
+
This event is defined by Provider.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.Browser.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Browser.html new file mode 100644 index 000000000..68dc6a358 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Browser.html @@ -0,0 +1,198 @@ + + + + YAHOO.ext.util.Browser + + + + + +
+ +

Class YAHOO.ext.util.Browser

+ + + + + +
Package:YAHOO.ext.util
Class:Browser
Extends:Object
Defined In:yutil.js
+
+

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 isGecko : BooleanBrowser
 isIE : BooleanBrowser
 isIE7 : BooleanBrowser
 isMac : BooleanBrowser
 isOpera : BooleanBrowser
 isSafari : BooleanBrowser
 isWindows : BooleanBrowser
+ +

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 fireDirect() : voidBrowser
Enable custom handler signature and event cancelling. Using fireDirect() instead of fire() calls the subscribed event...
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

isGecko

+ public Boolean isGecko +
+
+
This property is defined by Browser.
+
+ +
+

isIE

+ public Boolean isIE +
+
+
This property is defined by Browser.
+
+ +
+

isIE7

+ public Boolean isIE7 +
+
+
This property is defined by Browser.
+
+ +
+

isMac

+ public Boolean isMac +
+
+
This property is defined by Browser.
+
+ +
+

isOpera

+ public Boolean isOpera +
+
+
This property is defined by Browser.
+
+ +
+

isSafari

+ public Boolean isSafari +
+
+
This property is defined by Browser.
+
+ +
+

isWindows

+ public Boolean isWindows +
+
+
This property is defined by Browser.
+
+
+ + +

Method Details

+
+ +
+

fireDirect

+ public function fireDirect() +
+ Enable custom handler signature and event cancelling. Using fireDirect() instead of fire() calls the subscribed event handlers +with the exact parameters passed to fireDirect, instead of the usual (eventType, args[], obj). IMO this is more intuitive +and promotes cleaner code. Also, if an event handler returns false, it is returned by fireDirect and no other handlers will be called.
+Example:


+if(beforeUpdateEvent.fireDirect(myArg, myArg2) !== false){
+// do update
+}
+
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Browser.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.CSS.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.CSS.html new file mode 100644 index 000000000..82b5b13bd --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.CSS.html @@ -0,0 +1,146 @@ + + + + YAHOO.ext.util.CSS + + + + + +
+ +

Class YAHOO.ext.util.CSS

+ + + + + +
Package:YAHOO.ext.util
Class:CSS
Extends:Object
Defined In:CSS.js
+
+ Class for manipulating CSS Rules

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 apply(HTMLElement el, String/Array selector) : BooleanCSS
Applies a rule to an element without adding the class
 getRule(String/Array selector, Boolean refreshCache) : CSSRuleCSS
Gets an an individual CSS rule by selector(s)
 getRules(Boolean refreshCache) : ObjectCSS
Gets all css rules for the document
 updateRule(String/Array selector, String property, String value) : BooleanCSS
Updates a rule property
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

apply

+ public function apply(HTMLElement el, String/Array selector) +
+ Applies a rule to an element without adding the class +
+ Parameters: +
  • el : HTMLElement
    The element
  • selector : String/Array
    If it's an array it tries each selector until it finds one. Stops immediately once one is found.
+ Returns: +
    +
  • Boolean
    true if a rule was found and applied
  • +
+
+
+
This method is defined by CSS.
+
+ +
+

getRule

+ public function getRule(String/Array selector, Boolean refreshCache) +
+ Gets an an individual CSS rule by selector(s) +
+ Parameters: +
  • selector : String/Array
    The CSS selector or an array of selectors to try. The first selector that is found is returned.
  • refreshCache : Boolean
    true to refresh the internal cache
+ Returns: +
    +
  • CSSRule
    The CSS rule or null if one is not found
  • +
+
+
+
This method is defined by CSS.
+
+ +
+

getRules

+ public function getRules(Boolean refreshCache) +
+ Gets all css rules for the document +
+ Parameters: +
  • refreshCache : Boolean
    true to refresh the internal cache
+ Returns: +
    +
  • Object
    An object (hash) of rules indexed by selector
  • +
+
+
+
This method is defined by CSS.
+
+ +
+

updateRule

+ public function updateRule(String/Array selector, String property, String value) +
+ Updates a rule property +
+ Parameters: +
  • selector : String/Array
    If it's an array it tries each selector until it finds one. Stops immediately once one is found.
  • property : String
    The css property
  • value : String
    The new value for the property
+ Returns: +
    +
  • Boolean
    true if a rule was found and updated
  • +
+
+
+
This method is defined by CSS.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.Config.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Config.html new file mode 100644 index 000000000..1c0b2430f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Config.html @@ -0,0 +1,121 @@ + + + + YAHOO.ext.util.Config + + + + + +
+ +

Class YAHOO.ext.util.Config

+ + + + + +
Package:YAHOO.ext.util
Class:Config
Extends:Object
Defined In:yutil.js
+
+ Class with one useful method

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 left : ObjectConfig
Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}).
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 apply(Object obj, Object config, Object defaults) : ObjectConfig
Copies all the properties of config to obj.
 constrainTo(String/HTMLElement/Element constrainTo, [Object/Number pad], [Boolean inContent]) : voidConfig
Initializes the drag drop object's constraints to restrict movement to a certain element.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

left

+ public Object left +
+ Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}).
+
This property is defined by Config.
+
+
+ + +

Method Details

+
+ +
+

apply

+ public function apply(Object obj, Object config, Object defaults) +
+ Copies all the properties of config to obj. +
+ Parameters: +
  • obj : Object
    The receiver of the properties
  • config : Object
    The source of the properties
  • defaults : Object
    A different object that will also be applied for default values
+ Returns: +
    +
  • Object
    returns obj
  • +
+
+
+
This method is defined by Config.
+
+ +
+

constrainTo

+ public function constrainTo(String/HTMLElement/Element constrainTo, [Object/Number pad], [Boolean inContent]) +
+ Initializes the drag drop object's constraints to restrict movement to a certain element. +
+ Parameters: +
  • constrainTo : String/HTMLElement/Element
    The element to constrain to.
  • pad : Object/Number
    (optional) Pad provides a way to specify "padding" of the constraints, and can be either a number for symmetrical padding (4 would be equal to {left:4, right:4, top:4, bottom:4}) or an object containing the sides to pad. For example: {right:10, bottom:10}
  • inContent : Boolean
    (optional) Constrain the draggable in the content box of the element (inside padding and borders)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.DelayedTask.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.DelayedTask.html new file mode 100644 index 000000000..595044d7a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.DelayedTask.html @@ -0,0 +1,122 @@ + + + + YAHOO.ext.util.DelayedTask + + + + + +
+ +

Class YAHOO.ext.util.DelayedTask

+ + + + + +
Package:YAHOO.ext.util
Class:DelayedTask
Extends:Object
Defined In:yutil.js
+
+ Provides a convenient method of performing setTimeout where a new +timeout cancels the old timeout. An example would be performing validation on a keypress. +You can use this class to buffer +the keypress events for a certain number of milliseconds, and perform only if they stop +for that amount of time.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DelayedTask([Function fn], [Object scope], [Array args])DelayedTask
The parameters to this constructor serve as defaults and are not required.
 cancel() : voidDelayedTask
Cancel the last queued timeout
 delay(Number delay, [Function newFn], [Object newScope], [Array newArgs]) : voidDelayedTask
Cancels any pending timeout and queues a new one
+ +

Public Events

+
This class has no public events.
+ + +

Constructor Details

+
+
+

DelayedTask

+ public function DelayedTask([Function fn], [Object scope], [Array args]) +
+ The parameters to this constructor serve as defaults and are not required.
+ Parameters: +
  • fn : Function
    (optional) The default function to timeout
  • scope : Object
    (optional) The default scope of that timeout
  • args : Array
    (optional) The default Array of arguments
+
+
+
+
+ +

Method Details

+
+ +
+

cancel

+ public function cancel() +
+ Cancel the last queued timeout +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DelayedTask.
+
+ +
+

delay

+ public function delay(Number delay, [Function newFn], [Object newScope], [Array newArgs]) +
+ Cancels any pending timeout and queues a new one +
+ Parameters: +
  • delay : Number
    The milliseconds to delay
  • newFn : Function
    (optional) Overrides function passed to constructor
  • newScope : Object
    (optional) Overrides scope passed to constructor
  • newArgs : Array
    (optional) Overrides args passed to constructor
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DelayedTask.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.JSON.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.JSON.html new file mode 100644 index 000000000..2d1c6bddd --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.JSON.html @@ -0,0 +1,98 @@ + + + + YAHOO.ext.util.JSON + + + + + +
+ +

Class YAHOO.ext.util.JSON

+ + + + + +
Package:YAHOO.ext.util
Class:JSON
Extends:Object
Defined In:JSON.js
+
+ Modified version of Douglas Crockford's json.js that doesn't +mess with the Object prototype +http://www.json.org/js.html

This class is a singleton and cannot be created directly.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 decode(String json) : ObjectJSON
Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError.
 encode(Mixed o) : StringJSON
Encodes an Object, Array or other value
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

decode

+ public function decode(String json) +
+ Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError. +
+ Parameters: +
  • json : String
    The JSON string
+ Returns: +
    +
  • Object
    The resulting object
  • +
+
+
+
This method is defined by JSON.
+
+ +
+

encode

+ public function encode(Mixed o) +
+ Encodes an Object, Array or other value +
+ Parameters: +
  • o : Mixed
    The variable to encode
+ Returns: +
    +
  • String
    The JSON string
  • +
+
+
+
This method is defined by JSON.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.MixedCollection.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.MixedCollection.html new file mode 100644 index 000000000..2c6e4f572 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.MixedCollection.html @@ -0,0 +1,711 @@ + + + + YAHOO.ext.util.MixedCollection + + + + + +
+ +

Class YAHOO.ext.util.MixedCollection

+ + + + + +
Package:YAHOO.ext.util
Class:MixedCollection
Extends:Object
Defined In:MixedCollection.js
+
+ A Collection class that maintains both numeric indexes and keys and exposes events.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 MixedCollection(Boolean allowFunctions)MixedCollection
 add(String key, Object o) : ObjectMixedCollection
Adds an item to the collection.
 addAll(Object/Array objs) : voidMixedCollection
Adds all elements of an Array or an Object to the collection.
 clear() : voidMixedCollection
Removes all items from the collection.
 contains(Object o) : BooleanMixedCollection
Returns true if the collection contains the passed Object as an item.
 containsKey(String key) : BooleanMixedCollection
Returns true if the collection contains the passed Object as a key.
 each(Function fn, [Object scope]) : voidMixedCollection
Executes the specified function once for every item in the collection, passing each +item as the first and only parame...
 eachKey(Function fn, [Object scope]) : voidMixedCollection
Executes the specified function once for every key in the collection, passing each +key, and its associated item as th...
 find(Function fn, [Object scope]) : ObjectMixedCollection
Returns the first item in the collection which elicits a true return value from the +passed selection function.
 first() : BooleanMixedCollection
Returns the first item in the collection.
 get(String/Number key) : ObjectMixedCollection
Returns the item associated with the passed key or index.
 getCount() : NumberMixedCollection
Returns the number of items in the collection.
 getKey(o {Object}) : ObjectMixedCollection
MixedCollection has a generic way to fetch keys if you implement getKey. + + // normal way + var mc = new Y...
 indexOf(Object o) : NumberMixedCollection
Returns index within the collection of the passed Object.
 indexOfKey(String key) : NumberMixedCollection
Returns index within the collection of the passed key.
 insert(Number index, String key, [Object o]) : ObjectMixedCollection
Inserts an item at the specified index in the collection.
 item(String/Number key) : ObjectMixedCollection
Returns the item associated with the passed key.
 last() : BooleanMixedCollection
Returns the last item in the collection.
 remove(Object o) : ObjectMixedCollection
Removed an item from the collection.
 removeAt(Number index) : voidMixedCollection
Remove an item from a specified index in the collection.
 removeKey(String key) : voidMixedCollection
Removed an item associated with the passed key fom the collection.
 replace(String key, [o {Object}]) : ObjectMixedCollection
Replaces an item in the collection.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 add : (Number index, Object o, String key)MixedCollection
Fires when an item is added to the collection.
 clear : ()MixedCollection
Fires when the collection is cleared.
 remove : (Object o, [String key])MixedCollection
Fires when an item is removed from the collection.
 replace : (String key, Object old, Object new)MixedCollection
Fires when an item is replaced in the collection.
+ + + +

Constructor Details

+
+
+

MixedCollection

+ public function MixedCollection(Boolean allowFunctions) +
+
+ Parameters: +
  • allowFunctions : Boolean
    True if the addAll function should add function references to the collection.
+
+
+
+
+ +

Method Details

+
+ +
+

add

+ public function add(String key, Object o) +
+ Adds an item to the collection. +
+ Parameters: +
  • key : String
    The key to associate with the item
  • o : Object
    The item to add.
+ Returns: +
    +
  • Object
    The item added.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

addAll

+ public function addAll(Object/Array objs) +
+ Adds all elements of an Array or an Object to the collection. +
+ Parameters: +
  • objs : Object/Array
    An Object containing properties which will be added to the collection, or an Array of values, each of which are added to the collection.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

clear

+ public function clear() +
+ Removes all items from the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

contains

+ public function contains(Object o) +
+ Returns true if the collection contains the passed Object as an item. +
+ Parameters: +
  • o : Object
    The Object to look for in the collection.
+ Returns: +
    +
  • Boolean
    True if the collection contains the Object as an item.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

containsKey

+ public function containsKey(String key) +
+ Returns true if the collection contains the passed Object as a key. +
+ Parameters: +
  • key : String
    The key to look for in the collection.
+ Returns: +
    +
  • Boolean
    True if the collection contains the Object as a key.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

each

+ public function each(Function fn, [Object scope]) +
+ Executes the specified function once for every item in the collection, passing each +item as the first and only parameter. +
+ Parameters: +
  • fn : Function
    The function to execute for each item.
  • scope : Object
    (optional) The scope in which to execute the function.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

eachKey

+ public function eachKey(Function fn, [Object scope]) +
+ Executes the specified function once for every key in the collection, passing each +key, and its associated item as the first two parameters. +
+ Parameters: +
  • fn : Function
    The function to execute for each item.
  • scope : Object
    (optional) The scope in which to execute the function.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

find

+ public function find(Function fn, [Object scope]) +
+ Returns the first item in the collection which elicits a true return value from the +passed selection function. +
+ Parameters: +
  • fn : Function
    The selection function to execute for each item.
  • scope : Object
    (optional) The scope in which to execute the function.
+ Returns: +
    +
  • Object
    The first item in the collection which returned true from the selection function.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

first

+ public function first() +
+ Returns the first item in the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    the first item in the collection..
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

get

+ public function get(String/Number key) +
+ Returns the item associated with the passed key or index. +
+ Parameters: +
  • key : String/Number
    The key or index of the item.
+ Returns: +
    +
  • Object
    The item associated with the passed key.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

getCount

+ public function getCount() +
+ Returns the number of items in the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Number
    the number of items in the collection.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

getKey

+ public function getKey(o {Object}) +
+ MixedCollection has a generic way to fetch keys if you implement getKey. +

+    // normal way
+    var mc = new YAHOO.ext.util.MixedCollection();
+    mc.add(someEl.dom.id, someEl);
+    mc.add(otherEl.dom.id, otherEl);
+    //and so on
+    
+    // using getKey
+    var mc = new YAHOO.ext.util.MixedCollection();
+    mc.getKey = function(el){
+       return el.dom.id;
+    }
+    mc.add(someEl);
+    mc.add(otherEl);
+    // etc
+                    
+                
+ Parameters: +
  • {Object} : o
    The item for which to find the key.
+ Returns: +
    +
  • Object
    The key for the passed item.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

indexOf

+ public function indexOf(Object o) +
+ Returns index within the collection of the passed Object. +
+ Parameters: +
  • o : Object
    The item to find the index of.
+ Returns: +
    +
  • Number
    index of the item.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

indexOfKey

+ public function indexOfKey(String key) +
+ Returns index within the collection of the passed key. +
+ Parameters: +
  • key : String
    The key to find the index of.
+ Returns: +
    +
  • Number
    index of the key.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

insert

+ public function insert(Number index, String key, [Object o]) +
+ Inserts an item at the specified index in the collection. +
+ Parameters: +
  • index : Number
    The index to insert the item at.
  • key : String
    The key to associate with the new item, or the item itself.
  • o : Object
    (optional) If the second parameter was a key, the new item.
+ Returns: +
    +
  • Object
    The item inserted.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

item

+ public function item(String/Number key) +
+ Returns the item associated with the passed key. +
+ Parameters: +
  • key : String/Number
    The key or index of the item.
+ Returns: +
    +
  • Object
    The item associated with the passed key.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

last

+ public function last() +
+ Returns the last item in the collection. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    the last item in the collection..
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

remove

+ public function remove(Object o) +
+ Removed an item from the collection. +
+ Parameters: +
  • o : Object
    The item to remove.
+ Returns: +
    +
  • Object
    The item removed.
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

removeAt

+ public function removeAt(Number index) +
+ Remove an item from a specified index in the collection. +
+ Parameters: +
  • index : Number
    The index within the collection of the item to remove.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

removeKey

+ public function removeKey(String key) +
+ Removed an item associated with the passed key fom the collection. +
+ Parameters: +
  • key : String
    The key of the item to remove.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by MixedCollection.
+
+ +
+

replace

+ public function replace(String key, [o {Object}]) +
+ Replaces an item in the collection. +
+ Parameters: +
  • key : String
    The key associated with the item to replace, or the item to replace.
  • {Object} : o
    o (optional) If the first parameter passed was a key, the item to associate with that key.
+ Returns: +
    +
  • Object
    The new item.
  • +
+
+
+
This method is defined by MixedCollection.
+
+
+ +

Event Details

+
+ +
+

add

+ public event add +
+ Fires when an item is added to the collection. +
+ Subscribers will be called with the following parameters: +
  • index : Number
    The index at which the item was added.
  • o : Object
    The item added.
  • key : String
    The key associated with the added item.
+
+
+
This event is defined by MixedCollection.
+
+ +
+

clear

+ public event clear +
+ Fires when the collection is cleared. +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by MixedCollection.
+
+ +
+

remove

+ public event remove +
+ Fires when an item is removed from the collection. +
+ Subscribers will be called with the following parameters: +
  • o : Object
    The item being removed.
  • key : String
    (optional) The key associated with the removed item.
+
+
+
This event is defined by MixedCollection.
+
+ +
+

replace

+ public event replace +
+ Fires when an item is replaced in the collection. +
+ Subscribers will be called with the following parameters: +
  • key : String
    he key associated with the new added.
  • old : Object
    The item being replaced.
  • new : Object
    The new item.
+
+
+
This event is defined by MixedCollection.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.ext.util.Observable.html b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Observable.html new file mode 100644 index 000000000..a0ff59bdf --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.ext.util.Observable.html @@ -0,0 +1,184 @@ + + + + YAHOO.ext.util.Observable + + + + + +
+ +

Class YAHOO.ext.util.Observable

+ + + + + + +
Package:YAHOO.ext.util
Class:Observable
Extends:Object
Subclasses:BasicDialog, ContentPanel, LayoutManager, LayoutRegion, Resizable, SplitBar, TabPanel, TabPanelItem, UpdateManager, View, AbstractColumnModel, AbstractDataModel, DefaultSelectionModel, Grid
Defined In:yutil.js
+
+ Abstract base class that provides a common interface for publishing events. Subclasses are expected to +to have a property "events" with all the events defined.
+For example: +

+ var Employee = function(name){
+    this.name = name;
+    this.events = {
+        'fired' : new YAHOO.util.CustomEvent('fired'),
+        'quit' : new YAHOO.util.CustomEvent('quit')
+    }
+ }
+ YAHOO.extend(Employee, YAHOO.ext.util.Observable);
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(String eventName, Function handler, [Object scope], [boolean override]) : voidObservable
Appends an event handler to this element
 delayedListener(String eventName, Function handler, [Object scope], [Number delay]) : FunctionObservable
Appends an event handler to this element that is delayed the specified number of milliseconds.
 fireEvent(String eventName, Object... args) : BooleanObservable
Fires the specified event with the passed parameters (minus the event name).
 purgeListeners() : voidObservable
Removes all listeners for this object
 removeListener(String eventName, Function handler, [Object scope]) : voidObservable
Removes a listener
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(String eventName, Function handler, [Object scope], [boolean override]) +
+ Appends an event handler to this element +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • override : boolean
    (optional) If true, scope becomes the scope
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

delayedListener

+ public function delayedListener(String eventName, Function handler, [Object scope], [Number delay]) +
+ Appends an event handler to this element that is delayed the specified number of milliseconds. +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The method the event invokes
  • scope : Object
    (optional) The scope (this object) for the handler
  • delay : Number
    (optional) The number of milliseconds to delay
+ Returns: +
    +
  • Function
    The wrapped function that was created (can be used to remove the listener)
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

fireEvent

+ public function fireEvent(String eventName, Object... args) +
+ Fires the specified event with the passed parameters (minus the event name). +
+ Parameters: +
  • eventName : String
  • args : Object...
    Variable number of parameters are passed to handlers
+ Returns: +
    +
  • Boolean
    returns false if any of the handlers return false otherwise it returns true
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

purgeListeners

+ public function purgeListeners() +
+ Removes all listeners for this object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+ +
+

removeListener

+ public function removeListener(String eventName, Function handler, [Object scope]) +
+ Removes a listener +
+ Parameters: +
  • eventName : String
    The type of event to listen for
  • handler : Function
    The handler to remove
  • scope : Object
    (optional) The scope (this object) for the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Observable.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.html b/www/extras/yui-ext/docs/output/YAHOO.html new file mode 100644 index 000000000..c72f55d73 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.html @@ -0,0 +1,166 @@ + + + + YAHOO + + + + + +
+ +

Class YAHOO

+ + + + + +
Package:Global
Class:YAHOO
Extends:Object
Defined In:yahoo.js
+
+ The YAHOO global namespace object
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 augment(Function r, Function s, String* arguments) : voidYAHOO
<static> Applies all prototype properties in the supplier to the receiver if the +receiver does not have these p...
 extend(Function subc, Function superc, String[] overrides) : voidYAHOO
<static> Utility to set up the prototype, constructor and superclass properties to +support an inheritance strat...
 log(String msg, String cat, String src) : BooleanYAHOO
<static> Uses YAHOO.widget.Logger to output a log message, if the widget is available.
 namespace(String* arguments) : ObjectYAHOO
<static> Returns the namespace specified and creates it if it doesn't exist + +YAHOO.namespace("property.package"...
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

augment

+ public function augment(Function r, Function s, String* arguments) +
+ <static> Applies all prototype properties in the supplier to the receiver if the +receiver does not have these properties yet. Optionally, one or more +methods/properties can be specified (as additional parameters). This +option will overwrite the property if receiver has it already. +
+ Parameters: +
  • r : Function
    the object to receive the augmentation
  • s : Function
    the object that supplies the properties to augment
  • arguments : String*
    zero or more properties methods to augment the receiver with. If none specified, everything in the supplier will be used unless it would overwrite an existing property in the receiver
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by YAHOO.
+
+ +
+

extend

+ public function extend(Function subc, Function superc, String[] overrides) +
+ <static> Utility to set up the prototype, constructor and superclass properties to +support an inheritance strategy that can chain constructors and methods. +
+ Parameters: +
  • subc : Function
    the object to modify
  • superc : Function
    the object to inherit
  • overrides : String[]
    additional properties/methods to add to the subclass prototype. These will override the matching items obtained from the superclass if present.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by YAHOO.
+
+ +
+

log

+ public function log(String msg, String cat, String src) +
+ <static> Uses YAHOO.widget.Logger to output a log message, if the widget is available. +
+ Parameters: +
  • msg : String
    The message to log.
  • cat : String
    The log category for the message. Default categories are "info", "warn", "error", time". Custom categories can be used as well. (opt)
  • src : String
    The source of the the message (opt)
+ Returns: +
    +
  • Boolean
    True if the log operation was successful.
  • +
+
+
+
This method is defined by YAHOO.
+
+ +
+

namespace

+ public function namespace(String* arguments) +
+ <static> Returns the namespace specified and creates it if it doesn't exist +
+YAHOO.namespace("property.package");
+YAHOO.namespace("YAHOO.property.package");
+
+Either of the above would create YAHOO.property, then +YAHOO.property.package +Be careful when naming packages. Reserved words may work in some browsers +and not others. For instance, the following will fail in Safari: +
+YAHOO.namespace("really.long.nested.namespace");
+
+This fails because "long" is a future reserved word in ECMAScript +
+ Parameters: +
  • arguments : String*
    1-n namespaces to create
+ Returns: +
    +
  • Object
    A reference to the last namespace object created
  • +
+
+
+
This method is defined by YAHOO.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Anim.html b/www/extras/yui-ext/docs/output/YAHOO.util.Anim.html new file mode 100644 index 000000000..3768cae4c --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Anim.html @@ -0,0 +1,542 @@ + + + + YAHOO.util.Anim + + + + + +
+ +

Class YAHOO.util.Anim

+ + + + + + +
Package:YAHOO.util
Class:Anim
Extends:Object
Subclasses:ColorAnim, Motion, Scroll
Defined In:animation.js
+
+ Base animation class that provides the interface for building animated effects. +

Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectAnim
The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to ani...
 currentFrame : IntAnim
The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure th...
 duration : NumberAnim
The length of the animation. Defaults to "1" (second).
 method : FunctionAnim
The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
 totalFrames : IntAnim
The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation ...
 useSeconds : BooleanAnim
Whether or not the duration should be treated as seconds. +Defaults to true.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Anim(String/HTMLElement el, Object attributes, Number duration, Function method)Anim
 animate() : voidAnim
Starts the animation by registering it with the animation manager.
 doMethod(String attr, Number start, Number end) : NumberAnim
Returns the value computed by the animation's "method".
 getAttribute(String attr) : NumberAnim
Returns current value of the attribute.
 getDefaultUnit(attr attr) : StringAnim
Returns the unit to use when none is supplied.
 getEl() : HTMLElementAnim
Returns a reference to the animated element.
 getStartTime() : DateAnim
Returns the animation start time.
 init(String/HTMLElement el, Object attributes, Number duration, Function method) : voidAnim
Constructor for Anim instance.
 isAnimated() : BooleanAnim
Checks whether the element is currently animated.
 setAttribute(String attr, Number val, String unit) : voidAnim
Applies a value to an attribute.
 stop([Boolean finish]) : voidAnim
Stops the animation. Normally called by AnimMgr when animation completes.
 toString() : StringAnim
Provides a readable name for the Anim instance.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 onComplete : ()Anim
Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
 onStart : ()Anim
Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
 onTween : ()Anim
Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
+ +

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to animate. +If "to" is supplied, the animation will end with the attribute at that value. +If "by" is supplied, the animation will end at that value plus its starting value. +If both are supplied, "to" is used, and "by" is ignored. +Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
+
This property is defined by Anim.
+
+ +
+

currentFrame

+ public Int currentFrame +
+ The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

duration

+ public Number duration +
+ The length of the animation. Defaults to "1" (second).
+
This property is defined by Anim.
+
+ +
+

method

+ public Function method +
+ The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
+
This property is defined by Anim.
+
+ +
+

totalFrames

+ public Int totalFrames +
+ The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

useSeconds

+ public Boolean useSeconds +
+ Whether or not the duration should be treated as seconds. +Defaults to true.
+
This property is defined by Anim.
+
+
+ + +

Constructor Details

+
+
+

Anim

+ public function Anim(String/HTMLElement el, Object attributes, Number duration, Function method) +
+
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+
+
+
+
+ +

Method Details

+
+ +
+

animate

+ public function animate() +
+ Starts the animation by registering it with the animation manager. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

doMethod

+ public function doMethod(String attr, Number start, Number end) +
+ Returns the value computed by the animation's "method". +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • start : Number
    The value this attribute should start from for this animation.
  • end : Number
    The value this attribute should end at for this animation.
+ Returns: +
    +
  • Number
    The Value to be applied to the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getAttribute

+ public function getAttribute(String attr) +
+ Returns current value of the attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
+ Returns: +
    +
  • Number
    val The current value of the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getDefaultUnit

+ public function getDefaultUnit(attr attr) +
+ Returns the unit to use when none is supplied. +
+ Parameters: +
  • attr : attr
    The name of the attribute.
+ Returns: +
    +
  • String
    The default unit to be used.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the animated element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getStartTime

+ public function getStartTime() +
+ Returns the animation start time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    current value of startTime.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

init

+ public function init(String/HTMLElement el, Object attributes, Number duration, Function method) +
+ Constructor for Anim instance. +
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

isAnimated

+ public function isAnimated() +
+ Checks whether the element is currently animated. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    current value of isAnimated.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

setAttribute

+ public function setAttribute(String attr, Number val, String unit) +
+ Applies a value to an attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • val : Number
    The value to be applied to the attribute.
  • unit : String
    The unit ('px', '%', etc.) of the value.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

stop

+ public function stop([Boolean finish]) +
+ Stops the animation. Normally called by AnimMgr when animation completes. +
+ Parameters: +
  • finish : Boolean
    (optional) If true, animation will jump to final frame.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

toString

+ public function toString() +
+ Provides a readable name for the Anim instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Anim.
+
+
+ +

Event Details

+
+ +
+

onComplete

+ public event onComplete +
+ Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onStart

+ public event onStart +
+ Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onTween

+ public event onTween +
+ Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.AnimMgr.html b/www/extras/yui-ext/docs/output/YAHOO.util.AnimMgr.html new file mode 100644 index 000000000..ce77adbbc --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.AnimMgr.html @@ -0,0 +1,194 @@ + + + + YAHOO.util.AnimMgr + + + + + +
+ +

Class YAHOO.util.AnimMgr

+ + + + + +
Package:YAHOO.util
Class:AnimMgr
Extends:Object
Defined In:animation.js
+
+ Handles animation queueing and threading. +Used by Anim and subclasses.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 delay : IntAnimMgr
Interval delay in milliseconds, defaults to fastest possible.
 fps : IntAnimMgr
Base frame rate (frames per second). +Arbitrarily high for better x-browser calibration (slower browsers drop more fra...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 registerElement(object tween) : voidAnimMgr
Adds an animation instance to the animation queue. +All animation instances must be registered in order to animate.
 run() : voidAnimMgr
Called per Interval to handle each animation frame.
 start() : voidAnimMgr
Starts the animation thread. +Only one thread can run at a time.
 stop([object tween]) : voidAnimMgr
Stops the animation thread or a specific animation instance.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

delay

+ public Int delay +
+ Interval delay in milliseconds, defaults to fastest possible.
+
This property is defined by AnimMgr.
+
+ +
+

fps

+ public Int fps +
+ Base frame rate (frames per second). +Arbitrarily high for better x-browser calibration (slower browsers drop more frames).
+
This property is defined by AnimMgr.
+
+
+ + +

Method Details

+
+ +
+

registerElement

+ public function registerElement(object tween) +
+ Adds an animation instance to the animation queue. +All animation instances must be registered in order to animate. +
+ Parameters: +
  • tween : object
    The Anim instance to be be registered
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AnimMgr.
+
+ +
+

run

+ public function run() +
+ Called per Interval to handle each animation frame. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AnimMgr.
+
+ +
+

start

+ public function start() +
+ Starts the animation thread. +Only one thread can run at a time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AnimMgr.
+
+ +
+

stop

+ public function stop([object tween]) +
+ Stops the animation thread or a specific animation instance. +
+ Parameters: +
  • tween : object
    A specific Anim instance to stop (optional) If no instance given, Manager stops thread and all animations.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AnimMgr.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Attribute.html b/www/extras/yui-ext/docs/output/YAHOO.util.Attribute.html new file mode 100644 index 000000000..6e514346a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Attribute.html @@ -0,0 +1,343 @@ + + + + YAHOO.util.Attribute + + + + + +
+ +

Class YAHOO.util.Attribute

+ + + + + +
Package:YAHOO.util
Class:Attribute
Extends:Object
Defined In:tabview.js
+
+ Provides Attribute configurations.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 method : FunctionAttribute
The method to use when setting the attribute's value. +The method recieves the new value as the only argument.
 name : StringAttribute
The name of the attribute.
 owner : YAHOO.util.AttributeProviderAttribute
The owner of the attribute.
 readOnly : BooleanAttribute
Whether or not the attribute is read only.
 validator : FunctionAttribute
The validator to use when setting the attribute's value.
 value : StringAttribute
The value of the attribute.
 writeOnce : BooleanAttribute
Whether or not the attribute can only be written once.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Attribute(hash {Object}, YAHOO.util.AttributeProvider The)Attribute
 configure(Object map, Boolean init) : voidAttribute
Allows for configuring the Attribute's properties.
 getValue() : anyAttribute
Retrieves the current value of the attribute.
 refresh() : BooleanAttribute
Resets the value to the current value. +Useful when values may have gotten out of sync with actual properties.
 resetConfig() : voidAttribute
Resets the attribute config to the initial config state.
 resetValue() : BooleanAttribute
Resets the value to the initial config value.
 setValue(Any value, Boolean silent) : BooleanAttribute
Sets the value of the attribute and fires beforeChange and change events.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

method

+ public Function method +
+ The method to use when setting the attribute's value. +The method recieves the new value as the only argument.
+
This property is defined by Attribute.
+
+ +
+

name

+ public String name +
+ The name of the attribute.
+
This property is defined by Attribute.
+
+ +
+

owner

+ public YAHOO.util.AttributeProvider owner +
+ The owner of the attribute.
+
This property is defined by Attribute.
+
+ +
+

readOnly

+ public Boolean readOnly +
+ Whether or not the attribute is read only.
+
This property is defined by Attribute.
+
+ +
+

validator

+ public Function validator +
+ The validator to use when setting the attribute's value.
+
This property is defined by Attribute.
+
+ +
+

value

+ public String value +
+ The value of the attribute.
+
This property is defined by Attribute.
+
+ +
+

writeOnce

+ public Boolean writeOnce +
+ Whether or not the attribute can only be written once.
+
This property is defined by Attribute.
+
+
+ + +

Constructor Details

+
+
+

Attribute

+ public function Attribute(hash {Object}, YAHOO.util.AttributeProvider The) +
+
+ Parameters: +
  • {Object} : hash
    The intial Attribute.
  • The : YAHOO.util.AttributeProvider
    owner of the Attribute instance.
+
+
+
+
+ +

Method Details

+
+ +
+

configure

+ public function configure(Object map, Boolean init) +
+ Allows for configuring the Attribute's properties. +
+ Parameters: +
  • map : Object
    A key-value map of Attribute properties.
  • init : Boolean
    Whether or not this should become the initial config.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Attribute.
+
+ +
+

getValue

+ public function getValue() +
+ Retrieves the current value of the attribute. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • any
    The current value of the attribute.
  • +
+
+
+
This method is defined by Attribute.
+
+ +
+

refresh

+ public function refresh() +
+ Resets the value to the current value. +Useful when values may have gotten out of sync with actual properties. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    Whether or not the value was set.
  • +
+
+
+
This method is defined by Attribute.
+
+ +
+

resetConfig

+ public function resetConfig() +
+ Resets the attribute config to the initial config state. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Attribute.
+
+ +
+

resetValue

+ public function resetValue() +
+ Resets the value to the initial config value. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    Whether or not the value was set.
  • +
+
+
+
This method is defined by Attribute.
+
+ +
+

setValue

+ public function setValue(Any value, Boolean silent) +
+ Sets the value of the attribute and fires beforeChange and change events. +
+ Parameters: +
  • value : Any
    The value to apply to the attribute.
  • silent : Boolean
    If true the change events will not be fired.
+ Returns: +
    +
  • Boolean
    Whether or not the value was set.
  • +
+
+
+
This method is defined by Attribute.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.AttributeProvider.html b/www/extras/yui-ext/docs/output/YAHOO.util.AttributeProvider.html new file mode 100644 index 000000000..af36b9f41 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.AttributeProvider.html @@ -0,0 +1,297 @@ + + + + YAHOO.util.AttributeProvider + + + + + +
+ +

Class YAHOO.util.AttributeProvider

+ + + + + +
Package:YAHOO.util
Class:AttributeProvider
Extends:Object
Defined In:tabview.js
+
+ Provides and manages YAHOO.util.Attribute instances +@uses YAHOO.util.EventProvider
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 configureAttribute(String key, Object map, Boolean init) : voidAttributeProvider
Sets or updates an Attribute instance's properties.
 fireBeforeChangeEvent(String key, Obj e) : voidAttributeProvider
Fires the attribute's beforeChange event.
 fireChangeEvent(String key, Obj e) : voidAttributeProvider
Fires the attribute's change event.
 get(String key) : voidAttributeProvider
Returns the current value of the attribute.
 getAttributeKeys() : ArrayAttributeProvider
Returns an array of attribute names.
 refresh(String/Array key, Boolean silent) : voidAttributeProvider
Sets the attribute's value to its current value.
 register(String key, Object map) : voidAttributeProvider
Adds an Attribute to the AttributeProvider instance.
 resetValue(String key, Boolean silent) : BooleanAttributeProvider
Resets the specified attribute's value to its initial value.
 set(String key, Any value, Boolean silent) : BooleanAttributeProvider
Sets the value of a config.
 setAttributes(Object map, Boolean silent) : voidAttributeProvider
Sets multiple attribute values.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

configureAttribute

+ public function configureAttribute(String key, Object map, Boolean init) +
+ Sets or updates an Attribute instance's properties. +
+ Parameters: +
  • key : String
    The attribute's name.
  • map : Object
    A key-value map of attribute properties
  • init : Boolean
    Whether or not this should become the intial config.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

fireBeforeChangeEvent

+ public function fireBeforeChangeEvent(String key, Obj e) +
+ Fires the attribute's beforeChange event. +
+ Parameters: +
  • key : String
    The attribute's name.
  • e : Obj
    The event object to pass to handlers.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

fireChangeEvent

+ public function fireChangeEvent(String key, Obj e) +
+ Fires the attribute's change event. +
+ Parameters: +
  • key : String
    The attribute's name.
  • e : Obj
    The event object to pass to the handlers.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

get

+ public function get(String key) +
+ Returns the current value of the attribute. +
+ Parameters: +
  • key : String
    The attribute whose value will be returned.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

getAttributeKeys

+ public function getAttributeKeys() +
+ Returns an array of attribute names. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
    An array of attribute names.
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

refresh

+ public function refresh(String/Array key, Boolean silent) +
+ Sets the attribute's value to its current value. +
+ Parameters: +
  • key : String/Array
    The attribute(s) to refresh
  • silent : Boolean
    Whether or not to suppress change events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

register

+ public function register(String key, Object map) +
+ Adds an Attribute to the AttributeProvider instance. +
+ Parameters: +
  • key : String
    The attribute's name
  • map : Object
    A key-value map containing the attribute's properties.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

resetValue

+ public function resetValue(String key, Boolean silent) +
+ Resets the specified attribute's value to its initial value. +
+ Parameters: +
  • key : String
    The name of the attribute
  • silent : Boolean
    Whether or not to suppress change events
+ Returns: +
    +
  • Boolean
    Whether or not the value was set
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

set

+ public function set(String key, Any value, Boolean silent) +
+ Sets the value of a config. +
+ Parameters: +
  • key : String
    The name of the attribute
  • value : Any
    The value to apply to the attribute
  • silent : Boolean
    Whether or not to suppress change events
+ Returns: +
    +
  • Boolean
    Whether or not the value was set.
  • +
+
+
+
This method is defined by AttributeProvider.
+
+ +
+

setAttributes

+ public function setAttributes(Object map, Boolean silent) +
+ Sets multiple attribute values. +
+ Parameters: +
  • map : Object
    A key-value map of attributes
  • silent : Boolean
    Whether or not to suppress change events
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AttributeProvider.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Bezier.html b/www/extras/yui-ext/docs/output/YAHOO.util.Bezier.html new file mode 100644 index 000000000..3db953042 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Bezier.html @@ -0,0 +1,76 @@ + + + + YAHOO.util.Bezier + + + + + +
+ +

Class YAHOO.util.Bezier

+ + + + + +
Package:YAHOO.util
Class:Bezier
Extends:Object
Defined In:animation.js
+
+ Used to calculate Bezier splines for any number of control points.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + +
MethodDefined By
 getPosition(Array points, Number t) : ArrayBezier
Get the current position of the animated element based on t. +Each point is an array of "x" and "y" values (0 = x, 1 =...
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

getPosition

+ public function getPosition(Array points, Number t) +
+ Get the current position of the animated element based on t. +Each point is an array of "x" and "y" values (0 = x, 1 = y) +At least 2 points are required (start and end). +First point is start. Last point is end. +Additional control points are optional. +
+ Parameters: +
  • points : Array
    An array containing Bezier points
  • t : Number
    A number between 0 and 1 which is the basis for determining current position
+ Returns: +
    +
  • Array
    An array containing int x and y member data
  • +
+
+
+
This method is defined by Bezier.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.ColorAnim.html b/www/extras/yui-ext/docs/output/YAHOO.util.ColorAnim.html new file mode 100644 index 000000000..985e509a6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.ColorAnim.html @@ -0,0 +1,567 @@ + + + + YAHOO.util.ColorAnim + + + + + +
+ +

Class YAHOO.util.ColorAnim

+ + + + + +
Package:YAHOO.util
Class:ColorAnim
Extends:Anim
Defined In:animation.js
+
+ Anim subclass for color transitions. +

Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, +[255,255,255], or rgb(255,255,255)

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectAnim
The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to ani...
 currentFrame : IntAnim
The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure th...
 duration : NumberAnim
The length of the animation. Defaults to "1" (second).
 method : FunctionAnim
The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
 totalFrames : IntAnim
The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation ...
 useSeconds : BooleanAnim
Whether or not the duration should be treated as seconds. +Defaults to true.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ColorAnim(HTMLElement/String el, Object attributes, Number duration, Function method)ColorAnim
 animate() : voidAnim
Starts the animation by registering it with the animation manager.
 doMethod(String attr, Number start, Number end) : NumberAnim
Returns the value computed by the animation's "method".
 getAttribute(String attr) : NumberAnim
Returns current value of the attribute.
 getDefaultUnit(attr attr) : StringAnim
Returns the unit to use when none is supplied.
 getEl() : HTMLElementAnim
Returns a reference to the animated element.
 getStartTime() : DateAnim
Returns the animation start time.
 init(String/HTMLElement el, Object attributes, Number duration, Function method) : voidAnim
Constructor for Anim instance.
 isAnimated() : BooleanAnim
Checks whether the element is currently animated.
 parseColor(String s) : ArrayColorAnim
Attempts to parse the given string and return a 3-tuple.
 setAttribute(String attr, Number val, String unit) : voidAnim
Applies a value to an attribute.
 stop([Boolean finish]) : voidAnim
Stops the animation. Normally called by AnimMgr when animation completes.
 toString() : StringAnim
Provides a readable name for the Anim instance.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 onComplete : ()Anim
Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
 onStart : ()Anim
Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
 onTween : ()Anim
Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
+ +

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to animate. +If "to" is supplied, the animation will end with the attribute at that value. +If "by" is supplied, the animation will end at that value plus its starting value. +If both are supplied, "to" is used, and "by" is ignored. +Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
+
This property is defined by Anim.
+
+ +
+

currentFrame

+ public Int currentFrame +
+ The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

duration

+ public Number duration +
+ The length of the animation. Defaults to "1" (second).
+
This property is defined by Anim.
+
+ +
+

method

+ public Function method +
+ The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
+
This property is defined by Anim.
+
+ +
+

totalFrames

+ public Int totalFrames +
+ The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

useSeconds

+ public Boolean useSeconds +
+ Whether or not the duration should be treated as seconds. +Defaults to true.
+
This property is defined by Anim.
+
+
+ + +

Constructor Details

+
+
+

ColorAnim

+ public function ColorAnim(HTMLElement/String el, Object attributes, Number duration, Function method) +
+
+ Parameters: +
  • el : HTMLElement/String
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+
+
+
+
+ +

Method Details

+
+ +
+

animate

+ public function animate() +
+ Starts the animation by registering it with the animation manager. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

doMethod

+ public function doMethod(String attr, Number start, Number end) +
+ Returns the value computed by the animation's "method". +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • start : Number
    The value this attribute should start from for this animation.
  • end : Number
    The value this attribute should end at for this animation.
+ Returns: +
    +
  • Number
    The Value to be applied to the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getAttribute

+ public function getAttribute(String attr) +
+ Returns current value of the attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
+ Returns: +
    +
  • Number
    val The current value of the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getDefaultUnit

+ public function getDefaultUnit(attr attr) +
+ Returns the unit to use when none is supplied. +
+ Parameters: +
  • attr : attr
    The name of the attribute.
+ Returns: +
    +
  • String
    The default unit to be used.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the animated element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getStartTime

+ public function getStartTime() +
+ Returns the animation start time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    current value of startTime.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

init

+ public function init(String/HTMLElement el, Object attributes, Number duration, Function method) +
+ Constructor for Anim instance. +
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

isAnimated

+ public function isAnimated() +
+ Checks whether the element is currently animated. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    current value of isAnimated.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

parseColor

+ public function parseColor(String s) +
+ Attempts to parse the given string and return a 3-tuple. +
+ Parameters: +
  • s : String
    The string to parse.
+ Returns: +
    +
  • Array
    The 3-tuple of rgb values.
  • +
+
+
+
This method is defined by ColorAnim.
+
+ +
+

setAttribute

+ public function setAttribute(String attr, Number val, String unit) +
+ Applies a value to an attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • val : Number
    The value to be applied to the attribute.
  • unit : String
    The unit ('px', '%', etc.) of the value.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

stop

+ public function stop([Boolean finish]) +
+ Stops the animation. Normally called by AnimMgr when animation completes. +
+ Parameters: +
  • finish : Boolean
    (optional) If true, animation will jump to final frame.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

toString

+ public function toString() +
+ Provides a readable name for the Anim instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Anim.
+
+
+ +

Event Details

+
+ +
+

onComplete

+ public event onComplete +
+ Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onStart

+ public event onStart +
+ Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onTween

+ public event onTween +
+ Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Config.html b/www/extras/yui-ext/docs/output/YAHOO.util.Config.html new file mode 100644 index 000000000..39305bd1f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Config.html @@ -0,0 +1,592 @@ + + + + YAHOO.util.Config + + + + + +
+ +

Class YAHOO.util.Config

+ + + + + +
Package:YAHOO.util
Class:Config
Extends:Object
Defined In:container_core.js
+
+ Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 owner : ObjectConfig
Object reference to the owner of this Config Object
 queueInProgress : BooleanConfig
Boolean flag that specifies whether a queue is currently being executed
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Config(Object owner)Config
 addProperty(String key, Object propertyObject) : voidConfig
Adds a property to the Config Object's private config hash.
 alreadySubscribed<static>(YAHOO.util.CustomEvent evt, Function fn, Object obj) : BooleanConfig
<static> Checks to determine if a particular function/Object pair are already subscribed to the specified Custo...
 applyConfig(Object userConfig, Boolean init) : voidConfig
Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property eve...
 checkBoolean(Object val) : BooleanConfig
Validates that the value passed in is a Boolean.
 checkNumber(Object val) : BooleanConfig
Validates that the value passed in is a number.
 fireQueue() : voidConfig
Fires the normalized list of queued property change events
 getConfig() : ObjectConfig
Returns a key-value configuration map of the values currently set in the Config Object.
 getProperty(String key) : ObjectConfig
Returns the value of specified property.
 init(Object owner) : voidConfig
Initializes the configuration Object and all of its local members.
 outputEventQueue() : StringConfig
Returns a string representation of the Config object's current CustomEvent queue
 queueProperty(String key, String value) : BooleanConfig
Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is +mov...
 refireEvent(String key) : voidConfig
Fires the event for a property using the property's current value.
 refresh() : voidConfig
Refires the events for all configuration properties using their current values.
 resetProperty(String key) : BooleanConfig
Resets the specified property's value to its initial value.
 setProperty(String key, String value, Boolean silent) : BooleanConfig
Sets the value of a property. If the silent property is passed as true, the property's event will not be fired.
 subscribeToConfigEvent(String key, Function handler, Object obj, Boolean override) : BooleanConfig
Subscribes an external handler to the change event for any given property.
 toString() : StringConfig
Returns a string representation of the Config object
 unsubscribeFromConfigEvent(String key, Function handler, Object obj) : BooleanConfig
Unsubscribes an external handler from the change event for any given property.
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 configChangedEvent : ()Config
Object reference to the owner of this Config Object
+ +

Property Details

+
+ +
+

owner

+ public Object owner +
+ Object reference to the owner of this Config Object
+
This property is defined by Config.
+
+ +
+

queueInProgress

+ public Boolean queueInProgress +
+ Boolean flag that specifies whether a queue is currently being executed
+
This property is defined by Config.
+
+
+ + +

Constructor Details

+
+
+

Config

+ public function Config(Object owner) +
+
+ Parameters: +
  • owner : Object
    The owner Object to which this Config Object belongs
+
+
+
+
+ +

Method Details

+
+ +
+

addProperty

+ public function addProperty(String key, Object propertyObject) +
+ Adds a property to the Config Object's private config hash. +
+ Parameters: +
  • key : String
    The configuration property's name
  • propertyObject : Object
    The Object containing all of this property's arguments
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

alreadySubscribed<static>

+ public function alreadySubscribed<static>(YAHOO.util.CustomEvent evt, Function fn, Object obj) +
+ <static> Checks to determine if a particular function/Object pair are already subscribed to the specified CustomEvent +
+ Parameters: +
  • evt : YAHOO.util.CustomEvent
    The CustomEvent for which to check the subscriptions
  • fn : Function
    The function to look for in the subscribers list
  • obj : Object
    The execution scope Object for the subscription
+ Returns: +
    +
  • Boolean
    true, if the function/Object pair is already subscribed to the CustomEvent passed in
  • +
+
+
+
This method is defined by Config.
+
+ +
+

applyConfig

+ public function applyConfig(Object userConfig, Boolean init) +
+ Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property events. +Although the values will be set, fireQueue() must be called for their associated events to execute. +
+ Parameters: +
  • userConfig : Object
    The configuration Object literal
  • init : Boolean
    When set to true, the initialConfig will be set to the userConfig passed in, so that calling a reset will reset the properties to the passed values.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

checkBoolean

+ public function checkBoolean(Object val) +
+ Validates that the value passed in is a Boolean. +
+ Parameters: +
  • val : Object
    The value to validate
+ Returns: +
    +
  • Boolean
    true, if the value is valid
  • +
+
+
+
This method is defined by Config.
+
+ +
+

checkNumber

+ public function checkNumber(Object val) +
+ Validates that the value passed in is a number. +
+ Parameters: +
  • val : Object
    The value to validate
+ Returns: +
    +
  • Boolean
    true, if the value is valid
  • +
+
+
+
This method is defined by Config.
+
+ +
+

fireQueue

+ public function fireQueue() +
+ Fires the normalized list of queued property change events +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

getConfig

+ public function getConfig() +
+ Returns a key-value configuration map of the values currently set in the Config Object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object
    The current config, represented in a key-value map
  • +
+
+
+
This method is defined by Config.
+
+ +
+

getProperty

+ public function getProperty(String key) +
+ Returns the value of specified property. +
+ Parameters: +
  • key : String
    The name of the property
+ Returns: +
    +
  • Object
    The value of the specified property
  • +
+
+
+
This method is defined by Config.
+
+ +
+

init

+ public function init(Object owner) +
+ Initializes the configuration Object and all of its local members. +
+ Parameters: +
  • owner : Object
    The owner Object to which this Config Object belongs
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

outputEventQueue

+ public function outputEventQueue() +
+ Returns a string representation of the Config object's current CustomEvent queue +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The string list of CustomEvents currently queued for execution
  • +
+
+
+
This method is defined by Config.
+
+ +
+

queueProperty

+ public function queueProperty(String key, String value) +
+ Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is +moved from its current position to the end of the queue. +
+ Parameters: +
  • key : String
    The name of the property
  • value : String
    The value to set the property to
+ Returns: +
    +
  • Boolean
    true, if the set was successful, false if it failed.
  • +
+
+
+
This method is defined by Config.
+
+ +
+

refireEvent

+ public function refireEvent(String key) +
+ Fires the event for a property using the property's current value. +
+ Parameters: +
  • key : String
    The name of the property
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

refresh

+ public function refresh() +
+ Refires the events for all configuration properties using their current values. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Config.
+
+ +
+

resetProperty

+ public function resetProperty(String key) +
+ Resets the specified property's value to its initial value. +
+ Parameters: +
  • key : String
    The name of the property
+ Returns: +
    +
  • Boolean
    True is the property was reset, false if not
  • +
+
+
+
This method is defined by Config.
+
+ +
+

setProperty

+ public function setProperty(String key, String value, Boolean silent) +
+ Sets the value of a property. If the silent property is passed as true, the property's event will not be fired. +
+ Parameters: +
  • key : String
    The name of the property
  • value : String
    The value to set the property to
  • silent : Boolean
    Whether the value should be set silently, without firing the property event.
+ Returns: +
    +
  • Boolean
    True, if the set was successful, false if it failed.
  • +
+
+
+
This method is defined by Config.
+
+ +
+

subscribeToConfigEvent

+ public function subscribeToConfigEvent(String key, Function handler, Object obj, Boolean override) +
+ Subscribes an external handler to the change event for any given property. +
+ Parameters: +
  • key : String
    The property name
  • handler : Function
    The handler function to use subscribe to the property's event
  • obj : Object
    The Object to use for scoping the event handler (see CustomEvent documentation)
  • override : Boolean
    Optional. If true, will override "this" within the handler to map to the scope Object passed into the method.
+ Returns: +
    +
  • Boolean
    True, if the subscription was successful, otherwise false.
  • +
+
+
+
This method is defined by Config.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the Config object +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The Config object in string format.
  • +
+
+
+
This method is defined by Config.
+
+ +
+

unsubscribeFromConfigEvent

+ public function unsubscribeFromConfigEvent(String key, Function handler, Object obj) +
+ Unsubscribes an external handler from the change event for any given property. +
+ Parameters: +
  • key : String
    The property name
  • handler : Function
    The handler function to use subscribe to the property's event
  • obj : Object
    The Object to use for scoping the event handler (see CustomEvent documentation)
+ Returns: +
    +
  • Boolean
    True, if the unsubscription was successful, otherwise false.
  • +
+
+
+
This method is defined by Config.
+
+
+ +

Event Details

+
+ +
+

configChangedEvent

+ public event configChangedEvent +
+ Object reference to the owner of this Config Object +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Config.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Connect.html b/www/extras/yui-ext/docs/output/YAHOO.util.Connect.html new file mode 100644 index 000000000..3f84aff08 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Connect.html @@ -0,0 +1,255 @@ + + + + YAHOO.util.Connect + + + + + +
+ +

Class YAHOO.util.Connect

+ + + + + +
Package:YAHOO.util
Class:Connect
Extends:Object
Defined In:connection.js
+
+
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 abort(object o, object callback, string isTimeout) : booleanConnect
<static> Method to terminate a transaction, if it has not reached readyState 4.
 asyncRequest(string method, string uri, callback callback, string postData) : objectConnect
<static> Method for initiating an asynchronous request via the XHR object.
 initHeader(string label, string value) : voidConnect
<static> Public method that stores the custom HTTP headers for each transaction.
 isCallInProgress(object o) : booleanConnect
<static> Public method to check if the transaction is still being processed.
 setDefaultPostHeader(boolean b) : voidConnect
<static> Member to enable or disable the default POST header.
 setForm(string ||, string optional, string ||) : stringConnect
<static> This method assembles the form label and value pairs and +constructs an encoded string. +asyncRequest() ...
 setPollingInterval(int i) : voidConnect
<static> Member to modify the default polling interval.
 setProgId(string id) : voidConnect
<static> Member to add an ActiveX id to the existing xml_progid array. +In the event(unlikely) a new ActiveX id ...
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

abort

+ public function abort(object o, object callback, string isTimeout) +
+ <static> Method to terminate a transaction, if it has not reached readyState 4. +
+ Parameters: +
  • o : object
    The connection object returned by asyncRequest.
  • callback : object
    User-defined callback object.
  • isTimeout : string
    boolean to indicate if abort was a timeout.
+ Returns: +
    +
  • boolean
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

asyncRequest

+ public function asyncRequest(string method, string uri, callback callback, string postData) +
+ <static> Method for initiating an asynchronous request via the XHR object. +
+ Parameters: +
  • method : string
    HTTP transaction method
  • uri : string
    Fully qualified path of resource
  • callback : callback
    User-defined callback function or object
  • postData : string
    POST body
+ Returns: +
    +
  • object
    Returns the connection object
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

initHeader

+ public function initHeader(string label, string value) +
+ <static> Public method that stores the custom HTTP headers for each transaction. +
+ Parameters: +
  • label : string
    The HTTP header label
  • value : string
    The HTTP header value
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

isCallInProgress

+ public function isCallInProgress(object o) +
+ <static> Public method to check if the transaction is still being processed. +
+ Parameters: +
  • o : object
    The connection object returned by asyncRequest
+ Returns: +
    +
  • boolean
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

setDefaultPostHeader

+ public function setDefaultPostHeader(boolean b) +
+ <static> Member to enable or disable the default POST header. +
+ Parameters: +
  • b : boolean
    Set and use default header - true or false .
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

setForm

+ public function setForm(string ||, string optional, string ||) +
+ <static> This method assembles the form label and value pairs and +constructs an encoded string. +asyncRequest() will automatically initialize the +transaction with a HTTP header Content-Type of +application/x-www-form-urlencoded. +
+ Parameters: +
  • || : string
    object} form id or name attribute, or form object.
  • optional : string
    boolean to indicate SSL environment.
  • || : string
    boolean} optional qualified path of iframe resource for SSL in IE.
+ Returns: +
    +
  • string
    string of the HTML form field name and value pairs..
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

setPollingInterval

+ public function setPollingInterval(int i) +
+ <static> Member to modify the default polling interval. +
+ Parameters: +
  • i : int
    The polling interval in milliseconds.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connect.
+
+ +
+

setProgId

+ public function setProgId(string id) +
+ <static> Member to add an ActiveX id to the existing xml_progid array. +In the event(unlikely) a new ActiveX id is introduced, it can be added +without internal code modifications. +
+ Parameters: +
  • id : string
    The ActiveX id to be added to initialize the XHR object.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Connect.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.CustomEvent.html b/www/extras/yui-ext/docs/output/YAHOO.util.CustomEvent.html new file mode 100644 index 000000000..f7fec5d56 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.CustomEvent.html @@ -0,0 +1,390 @@ + + + + YAHOO.util.CustomEvent + + + + + +
+ +

Class YAHOO.util.CustomEvent

+ + + + + +
Package:YAHOO.util
Class:CustomEvent
Extends:Object
Defined In:event.js
+
+ The CustomEvent class lets you define events for your application +that can be subscribed to by one or more independent component.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 FLAT<static> : intCustomEvent
<static> Subscriber listener sigature constant. The FLAT type returns two +parameters: the first argument passe...
 LIST<static> : intCustomEvent
<static> Subscriber listener sigature constant. The LIST type returns three +parameters: the event type, the ar...
 scope : objectCustomEvent
The scope the the event will fire from by default. Defaults to the window +obj
 signature : intCustomEvent
Custom events support two styles of arguments provided to the event +subscribers. + +YAHOO.util.CustomEvent.LIST: + +pa...
 silent : booleanCustomEvent
By default all custom events are logged in the debug build, set silent +to true to disable logging for this event.
 subscribers : Subscriber[]CustomEvent
The subscribers to this event
 type : stringCustomEvent
The type of event, returned to subscribers when the event fires
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CustomEvent()CustomEvent
 fire(Object* arguments) : voidCustomEvent
Notifies the subscribers. The callback functions will be executed +from the scope specified when the event was create...
 subscribe(Function fn, Object obj, boolean|Object override) : voidCustomEvent
Subscribes the caller to this event
 toString() : voidCustomEvent
 unsubscribe(Function fn, [Object obj]) : booleanCustomEvent
Unsubscribes the caller from this event
 unsubscribeAll() : voidCustomEvent
Removes all listeners
+ +

Public Events

+ + + + + + + + + + + + + +
EventDefined By
 subscribeEvent : (Function fn, Object obj, boolean|Object override)CustomEvent
Custom events provide a custom event that fires whenever there is +a new subscriber to the event. This provides an op...
+ +

Property Details

+
+ +
+

FLAT<static>

+ public int FLAT<static> +
+ <static> Subscriber listener sigature constant. The FLAT type returns two +parameters: the first argument passed to fire and the optional +custom object
+
This property is defined by CustomEvent.
+
+ +
+

LIST<static>

+ public int LIST<static> +
+ <static> Subscriber listener sigature constant. The LIST type returns three +parameters: the event type, the array of args passed to fire, and +the optional custom object
+
This property is defined by CustomEvent.
+
+ +
+

scope

+ public object scope +
+ The scope the the event will fire from by default. Defaults to the window +obj
+
This property is defined by CustomEvent.
+
+ +
+

signature

+ public int signature +
+ Custom events support two styles of arguments provided to the event +subscribers. +
    +
  • YAHOO.util.CustomEvent.LIST: +
      +
    • param1: event name
    • +
    • param2: array of arguments sent to fire
    • +
    • param3: a custom object supplied by the subscriber
    • +
    +
  • +
  • YAHOO.util.CustomEvent.FLAT +
      +
    • param1: the first argument passed to fire. If you need to +pass multiple parameters, use and array or object literal
    • +
    • param2: a custom object supplied by the subscriber
    • +
    +
  • +
+
This property is defined by CustomEvent.
+
+ +
+

silent

+ public boolean silent +
+ By default all custom events are logged in the debug build, set silent +to true to disable logging for this event.
+
This property is defined by CustomEvent.
+
+ +
+

subscribers

+ public Subscriber[] subscribers +
+ The subscribers to this event
+
This property is defined by CustomEvent.
+
+ +
+

type

+ public string type +
+ The type of event, returned to subscribers when the event fires
+
This property is defined by CustomEvent.
+
+
+ + +

Constructor Details

+
+
+

CustomEvent

+ public function CustomEvent() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

fire

+ public function fire(Object* arguments) +
+ Notifies the subscribers. The callback functions will be executed +from the scope specified when the event was created, and with the +following parameters: +
    +
  • The type of event
  • +
  • All of the arguments fire() was executed with as an array
  • +
  • The custom object (if any) that was passed into the subscribe() +method
  • +
+
+ Parameters: +
  • arguments : Object*
    an arbitrary set of parameters to pass to the handler.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CustomEvent.
+
+ +
+

subscribe

+ public function subscribe(Function fn, Object obj, boolean|Object override) +
+ Subscribes the caller to this event +
+ Parameters: +
  • fn : Function
    The function to execute
  • obj : Object
    An object to be passed along when the event fires
  • override : boolean|Object
    If true, the obj passed in becomes the execution scope of the listener. if an object, that object becomes the the execution scope.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CustomEvent.
+
+ +
+

toString

+ public function toString() +
+ +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CustomEvent.
+
+ +
+

unsubscribe

+ public function unsubscribe(Function fn, [Object obj]) +
+ Unsubscribes the caller from this event +
+ Parameters: +
  • fn : Function
    The function to execute
  • obj : Object
    The custom object passed to subscribe (optional)
+ Returns: +
    +
  • boolean
    True if the subscriber was found and detached.
  • +
+
+
+
This method is defined by CustomEvent.
+
+ +
+

unsubscribeAll

+ public function unsubscribeAll() +
+ Removes all listeners +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CustomEvent.
+
+
+ +

Event Details

+
+ +
+

subscribeEvent

+ public event subscribeEvent +
+ Custom events provide a custom event that fires whenever there is +a new subscriber to the event. This provides an opportunity to +handle the case where there is a non-repeating event that has +already fired has a new subscriber. +
+ Subscribers will be called with the following parameters: +
  • fn : Function
    The function to execute
  • obj : Object
    An object to be passed along when the event fires
  • override : boolean|Object
    If true, the obj passed in becomes the execution scope of the listener. if an object, that object becomes the the execution scope.
+
+
+
This event is defined by CustomEvent.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.DD.html b/www/extras/yui-ext/docs/output/YAHOO.util.DD.html new file mode 100644 index 000000000..b37b4ab79 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.DD.html @@ -0,0 +1,1572 @@ + + + + YAHOO.util.DD + + + + + +
+ +

Class YAHOO.util.DD

+ + + + + + +
Package:YAHOO.util
Class:DD
Extends:DragDrop
Subclasses:DDProxy, SliderThumb
Defined In:dragdrop.js
+
+ A DragDrop implementation where the linked element follows the +mouse cursor during a drag.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 available : booleanDragDrop
The availabe property is false until the linked dom element is accessible.
 config : objectDragDrop
Configuration attributes passed into the constructor
 groups : string:DragDrop
The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
 hasOuterHandles : booleanDragDrop
By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
 id : StringDragDrop
The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
 invalidHandleClasses : string[]DragDrop
An indexted array of css class names for elements that will be ignored +if clicked.
 invalidHandleIds : string:DragDrop
An associative array of ids for elements that will be ignored if clicked
 invalidHandleTypes : string:DragDrop
An associative array of HTML tags that will be ignored if clicked.
 maintainOffset : booleanDragDrop
Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
 primaryButtonOnly : booleanDragDrop
By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
 scroll : booleanDD
When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
 xTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
 yTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DD(String id, String sGroup, object config)DD
 addInvalidHandleClass(string cssClass) : voidDragDrop
Lets you specify a css class of elements that will not initiate a drag
 addInvalidHandleId(string id) : voidDragDrop
Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
 addInvalidHandleType(string tagName) : voidDragDrop
Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
 addToGroup(sGroup {string}) : voidDragDrop
Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
 alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
 applyConfig() : voidDragDrop
Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
 autoOffset(int iPageX, int iPageY) : voidDD
Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
 cachePosition(iPageX the, iPageY the) : voidDD
Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
 clearConstraints() : voidDragDrop
Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
 clearTicks() : voidDragDrop
Clears any tick interval defined for this instance
 endDrag(Event e) : voidDragDrop
Fired when we are done dragging the object
 getDragEl() : HTMLElementDragDrop
Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
 getEl() : HTMLElementDragDrop
Returns a reference to the linked element
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
 initTarget(id the, String sGroup, object config) : voidDragDrop
Initializes Targeting functionality only... the object does not +get a mousedown handler.
 isLocked() : booleanDragDrop
Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
 isTarget() : voidDragDrop
By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
 isValidHandleChild(HTMLElement node) : booleanDragDrop
Checks the tag exclusion list to see if this click should be ignored
 lock() : voidDragDrop
Lock this instance
 onAvailable() : voidDragDrop
Override the onAvailable method to do what is needed after the initial +position was determined.
 onDrag(Event e) : voidDragDrop
Abstract method called during the onMouseMove event while dragging an +object.
 onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this item is dropped on another DragDrop +obj
 onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element fist begins hovering over +another DragDrop obj
 onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when we are no longer hovering over an element
 onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element is hovering over another +DragDrop obj
 onInvalidDrop(Event e) : voidDragDrop
Abstract method called when this item is dropped on an area with no +drop target
 onMouseDown(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mousedown
 onMouseUp(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mouseup
 padding() : voidDragDrop
The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
 removeFromGroup(string sGroup) : voidDragDrop
Remove's this instance from the supplied interaction group
 removeInvalidHandleClass(string cssClass) : voidDragDrop
Unsets an invalid css class
 removeInvalidHandleId(string id) : voidDragDrop
Unsets an invalid handle id
 removeInvalidHandleType(string tagName) : voidDragDrop
Unsets an excluded tag name set by addInvalidHandleType
 resetConstraints(boolean maintainOffset) : voidDragDrop
resetConstraints must be called if you manually reposition a dd element.
 setDelta(int iDeltaX, int iDeltaY) : voidDD
Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
 setDragElId(id {string}) : voidDragDrop
Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
 setDragElPos(int iPageX, int iPageY) : voidDD
Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
 setHandleElId(id {string}) : voidDragDrop
Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
 setInitialPosition(int diffX, int diffY) : voidDragDrop
Stores the initial placement of the linked element.
 setOuterHandleElId(id the) : voidDragDrop
Allows you to set an element outside of the linked element as a drag +handle
 setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
 setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
 setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
 startDrag(int X, int Y) : voidDragDrop
Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
 toString() : stringDragDrop
toString method
 unlock() : voidDragDrop
Unlock this instace
 unreg() : voidDragDrop
Remove all drag and drop hooks for this element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

available

+ public boolean available +
+ The availabe property is false until the linked dom element is accessible.
+
This property is defined by DragDrop.
+
+ +
+

config

+ public object config +
+ Configuration attributes passed into the constructor
+
This property is defined by DragDrop.
+
+ +
+

groups

+ public string: groups +
+ The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
+
This property is defined by DragDrop.
+
+ +
+

hasOuterHandles

+ public boolean hasOuterHandles +
+ By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
+
This property is defined by DragDrop.
+
+ +
+

id

+ public String id +
+ The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleClasses

+ public string[] invalidHandleClasses +
+ An indexted array of css class names for elements that will be ignored +if clicked.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleIds

+ public string: invalidHandleIds +
+ An associative array of ids for elements that will be ignored if clicked
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleTypes

+ public string: invalidHandleTypes +
+ An associative array of HTML tags that will be ignored if clicked.
+
This property is defined by DragDrop.
+
+ +
+

maintainOffset

+ public boolean maintainOffset +
+ Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
+
This property is defined by DragDrop.
+
+ +
+

primaryButtonOnly

+ public boolean primaryButtonOnly +
+ By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
+
This property is defined by DragDrop.
+
+ +
+

scroll

+ public boolean scroll +
+ When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
+
This property is defined by DD.
+
+ +
+

xTicks

+ public int[] xTicks +
+ Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+ +
+

yTicks

+ public int[] yTicks +
+ Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+
+ + +

Constructor Details

+
+
+

DD

+ public function DD(String id, String sGroup, object config) +
+
+ Parameters: +
  • id : String
    the id of the linked element
  • sGroup : String
    the group of related DragDrop items
  • config : object
    an object containing configurable attributes Valid properties for DD: scroll
+
+
+
+
+ +

Method Details

+
+ +
+

addInvalidHandleClass

+ public function addInvalidHandleClass(string cssClass) +
+ Lets you specify a css class of elements that will not initiate a drag +
+ Parameters: +
  • cssClass : string
    the class of the elements you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleId

+ public function addInvalidHandleId(string id) +
+ Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
+ Parameters: +
  • id : string
    the element id of the element you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleType

+ public function addInvalidHandleType(string tagName) +
+ Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
+ Parameters: +
  • tagName : string
    the type of element to exclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addToGroup

+ public function addToGroup(sGroup {string}) +
+ Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
+ Parameters: +
  • {string} : sGroup
    the name of the group
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

alignElWithMouse

+ public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
+ Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
+ Parameters: +
  • el : HTMLElement
    the element to move
  • iPageX : int
    the X coordinate of the mousedown or drag event
  • iPageY : int
    the Y coordinate of the mousedown or drag event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

applyConfig

+ public function applyConfig() +
+ Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

autoOffset

+ public function autoOffset(int iPageX, int iPageY) +
+ Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
+ Parameters: +
  • iPageX : int
    the X coordinate of the click
  • iPageY : int
    the Y coordinate of the click
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

cachePosition

+ public function cachePosition(iPageX the, iPageY the) +
+ Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
+ Parameters: +
  • the : iPageX
    current x position (optional, this just makes it so we don't have to look it up again)
  • the : iPageY
    current y position (optional, this just makes it so we don't have to look it up again)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

clearConstraints

+ public function clearConstraints() +
+ Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearTicks

+ public function clearTicks() +
+ Clears any tick interval defined for this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

endDrag

+ public function endDrag(Event e) +
+ Fired when we are done dragging the object +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getDragEl

+ public function getDragEl() +
+ Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the linked element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

initTarget

+ public function initTarget(id the, String sGroup, object config) +
+ Initializes Targeting functionality only... the object does not +get a mousedown handler. +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • boolean
    true if this obj or all drag/drop is locked, else false
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isTarget

+ public function isTarget() +
+ By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isValidHandleChild

+ public function isValidHandleChild(HTMLElement node) +
+ Checks the tag exclusion list to see if this click should be ignored +
+ Parameters: +
  • node : HTMLElement
    the HTMLElement to evaluate
+ Returns: +
    +
  • boolean
    true if this is a valid tag type, false if not
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

lock

+ public function lock() +
+ Lock this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onAvailable

+ public function onAvailable() +
+ Override the onAvailable method to do what is needed after the initial +position was determined. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDrag

+ public function onDrag(Event e) +
+ Abstract method called during the onMouseMove event while dragging an +object. +
+ Parameters: +
  • e : Event
    the mousemove event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragDrop

+ public function onDragDrop(Event e, String|DragDrop[] id) +
+ Abstract method called when this item is dropped on another DragDrop +obj +
+ Parameters: +
  • e : Event
    the mouseup event
  • id : String|DragDrop[]
    In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragEnter

+ public function onDragEnter(Event e, String|DragDrop[] id) +
+ Abstract method called when this element fist begins hovering over +another DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOut

+ public function onDragOut(Event e, String|DragDrop[] id) +
+ Abstract method called when we are no longer hovering over an element +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOver

+ public function onDragOver(Event e, String|DragDrop[] id) +
+ Abstract method called when this element is hovering over another +DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onInvalidDrop

+ public function onInvalidDrop(Event e) +
+ Abstract method called when this item is dropped on an area with no +drop target +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseDown

+ public function onMouseDown(Event e) +
+ Event handler that fires when a drag/drop obj gets a mousedown +
+ Parameters: +
  • e : Event
    the mousedown event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseUp

+ public function onMouseUp(Event e) +
+ Event handler that fires when a drag/drop obj gets a mouseup +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

padding

+ public function padding() +
+ The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeFromGroup

+ public function removeFromGroup(string sGroup) +
+ Remove's this instance from the supplied interaction group +
+ Parameters: +
  • sGroup : string
    The group to drop
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleClass

+ public function removeInvalidHandleClass(string cssClass) +
+ Unsets an invalid css class +
+ Parameters: +
  • cssClass : string
    the class of the element(s) you wish to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleId

+ public function removeInvalidHandleId(string id) +
+ Unsets an invalid handle id +
+ Parameters: +
  • id : string
    the id of the element to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleType

+ public function removeInvalidHandleType(string tagName) +
+ Unsets an excluded tag name set by addInvalidHandleType +
+ Parameters: +
  • tagName : string
    the type of element to unexclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

resetConstraints

+ public function resetConstraints(boolean maintainOffset) +
+ resetConstraints must be called if you manually reposition a dd element. +
+ Parameters: +
  • maintainOffset : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDelta

+ public function setDelta(int iDeltaX, int iDeltaY) +
+ Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
+ Parameters: +
  • iDeltaX : int
    the distance from the left
  • iDeltaY : int
    the distance from the top
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

setDragElId

+ public function setDragElId(id {string}) +
+ Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDragElPos

+ public function setDragElPos(int iPageX, int iPageY) +
+ Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
+ Parameters: +
  • iPageX : int
    the X coordinate of the mousedown or drag event
  • iPageY : int
    the Y coordinate of the mousedown or drag event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

setHandleElId

+ public function setHandleElId(id {string}) +
+ Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setInitialPosition

+ public function setInitialPosition(int diffX, int diffY) +
+ Stores the initial placement of the linked element. +
+ Parameters: +
  • diffX : int
    the X offset, default 0
  • diffY : int
    the Y offset, default 0
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setOuterHandleElId

+ public function setOuterHandleElId(id the) +
+ Allows you to set an element outside of the linked element as a drag +handle +
+ Parameters: +
  • the : id
    id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setPadding

+ public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
+ Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
+ Parameters: +
  • iTop : int
    Top pad
  • iRight : int
    Right pad
  • iBot : int
    Bot pad
  • iLeft : int
    Left pad
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setXConstraint

+ public function setXConstraint(int iLeft, int iRight, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
+ Parameters: +
  • iLeft : int
    the number of pixels the element can move to the left
  • iRight : int
    the number of pixels the element can move to the right
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setYConstraint

+ public function setYConstraint(int iUp, int iDown, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
+ Parameters: +
  • iUp : int
    the number of pixels the element can move up
  • iDown : int
    the number of pixels the element can move down
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

startDrag

+ public function startDrag(int X, int Y) +
+ Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
+ Parameters: +
  • X : int
    click location
  • Y : int
    click location
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

toString

+ public function toString() +
+ toString method +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    string representation of the dd obj
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock this instace +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unreg

+ public function unreg() +
+ Remove all drag and drop hooks for this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.DDProxy.html b/www/extras/yui-ext/docs/output/YAHOO.util.DDProxy.html new file mode 100644 index 000000000..504bdda5e --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.DDProxy.html @@ -0,0 +1,1683 @@ + + + + YAHOO.util.DDProxy + + + + + +
+ +

Class YAHOO.util.DDProxy

+ + + + + +
Package:YAHOO.util
Class:DDProxy
Extends:DD
Defined In:dragdrop.js
+
+ A DragDrop implementation that inserts an empty, bordered div into +the document that follows the cursor during drag operations. At the time of +the click, the frame div is resized to the dimensions of the linked html +element, and moved to the exact location of the linked element. +References to the "frame" element refer to the single proxy element that +was created to be dragged in place of all DDProxy elements on the +page.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 available : booleanDragDrop
The availabe property is false until the linked dom element is accessible.
 centerFrame : booleanDDProxy
By default the frame is positioned exactly where the drag element is, so +we use the cursor offset provided by YAHOO.u...
 config : objectDragDrop
Configuration attributes passed into the constructor
 dragElId<static> : StringDDProxy
<static> The default drag frame div id
 groups : string:DragDrop
The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
 hasOuterHandles : booleanDragDrop
By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
 id : StringDragDrop
The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
 invalidHandleClasses : string[]DragDrop
An indexted array of css class names for elements that will be ignored +if clicked.
 invalidHandleIds : string:DragDrop
An associative array of ids for elements that will be ignored if clicked
 invalidHandleTypes : string:DragDrop
An associative array of HTML tags that will be ignored if clicked.
 maintainOffset : booleanDragDrop
Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
 primaryButtonOnly : booleanDragDrop
By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
 resizeFrame : booleanDDProxy
By default we resize the drag frame to be the same size as the element +we want to drag (this is to get the frame effe...
 scroll : booleanDD
When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
 xTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
 yTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DDProxy(String id, String sGroup, object config)DDProxy
 addInvalidHandleClass(string cssClass) : voidDragDrop
Lets you specify a css class of elements that will not initiate a drag
 addInvalidHandleId(string id) : voidDragDrop
Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
 addInvalidHandleType(string tagName) : voidDragDrop
Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
 addToGroup(sGroup {string}) : voidDragDrop
Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
 alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
 applyConfig() : voidDragDrop
Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
 autoOffset(int iPageX, int iPageY) : voidDD
Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
 cachePosition(iPageX the, iPageY the) : voidDD
Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
 clearConstraints() : voidDragDrop
Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
 clearTicks() : voidDragDrop
Clears any tick interval defined for this instance
 createFrame() : voidDDProxy
Creates the proxy element if it does not yet exist
 endDrag(Event e) : voidDragDrop
Fired when we are done dragging the object
 getDragEl() : HTMLElementDragDrop
Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
 getEl() : HTMLElementDragDrop
Returns a reference to the linked element
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
 initFrame() : voidDDProxy
Initialization for the drag frame element. Must be called in the +constructor of all subclasses
 initTarget(id the, String sGroup, object config) : voidDragDrop
Initializes Targeting functionality only... the object does not +get a mousedown handler.
 isLocked() : booleanDragDrop
Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
 isTarget() : voidDragDrop
By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
 isValidHandleChild(HTMLElement node) : booleanDragDrop
Checks the tag exclusion list to see if this click should be ignored
 lock() : voidDragDrop
Lock this instance
 onAvailable() : voidDragDrop
Override the onAvailable method to do what is needed after the initial +position was determined.
 onDrag(Event e) : voidDragDrop
Abstract method called during the onMouseMove event while dragging an +object.
 onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this item is dropped on another DragDrop +obj
 onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element fist begins hovering over +another DragDrop obj
 onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when we are no longer hovering over an element
 onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element is hovering over another +DragDrop obj
 onInvalidDrop(Event e) : voidDragDrop
Abstract method called when this item is dropped on an area with no +drop target
 onMouseDown(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mousedown
 onMouseUp(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mouseup
 padding() : voidDragDrop
The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
 removeFromGroup(string sGroup) : voidDragDrop
Remove's this instance from the supplied interaction group
 removeInvalidHandleClass(string cssClass) : voidDragDrop
Unsets an invalid css class
 removeInvalidHandleId(string id) : voidDragDrop
Unsets an invalid handle id
 removeInvalidHandleType(string tagName) : voidDragDrop
Unsets an excluded tag name set by addInvalidHandleType
 resetConstraints(boolean maintainOffset) : voidDragDrop
resetConstraints must be called if you manually reposition a dd element.
 setDelta(int iDeltaX, int iDeltaY) : voidDD
Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
 setDragElId(id {string}) : voidDragDrop
Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
 setDragElPos(int iPageX, int iPageY) : voidDD
Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
 setHandleElId(id {string}) : voidDragDrop
Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
 setInitialPosition(int diffX, int diffY) : voidDragDrop
Stores the initial placement of the linked element.
 setOuterHandleElId(id the) : voidDragDrop
Allows you to set an element outside of the linked element as a drag +handle
 setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
 setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
 setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
 startDrag(int X, int Y) : voidDragDrop
Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
 toString() : stringDragDrop
toString method
 unlock() : voidDragDrop
Unlock this instace
 unreg() : voidDragDrop
Remove all drag and drop hooks for this element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

available

+ public boolean available +
+ The availabe property is false until the linked dom element is accessible.
+
This property is defined by DragDrop.
+
+ +
+

centerFrame

+ public boolean centerFrame +
+ By default the frame is positioned exactly where the drag element is, so +we use the cursor offset provided by YAHOO.util.DD. Another option that works only if +you do not have constraints on the obj is to have the drag frame centered +around the cursor. Set centerFrame to true for this effect.
+
This property is defined by DDProxy.
+
+ +
+

config

+ public object config +
+ Configuration attributes passed into the constructor
+
This property is defined by DragDrop.
+
+ +
+

dragElId<static>

+ public String dragElId<static> +
+ <static> The default drag frame div id
+
This property is defined by DDProxy.
+
+ +
+

groups

+ public string: groups +
+ The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
+
This property is defined by DragDrop.
+
+ +
+

hasOuterHandles

+ public boolean hasOuterHandles +
+ By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
+
This property is defined by DragDrop.
+
+ +
+

id

+ public String id +
+ The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleClasses

+ public string[] invalidHandleClasses +
+ An indexted array of css class names for elements that will be ignored +if clicked.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleIds

+ public string: invalidHandleIds +
+ An associative array of ids for elements that will be ignored if clicked
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleTypes

+ public string: invalidHandleTypes +
+ An associative array of HTML tags that will be ignored if clicked.
+
This property is defined by DragDrop.
+
+ +
+

maintainOffset

+ public boolean maintainOffset +
+ Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
+
This property is defined by DragDrop.
+
+ +
+

primaryButtonOnly

+ public boolean primaryButtonOnly +
+ By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
+
This property is defined by DragDrop.
+
+ +
+

resizeFrame

+ public boolean resizeFrame +
+ By default we resize the drag frame to be the same size as the element +we want to drag (this is to get the frame effect). We can turn it off +if we want a different behavior.
+
This property is defined by DDProxy.
+
+ +
+

scroll

+ public boolean scroll +
+ When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
+
This property is defined by DD.
+
+ +
+

xTicks

+ public int[] xTicks +
+ Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+ +
+

yTicks

+ public int[] yTicks +
+ Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+
+ + +

Constructor Details

+
+
+

DDProxy

+ public function DDProxy(String id, String sGroup, object config) +
+
+ Parameters: +
  • id : String
    the id of the linked html element
  • sGroup : String
    the group of related DragDrop objects
  • config : object
    an object containing configurable attributes Valid properties for DDProxy in addition to those in DragDrop: resizeFrame, centerFrame, dragElId
+
+
+
+
+ +

Method Details

+
+ +
+

addInvalidHandleClass

+ public function addInvalidHandleClass(string cssClass) +
+ Lets you specify a css class of elements that will not initiate a drag +
+ Parameters: +
  • cssClass : string
    the class of the elements you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleId

+ public function addInvalidHandleId(string id) +
+ Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
+ Parameters: +
  • id : string
    the element id of the element you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleType

+ public function addInvalidHandleType(string tagName) +
+ Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
+ Parameters: +
  • tagName : string
    the type of element to exclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addToGroup

+ public function addToGroup(sGroup {string}) +
+ Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
+ Parameters: +
  • {string} : sGroup
    the name of the group
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

alignElWithMouse

+ public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
+ Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
+ Parameters: +
  • el : HTMLElement
    the element to move
  • iPageX : int
    the X coordinate of the mousedown or drag event
  • iPageY : int
    the Y coordinate of the mousedown or drag event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

applyConfig

+ public function applyConfig() +
+ Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

autoOffset

+ public function autoOffset(int iPageX, int iPageY) +
+ Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
+ Parameters: +
  • iPageX : int
    the X coordinate of the click
  • iPageY : int
    the Y coordinate of the click
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

cachePosition

+ public function cachePosition(iPageX the, iPageY the) +
+ Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
+ Parameters: +
  • the : iPageX
    current x position (optional, this just makes it so we don't have to look it up again)
  • the : iPageY
    current y position (optional, this just makes it so we don't have to look it up again)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

clearConstraints

+ public function clearConstraints() +
+ Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearTicks

+ public function clearTicks() +
+ Clears any tick interval defined for this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

createFrame

+ public function createFrame() +
+ Creates the proxy element if it does not yet exist +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DDProxy.
+
+ +
+

endDrag

+ public function endDrag(Event e) +
+ Fired when we are done dragging the object +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getDragEl

+ public function getDragEl() +
+ Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the linked element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

initFrame

+ public function initFrame() +
+ Initialization for the drag frame element. Must be called in the +constructor of all subclasses +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DDProxy.
+
+ +
+

initTarget

+ public function initTarget(id the, String sGroup, object config) +
+ Initializes Targeting functionality only... the object does not +get a mousedown handler. +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • boolean
    true if this obj or all drag/drop is locked, else false
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isTarget

+ public function isTarget() +
+ By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isValidHandleChild

+ public function isValidHandleChild(HTMLElement node) +
+ Checks the tag exclusion list to see if this click should be ignored +
+ Parameters: +
  • node : HTMLElement
    the HTMLElement to evaluate
+ Returns: +
    +
  • boolean
    true if this is a valid tag type, false if not
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

lock

+ public function lock() +
+ Lock this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onAvailable

+ public function onAvailable() +
+ Override the onAvailable method to do what is needed after the initial +position was determined. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDrag

+ public function onDrag(Event e) +
+ Abstract method called during the onMouseMove event while dragging an +object. +
+ Parameters: +
  • e : Event
    the mousemove event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragDrop

+ public function onDragDrop(Event e, String|DragDrop[] id) +
+ Abstract method called when this item is dropped on another DragDrop +obj +
+ Parameters: +
  • e : Event
    the mouseup event
  • id : String|DragDrop[]
    In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragEnter

+ public function onDragEnter(Event e, String|DragDrop[] id) +
+ Abstract method called when this element fist begins hovering over +another DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOut

+ public function onDragOut(Event e, String|DragDrop[] id) +
+ Abstract method called when we are no longer hovering over an element +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOver

+ public function onDragOver(Event e, String|DragDrop[] id) +
+ Abstract method called when this element is hovering over another +DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onInvalidDrop

+ public function onInvalidDrop(Event e) +
+ Abstract method called when this item is dropped on an area with no +drop target +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseDown

+ public function onMouseDown(Event e) +
+ Event handler that fires when a drag/drop obj gets a mousedown +
+ Parameters: +
  • e : Event
    the mousedown event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseUp

+ public function onMouseUp(Event e) +
+ Event handler that fires when a drag/drop obj gets a mouseup +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

padding

+ public function padding() +
+ The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeFromGroup

+ public function removeFromGroup(string sGroup) +
+ Remove's this instance from the supplied interaction group +
+ Parameters: +
  • sGroup : string
    The group to drop
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleClass

+ public function removeInvalidHandleClass(string cssClass) +
+ Unsets an invalid css class +
+ Parameters: +
  • cssClass : string
    the class of the element(s) you wish to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleId

+ public function removeInvalidHandleId(string id) +
+ Unsets an invalid handle id +
+ Parameters: +
  • id : string
    the id of the element to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleType

+ public function removeInvalidHandleType(string tagName) +
+ Unsets an excluded tag name set by addInvalidHandleType +
+ Parameters: +
  • tagName : string
    the type of element to unexclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

resetConstraints

+ public function resetConstraints(boolean maintainOffset) +
+ resetConstraints must be called if you manually reposition a dd element. +
+ Parameters: +
  • maintainOffset : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDelta

+ public function setDelta(int iDeltaX, int iDeltaY) +
+ Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
+ Parameters: +
  • iDeltaX : int
    the distance from the left
  • iDeltaY : int
    the distance from the top
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

setDragElId

+ public function setDragElId(id {string}) +
+ Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDragElPos

+ public function setDragElPos(int iPageX, int iPageY) +
+ Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
+ Parameters: +
  • iPageX : int
    the X coordinate of the mousedown or drag event
  • iPageY : int
    the Y coordinate of the mousedown or drag event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DD.
+
+ +
+

setHandleElId

+ public function setHandleElId(id {string}) +
+ Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setInitialPosition

+ public function setInitialPosition(int diffX, int diffY) +
+ Stores the initial placement of the linked element. +
+ Parameters: +
  • diffX : int
    the X offset, default 0
  • diffY : int
    the Y offset, default 0
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setOuterHandleElId

+ public function setOuterHandleElId(id the) +
+ Allows you to set an element outside of the linked element as a drag +handle +
+ Parameters: +
  • the : id
    id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setPadding

+ public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
+ Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
+ Parameters: +
  • iTop : int
    Top pad
  • iRight : int
    Right pad
  • iBot : int
    Bot pad
  • iLeft : int
    Left pad
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setXConstraint

+ public function setXConstraint(int iLeft, int iRight, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
+ Parameters: +
  • iLeft : int
    the number of pixels the element can move to the left
  • iRight : int
    the number of pixels the element can move to the right
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setYConstraint

+ public function setYConstraint(int iUp, int iDown, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
+ Parameters: +
  • iUp : int
    the number of pixels the element can move up
  • iDown : int
    the number of pixels the element can move down
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

startDrag

+ public function startDrag(int X, int Y) +
+ Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
+ Parameters: +
  • X : int
    click location
  • Y : int
    click location
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

toString

+ public function toString() +
+ toString method +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    string representation of the dd obj
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock this instace +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unreg

+ public function unreg() +
+ Remove all drag and drop hooks for this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.DDTarget.html b/www/extras/yui-ext/docs/output/YAHOO.util.DDTarget.html new file mode 100644 index 000000000..6644ab80a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.DDTarget.html @@ -0,0 +1,1413 @@ + + + + YAHOO.util.DDTarget + + + + + +
+ +

Class YAHOO.util.DDTarget

+ + + + + +
Package:YAHOO.util
Class:DDTarget
Extends:DragDrop
Defined In:dragdrop.js
+
+ A DragDrop implementation that does not move, but can be a drop +target. You would get the same result by simply omitting implementation +for the event callbacks, but this way we reduce the processing cost of the +event listener and the callbacks.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 available : booleanDragDrop
The availabe property is false until the linked dom element is accessible.
 config : objectDragDrop
Configuration attributes passed into the constructor
 groups : string:DragDrop
The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
 hasOuterHandles : booleanDragDrop
By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
 id : StringDragDrop
The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
 invalidHandleClasses : string[]DragDrop
An indexted array of css class names for elements that will be ignored +if clicked.
 invalidHandleIds : string:DragDrop
An associative array of ids for elements that will be ignored if clicked
 invalidHandleTypes : string:DragDrop
An associative array of HTML tags that will be ignored if clicked.
 maintainOffset : booleanDragDrop
Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
 primaryButtonOnly : booleanDragDrop
By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
 xTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
 yTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DDTarget(String id, String sGroup, object config)DDTarget
 addInvalidHandleClass(string cssClass) : voidDragDrop
Lets you specify a css class of elements that will not initiate a drag
 addInvalidHandleId(string id) : voidDragDrop
Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
 addInvalidHandleType(string tagName) : voidDragDrop
Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
 addToGroup(sGroup {string}) : voidDragDrop
Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
 applyConfig() : voidDragDrop
Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
 clearConstraints() : voidDragDrop
Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
 clearTicks() : voidDragDrop
Clears any tick interval defined for this instance
 endDrag(Event e) : voidDragDrop
Fired when we are done dragging the object
 getDragEl() : HTMLElementDragDrop
Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
 getEl() : HTMLElementDragDrop
Returns a reference to the linked element
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
 initTarget(id the, String sGroup, object config) : voidDragDrop
Initializes Targeting functionality only... the object does not +get a mousedown handler.
 isLocked() : booleanDragDrop
Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
 isTarget() : voidDragDrop
By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
 isValidHandleChild(HTMLElement node) : booleanDragDrop
Checks the tag exclusion list to see if this click should be ignored
 lock() : voidDragDrop
Lock this instance
 onAvailable() : voidDragDrop
Override the onAvailable method to do what is needed after the initial +position was determined.
 onDrag(Event e) : voidDragDrop
Abstract method called during the onMouseMove event while dragging an +object.
 onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this item is dropped on another DragDrop +obj
 onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element fist begins hovering over +another DragDrop obj
 onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when we are no longer hovering over an element
 onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element is hovering over another +DragDrop obj
 onInvalidDrop(Event e) : voidDragDrop
Abstract method called when this item is dropped on an area with no +drop target
 onMouseDown(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mousedown
 onMouseUp(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mouseup
 padding() : voidDragDrop
The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
 removeFromGroup(string sGroup) : voidDragDrop
Remove's this instance from the supplied interaction group
 removeInvalidHandleClass(string cssClass) : voidDragDrop
Unsets an invalid css class
 removeInvalidHandleId(string id) : voidDragDrop
Unsets an invalid handle id
 removeInvalidHandleType(string tagName) : voidDragDrop
Unsets an excluded tag name set by addInvalidHandleType
 resetConstraints(boolean maintainOffset) : voidDragDrop
resetConstraints must be called if you manually reposition a dd element.
 setDragElId(id {string}) : voidDragDrop
Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
 setHandleElId(id {string}) : voidDragDrop
Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
 setInitialPosition(int diffX, int diffY) : voidDragDrop
Stores the initial placement of the linked element.
 setOuterHandleElId(id the) : voidDragDrop
Allows you to set an element outside of the linked element as a drag +handle
 setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
 setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
 setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
 startDrag(int X, int Y) : voidDragDrop
Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
 toString() : stringDragDrop
toString method
 unlock() : voidDragDrop
Unlock this instace
 unreg() : voidDragDrop
Remove all drag and drop hooks for this element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

available

+ public boolean available +
+ The availabe property is false until the linked dom element is accessible.
+
This property is defined by DragDrop.
+
+ +
+

config

+ public object config +
+ Configuration attributes passed into the constructor
+
This property is defined by DragDrop.
+
+ +
+

groups

+ public string: groups +
+ The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
+
This property is defined by DragDrop.
+
+ +
+

hasOuterHandles

+ public boolean hasOuterHandles +
+ By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
+
This property is defined by DragDrop.
+
+ +
+

id

+ public String id +
+ The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleClasses

+ public string[] invalidHandleClasses +
+ An indexted array of css class names for elements that will be ignored +if clicked.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleIds

+ public string: invalidHandleIds +
+ An associative array of ids for elements that will be ignored if clicked
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleTypes

+ public string: invalidHandleTypes +
+ An associative array of HTML tags that will be ignored if clicked.
+
This property is defined by DragDrop.
+
+ +
+

maintainOffset

+ public boolean maintainOffset +
+ Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
+
This property is defined by DragDrop.
+
+ +
+

primaryButtonOnly

+ public boolean primaryButtonOnly +
+ By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
+
This property is defined by DragDrop.
+
+ +
+

xTicks

+ public int[] xTicks +
+ Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+ +
+

yTicks

+ public int[] yTicks +
+ Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+
+ + +

Constructor Details

+
+
+

DDTarget

+ public function DDTarget(String id, String sGroup, object config) +
+
+ Parameters: +
  • id : String
    the id of the element that is a drop target
  • sGroup : String
    the group of related DragDrop objects
  • config : object
    an object containing configurable attributes Valid properties for DDTarget in addition to those in DragDrop: none
+
+
+
+
+ +

Method Details

+
+ +
+

addInvalidHandleClass

+ public function addInvalidHandleClass(string cssClass) +
+ Lets you specify a css class of elements that will not initiate a drag +
+ Parameters: +
  • cssClass : string
    the class of the elements you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleId

+ public function addInvalidHandleId(string id) +
+ Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
+ Parameters: +
  • id : string
    the element id of the element you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleType

+ public function addInvalidHandleType(string tagName) +
+ Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
+ Parameters: +
  • tagName : string
    the type of element to exclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addToGroup

+ public function addToGroup(sGroup {string}) +
+ Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
+ Parameters: +
  • {string} : sGroup
    the name of the group
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

applyConfig

+ public function applyConfig() +
+ Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearConstraints

+ public function clearConstraints() +
+ Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearTicks

+ public function clearTicks() +
+ Clears any tick interval defined for this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

endDrag

+ public function endDrag(Event e) +
+ Fired when we are done dragging the object +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getDragEl

+ public function getDragEl() +
+ Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the linked element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

initTarget

+ public function initTarget(id the, String sGroup, object config) +
+ Initializes Targeting functionality only... the object does not +get a mousedown handler. +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • boolean
    true if this obj or all drag/drop is locked, else false
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isTarget

+ public function isTarget() +
+ By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isValidHandleChild

+ public function isValidHandleChild(HTMLElement node) +
+ Checks the tag exclusion list to see if this click should be ignored +
+ Parameters: +
  • node : HTMLElement
    the HTMLElement to evaluate
+ Returns: +
    +
  • boolean
    true if this is a valid tag type, false if not
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

lock

+ public function lock() +
+ Lock this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onAvailable

+ public function onAvailable() +
+ Override the onAvailable method to do what is needed after the initial +position was determined. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDrag

+ public function onDrag(Event e) +
+ Abstract method called during the onMouseMove event while dragging an +object. +
+ Parameters: +
  • e : Event
    the mousemove event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragDrop

+ public function onDragDrop(Event e, String|DragDrop[] id) +
+ Abstract method called when this item is dropped on another DragDrop +obj +
+ Parameters: +
  • e : Event
    the mouseup event
  • id : String|DragDrop[]
    In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragEnter

+ public function onDragEnter(Event e, String|DragDrop[] id) +
+ Abstract method called when this element fist begins hovering over +another DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOut

+ public function onDragOut(Event e, String|DragDrop[] id) +
+ Abstract method called when we are no longer hovering over an element +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOver

+ public function onDragOver(Event e, String|DragDrop[] id) +
+ Abstract method called when this element is hovering over another +DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onInvalidDrop

+ public function onInvalidDrop(Event e) +
+ Abstract method called when this item is dropped on an area with no +drop target +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseDown

+ public function onMouseDown(Event e) +
+ Event handler that fires when a drag/drop obj gets a mousedown +
+ Parameters: +
  • e : Event
    the mousedown event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseUp

+ public function onMouseUp(Event e) +
+ Event handler that fires when a drag/drop obj gets a mouseup +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

padding

+ public function padding() +
+ The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeFromGroup

+ public function removeFromGroup(string sGroup) +
+ Remove's this instance from the supplied interaction group +
+ Parameters: +
  • sGroup : string
    The group to drop
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleClass

+ public function removeInvalidHandleClass(string cssClass) +
+ Unsets an invalid css class +
+ Parameters: +
  • cssClass : string
    the class of the element(s) you wish to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleId

+ public function removeInvalidHandleId(string id) +
+ Unsets an invalid handle id +
+ Parameters: +
  • id : string
    the id of the element to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleType

+ public function removeInvalidHandleType(string tagName) +
+ Unsets an excluded tag name set by addInvalidHandleType +
+ Parameters: +
  • tagName : string
    the type of element to unexclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

resetConstraints

+ public function resetConstraints(boolean maintainOffset) +
+ resetConstraints must be called if you manually reposition a dd element. +
+ Parameters: +
  • maintainOffset : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDragElId

+ public function setDragElId(id {string}) +
+ Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setHandleElId

+ public function setHandleElId(id {string}) +
+ Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setInitialPosition

+ public function setInitialPosition(int diffX, int diffY) +
+ Stores the initial placement of the linked element. +
+ Parameters: +
  • diffX : int
    the X offset, default 0
  • diffY : int
    the Y offset, default 0
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setOuterHandleElId

+ public function setOuterHandleElId(id the) +
+ Allows you to set an element outside of the linked element as a drag +handle +
+ Parameters: +
  • the : id
    id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setPadding

+ public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
+ Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
+ Parameters: +
  • iTop : int
    Top pad
  • iRight : int
    Right pad
  • iBot : int
    Bot pad
  • iLeft : int
    Left pad
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setXConstraint

+ public function setXConstraint(int iLeft, int iRight, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
+ Parameters: +
  • iLeft : int
    the number of pixels the element can move to the left
  • iRight : int
    the number of pixels the element can move to the right
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setYConstraint

+ public function setYConstraint(int iUp, int iDown, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
+ Parameters: +
  • iUp : int
    the number of pixels the element can move up
  • iDown : int
    the number of pixels the element can move down
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

startDrag

+ public function startDrag(int X, int Y) +
+ Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
+ Parameters: +
  • X : int
    click location
  • Y : int
    click location
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

toString

+ public function toString() +
+ toString method +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    string representation of the dd obj
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock this instace +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unreg

+ public function unreg() +
+ Remove all drag and drop hooks for this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Dom.html b/www/extras/yui-ext/docs/output/YAHOO.util.Dom.html new file mode 100644 index 000000000..6302770af --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Dom.html @@ -0,0 +1,712 @@ + + + + YAHOO.util.Dom + + + + + +
+ +

Class YAHOO.util.Dom

+ + + + + +
Package:YAHOO.util
Class:Dom
Extends:Object
Defined In:dom.js
+
+ Provides helper methods for DOM elements.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addClass(String/HTMLElement/Array el, String className) : voidDom
Adds a class name to a given element or collection of elements.
 batch([String/HTMLElement/Array el], Function method, [Any o], [Boolean override]) : HTMLElement/ArrayDom
Returns an array of elements that have had the supplied method applied. +The method is called with the element(s) as t...
 generateId([String/HTMLElement/Array el], [String prefix]) : String/ArrayDom
Generates a unique ID
 get(String/HTMLElement |Array}) : HTMLElement/ArrayDom
Returns an HTMLElement reference.
 getClientHeight() : IntDom
Deprecated. Returns the height of the client (viewport).
 getClientWidth() : IntDom
Deprecated. Returns the width of the client (viewport).
 getDocumentHeight() : IntDom
Returns the height of the document.
 getDocumentWidth() : IntDom
Returns the width of the document.
 getElementsBy(Function method, [String tag], [String/HTMLElement root]) : voidDom
Returns a array of HTMLElements that pass the test applied by supplied boolean method. +For optimized performance, inc...
 getElementsByClassName(String className, [String tag], [String/HTMLElement root]) : ArrayDom
Returns a array of HTMLElements with the given class. +For optimized performance, include a tag and/or root node when ...
 getRegion(String/HTMLElement/Array el) : Region/ArrayDom
Returns the region position of the given element. +The element must be part of the DOM tree to have a region (display:...
 getStyle(String/HTMLElement |Array}, String property) : String/ArrayDom
Normalizes currentStyle and ComputedStyle.
 getViewportHeight() : IntDom
Returns the current height of the viewport.
 getViewportWidth() : IntDom
Returns the current width of the viewport.
 getX(String/HTMLElement/Array el) : String/ArrayDom
Gets the current X position of an element based on page coordinates. The element must be part of the DOM tree to hav...
 getXY(String/HTMLElement/Array el) : ArrayDom
Gets the current position of an element based on page coordinates. Element must be part of the DOM tree to have page...
 getY(String/HTMLElement/Array el) : String/ArrayDom
Gets the current Y position of an element based on page coordinates. Element must be part of the DOM tree to have pa...
 hasClass(String/HTMLElement/Array el, String className) : Boolean/ArrayDom
Determines whether an HTMLElement has the given className.
 inDocument(String/HTMLElement el) : BooleanDom
Determines whether an HTMLElement is present in the current document.
 isAncestor(String/HTMLElement haystack, String/HTMLElement needle) : BooleanDom
Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy.
 removeClass(String/HTMLElement/Array el, String className) : voidDom
Removes a class name from a given element or collection of elements.
 replaceClass(String/HTMLElement/Array el, String oldClassName, String newClassName) : voidDom
Replace a class with another class for a given element or collection of elements. +If no oldClassName is present, the ...
 setStyle(String/HTMLElement/Array el, String property, String val) : voidDom
Wrapper for setting style properties of HTMLElements. Normalizes "opacity" across modern browsers.
 setX(String/HTMLElement/Array el, Int x) : voidDom
Set the X position of an html element in page coordinates, regardless of how the element is positioned. +The element m...
 setXY(String/HTMLElement/Array el, Array pos, Boolean noRetry) : voidDom
Set the position of an html element in page coordinates, regardless of how the element is positioned. +The element(s) ...
 setY(String/HTMLElement/Array el, Int x) : voidDom
Set the Y position of an html element in page coordinates, regardless of how the element is positioned. +The element m...
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

addClass

+ public function addClass(String/HTMLElement/Array el, String className) +
+ Adds a class name to a given element or collection of elements. +
+ Parameters: +
  • el : String/HTMLElement/Array
    The element or collection to add the class to
  • className : String
    the class name to add to the class attribute
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

batch

+ public function batch([String/HTMLElement/Array el], Function method, [Any o], [Boolean override]) +
+ Returns an array of elements that have had the supplied method applied. +The method is called with the element(s) as the first arg, and the optional param as the second ( method(el, o) ). +
+ Parameters: +
  • el : String/HTMLElement/Array
    (optional) An element or array of elements to apply the method to
  • method : Function
    The method to apply to the element(s)
  • o : Any
    (optional) An optional arg that is passed to the supplied method
  • override : Boolean
    (optional) Whether or not to override the scope of "method" with "o"
+ Returns: +
    +
  • HTMLElement/Array
    The element(s) with the method applied
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

generateId

+ public function generateId([String/HTMLElement/Array el], [String prefix]) +
+ Generates a unique ID +
+ Parameters: +
  • el : String/HTMLElement/Array
    (optional) An optional element array of elements to add an ID to (no ID is added if one is already present).
  • prefix : String
    (optional) an optional prefix to use (defaults to "yui-gen").
+ Returns: +
    +
  • String/Array
    The generated ID, or array of generated IDs (or original ID if already present on an element)
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

get

+ public function get(String/HTMLElement |Array}) +
+ Returns an HTMLElement reference. +
+ Parameters: +
  • |Array} : String/HTMLElement
    el Accepts a string to use as an ID for getting a DOM reference, an actual DOM reference, or an Array of IDs and/or HTMLElements.
+ Returns: +
    +
  • HTMLElement/Array
    A DOM reference to an HTML element or an array of HTMLElements.
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getClientHeight

+ public function getClientHeight() +
+ Deprecated. Returns the height of the client (viewport). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The height of the viewable area of the page.
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getClientWidth

+ public function getClientWidth() +
+ Deprecated. Returns the width of the client (viewport). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The width of the viewable area of the page.
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getDocumentHeight

+ public function getDocumentHeight() +
+ Returns the height of the document. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The height of the actual document (which includes the body and its margin).
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getDocumentWidth

+ public function getDocumentWidth() +
+ Returns the width of the document. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The width of the actual document (which includes the body and its margin).
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getElementsBy

+ public function getElementsBy(Function method, [String tag], [String/HTMLElement root]) +
+ Returns a array of HTMLElements that pass the test applied by supplied boolean method. +For optimized performance, include a tag and/or root node when possible. +
+ Parameters: +
  • method : Function
    - A boolean method for testing elements which receives the element as its only argument.
  • tag : String
    (optional) The tag name of the elements being collected
  • root : String/HTMLElement
    (optional) The HTMLElement or an ID to use as the starting point
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getElementsByClassName

+ public function getElementsByClassName(String className, [String tag], [String/HTMLElement root]) +
+ Returns a array of HTMLElements with the given class. +For optimized performance, include a tag and/or root node when possible. +
+ Parameters: +
  • className : String
    The class name to match against
  • tag : String
    (optional) The tag name of the elements being collected
  • root : String/HTMLElement
    (optional) The HTMLElement or an ID to use as the starting point
+ Returns: +
    +
  • Array
    An array of elements that have the given class name
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getRegion

+ public function getRegion(String/HTMLElement/Array el) +
+ Returns the region position of the given element. +The element must be part of the DOM tree to have a region (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
+ Returns: +
    +
  • Region/Array
    A Region or array of Region instances containing "top, left, bottom, right" member data.
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getStyle

+ public function getStyle(String/HTMLElement |Array}, String property) +
+ Normalizes currentStyle and ComputedStyle. +
+ Parameters: +
  • |Array} : String/HTMLElement
    el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
  • property : String
    The style property whose value is returned.
+ Returns: +
    +
  • String/Array
    The current value of the style property for the element(s).
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getViewportHeight

+ public function getViewportHeight() +
+ Returns the current height of the viewport. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The height of the viewable area of the page (excludes scrollbars).
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getViewportWidth

+ public function getViewportWidth() +
+ Returns the current width of the viewport. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    The width of the viewable area of the page (excludes scrollbars).
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getX

+ public function getX(String/HTMLElement/Array el) +
+ Gets the current X position of an element based on page coordinates. The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
+ Returns: +
    +
  • String/Array
    The X position of the element(s)
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getXY

+ public function getXY(String/HTMLElement/Array el) +
+ Gets the current position of an element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
+ Returns: +
    +
  • Array
    The XY position of the element(s)
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

getY

+ public function getY(String/HTMLElement/Array el) +
+ Gets the current Y position of an element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
+ Returns: +
    +
  • String/Array
    The Y position of the element(s)
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

hasClass

+ public function hasClass(String/HTMLElement/Array el, String className) +
+ Determines whether an HTMLElement has the given className. +
+ Parameters: +
  • el : String/HTMLElement/Array
    The element or collection to test
  • className : String
    the class name to search for
+ Returns: +
    +
  • Boolean/Array
    A boolean value or array of boolean values
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

inDocument

+ public function inDocument(String/HTMLElement el) +
+ Determines whether an HTMLElement is present in the current document. +
+ Parameters: +
  • el : String/HTMLElement
    The element to search for
+ Returns: +
    +
  • Boolean
    Whether or not the element is present in the current document
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

isAncestor

+ public function isAncestor(String/HTMLElement haystack, String/HTMLElement needle) +
+ Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy. +
+ Parameters: +
  • haystack : String/HTMLElement
    The possible ancestor
  • needle : String/HTMLElement
    The possible descendent
+ Returns: +
    +
  • Boolean
    Whether or not the haystack is an ancestor of needle
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

removeClass

+ public function removeClass(String/HTMLElement/Array el, String className) +
+ Removes a class name from a given element or collection of elements. +
+ Parameters: +
  • el : String/HTMLElement/Array
    The element or collection to remove the class from
  • className : String
    the class name to remove from the class attribute
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

replaceClass

+ public function replaceClass(String/HTMLElement/Array el, String oldClassName, String newClassName) +
+ Replace a class with another class for a given element or collection of elements. +If no oldClassName is present, the newClassName is simply added. +
+ Parameters: +
  • el : String/HTMLElement/Array
    The element or collection to remove the class from
  • oldClassName : String
    the class name to be replaced
  • newClassName : String
    the class name that will be replacing the old class name
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

setStyle

+ public function setStyle(String/HTMLElement/Array el, String property, String val) +
+ Wrapper for setting style properties of HTMLElements. Normalizes "opacity" across modern browsers. +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
  • property : String
    The style property to be set.
  • val : String
    The value to apply to the given property.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

setX

+ public function setX(String/HTMLElement/Array el, Int x) +
+ Set the X position of an html element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
  • x : Int
    The value to use as the X coordinate for the element(s).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

setXY

+ public function setXY(String/HTMLElement/Array el, Array pos, Boolean noRetry) +
+ Set the position of an html element in page coordinates, regardless of how the element is positioned. +The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
  • pos : Array
    Contains X & Y values for new position (coordinates are page-based)
  • noRetry : Boolean
    By default we try and set the position a second time if the first fails
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+ +
+

setY

+ public function setY(String/HTMLElement/Array el, Int x) +
+ Set the Y position of an html element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
+ Parameters: +
  • el : String/HTMLElement/Array
    Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
  • x : Int
    To use as the Y coordinate for the element(s).
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Dom.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.DragDrop.html b/www/extras/yui-ext/docs/output/YAHOO.util.DragDrop.html new file mode 100644 index 000000000..0c4aef012 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.DragDrop.html @@ -0,0 +1,1445 @@ + + + + YAHOO.util.DragDrop + + + + + +
+ +

Class YAHOO.util.DragDrop

+ + + + + + +
Package:YAHOO.util
Class:DragDrop
Extends:Object
Subclasses:DD, DDTarget, Slider
Defined In:dragdrop.js
+
+ Defines the interface and base operation of items that that can be +dragged or can be drop targets. It was designed to be extended, overriding +the event handlers for startDrag, onDrag, onDragOver, onDragOut. +Up to three html elements can be associated with a DragDrop instance: +
    +
  • linked element: the element that is passed into the constructor. +This is the element which defines the boundaries for interaction with +other DragDrop objects.
  • +
  • handle element(s): The drag operation only occurs if the element that +was clicked matches a handle element. By default this is the linked +element, but there are times that you will want only a portion of the +linked element to initiate the drag operation, and the setHandleElId() +method provides a way to define this.
  • +
  • drag element: this represents an the element that would be moved along +with the cursor during a drag operation. By default, this is the linked +element itself as in YAHOO.util.DD. setDragElId() lets you define +a separate element that would be moved, as in YAHOO.util.DDProxy +
  • +
+This class should not be instantiated until the onload event to ensure that +the associated elements are available. +The following would define a DragDrop obj that would interact with any +other DragDrop obj in the "group1" group: +
+dd = new YAHOO.util.DragDrop("div1", "group1");
+
+Since none of the event handlers have been implemented, nothing would +actually happen if you were to run the code above. Normally you would +override this class or one of the default implementations, but you can +also override the methods you want on an instance of the class... +
+dd.onDragDrop = function(e, id) {
+  alert("dd was dropped on " + id);
+}
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 available : booleanDragDrop
The availabe property is false until the linked dom element is accessible.
 config : objectDragDrop
Configuration attributes passed into the constructor
 groups : string:DragDrop
The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
 hasOuterHandles : booleanDragDrop
By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
 id : StringDragDrop
The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
 invalidHandleClasses : string[]DragDrop
An indexted array of css class names for elements that will be ignored +if clicked.
 invalidHandleIds : string:DragDrop
An associative array of ids for elements that will be ignored if clicked
 invalidHandleTypes : string:DragDrop
An associative array of HTML tags that will be ignored if clicked.
 maintainOffset : booleanDragDrop
Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
 primaryButtonOnly : booleanDragDrop
By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
 xTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
 yTicks : int[]DragDrop
Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 DragDrop(String id, String sGroup, object config)DragDrop
 addInvalidHandleClass(string cssClass) : voidDragDrop
Lets you specify a css class of elements that will not initiate a drag
 addInvalidHandleId(string id) : voidDragDrop
Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
 addInvalidHandleType(string tagName) : voidDragDrop
Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
 addToGroup(sGroup {string}) : voidDragDrop
Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
 applyConfig() : voidDragDrop
Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
 clearConstraints() : voidDragDrop
Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
 clearTicks() : voidDragDrop
Clears any tick interval defined for this instance
 endDrag(Event e) : voidDragDrop
Fired when we are done dragging the object
 getDragEl() : HTMLElementDragDrop
Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
 getEl() : HTMLElementDragDrop
Returns a reference to the linked element
 init(id the, String sGroup, object config) : voidDragDrop
Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
 initTarget(id the, String sGroup, object config) : voidDragDrop
Initializes Targeting functionality only... the object does not +get a mousedown handler.
 isLocked() : booleanDragDrop
Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
 isTarget() : voidDragDrop
By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
 isValidHandleChild(HTMLElement node) : booleanDragDrop
Checks the tag exclusion list to see if this click should be ignored
 lock() : voidDragDrop
Lock this instance
 onAvailable() : voidDragDrop
Override the onAvailable method to do what is needed after the initial +position was determined.
 onDrag(Event e) : voidDragDrop
Abstract method called during the onMouseMove event while dragging an +object.
 onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this item is dropped on another DragDrop +obj
 onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element fist begins hovering over +another DragDrop obj
 onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when we are no longer hovering over an element
 onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
Abstract method called when this element is hovering over another +DragDrop obj
 onInvalidDrop(Event e) : voidDragDrop
Abstract method called when this item is dropped on an area with no +drop target
 onMouseDown(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mousedown
 onMouseUp(Event e) : voidDragDrop
Event handler that fires when a drag/drop obj gets a mouseup
 padding() : voidDragDrop
The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
 removeFromGroup(string sGroup) : voidDragDrop
Remove's this instance from the supplied interaction group
 removeInvalidHandleClass(string cssClass) : voidDragDrop
Unsets an invalid css class
 removeInvalidHandleId(string id) : voidDragDrop
Unsets an invalid handle id
 removeInvalidHandleType(string tagName) : voidDragDrop
Unsets an excluded tag name set by addInvalidHandleType
 resetConstraints(boolean maintainOffset) : voidDragDrop
resetConstraints must be called if you manually reposition a dd element.
 setDragElId(id {string}) : voidDragDrop
Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
 setHandleElId(id {string}) : voidDragDrop
Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
 setInitialPosition(int diffX, int diffY) : voidDragDrop
Stores the initial placement of the linked element.
 setOuterHandleElId(id the) : voidDragDrop
Allows you to set an element outside of the linked element as a drag +handle
 setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
 setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
 setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
 startDrag(int X, int Y) : voidDragDrop
Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
 toString() : stringDragDrop
toString method
 unlock() : voidDragDrop
Unlock this instace
 unreg() : voidDragDrop
Remove all drag and drop hooks for this element
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

available

+ public boolean available +
+ The availabe property is false until the linked dom element is accessible.
+
This property is defined by DragDrop.
+
+ +
+

config

+ public object config +
+ Configuration attributes passed into the constructor
+
This property is defined by DragDrop.
+
+ +
+

groups

+ public string: groups +
+ The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
+
This property is defined by DragDrop.
+
+ +
+

hasOuterHandles

+ public boolean hasOuterHandles +
+ By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
+
This property is defined by DragDrop.
+
+ +
+

id

+ public String id +
+ The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleClasses

+ public string[] invalidHandleClasses +
+ An indexted array of css class names for elements that will be ignored +if clicked.
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleIds

+ public string: invalidHandleIds +
+ An associative array of ids for elements that will be ignored if clicked
+
This property is defined by DragDrop.
+
+ +
+

invalidHandleTypes

+ public string: invalidHandleTypes +
+ An associative array of HTML tags that will be ignored if clicked.
+
This property is defined by DragDrop.
+
+ +
+

maintainOffset

+ public boolean maintainOffset +
+ Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
+
This property is defined by DragDrop.
+
+ +
+

primaryButtonOnly

+ public boolean primaryButtonOnly +
+ By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
+
This property is defined by DragDrop.
+
+ +
+

xTicks

+ public int[] xTicks +
+ Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+ +
+

yTicks

+ public int[] yTicks +
+ Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
+
This property is defined by DragDrop.
+
+
+ + +

Constructor Details

+
+
+

DragDrop

+ public function DragDrop(String id, String sGroup, object config) +
+
+ Parameters: +
  • id : String
    of the element that is linked to this instance
  • sGroup : String
    the group of related DragDrop objects
  • config : object
    an object containing configurable attributes Valid properties for DragDrop: padding, isTarget, maintainOffset, primaryButtonOnly
+
+
+
+
+ +

Method Details

+
+ +
+

addInvalidHandleClass

+ public function addInvalidHandleClass(string cssClass) +
+ Lets you specify a css class of elements that will not initiate a drag +
+ Parameters: +
  • cssClass : string
    the class of the elements you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleId

+ public function addInvalidHandleId(string id) +
+ Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
+ Parameters: +
  • id : string
    the element id of the element you wish to ignore
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addInvalidHandleType

+ public function addInvalidHandleType(string tagName) +
+ Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
+ Parameters: +
  • tagName : string
    the type of element to exclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

addToGroup

+ public function addToGroup(sGroup {string}) +
+ Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
+ Parameters: +
  • {string} : sGroup
    the name of the group
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

applyConfig

+ public function applyConfig() +
+ Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearConstraints

+ public function clearConstraints() +
+ Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

clearTicks

+ public function clearTicks() +
+ Clears any tick interval defined for this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

endDrag

+ public function endDrag(Event e) +
+ Fired when we are done dragging the object +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getDragEl

+ public function getDragEl() +
+ Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the linked element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
    the html element
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

init

+ public function init(id the, String sGroup, object config) +
+ Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

initTarget

+ public function initTarget(id the, String sGroup, object config) +
+ Initializes Targeting functionality only... the object does not +get a mousedown handler. +
+ Parameters: +
  • the : id
    id of the linked element
  • sGroup : String
    the group of related items
  • config : object
    configuration attributes
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isLocked

+ public function isLocked() +
+ Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
+ Parameters: +
  • None.
+ Returns: +
    +
  • boolean
    true if this obj or all drag/drop is locked, else false
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isTarget

+ public function isTarget() +
+ By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

isValidHandleChild

+ public function isValidHandleChild(HTMLElement node) +
+ Checks the tag exclusion list to see if this click should be ignored +
+ Parameters: +
  • node : HTMLElement
    the HTMLElement to evaluate
+ Returns: +
    +
  • boolean
    true if this is a valid tag type, false if not
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

lock

+ public function lock() +
+ Lock this instance +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onAvailable

+ public function onAvailable() +
+ Override the onAvailable method to do what is needed after the initial +position was determined. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDrag

+ public function onDrag(Event e) +
+ Abstract method called during the onMouseMove event while dragging an +object. +
+ Parameters: +
  • e : Event
    the mousemove event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragDrop

+ public function onDragDrop(Event e, String|DragDrop[] id) +
+ Abstract method called when this item is dropped on another DragDrop +obj +
+ Parameters: +
  • e : Event
    the mouseup event
  • id : String|DragDrop[]
    In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragEnter

+ public function onDragEnter(Event e, String|DragDrop[] id) +
+ Abstract method called when this element fist begins hovering over +another DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOut

+ public function onDragOut(Event e, String|DragDrop[] id) +
+ Abstract method called when we are no longer hovering over an element +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onDragOver

+ public function onDragOver(Event e, String|DragDrop[] id) +
+ Abstract method called when this element is hovering over another +DragDrop obj +
+ Parameters: +
  • e : Event
    the mousemove event
  • id : String|DragDrop[]
    In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onInvalidDrop

+ public function onInvalidDrop(Event e) +
+ Abstract method called when this item is dropped on an area with no +drop target +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseDown

+ public function onMouseDown(Event e) +
+ Event handler that fires when a drag/drop obj gets a mousedown +
+ Parameters: +
  • e : Event
    the mousedown event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

onMouseUp

+ public function onMouseUp(Event e) +
+ Event handler that fires when a drag/drop obj gets a mouseup +
+ Parameters: +
  • e : Event
    the mouseup event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

padding

+ public function padding() +
+ The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeFromGroup

+ public function removeFromGroup(string sGroup) +
+ Remove's this instance from the supplied interaction group +
+ Parameters: +
  • sGroup : string
    The group to drop
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleClass

+ public function removeInvalidHandleClass(string cssClass) +
+ Unsets an invalid css class +
+ Parameters: +
  • cssClass : string
    the class of the element(s) you wish to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleId

+ public function removeInvalidHandleId(string id) +
+ Unsets an invalid handle id +
+ Parameters: +
  • id : string
    the id of the element to re-enable
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

removeInvalidHandleType

+ public function removeInvalidHandleType(string tagName) +
+ Unsets an excluded tag name set by addInvalidHandleType +
+ Parameters: +
  • tagName : string
    the type of element to unexclude
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

resetConstraints

+ public function resetConstraints(boolean maintainOffset) +
+ resetConstraints must be called if you manually reposition a dd element. +
+ Parameters: +
  • maintainOffset : boolean
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setDragElId

+ public function setDragElId(id {string}) +
+ Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setHandleElId

+ public function setHandleElId(id {string}) +
+ Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
+ Parameters: +
  • {string} : id
    the id of the element that will be used to initiate the drag.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setInitialPosition

+ public function setInitialPosition(int diffX, int diffY) +
+ Stores the initial placement of the linked element. +
+ Parameters: +
  • diffX : int
    the X offset, default 0
  • diffY : int
    the Y offset, default 0
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setOuterHandleElId

+ public function setOuterHandleElId(id the) +
+ Allows you to set an element outside of the linked element as a drag +handle +
+ Parameters: +
  • the : id
    id of the element that will be used to initiate the drag
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setPadding

+ public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
+ Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
+ Parameters: +
  • iTop : int
    Top pad
  • iRight : int
    Right pad
  • iBot : int
    Bot pad
  • iLeft : int
    Left pad
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setXConstraint

+ public function setXConstraint(int iLeft, int iRight, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
+ Parameters: +
  • iLeft : int
    the number of pixels the element can move to the left
  • iRight : int
    the number of pixels the element can move to the right
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

setYConstraint

+ public function setYConstraint(int iUp, int iDown, int iTickSize) +
+ By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
+ Parameters: +
  • iUp : int
    the number of pixels the element can move up
  • iDown : int
    the number of pixels the element can move down
  • iTickSize : int
    optional parameter for specifying that the element should move iTickSize pixels at a time.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

startDrag

+ public function startDrag(int X, int Y) +
+ Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
+ Parameters: +
  • X : int
    click location
  • Y : int
    click location
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

toString

+ public function toString() +
+ toString method +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    string representation of the dd obj
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unlock

+ public function unlock() +
+ Unlock this instace +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+ +
+

unreg

+ public function unreg() +
+ Remove all drag and drop hooks for this element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDrop.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.DragDropMgr.html b/www/extras/yui-ext/docs/output/YAHOO.util.DragDropMgr.html new file mode 100644 index 000000000..15a29b74a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.DragDropMgr.html @@ -0,0 +1,1055 @@ + + + + YAHOO.util.DragDropMgr + + + + + +
+ +

Class YAHOO.util.DragDropMgr

+ + + + + +
Package:YAHOO.util
Class:DragDropMgr
Extends:Object
Defined In:dragdrop.js
+
+ DragDropMgr is a singleton that tracks the element interaction for +all DragDrop items in the window. Generally, you will not call +this class directly, but it does have helper methods that could +be useful in your DragDrop implementations.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 INTERSECT : intDragDropMgr
<static> In intersect mode, drag and drop interactio nis defined by the +overlap of two or more drag and drop ob...
 POINT : intDragDropMgr
<static> In point mode, drag and drop interaction is defined by the +location of the cursor during the drag/drop
 clickPixelThresh : intDragDropMgr
<static> The number of pixels that the mouse needs to move after the +mousedown before the drag is initiated. D...
 clickTimeThresh : intDragDropMgr
<static> The number of milliseconds after the mousedown event to initiate the +drag if we don't get a mouseup ev...
 css : ObjectDragDropMgr
A reference to the style property
 el : ObjectDragDropMgr
The element
 id : ObjectDragDropMgr
The element id
 mode : intDragDropMgr
<static> The current drag and drop mode. Default: POINT
 preventDefault : booleanDragDropMgr
<static> Flag to determine if we should prevent the default behavior of the +events we define. By default this i...
 stopPropagation : booleanDragDropMgr
<static> Flag to determine if we should stop the propagation of the events +we generate. This is true by default...
 useCache : booleanDragDropMgr
<static> Set useCache to false if you want to force object the lookup of each +drag and drop linked element cons...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 getBestMatch(DragDrop[] dds) : DragDropDragDropMgr
<static> Helper function for getting the best match from the list of drag +and drop objects returned by the drag...
 getClientHeight() : intDragDropMgr
Deprecated. <static> Gets the client height
 getClientWidth() : intDragDropMgr
Deprecated. <static> Gets the client width
 getCss(String id) : ObjectDragDropMgr
Deprecated. <static> Returns the style property for the DOM element (i.e., +document.getElById(id).style)
 getDDById(String id) : DragDropDragDropMgr
<static> Returns the DragDrop instance for a given id
 getElement(String id) : ObjectDragDropMgr
Deprecated. <static> Returns the actual DOM element
 getLocation(DragDrop oDD) : YAHOO.util.RegionDragDropMgr
<static> Returns a Region object containing the drag and drop element's position +and size, including the paddin...
 getPosX(el the) : intDragDropMgr
Deprecated. <static> Returns the X position of an html element
 getPosY(el the) : intDragDropMgr
Deprecated. <static> Returns the Y position of an html element
 getRelated(DragDrop p_oDD, boolean bTargetsOnly) : DragDrop[]DragDropMgr
<static> Returns the drag and drop instances that are in all groups the +passed in instance belongs to.
 getScrollLeft() : intDragDropMgr
<static> Gets the scrollLeft
 getScrollTop() : intDragDropMgr
<static> Gets the scrollTop
 getStyle(HTMLElement el, string styleProp) : stringDragDropMgr
Deprecated. <static> Returns the specified element style property
 handleWasClicked(node the) : voidDragDropMgr
<static> Recursively searches the immediate parent and all child nodes for +the handle element in order to deter...
 isDragDrop(String id) : booleanDragDropMgr
<static> Utility function to determine if a given element has been +registered as a drag drop item.
 isHandle(String id) : booleanDragDropMgr
<static> Utility function to determine if a given element has been +registered as a drag drop handle for the giv...
 isLegalTarget(DragDrop the, DragDrop the) : booleanDragDropMgr
<static> Returns true if the specified dd target is a legal target for +the specifice drag obj
 isLocked() : booleanDragDropMgr
<static> Is drag and drop locked?
 isTypeOfDD(Object the) : booleanDragDropMgr
<static> My goal is to be able to transparently determine if an object is +typeof DragDrop, and the exact subcla...
 lock() : voidDragDropMgr
<static> Lock all drag and drop functionality
 moveToEl(HTMLElement moveEl, HTMLElement targetEl) : voidDragDropMgr
<static> Sets the x/y position of an element to the location of the +target element.
 numericSort() : voidDragDropMgr
<static> Numeric array sort function
 refreshCache(Object groups) : voidDragDropMgr
<static> Refreshes the cache of the top-left and bottom-right points of the +drag and drop objects in the specif...
 regDragDrop(DragDrop oDD, String sGroup) : voidDragDropMgr
<static> Each DragDrop instance must be registered with the DragDropMgr. +This is executed in DragDrop.init()
 regHandle(String sDDId, String sHandleId) : voidDragDropMgr
<static> Each DragDrop handle element must be registered. This is done +automatically when executing DragDrop.s...
 startDrag(x {int}, y {int}) : voidDragDropMgr
<static> Fired when either the drag pixel threshol or the mousedown hold +time threshold has been met.
 stopEvent(Event e) : voidDragDropMgr
<static> Utility to stop event propagation and event default, if these +features are turned on.
 swapNode(n1 the, n2 the) : voidDragDropMgr
<static> Swap two nodes. In IE, we use the native method, for others we +emulate the IE behavior
 unlock() : voidDragDropMgr
<static> Unlock all drag and drop functionality
 verifyEl(HTMLElement el) : booleanDragDropMgr
<static> This checks to make sure an element exists and is in the DOM. The +main purpose is to handle cases whe...
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

INTERSECT

+ public int INTERSECT +
+ <static> In intersect mode, drag and drop interactio nis defined by the +overlap of two or more drag and drop objects.
+
This property is defined by DragDropMgr.
+
+ +
+

POINT

+ public int POINT +
+ <static> In point mode, drag and drop interaction is defined by the +location of the cursor during the drag/drop
+
This property is defined by DragDropMgr.
+
+ +
+

clickPixelThresh

+ public int clickPixelThresh +
+ <static> The number of pixels that the mouse needs to move after the +mousedown before the drag is initiated. Default=3;
+
This property is defined by DragDropMgr.
+
+ +
+

clickTimeThresh

+ public int clickTimeThresh +
+ <static> The number of milliseconds after the mousedown event to initiate the +drag if we don't get a mouseup event. Default=1000
+
This property is defined by DragDropMgr.
+
+ +
+

css

+ public Object css +
+ A reference to the style property
+
This property is defined by DragDropMgr.
+
+ +
+

el

+ public Object el +
+ The element
+
This property is defined by DragDropMgr.
+
+ +
+

id

+ public Object id +
+ The element id
+
This property is defined by DragDropMgr.
+
+ +
+

mode

+ public int mode +
+ <static> The current drag and drop mode. Default: POINT
+
This property is defined by DragDropMgr.
+
+ +
+

preventDefault

+ public boolean preventDefault +
+ <static> Flag to determine if we should prevent the default behavior of the +events we define. By default this is true, but this can be set to +false if you need the default behavior (not recommended)
+
This property is defined by DragDropMgr.
+
+ +
+

stopPropagation

+ public boolean stopPropagation +
+ <static> Flag to determine if we should stop the propagation of the events +we generate. This is true by default but you may want to set it to +false if the html element contains other features that require the +mouse click.
+
This property is defined by DragDropMgr.
+
+ +
+

useCache

+ public boolean useCache +
+ <static> Set useCache to false if you want to force object the lookup of each +drag and drop linked element constantly during a drag.
+
This property is defined by DragDropMgr.
+
+
+ + +

Method Details

+
+ +
+

getBestMatch

+ public function getBestMatch(DragDrop[] dds) +
+ <static> Helper function for getting the best match from the list of drag +and drop objects returned by the drag and drop events when we are +in INTERSECT mode. It returns either the first object that the +cursor is over, or the object that has the greatest overlap with +the dragged element. +
+ Parameters: +
  • dds : DragDrop[]
    The array of drag and drop objects targeted
+ Returns: +
    +
  • DragDrop
    The best single match
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getClientHeight

+ public function getClientHeight() +
+ Deprecated. <static> Gets the client height +
+ Parameters: +
  • None.
+ Returns: +
    +
  • int
    client height in px
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getClientWidth

+ public function getClientWidth() +
+ Deprecated. <static> Gets the client width +
+ Parameters: +
  • None.
+ Returns: +
    +
  • int
    client width in px
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getCss

+ public function getCss(String id) +
+ Deprecated. <static> Returns the style property for the DOM element (i.e., +document.getElById(id).style) +
+ Parameters: +
  • id : String
    the id of the elment to get
+ Returns: +
    +
  • Object
    The style property of the element
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getDDById

+ public function getDDById(String id) +
+ <static> Returns the DragDrop instance for a given id +
+ Parameters: +
  • id : String
    the id of the DragDrop object
+ Returns: +
    +
  • DragDrop
    the drag drop object, null if it is not found
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getElement

+ public function getElement(String id) +
+ Deprecated. <static> Returns the actual DOM element +
+ Parameters: +
  • id : String
    the id of the elment to get
+ Returns: +
    +
  • Object
    The element
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getLocation

+ public function getLocation(DragDrop oDD) +
+ <static> Returns a Region object containing the drag and drop element's position +and size, including the padding configured for it +
+ Parameters: +
  • oDD : DragDrop
    the drag and drop object to get the location for
+ Returns: +
    +
  • YAHOO.util.Region
    a Region object representing the total area the element occupies, including any padding the instance is configured for.
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getPosX

+ public function getPosX(el the) +
+ Deprecated. <static> Returns the X position of an html element +
+ Parameters: +
  • the : el
    element for which to get the position
+ Returns: +
    +
  • int
    the X coordinate @for DragDropMgr
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getPosY

+ public function getPosY(el the) +
+ Deprecated. <static> Returns the Y position of an html element +
+ Parameters: +
  • the : el
    element for which to get the position
+ Returns: +
    +
  • int
    the Y coordinate
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getRelated

+ public function getRelated(DragDrop p_oDD, boolean bTargetsOnly) +
+ <static> Returns the drag and drop instances that are in all groups the +passed in instance belongs to. +
+ Parameters: +
  • p_oDD : DragDrop
    the obj to get related data for
  • bTargetsOnly : boolean
    if true, only return targetable objs
+ Returns: +
    +
  • DragDrop[]
    the related instances
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getScrollLeft

+ public function getScrollLeft() +
+ <static> Gets the scrollLeft +
+ Parameters: +
  • None.
+ Returns: +
    +
  • int
    the document's scrollTop
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getScrollTop

+ public function getScrollTop() +
+ <static> Gets the scrollTop +
+ Parameters: +
  • None.
+ Returns: +
    +
  • int
    the document's scrollTop
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

getStyle

+ public function getStyle(HTMLElement el, string styleProp) +
+ Deprecated. <static> Returns the specified element style property +
+ Parameters: +
  • el : HTMLElement
    the element
  • styleProp : string
    the style property
+ Returns: +
    +
  • string
    The value of the style property
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

handleWasClicked

+ public function handleWasClicked(node the) +
+ <static> Recursively searches the immediate parent and all child nodes for +the handle element in order to determine wheter or not it was +clicked. +
+ Parameters: +
  • the : node
    html element to inspect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

isDragDrop

+ public function isDragDrop(String id) +
+ <static> Utility function to determine if a given element has been +registered as a drag drop item. +
+ Parameters: +
  • id : String
    the element id to check
+ Returns: +
    +
  • boolean
    true if this element is a DragDrop item, false otherwise
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

isHandle

+ public function isHandle(String id) +
+ <static> Utility function to determine if a given element has been +registered as a drag drop handle for the given Drag Drop object. +
+ Parameters: +
  • id : String
    the element id to check
+ Returns: +
    +
  • boolean
    true if this element is a DragDrop handle, false otherwise
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

isLegalTarget

+ public function isLegalTarget(DragDrop the, DragDrop the) +
+ <static> Returns true if the specified dd target is a legal target for +the specifice drag obj +
+ Parameters: +
  • the : DragDrop
    drag obj
  • the : DragDrop
    target
+ Returns: +
    +
  • boolean
    true if the target is a legal target for the dd obj
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

isLocked

+ public function isLocked() +
+ <static> Is drag and drop locked? +
+ Parameters: +
  • None.
+ Returns: +
    +
  • boolean
    True if drag and drop is locked, false otherwise.
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

isTypeOfDD

+ public function isTypeOfDD(Object the) +
+ <static> My goal is to be able to transparently determine if an object is +typeof DragDrop, and the exact subclass of DragDrop. typeof +returns "object", oDD.constructor.toString() always returns +"DragDrop" and not the name of the subclass. So for now it just +evaluates a well-known variable in DragDrop. +
+ Parameters: +
  • the : Object
    object to evaluate
+ Returns: +
    +
  • boolean
    true if typeof oDD = DragDrop
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

lock

+ public function lock() +
+ <static> Lock all drag and drop functionality +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

moveToEl

+ public function moveToEl(HTMLElement moveEl, HTMLElement targetEl) +
+ <static> Sets the x/y position of an element to the location of the +target element. +
+ Parameters: +
  • moveEl : HTMLElement
    The element to move
  • targetEl : HTMLElement
    The position reference element
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

numericSort

+ public function numericSort() +
+ <static> Numeric array sort function +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

refreshCache

+ public function refreshCache(Object groups) +
+ <static> Refreshes the cache of the top-left and bottom-right points of the +drag and drop objects in the specified group(s). This is in the +format that is stored in the drag and drop instance, so typical +usage is: + +YAHOO.util.DragDropMgr.refreshCache(ddinstance.groups); + +Alternatively: + +YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true}); + +@TODO this really should be an indexed array. Alternatively this +method could accept both. +
+ Parameters: +
  • groups : Object
    an associative array of groups to refresh
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

regDragDrop

+ public function regDragDrop(DragDrop oDD, String sGroup) +
+ <static> Each DragDrop instance must be registered with the DragDropMgr. +This is executed in DragDrop.init() +
+ Parameters: +
  • oDD : DragDrop
    the DragDrop object to register
  • sGroup : String
    the name of the group this element belongs to
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

regHandle

+ public function regHandle(String sDDId, String sHandleId) +
+ <static> Each DragDrop handle element must be registered. This is done +automatically when executing DragDrop.setHandleElId() +
+ Parameters: +
  • sDDId : String
    the DragDrop id this element is a handle for
  • sHandleId : String
    the id of the element that is the drag handle
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

startDrag

+ public function startDrag(x {int}, y {int}) +
+ <static> Fired when either the drag pixel threshol or the mousedown hold +time threshold has been met. +
+ Parameters: +
  • {int} : x
    the X position of the original mousedown
  • {int} : y
    the Y position of the original mousedown
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

stopEvent

+ public function stopEvent(Event e) +
+ <static> Utility to stop event propagation and event default, if these +features are turned on. +
+ Parameters: +
  • e : Event
    the event as returned by this.getEvent()
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

swapNode

+ public function swapNode(n1 the, n2 the) +
+ <static> Swap two nodes. In IE, we use the native method, for others we +emulate the IE behavior +
+ Parameters: +
  • the : n1
    first node to swap
  • the : n2
    other node to swap
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

unlock

+ public function unlock() +
+ <static> Unlock all drag and drop functionality +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by DragDropMgr.
+
+ +
+

verifyEl

+ public function verifyEl(HTMLElement el) +
+ <static> This checks to make sure an element exists and is in the DOM. The +main purpose is to handle cases where innerHTML is used to remove +drag and drop objects from the DOM. IE provides an 'unspecified +error' when trying to access the offsetParent of such an element +
+ Parameters: +
  • el : HTMLElement
    the element to check
+ Returns: +
    +
  • boolean
    true if the element looks usable
  • +
+
+
+
This method is defined by DragDropMgr.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Easing.html b/www/extras/yui-ext/docs/output/YAHOO.util.Easing.html new file mode 100644 index 000000000..547ee43c6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Easing.html @@ -0,0 +1,448 @@ + + + + YAHOO.util.Easing + + + + + +
+ +

Class YAHOO.util.Easing

+ + + + + +
Package:YAHOO.util
Class:Easing
Extends:Object
Defined In:animation.js
+
+ Singleton that determines how an animation proceeds from start to end.
+
+ +

Public Properties

+
This class has no public properties.
+

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 backBoth(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
Backtracks slightly, then reverses direction, overshoots end, +then reverses and comes back to end.
 backIn(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
Backtracks slightly, then reverses direction and moves to end.
 backOut(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
Overshoots end, then reverses and comes back to end.
 bounceBoth(Number t, Number b, Number c, Number d) : NumberEasing
Bounces off start and end.
 bounceIn(Number t, Number b, Number c, Number d) : NumberEasing
Bounce off of start.
 bounceOut(Number t, Number b, Number c, Number d) : NumberEasing
Bounces off end.
 easeBoth(Number t, Number b, Number c, Number d) : NumberEasing
Begins slowly and decelerates towards end. (quadratic)
 easeBothStrong(Number t, Number b, Number c, Number d) : NumberEasing
Begins slowly and decelerates towards end. (quartic)
 easeIn(Number t, Number b, Number c, Number d) : NumberEasing
Begins slowly and accelerates towards end. (quadratic)
 easeInStrong(Number t, Number b, Number c, Number d) : NumberEasing
Begins slowly and accelerates towards end. (quartic)
 easeNone(Number t, Number b, Number c, Number d) : NumberEasing
Uniform speed between points.
 easeOut(Number t, Number b, Number c, Number d) : NumberEasing
Begins quickly and decelerates towards end. (quadratic)
 easeOutStrong(Number t, Number b, Number c, Number d) : NumberEasing
Begins quickly and decelerates towards end. (quartic)
 elasticBoth(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
Snap both elastic effect.
 elasticIn(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
Snap in elastic effect.
 elasticOut(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
Snap out elastic effect.
+ +

Public Events

+
This class has no public events.
+ + +

Method Details

+
+ +
+

backBoth

+ public function backBoth(Number t, Number b, Number c, Number d, [Number s]) +
+ Backtracks slightly, then reverses direction, overshoots end, +then reverses and comes back to end. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • s : Number
    Overshoot (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

backIn

+ public function backIn(Number t, Number b, Number c, Number d, [Number s]) +
+ Backtracks slightly, then reverses direction and moves to end. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • s : Number
    Overshoot (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

backOut

+ public function backOut(Number t, Number b, Number c, Number d, [Number s]) +
+ Overshoots end, then reverses and comes back to end. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • s : Number
    Overshoot (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

bounceBoth

+ public function bounceBoth(Number t, Number b, Number c, Number d) +
+ Bounces off start and end. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

bounceIn

+ public function bounceIn(Number t, Number b, Number c, Number d) +
+ Bounce off of start. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

bounceOut

+ public function bounceOut(Number t, Number b, Number c, Number d) +
+ Bounces off end. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeBoth

+ public function easeBoth(Number t, Number b, Number c, Number d) +
+ Begins slowly and decelerates towards end. (quadratic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeBothStrong

+ public function easeBothStrong(Number t, Number b, Number c, Number d) +
+ Begins slowly and decelerates towards end. (quartic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeIn

+ public function easeIn(Number t, Number b, Number c, Number d) +
+ Begins slowly and accelerates towards end. (quadratic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeInStrong

+ public function easeInStrong(Number t, Number b, Number c, Number d) +
+ Begins slowly and accelerates towards end. (quartic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeNone

+ public function easeNone(Number t, Number b, Number c, Number d) +
+ Uniform speed between points. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeOut

+ public function easeOut(Number t, Number b, Number c, Number d) +
+ Begins quickly and decelerates towards end. (quadratic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

easeOutStrong

+ public function easeOutStrong(Number t, Number b, Number c, Number d) +
+ Begins quickly and decelerates towards end. (quartic) +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

elasticBoth

+ public function elasticBoth(Number t, Number b, Number c, Number d, [Number p]) +
+ Snap both elastic effect. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • p : Number
    Period (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

elasticIn

+ public function elasticIn(Number t, Number b, Number c, Number d, [Number p]) +
+ Snap in elastic effect. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • p : Number
    Period (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+ +
+

elasticOut

+ public function elasticOut(Number t, Number b, Number c, Number d, [Number p]) +
+ Snap out elastic effect. +
+ Parameters: +
  • t : Number
    Time value used to compute current value
  • b : Number
    Starting value
  • c : Number
    Delta between start and end values
  • d : Number
    Total length of animation
  • p : Number
    Period (optional)
+ Returns: +
    +
  • Number
    The computed value for the current animation frame
  • +
+
+
+
This method is defined by Easing.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Element.html b/www/extras/yui-ext/docs/output/YAHOO.util.Element.html new file mode 100644 index 000000000..75f36f3b9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Element.html @@ -0,0 +1,647 @@ + + + + YAHOO.util.Element + + + + + +
+ +

Class YAHOO.util.Element

+ + + + + + +
Package:YAHOO.util
Class:Element
Extends:Object
Subclasses:Tab, TabView
Defined In:tabview.js
+
+ Element provides an interface to an HTMLElement's attributes and common +methods. Other commonly used attributes are added as well. +@uses YAHOO.util.AttributeProvider
+
+ +

Public Properties

+ + + + + + + + + + + + + +
PropertyDefined By
 DOM_EVENTS : ObjectElement
Dom events supported by the Element instance.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Element(el {HTMLElement/String}, Object map)Element
 addClass(String className) : voidElement
Wrapper for Dom method.
 addListener(String type, Function fn, Any obj, Object scope) : voidElement
Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEve...
 appendChild(Boolean deep) : voidElement
Wrapper for HTMLElement method.
 appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) : voidElement
Appends the HTMLElement into either the supplied parentNode.
 fireQueue() : voidElement
Apply any queued set calls.
 getElementsByClassName(String className, [String tag]) : ArrayElement
Wrapper for Dom method.
 getElementsByTagName(String tag) : voidElement
Wrapper for HTMLElement method.
 getStyle(String property) : StringElement
Wrapper for Dom method.
 hasChildNodes() : BooleanElement
Wrapper for HTMLElement method.
 hasClass(String className) : BooleanElement
Wrapper for Dom method.
 initAttributes(Object map) : voidElement
Registers Element specific attributes.
 insertBefore(HTMLElement element, HTMLElement before) : voidElement
Wrapper for HTMLElement method.
 on(String type, Function fn, Any obj, Object scope) : voidElement
Alias for addListener
 removeChild(HTMLElement child) : voidElement
Wrapper for HTMLElement method.
 removeClass(String className) : voidElement
Wrapper for Dom method.
 removeListener(String type, Function fn) : voidElement
Remove an event listener
 replaceChild(HTMLElement newNode, HTMLElement oldNode) : voidElement
Wrapper for HTMLElement method.
 replaceClass(String oldClassName, String newClassName) : voidElement
Wrapper for Dom method.
 setStyle(String property, String value) : voidElement
Wrapper for Dom method.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 available : ()Element
Fires when the Element's HTMLElement can be retrieved by Id. +See: Element.addListener +Event fields: +<String> ty...
 contentReady : ()Element
Fires when the Element's HTMLElement subtree is rendered. +See: Element.addListener +Event fields: +<String> type ...
+ +

Property Details

+
+ +
+

DOM_EVENTS

+ public Object DOM_EVENTS +
+ Dom events supported by the Element instance.
+
This property is defined by Element.
+
+
+ + +

Constructor Details

+
+
+

Element

+ public function Element(el {HTMLElement/String}, Object map) +
+
+ Parameters: +
  • {HTMLElement/String} : el
    The html element that represents the Element.
  • map : Object
    A key-value map of initial config names and values
+
+
+
+
+ +

Method Details

+
+ +
+

addClass

+ public function addClass(String className) +
+ Wrapper for Dom method. +
+ Parameters: +
  • className : String
    The className to add
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

addListener

+ public function addListener(String type, Function fn, Any obj, Object scope) +
+ Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEvent +can be listened for. All handlers receive an event object. +
+ Parameters: +
  • type : String
    The name of the event to listen for
  • fn : Function
    The handler to call when the event fires
  • obj : Any
    A variable to pass to the handler
  • scope : Object
    The object to use for the scope of the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

appendChild

+ public function appendChild(Boolean deep) +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • deep : Boolean
    Whether or not to do a deep clone
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

appendTo

+ public function appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) +
+ Appends the HTMLElement into either the supplied parentNode. +
+ Parameters: +
  • parentNode : HTMLElement/Element
    The node to append to
  • before : HTMLElement/Element
    An optional node to insert before
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

fireQueue

+ public function fireQueue() +
+ Apply any queued set calls. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getElementsByClassName

+ public function getElementsByClassName(String className, [String tag]) +
+ Wrapper for Dom method. +
+ Parameters: +
  • className : String
    The className to collect
  • tag : String
    (optional) The tag to use in conjunction with class name
+ Returns: +
    +
  • Array
    Array of HTMLElements
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getElementsByTagName

+ public function getElementsByTagName(String tag) +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • tag : String
    The tagName to collect
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

getStyle

+ public function getStyle(String property) +
+ Wrapper for Dom method. +
+ Parameters: +
  • property : String
    The style property to retrieve
+ Returns: +
    +
  • String
    The current value of the property
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hasChildNodes

+ public function hasChildNodes() +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    Whether or not the element has childNodes
  • +
+
+
+
This method is defined by Element.
+
+ +
+

hasClass

+ public function hasClass(String className) +
+ Wrapper for Dom method. +
+ Parameters: +
  • className : String
    The className to add
+ Returns: +
    +
  • Boolean
    Whether or not the element has the class name
  • +
+
+
+
This method is defined by Element.
+
+ +
+

initAttributes

+ public function initAttributes(Object map) +
+ Registers Element specific attributes. +
+ Parameters: +
  • map : Object
    A key-value map of initial attribute configs
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

insertBefore

+ public function insertBefore(HTMLElement element, HTMLElement before) +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • element : HTMLElement
    The HTMLElement to insert
  • before : HTMLElement
    The HTMLElement to insert the element before.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

on

+ public function on(String type, Function fn, Any obj, Object scope) +
+ Alias for addListener +
+ Parameters: +
  • type : String
    The name of the event to listen for
  • fn : Function
    The function call when the event fires
  • obj : Any
    A variable to pass to the handler
  • scope : Object
    The object to use for the scope of the handler
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeChild

+ public function removeChild(HTMLElement child) +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • child : HTMLElement
    The HTMLElement to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeClass

+ public function removeClass(String className) +
+ Wrapper for Dom method. +
+ Parameters: +
  • className : String
    The className to remove
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

removeListener

+ public function removeListener(String type, Function fn) +
+ Remove an event listener +
+ Parameters: +
  • type : String
    The name of the event to listen for
  • fn : Function
    The function call when the event fires
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replaceChild

+ public function replaceChild(HTMLElement newNode, HTMLElement oldNode) +
+ Wrapper for HTMLElement method. +
+ Parameters: +
  • newNode : HTMLElement
    The HTMLElement to insert
  • oldNode : HTMLElement
    The HTMLElement to replace
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

replaceClass

+ public function replaceClass(String oldClassName, String newClassName) +
+ Wrapper for Dom method. +
+ Parameters: +
  • oldClassName : String
    The className to replace
  • newClassName : String
    The className to add
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+ +
+

setStyle

+ public function setStyle(String property, String value) +
+ Wrapper for Dom method. +
+ Parameters: +
  • property : String
    The style property to set
  • value : String
    The value to apply to the style property
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Element.
+
+
+ +

Event Details

+
+ +
+

available

+ public event available +
+ Fires when the Element's HTMLElement can be retrieved by Id. +

See: Element.addListener

+

Event fields:
+<String> type available
+<HTMLElement> +target the HTMLElement bound to this Element instance
+

Usage:
+var handler = function(e) {var target = e.target};
+myTabs.addListener('available', handler);

+
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Element.
+
+ +
+

contentReady

+ public event contentReady +
+ Fires when the Element's HTMLElement subtree is rendered. +

See: Element.addListener

+

Event fields:
+<String> type contentReady
+<HTMLElement> +target the HTMLElement bound to this Element instance
+

Usage:
+var handler = function(e) {var target = e.target};
+myTabs.addListener('contentReady', handler);

+
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Element.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Event.html b/www/extras/yui-ext/docs/output/YAHOO.util.Event.html new file mode 100644 index 000000000..b49f75297 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Event.html @@ -0,0 +1,858 @@ + + + + YAHOO.util.Event + + + + + +
+ +

Class YAHOO.util.Event

+ + + + + +
Package:YAHOO.util
Class:Event
Extends:Object
Defined In:event.js
+
+ The event utility provides functions to add and remove event listeners, +event cleansing. It also tries to automatically remove listeners it +registers during the unload event.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 ADJ_SCOPE : intEvent
<static> Adjusted scope, either the element we are registering the event +on or the custom object passed in by t...
 EL : intEvent
<static> Element to bind, int constant
 FN : intEvent
<static> Function to execute, int constant
 OBJ : intEvent
<static> Object passed in by the user that will be returned as a +parameter to the callback, int constant
 POLL_INTERVAL : intEvent
<static> The poll interval in milliseconds
 POLL_RETRYS : intEvent
<static> The number of times we should look for elements that are not +in the DOM at the time the event is reque...
 TYPE : intEvent
<static> Type of event, int constant
 WFN : intEvent
<static> Function wrapped for scope correction and cleanup, int constant
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addListener(Object el, String sType, Function fn, Object obj, boolean override) : booleanEvent
<static> Appends an event handler
 createEvent(p_type {string}, p_config {object}) : CustomEventEvent
Creates a new custom event of the specified type. If a custom event +by that name already exists, it will not be re-c...
 fireEvent(p_type {string}, arguments {Object*}) : booleanEvent
Fire a custom event by name. The callback functions will be executed +from the scope specified when the event was cre...
 generateId(el the) : stringEvent
<static> Generates an unique ID for the element if it does not already +have one.
 getCharCode(Event ev) : intEvent
<static> Returns the charcode for an event
 getEvent(Event e) : EventEvent
<static> Finds the event in the window object, the caller's arguments, or +in the arguments of another method in...
 getListeners(el {HTMLElement}, sType {string}) : ObjectEvent
<static> Returns all listeners attached to the given element via addListener. +Optionally, you can specify a spe...
 getPageX(Event ev) : intEvent
<static> Returns the event's pageX
 getPageY(Event ev) : intEvent
<static> Returns the event's pageY
 getRelatedTarget(Event ev) : HTMLElementEvent
<static> Returns the event's related target
 getTarget(Event ev, boolean resolveTextNode) : HTMLElementEvent
Deprecated. <static> Returns the event's target element
 getTime(Event ev) : DateEvent
<static> Returns the time of the event. If the time is not included, the +event is modified using the current t...
 getXY() : voidEvent
<static> Returns the pageX and pageY properties as an indexed array.
 hasEvent(type {string}) : voidEvent
Returns true if the custom event of the provided type has been created +with createEvent.
 on() : voidEvent
<static> YAHOO.util.Event.on is an alias for addListener
 onAvailable(string p_id, function p_fn, object p_obj, boolean p_override) : voidEvent
<static> Executes the supplied callback when the item with the supplied +id is found. This is meant to be used ...
 onContentReady(string p_id, function p_fn, object p_obj, boolean p_override) : voidEvent
<static> Works the same way as onAvailable, but additionally checks the +state of sibling elements to determine ...
 preventDefault(Event ev) : voidEvent
<static> Prevents the default behavior of the event
 purgeElement(HTMLElement el, boolean recurse, string sType) : voidEvent
<static> Removes all listeners attached to the given element via addListener. +Optionally, the node's children c...
 removeListener(Object el, String sType, Function fn) : booleanEvent
<static> Removes an event handler
 resolveTextNode(HTMLElement node) : HTMLElementEvent
<static> In some cases, some browsers will return a text node inside +the actual element that was targeted. Thi...
 stopEvent(Event ev) : voidEvent
<static> Convenience method for stopPropagation + preventDefault
 stopPropagation(Event ev) : voidEvent
<static> Stops event propagation
 subscribe(p_type {string}, p_fn {function}, p_obj , p_obj {Object}, p_override {boolean}) : voidEvent
Subscribe to a CustomEvent by event type
 unsubscribe(p_type {string}, p_fn {Function}, [p_obj {Object}]) : booleanEvent
Unsubscribes the from the specified event
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

ADJ_SCOPE

+ public int ADJ_SCOPE +
+ <static> Adjusted scope, either the element we are registering the event +on or the custom object passed in by the listener, int constant
+
This property is defined by Event.
+
+ +
+

EL

+ public int EL +
+ <static> Element to bind, int constant
+
This property is defined by Event.
+
+ +
+

FN

+ public int FN +
+ <static> Function to execute, int constant
+
This property is defined by Event.
+
+ +
+

OBJ

+ public int OBJ +
+ <static> Object passed in by the user that will be returned as a +parameter to the callback, int constant
+
This property is defined by Event.
+
+ +
+

POLL_INTERVAL

+ public int POLL_INTERVAL +
+ <static> The poll interval in milliseconds
+
This property is defined by Event.
+
+ +
+

POLL_RETRYS

+ public int POLL_RETRYS +
+ <static> The number of times we should look for elements that are not +in the DOM at the time the event is requested after the document +has been loaded. The default is 200@amp;50 ms, so it will poll +for 10 seconds or until all outstanding handlers are bound +(whichever comes first).
+
This property is defined by Event.
+
+ +
+

TYPE

+ public int TYPE +
+ <static> Type of event, int constant
+
This property is defined by Event.
+
+ +
+

WFN

+ public int WFN +
+ <static> Function wrapped for scope correction and cleanup, int constant
+
This property is defined by Event.
+
+
+ + +

Method Details

+
+ +
+

addListener

+ public function addListener(Object el, String sType, Function fn, Object obj, boolean override) +
+ <static> Appends an event handler +
+ Parameters: +
  • el : Object
    The html element to assign the event to
  • sType : String
    The type of event to append
  • fn : Function
    The method the event invokes
  • obj : Object
    An arbitrary object that will be passed as a parameter to the handler
  • override : boolean
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • boolean
    True if the action was successful or defered, false if one or more of the elements could not have the event bound to it.
  • +
+
+
+
This method is defined by Event.
+
+ +
+

createEvent

+ public function createEvent(p_type {string}, p_config {object}) +
+ Creates a new custom event of the specified type. If a custom event +by that name already exists, it will not be re-created. In either +case the custom event is returned. +
+ Parameters: +
  • {string} : p_type
    the type, or name of the event
  • {object} : p_config
    optional config params. Valid properties are:
    • scope: defines the default execution scope. If not defined the default scope will be this instance.
    • silent: if true, the custom event will not generate log messages. This is false by default.
    • onSubscribeCallback: specifies a callback to execute when the event has a new subscriber. This will fire immediately for each queued subscriber if any exist prior to the creation of the event.
+ Returns: +
    +
  • CustomEvent
    the custom event
  • +
+
+
+
This method is defined by Event.
+
+ +
+

fireEvent

+ public function fireEvent(p_type {string}, arguments {Object*}) +
+ Fire a custom event by name. The callback functions will be executed +from the scope specified when the event was created, and with the +following parameters: +
    +
  • The first argument fire() was executed with
  • +
  • The custom object (if any) that was passed into the subscribe() +method
  • +
+
+ Parameters: +
  • {string} : p_type
    the type, or name of the event
  • {Object*} : arguments
    an arbitrary set of parameters to pass to the handler.
+ Returns: +
    +
  • boolean
    the return value from CustomEvent.fire, or null if the custom event does not exist.
  • +
+
+
+
This method is defined by Event.
+
+ +
+

generateId

+ public function generateId(el the) +
+ <static> Generates an unique ID for the element if it does not already +have one. +
+ Parameters: +
  • the : el
    element to create the id for
+ Returns: +
    +
  • string
    the resulting id of the element
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getCharCode

+ public function getCharCode(Event ev) +
+ <static> Returns the charcode for an event +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • int
    the event's charCode
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getEvent

+ public function getEvent(Event e) +
+ <static> Finds the event in the window object, the caller's arguments, or +in the arguments of another method in the callstack. This is +executed automatically for events registered through the event +manager, so the implementer should not normally need to execute +this function at all. +
+ Parameters: +
  • e : Event
    the event parameter from the handler
+ Returns: +
    +
  • Event
    the event
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getListeners

+ public function getListeners(el {HTMLElement}, sType {string}) +
+ <static> Returns all listeners attached to the given element via addListener. +Optionally, you can specify a specific type of event to return. +
+ Parameters: +
  • {HTMLElement} : el
    the element to inspect
  • {string} : sType
    optional type of listener to return. If left out, all listeners will be returned
+ Returns: +
    +
  • Object
    the listener. Contains the following fields:   type: (string) the type of event   fn: (function) the callback supplied to addListener   obj: (object) the custom object supplied to addListener   adjust: (boolean) whether or not to adjust the default scope   index: (int) its position in the Event util listener cache
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getPageX

+ public function getPageX(Event ev) +
+ <static> Returns the event's pageX +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • int
    the event's pageX
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getPageY

+ public function getPageY(Event ev) +
+ <static> Returns the event's pageY +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • int
    the event's pageY
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getRelatedTarget

+ public function getRelatedTarget(Event ev) +
+ <static> Returns the event's related target +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • HTMLElement
    the event's relatedTarget
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getTarget

+ public function getTarget(Event ev, boolean resolveTextNode) +
+ Deprecated. <static> Returns the event's target element +
+ Parameters: +
  • ev : Event
    the event
  • resolveTextNode : boolean
    when set to true the target's parent will be returned if the target is a text node.
+ Returns: +
    +
  • HTMLElement
    the event's target
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getTime

+ public function getTime(Event ev) +
+ <static> Returns the time of the event. If the time is not included, the +event is modified using the current time. +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • Date
    the time of the event
  • +
+
+
+
This method is defined by Event.
+
+ +
+

getXY

+ public function getXY() +
+ <static> Returns the pageX and pageY properties as an indexed array. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

hasEvent

+ public function hasEvent(type {string}) +
+ Returns true if the custom event of the provided type has been created +with createEvent. +
+ Parameters: +
  • {string} : type
    the type, or name of the event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

on

+ public function on() +
+ <static> YAHOO.util.Event.on is an alias for addListener +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

onAvailable

+ public function onAvailable(string p_id, function p_fn, object p_obj, boolean p_override) +
+ <static> Executes the supplied callback when the item with the supplied +id is found. This is meant to be used to execute behavior as +soon as possible as the page loads. If you use this after the +initial page load it will poll for a fixed time for the element. +The number of times it will poll and the frequency are +configurable. By default it will poll for 10 seconds. +
+ Parameters: +
  • p_id : string
    the id of the element to look for.
  • p_fn : function
    what to execute when the element is found.
  • p_obj : object
    an optional object to be passed back as a parameter to p_fn.
  • p_override : boolean
    If set to true, p_fn will execute in the scope of p_obj
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

onContentReady

+ public function onContentReady(string p_id, function p_fn, object p_obj, boolean p_override) +
+ <static> Works the same way as onAvailable, but additionally checks the +state of sibling elements to determine if the content of the +available element is safe to modify. +
+ Parameters: +
  • p_id : string
    the id of the element to look for.
  • p_fn : function
    what to execute when the element is ready.
  • p_obj : object
    an optional object to be passed back as a parameter to p_fn.
  • p_override : boolean
    If set to true, p_fn will execute in the scope of p_obj
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

preventDefault

+ public function preventDefault(Event ev) +
+ <static> Prevents the default behavior of the event +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

purgeElement

+ public function purgeElement(HTMLElement el, boolean recurse, string sType) +
+ <static> Removes all listeners attached to the given element via addListener. +Optionally, the node's children can also be purged. +Optionally, you can specify a specific type of event to remove. +
+ Parameters: +
  • el : HTMLElement
    the element to purge
  • recurse : boolean
    recursively purge this element's children as well. Use with caution.
  • sType : string
    optional type of listener to purge. If left out, all listeners will be removed
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

removeListener

+ public function removeListener(Object el, String sType, Function fn) +
+ <static> Removes an event handler +
+ Parameters: +
  • el : Object
    the html element or the id of the element to assign the event to.
  • sType : String
    the type of event to remove.
  • fn : Function
    the method the event invokes. If fn is undefined, then all event handlers for the type of event are removed.
+ Returns: +
    +
  • boolean
    true if the unbind was successful, false otherwise.
  • +
+
+
+
This method is defined by Event.
+
+ +
+

resolveTextNode

+ public function resolveTextNode(HTMLElement node) +
+ <static> In some cases, some browsers will return a text node inside +the actual element that was targeted. This normalizes the +return value for getTarget and getRelatedTarget. +
+ Parameters: +
  • node : HTMLElement
    node to resolve
+ Returns: +
    +
  • HTMLElement
    the normized node
  • +
+
+
+
This method is defined by Event.
+
+ +
+

stopEvent

+ public function stopEvent(Event ev) +
+ <static> Convenience method for stopPropagation + preventDefault +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

stopPropagation

+ public function stopPropagation(Event ev) +
+ <static> Stops event propagation +
+ Parameters: +
  • ev : Event
    the event
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

subscribe

+ public function subscribe(p_type {string}, p_fn {function}, p_obj , p_obj {Object}, p_override {boolean}) +
+ Subscribe to a CustomEvent by event type +
+ Parameters: +
  • {string} : p_type
    the type, or name of the event
  • {function} : p_fn
    the function to exectute when the event fires
  • : p_obj
  • {Object} : p_obj
    An object to be passed along when the event fires
  • {boolean} : p_override
    If true, the obj passed in becomes the execution scope of the listener
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Event.
+
+ +
+

unsubscribe

+ public function unsubscribe(p_type {string}, p_fn {Function}, [p_obj {Object}]) +
+ Unsubscribes the from the specified event +
+ Parameters: +
  • {string} : p_type
    The type, or name of the event
  • {Function} : p_fn
    The function to execute
  • {Object} : p_obj
    The custom object passed to subscribe (optional)
+ Returns: +
    +
  • boolean
    true if the subscriber was found and detached.
  • +
+
+
+
This method is defined by Event.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.KeyListener.html b/www/extras/yui-ext/docs/output/YAHOO.util.KeyListener.html new file mode 100644 index 000000000..e6ec6b88f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.KeyListener.html @@ -0,0 +1,251 @@ + + + + YAHOO.util.KeyListener + + + + + +
+ +

Class YAHOO.util.KeyListener

+ + + + + +
Package:YAHOO.util
Class:KeyListener
Extends:Object
Defined In:container_core.js
+
+ KeyListener is a utility that provides an easy interface for listening for keydown/keyup events fired against DOM elements.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 KEYDOWN<static> : StringKeyListener
<static> Constant representing the DOM "keydown" event.
 KEYUP<static> : StringKeyListener
<static> Constant representing the DOM "keyup" event.
 enabled : BooleanKeyListener
Boolean indicating the enabled/disabled state of the Tooltip
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 KeyListener(HTMLElement attachTo, String attachTo, Object keyData, Function handler, Object handler, String event)KeyListener
 disable() : voidKeyListener
Disables the KeyListener by removing the DOM event listeners from the target DOM element
 enable() : voidKeyListener
Enables the KeyListener by attaching the DOM event listeners to the target DOM element
 toString() : StringKeyListener
Returns a String representation of the object.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 disabledEvent : (Object keyData)KeyListener
The CustomEvent fired when the KeyListener is disabled via the disable() function
 enabledEvent : (Object keyData)KeyListener
The CustomEvent fired when the KeyListener is enabled via the enable() function
+ +

Property Details

+
+ +
+

KEYDOWN<static>

+ public String KEYDOWN<static> +
+ <static> Constant representing the DOM "keydown" event.
+
This property is defined by KeyListener.
+
+ +
+

KEYUP<static>

+ public String KEYUP<static> +
+ <static> Constant representing the DOM "keyup" event.
+
This property is defined by KeyListener.
+
+ +
+

enabled

+ public Boolean enabled +
+ Boolean indicating the enabled/disabled state of the Tooltip
+
This property is defined by KeyListener.
+
+
+ + +

Constructor Details

+
+
+

KeyListener

+ public function KeyListener(HTMLElement attachTo, String attachTo, Object keyData, Function handler, Object handler, String event) +
+
+ Parameters: +
  • attachTo : HTMLElement
    The element or element ID to which the key event should be attached
  • attachTo : String
    The element or element ID to which the key event should be attached
  • keyData : Object
    The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
  • handler : Function
    The CustomEvent handler to fire when the key event is detected
  • handler : Object
    An object literal representing the handler.
  • event : String
    Optional. The event (keydown or keyup) to listen for. Defaults automatically to keydown.
+
+
+
+
+ +

Method Details

+
+ +
+

disable

+ public function disable() +
+ Disables the KeyListener by removing the DOM event listeners from the target DOM element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by KeyListener.
+
+ +
+

enable

+ public function enable() +
+ Enables the KeyListener by attaching the DOM event listeners to the target DOM element +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by KeyListener.
+
+ +
+

toString

+ public function toString() +
+ Returns a String representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The string representation of the KeyListener
  • +
+
+
+
This method is defined by KeyListener.
+
+
+ +

Event Details

+
+ +
+

disabledEvent

+ public event disabledEvent +
+ The CustomEvent fired when the KeyListener is disabled via the disable() function +
+ Subscribers will be called with the following parameters: +
  • keyData : Object
    The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
+
+
+
This event is defined by KeyListener.
+
+ +
+

enabledEvent

+ public event enabledEvent +
+ The CustomEvent fired when the KeyListener is enabled via the enable() function +
+ Subscribers will be called with the following parameters: +
  • keyData : Object
    The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
+
+
+
This event is defined by KeyListener.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Motion.html b/www/extras/yui-ext/docs/output/YAHOO.util.Motion.html new file mode 100644 index 000000000..0838c8094 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Motion.html @@ -0,0 +1,542 @@ + + + + YAHOO.util.Motion + + + + + +
+ +

Class YAHOO.util.Motion

+ + + + + +
Package:YAHOO.util
Class:Motion
Extends:Anim
Defined In:animation.js
+
+ Anim subclass for moving elements along a path defined by the "points" +member of "attributes". All "points" are arrays with x, y coordinates. +

Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectAnim
The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to ani...
 currentFrame : IntAnim
The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure th...
 duration : NumberAnim
The length of the animation. Defaults to "1" (second).
 method : FunctionAnim
The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
 totalFrames : IntAnim
The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation ...
 useSeconds : BooleanAnim
Whether or not the duration should be treated as seconds. +Defaults to true.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Motion(String/HTMLElement el, Object attributes, Number duration, Function method)Motion
 animate() : voidAnim
Starts the animation by registering it with the animation manager.
 doMethod(String attr, Number start, Number end) : NumberAnim
Returns the value computed by the animation's "method".
 getAttribute(String attr) : NumberAnim
Returns current value of the attribute.
 getDefaultUnit(attr attr) : StringAnim
Returns the unit to use when none is supplied.
 getEl() : HTMLElementAnim
Returns a reference to the animated element.
 getStartTime() : DateAnim
Returns the animation start time.
 init(String/HTMLElement el, Object attributes, Number duration, Function method) : voidAnim
Constructor for Anim instance.
 isAnimated() : BooleanAnim
Checks whether the element is currently animated.
 setAttribute(String attr, Number val, String unit) : voidAnim
Applies a value to an attribute.
 stop([Boolean finish]) : voidAnim
Stops the animation. Normally called by AnimMgr when animation completes.
 toString() : StringAnim
Provides a readable name for the Anim instance.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 onComplete : ()Anim
Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
 onStart : ()Anim
Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
 onTween : ()Anim
Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
+ +

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to animate. +If "to" is supplied, the animation will end with the attribute at that value. +If "by" is supplied, the animation will end at that value plus its starting value. +If both are supplied, "to" is used, and "by" is ignored. +Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
+
This property is defined by Anim.
+
+ +
+

currentFrame

+ public Int currentFrame +
+ The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

duration

+ public Number duration +
+ The length of the animation. Defaults to "1" (second).
+
This property is defined by Anim.
+
+ +
+

method

+ public Function method +
+ The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
+
This property is defined by Anim.
+
+ +
+

totalFrames

+ public Int totalFrames +
+ The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

useSeconds

+ public Boolean useSeconds +
+ Whether or not the duration should be treated as seconds. +Defaults to true.
+
This property is defined by Anim.
+
+
+ + +

Constructor Details

+
+
+

Motion

+ public function Motion(String/HTMLElement el, Object attributes, Number duration, Function method) +
+
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+
+
+
+
+ +

Method Details

+
+ +
+

animate

+ public function animate() +
+ Starts the animation by registering it with the animation manager. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

doMethod

+ public function doMethod(String attr, Number start, Number end) +
+ Returns the value computed by the animation's "method". +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • start : Number
    The value this attribute should start from for this animation.
  • end : Number
    The value this attribute should end at for this animation.
+ Returns: +
    +
  • Number
    The Value to be applied to the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getAttribute

+ public function getAttribute(String attr) +
+ Returns current value of the attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
+ Returns: +
    +
  • Number
    val The current value of the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getDefaultUnit

+ public function getDefaultUnit(attr attr) +
+ Returns the unit to use when none is supplied. +
+ Parameters: +
  • attr : attr
    The name of the attribute.
+ Returns: +
    +
  • String
    The default unit to be used.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the animated element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getStartTime

+ public function getStartTime() +
+ Returns the animation start time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    current value of startTime.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

init

+ public function init(String/HTMLElement el, Object attributes, Number duration, Function method) +
+ Constructor for Anim instance. +
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

isAnimated

+ public function isAnimated() +
+ Checks whether the element is currently animated. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    current value of isAnimated.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

setAttribute

+ public function setAttribute(String attr, Number val, String unit) +
+ Applies a value to an attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • val : Number
    The value to be applied to the attribute.
  • unit : String
    The unit ('px', '%', etc.) of the value.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

stop

+ public function stop([Boolean finish]) +
+ Stops the animation. Normally called by AnimMgr when animation completes. +
+ Parameters: +
  • finish : Boolean
    (optional) If true, animation will jump to final frame.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

toString

+ public function toString() +
+ Provides a readable name for the Anim instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Anim.
+
+
+ +

Event Details

+
+ +
+

onComplete

+ public event onComplete +
+ Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onStart

+ public event onStart +
+ Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onTween

+ public event onTween +
+ Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Point.html b/www/extras/yui-ext/docs/output/YAHOO.util.Point.html new file mode 100644 index 000000000..7089dfba2 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Point.html @@ -0,0 +1,342 @@ + + + + YAHOO.util.Point + + + + + +
+ +

Class YAHOO.util.Point

+ + + + + +
Package:YAHOO.util
Class:Point
Extends:Region
Defined In:dom.js
+
+ A point is a region that is special in that it represents a single point on +the grid.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 1 : IntRegion
The region's top extent as index, for symmetry with set/getXY
 bottom : IntRegion
The region's bottom extent
 left : IntRegion
The region's left extent
 right : intRegion
The region's right extent
 top : IntRegion
The region's top extent
 x : IntPoint
The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry)
 y : IntPoint
The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry)
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Point()Point
 contains(Region region) : BooleanRegion
Returns true if this region contains the region passed in
 getArea() : IntRegion
Returns the area of the region
 getRegion(HTMLElement el) : RegionRegion
<static> Returns a region that is occupied by the DOM element
 intersect(Region region) : RegionRegion
Returns the region where the passed in region overlaps with this one
 toString() : stringRegion
toString
 union(Region region) : RegionRegion
Returns the region representing the smallest region that can contain both +the passed in region and this region.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

1

+ public Int 1 +
+ The region's top extent as index, for symmetry with set/getXY
+
This property is defined by Region.
+
+ +
+

bottom

+ public Int bottom +
+ The region's bottom extent
+
This property is defined by Region.
+
+ +
+

left

+ public Int left +
+ The region's left extent
+
This property is defined by Region.
+
+ +
+

right

+ public int right +
+ The region's right extent
+
This property is defined by Region.
+
+ +
+

top

+ public Int top +
+ The region's top extent
+
This property is defined by Region.
+
+ +
+

x

+ public Int x +
+ The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry)
+
This property is defined by Point.
+
+ +
+

y

+ public Int y +
+ The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry)
+
This property is defined by Point.
+
+
+ + +

Constructor Details

+
+
+

Point

+ public function Point() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

contains

+ public function contains(Region region) +
+ Returns true if this region contains the region passed in +
+ Parameters: +
  • region : Region
    The region to evaluate
+ Returns: +
    +
  • Boolean
    True if the region is contained with this region, else false
  • +
+
+
+
This method is defined by Region.
+
+ +
+

getArea

+ public function getArea() +
+ Returns the area of the region +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    the region's area
  • +
+
+
+
This method is defined by Region.
+
+ +
+

getRegion

+ public function getRegion(HTMLElement el) +
+ <static> Returns a region that is occupied by the DOM element +
+ Parameters: +
  • el : HTMLElement
    The element
+ Returns: +
    +
  • Region
    The region that the element occupies
  • +
+
+
+
This method is defined by Region.
+
+ +
+

intersect

+ public function intersect(Region region) +
+ Returns the region where the passed in region overlaps with this one +
+ Parameters: +
  • region : Region
    The region that intersects
+ Returns: +
    +
  • Region
    The overlap region, or null if there is no overlap
  • +
+
+
+
This method is defined by Region.
+
+ +
+

toString

+ public function toString() +
+ toString +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    the region properties
  • +
+
+
+
This method is defined by Region.
+
+ +
+

union

+ public function union(Region region) +
+ Returns the region representing the smallest region that can contain both +the passed in region and this region. +
+ Parameters: +
  • region : Region
    The region that to create the union with
+ Returns: +
    +
  • Region
    The union region
  • +
+
+
+
This method is defined by Region.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Region.html b/www/extras/yui-ext/docs/output/YAHOO.util.Region.html new file mode 100644 index 000000000..16e88f22f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Region.html @@ -0,0 +1,312 @@ + + + + YAHOO.util.Region + + + + + +
+ +

Class YAHOO.util.Region

+ + + + + + +
Package:YAHOO.util
Class:Region
Extends:Object
Subclasses:Point
Defined In:dom.js
+
+ A region is a representation of an object on a grid. It is defined +by the top, right, bottom, left extents, so is rectangular by default. If +other shapes are required, this class could be extended to support it.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 bottom : IntRegion
The region's bottom extent
 left : IntRegion
The region's left extent
 right : intRegion
The region's right extent
 1 : IntRegion
The region's top extent as index, for symmetry with set/getXY
 top : IntRegion
The region's top extent
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Region()Region
 contains(Region region) : BooleanRegion
Returns true if this region contains the region passed in
 getArea() : IntRegion
Returns the area of the region
 getRegion(HTMLElement el) : RegionRegion
<static> Returns a region that is occupied by the DOM element
 intersect(Region region) : RegionRegion
Returns the region where the passed in region overlaps with this one
 toString() : stringRegion
toString
 union(Region region) : RegionRegion
Returns the region representing the smallest region that can contain both +the passed in region and this region.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

bottom

+ public Int bottom +
+ The region's bottom extent
+
This property is defined by Region.
+
+ +
+

left

+ public Int left +
+ The region's left extent
+
This property is defined by Region.
+
+ +
+

right

+ public int right +
+ The region's right extent
+
This property is defined by Region.
+
+ +
+

1

+ public Int 1 +
+ The region's top extent as index, for symmetry with set/getXY
+
This property is defined by Region.
+
+ +
+

top

+ public Int top +
+ The region's top extent
+
This property is defined by Region.
+
+
+ + +

Constructor Details

+
+
+

Region

+ public function Region() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

contains

+ public function contains(Region region) +
+ Returns true if this region contains the region passed in +
+ Parameters: +
  • region : Region
    The region to evaluate
+ Returns: +
    +
  • Boolean
    True if the region is contained with this region, else false
  • +
+
+
+
This method is defined by Region.
+
+ +
+

getArea

+ public function getArea() +
+ Returns the area of the region +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Int
    the region's area
  • +
+
+
+
This method is defined by Region.
+
+ +
+

getRegion

+ public function getRegion(HTMLElement el) +
+ <static> Returns a region that is occupied by the DOM element +
+ Parameters: +
  • el : HTMLElement
    The element
+ Returns: +
    +
  • Region
    The region that the element occupies
  • +
+
+
+
This method is defined by Region.
+
+ +
+

intersect

+ public function intersect(Region region) +
+ Returns the region where the passed in region overlaps with this one +
+ Parameters: +
  • region : Region
    The region that intersects
+ Returns: +
    +
  • Region
    The overlap region, or null if there is no overlap
  • +
+
+
+
This method is defined by Region.
+
+ +
+

toString

+ public function toString() +
+ toString +
+ Parameters: +
  • None.
+ Returns: +
    +
  • string
    the region properties
  • +
+
+
+
This method is defined by Region.
+
+ +
+

union

+ public function union(Region region) +
+ Returns the region representing the smallest region that can contain both +the passed in region and this region. +
+ Parameters: +
  • region : Region
    The region that to create the union with
+ Returns: +
    +
  • Region
    The union region
  • +
+
+
+
This method is defined by Region.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Scroll.html b/www/extras/yui-ext/docs/output/YAHOO.util.Scroll.html new file mode 100644 index 000000000..2f6818603 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Scroll.html @@ -0,0 +1,542 @@ + + + + YAHOO.util.Scroll + + + + + +
+ +

Class YAHOO.util.Scroll

+ + + + + +
Package:YAHOO.util
Class:Scroll
Extends:Anim
Defined In:animation.js
+
+ Anim subclass for scrolling elements to a position defined by the "scroll" +member of "attributes". All "scroll" members are arrays with x, y scroll positions. +

Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 attributes : ObjectAnim
The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to ani...
 currentFrame : IntAnim
The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure th...
 duration : NumberAnim
The length of the animation. Defaults to "1" (second).
 method : FunctionAnim
The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
 totalFrames : IntAnim
The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation ...
 useSeconds : BooleanAnim
Whether or not the duration should be treated as seconds. +Defaults to true.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Scroll(String or, Object attributes, Number duration, Function method)Scroll
 animate() : voidAnim
Starts the animation by registering it with the animation manager.
 doMethod(String attr, Number start, Number end) : NumberAnim
Returns the value computed by the animation's "method".
 getAttribute(String attr) : NumberAnim
Returns current value of the attribute.
 getDefaultUnit(attr attr) : StringAnim
Returns the unit to use when none is supplied.
 getEl() : HTMLElementAnim
Returns a reference to the animated element.
 getStartTime() : DateAnim
Returns the animation start time.
 init(String/HTMLElement el, Object attributes, Number duration, Function method) : voidAnim
Constructor for Anim instance.
 isAnimated() : BooleanAnim
Checks whether the element is currently animated.
 setAttribute(String attr, Number val, String unit) : voidAnim
Applies a value to an attribute.
 stop([Boolean finish]) : voidAnim
Stops the animation. Normally called by AnimMgr when animation completes.
 toString() : StringAnim
Provides a readable name for the Anim instance.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 onComplete : ()Anim
Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
 onStart : ()Anim
Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
 onTween : ()Anim
Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
+ +

Property Details

+
+ +
+

attributes

+ public Object attributes +
+ The collection of attributes to be animated. +Each attribute must have at least a "to" or "by" defined in order to animate. +If "to" is supplied, the animation will end with the attribute at that value. +If "by" is supplied, the animation will end at that value plus its starting value. +If both are supplied, "to" is used, and "by" is ignored. +Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
+
This property is defined by Anim.
+
+ +
+

currentFrame

+ public Int currentFrame +
+ The location of the current animation on the timeline. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

duration

+ public Number duration +
+ The length of the animation. Defaults to "1" (second).
+
This property is defined by Anim.
+
+ +
+

method

+ public Function method +
+ The method that will provide values to the attribute(s) during the animation. +Defaults to "YAHOO.util.Easing.easeNone".
+
This property is defined by Anim.
+
+ +
+

totalFrames

+ public Int totalFrames +
+ The total number of frames to be executed. +In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
+
This property is defined by Anim.
+
+ +
+

useSeconds

+ public Boolean useSeconds +
+ Whether or not the duration should be treated as seconds. +Defaults to true.
+
This property is defined by Anim.
+
+
+ + +

Constructor Details

+
+
+

Scroll

+ public function Scroll(String or, Object attributes, Number duration, Function method) +
+
+ Parameters: +
  • or : String
    HTMLElement} el Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+
+
+
+
+ +

Method Details

+
+ +
+

animate

+ public function animate() +
+ Starts the animation by registering it with the animation manager. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

doMethod

+ public function doMethod(String attr, Number start, Number end) +
+ Returns the value computed by the animation's "method". +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • start : Number
    The value this attribute should start from for this animation.
  • end : Number
    The value this attribute should end at for this animation.
+ Returns: +
    +
  • Number
    The Value to be applied to the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getAttribute

+ public function getAttribute(String attr) +
+ Returns current value of the attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
+ Returns: +
    +
  • Number
    val The current value of the attribute.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getDefaultUnit

+ public function getDefaultUnit(attr attr) +
+ Returns the unit to use when none is supplied. +
+ Parameters: +
  • attr : attr
    The name of the attribute.
+ Returns: +
    +
  • String
    The default unit to be used.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getEl

+ public function getEl() +
+ Returns a reference to the animated element. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

getStartTime

+ public function getStartTime() +
+ Returns the animation start time. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date
    current value of startTime.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

init

+ public function init(String/HTMLElement el, Object attributes, Number duration, Function method) +
+ Constructor for Anim instance. +
+ Parameters: +
  • el : String/HTMLElement
    Reference to the element that will be animated
  • attributes : Object
    The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
  • duration : Number
    (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
  • method : Function
    (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

isAnimated

+ public function isAnimated() +
+ Checks whether the element is currently animated. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    current value of isAnimated.
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

setAttribute

+ public function setAttribute(String attr, Number val, String unit) +
+ Applies a value to an attribute. +
+ Parameters: +
  • attr : String
    The name of the attribute.
  • val : Number
    The value to be applied to the attribute.
  • unit : String
    The unit ('px', '%', etc.) of the value.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

stop

+ public function stop([Boolean finish]) +
+ Stops the animation. Normally called by AnimMgr when animation completes. +
+ Parameters: +
  • finish : Boolean
    (optional) If true, animation will jump to final frame.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Anim.
+
+ +
+

toString

+ public function toString() +
+ Provides a readable name for the Anim instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
  • +
+
+
+
This method is defined by Anim.
+
+
+ +

Event Details

+
+ +
+

onComplete

+ public event onComplete +
+ Custom event that fires when animation ends +Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onStart

+ public event onStart +
+ Custom event that fires when animation begins +Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+ +
+

onTween

+ public event onTween +
+ Custom event that fires between each frame +Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Anim.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.util.Subscriber.html b/www/extras/yui-ext/docs/output/YAHOO.util.Subscriber.html new file mode 100644 index 000000000..e597d664c --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.util.Subscriber.html @@ -0,0 +1,212 @@ + + + + YAHOO.util.Subscriber + + + + + +
+ +

Class YAHOO.util.Subscriber

+ + + + + +
Package:YAHOO.util
Class:Subscriber
Extends:Object
Defined In:event.js
+
+ Stores the subscriber information to be used when the event fires.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 fn : functionSubscriber
The callback that will be execute when the event fires
 obj : objectSubscriber
An optional custom object that will passed to the callback when +the event fires
 override : boolean|objectSubscriber
The default execution scope for the event listener is defined when the +event is created (usually the object which con...
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Subscriber()Subscriber
 contains(Function fn, Object obj) : booleanSubscriber
Returns true if the fn and obj match this objects properties. +Used by the unsubscribe method to match the right subsc...
 getScope(Object defaultScope) : voidSubscriber
Returns the execution scope for this listener. If override was set to true +the custom obj will be the scope. If ove...
 toString() : voidSubscriber
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

fn

+ public function fn +
+ The callback that will be execute when the event fires
+
This property is defined by Subscriber.
+
+ +
+

obj

+ public object obj +
+ An optional custom object that will passed to the callback when +the event fires
+
This property is defined by Subscriber.
+
+ +
+

override

+ public boolean|object override +
+ The default execution scope for the event listener is defined when the +event is created (usually the object which contains the event). +By setting override to true, the execution scope becomes the custom +object passed in by the subscriber. If override is an object, that +object becomes the scope.
+
This property is defined by Subscriber.
+
+
+ + +

Constructor Details

+
+
+

Subscriber

+ public function Subscriber() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

contains

+ public function contains(Function fn, Object obj) +
+ Returns true if the fn and obj match this objects properties. +Used by the unsubscribe method to match the right subscriber. +
+ Parameters: +
  • fn : Function
    the function to execute
  • obj : Object
    an object to be passed along when the event fires
+ Returns: +
    +
  • boolean
    true if the supplied arguments match this subscriber's signature.
  • +
+
+
+
This method is defined by Subscriber.
+
+ +
+

getScope

+ public function getScope(Object defaultScope) +
+ Returns the execution scope for this listener. If override was set to true +the custom obj will be the scope. If override is an object, that is the +scope, otherwise the default scope will be used. +
+ Parameters: +
  • defaultScope : Object
    the scope to use if this listener does not override it.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Subscriber.
+
+ +
+

toString

+ public function toString() +
+ +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Subscriber.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.AutoComplete.html b/www/extras/yui-ext/docs/output/YAHOO.widget.AutoComplete.html new file mode 100644 index 000000000..f821229d4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.AutoComplete.html @@ -0,0 +1,1019 @@ + + + + YAHOO.widget.AutoComplete + + + + + +
+ +

Class YAHOO.widget.AutoComplete

+ + + + + +
Package:YAHOO.widget
Class:AutoComplete
Extends:Object
Defined In:autocomplete.js
+
+ The AutoComplete class provides the customizable functionality of a plug-and-play DHTML +auto completion widget. Some key features: +
    +
  • Navigate with up/down arrow keys and/or mouse to pick a selection
  • +
  • The drop down container can "roll down" or "fly out" via configurable +animation
  • +
  • UI look-and-feel customizable through CSS, including container +attributes, borders, position, fonts, etc
  • +
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 allowBrowserAutocomplete : BooleanAutoComplete
Whether or not to allow browsers to cache user-typed input in the input +field. Disabling this feature will prevent th...
 alwaysShowContainer : BooleanAutoComplete
Whether or not the results container should always be displayed. +Enabling this feature displays the container when th...
 animHoriz : BooleanAutoComplete
Whether or not to animate the expansion/collapse of the results container in the +horizontal direction.
 animSpeed : NumberAutoComplete
Speed of container expand/collapse animation, in seconds..
 animVert : BooleanAutoComplete
Whether or not to animate the expansion/collapse of the results container in the +vertical direction.
 autoHighlight : BooleanAutoComplete
Whether or not the first item in results container should be automatically highlighted +on expand.
 dataSource : ObjectAutoComplete
The DataSource object that encapsulates the data used for auto completion. +This object should be an inherited object ...
 delimChar : StringAutoComplete
Query delimiter. A single character separator for multiple delimited +selections. Multiple delimiter characteres may b...
 forceSelection : BooleanAutoComplete
Whether or not to force the user's selection to match one of the query +results. Enabling this feature essentially tra...
 highlighClassName : StringAutoComplete
Class name of a highlighted item within results container.
 maxResultsDisplayed : NumberAutoComplete
Maximum number of results to display in results container.
 minQueryLength : NumberAutoComplete
Number of characters that must be entered before querying for results. A negative value +effectively turns off the wid...
 prehighlightClassName : StringAutoComplete
Class name of a pre-highlighted item within results container.
 queryDelay : NumberAutoComplete
Number of seconds to delay before submitting a query request. If a query +request is received before a previous one h...
 typeAhead : BooleanAutoComplete
Whether or not the input field should be automatically updated +with the first query result as the user types, auto-se...
 useIFrame : BooleanAutoComplete
Whether or not to use an iFrame to layer over Windows form elements in +IE. Set to true only when the results containe...
 useShadow : BooleanAutoComplete
Whether or not the results container should have a shadow.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 AutoComplete(elInput {HTMLElement}, elInput {String}, elContainer {HTMLElement}, elContainer {String}, oDataSource {Object}, [oConfigs {Object}])AutoComplete
 doBeforeExpandContainer() : BooleanAutoComplete
Overridable method called before container expands allows implementers to access data +and DOM elements.
 formatResult(oResultItem {Object}, sQuery {String}) : StringAutoComplete
Overridable method that converts a result item object into HTML markup +for display. Return data values are accessible...
 getListItemData() : Object/ArrayAutoComplete
Public accessor to the data held in an <li> element of the +results container.
 getListItems() : HTMLElement[]AutoComplete
Public accessor to the internal array of DOM <li> elements that +display query results within the results contai...
 isContainerOpen() : BooleanAutoComplete
Returns true if container is in an expanded state, false otherwise.
 sendQuery(sQuery {String}) : voidAutoComplete
Makes query request to the DataSource.
 setBody(sHeader {String}) : voidAutoComplete
Sets HTML markup for the results container body. This markup will be +inserted within a <div> tag with a class o...
 setFooter(sFooter {String}) : voidAutoComplete
Sets HTML markup for the results container footer. This markup will be +inserted within a <div> tag with a class...
 setHeader(sHeader {String}) : voidAutoComplete
Sets HTML markup for the results container header. This markup will be +inserted within a <div> tag with a class...
 toString() : StringAutoComplete
Public accessor to the unique name of the AutoComplete instance.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 containerCollapseEvent : (oSelf {Object})AutoComplete
Fired when the results container is collapsed.
 containerExpandEvent : (oSelf {Object})AutoComplete
Fired when the results container is expanded.
 dataErrorEvent : (oSelf {Object}, sQuery {String})AutoComplete
Fired when the AutoComplete instance does not receive query results from the +DataSource due to an error.
 dataRequestEvent : (oSelf {Object}, sQuery {String})AutoComplete
Fired when the AutoComplete instance makes a query to the DataSource.
 dataReturnEvent : (oSelf {Object}, sQuery {String}, aResults {Array})AutoComplete
Fired when the AutoComplete instance receives query results from the data +source.
 itemArrowFromEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
Fired when result item has been arrowed away from.
 itemArrowToEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
Fired when result item has been arrowed to.
 itemMouseOutEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
Fired when result item has been moused out.
 itemMouseOverEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
Fired when result item has been moused over.
 itemSelectEvent : (oSelf {Object}, elItem {HTMLElement}, oData {Object})AutoComplete
Fired when an item is selected via mouse click, ENTER key, or TAB key.
 selectionEnforceEvent : (oSelf {Object})AutoComplete
Fired if forceSelection is enabled and the user's input has been cleared +because it did not match one of the returned...
 textboxBlurEvent : (oSelf {Object})AutoComplete
Fired when the input field loses focus.
 textboxFocusEvent : (oSelf {Object})AutoComplete
Fired when the input field receives focus.
 textboxKeyEvent : (oSelf {Object}, nKeycode {Number})AutoComplete
Fired when the input field receives key input.
 typeAheadEvent : (oSelf {Object}, sQuery {String}, sPrefill {String})AutoComplete
Fired when the input field has been prefilled by the type-ahead +feature.
 unmatchedItemSelectEvent : (oSelf {Object}, sQuery {String})AutoComplete
Fired when a user selection does not match any of the displayed result items. +Note that this event may not behave as ...
+ +

Property Details

+
+ +
+

allowBrowserAutocomplete

+ public Boolean allowBrowserAutocomplete +
+ Whether or not to allow browsers to cache user-typed input in the input +field. Disabling this feature will prevent the widget from setting the +autocomplete="off" on the input field. When autocomplete="off" +and users click the back button after form submission, user-typed input can +be prefilled by the browser from its cache. This caching of user input may +not be desired for sensitive data, such as credit card numbers, in which +case, implementers should consider setting allowBrowserAutocomplete to false.
+
This property is defined by AutoComplete.
+
+ +
+

alwaysShowContainer

+ public Boolean alwaysShowContainer +
+ Whether or not the results container should always be displayed. +Enabling this feature displays the container when the widget is instantiated +and prevents the toggling of the container to a collapsed state.
+
This property is defined by AutoComplete.
+
+ +
+

animHoriz

+ public Boolean animHoriz +
+ Whether or not to animate the expansion/collapse of the results container in the +horizontal direction.
+
This property is defined by AutoComplete.
+
+ +
+

animSpeed

+ public Number animSpeed +
+ Speed of container expand/collapse animation, in seconds..
+
This property is defined by AutoComplete.
+
+ +
+

animVert

+ public Boolean animVert +
+ Whether or not to animate the expansion/collapse of the results container in the +vertical direction.
+
This property is defined by AutoComplete.
+
+ +
+

autoHighlight

+ public Boolean autoHighlight +
+ Whether or not the first item in results container should be automatically highlighted +on expand.
+
This property is defined by AutoComplete.
+
+ +
+

dataSource

+ public Object dataSource +
+ The DataSource object that encapsulates the data used for auto completion. +This object should be an inherited object from YAHOO.widget.DataSource.
+
This property is defined by AutoComplete.
+
+ +
+

delimChar

+ public String delimChar +
+ Query delimiter. A single character separator for multiple delimited +selections. Multiple delimiter characteres may be defined as an array of +strings. A null value or empty string indicates that query results cannot +be delimited. This feature is not recommended if you need forceSelection to +be true.
+
This property is defined by AutoComplete.
+
+ +
+

forceSelection

+ public Boolean forceSelection +
+ Whether or not to force the user's selection to match one of the query +results. Enabling this feature essentially transforms the input field into a +<select> field. This feature is not recommended with delimiter character(s) +defined.
+
This property is defined by AutoComplete.
+
+ +
+

highlighClassName

+ public String highlighClassName +
+ Class name of a highlighted item within results container.
+
This property is defined by AutoComplete.
+
+ +
+

maxResultsDisplayed

+ public Number maxResultsDisplayed +
+ Maximum number of results to display in results container.
+
This property is defined by AutoComplete.
+
+ +
+

minQueryLength

+ public Number minQueryLength +
+ Number of characters that must be entered before querying for results. A negative value +effectively turns off the widget. A value of 0 allows queries of null or empty string +values.
+
This property is defined by AutoComplete.
+
+ +
+

prehighlightClassName

+ public String prehighlightClassName +
+ Class name of a pre-highlighted item within results container.
+
This property is defined by AutoComplete.
+
+ +
+

queryDelay

+ public Number queryDelay +
+ Number of seconds to delay before submitting a query request. If a query +request is received before a previous one has completed its delay, the +previous request is cancelled and the new request is set to the delay.
+
This property is defined by AutoComplete.
+
+ +
+

typeAhead

+ public Boolean typeAhead +
+ Whether or not the input field should be automatically updated +with the first query result as the user types, auto-selecting the substring +that the user has not typed.
+
This property is defined by AutoComplete.
+
+ +
+

useIFrame

+ public Boolean useIFrame +
+ Whether or not to use an iFrame to layer over Windows form elements in +IE. Set to true only when the results container will be on top of a +<select> field in IE and thus exposed to the IE z-index bug (i.e., +5.5 < IE < 7).
+
This property is defined by AutoComplete.
+
+ +
+

useShadow

+ public Boolean useShadow +
+ Whether or not the results container should have a shadow.
+
This property is defined by AutoComplete.
+
+
+ + +

Constructor Details

+
+
+

AutoComplete

+ public function AutoComplete(elInput {HTMLElement}, elInput {String}, elContainer {HTMLElement}, elContainer {String}, oDataSource {Object}, [oConfigs {Object}]) +
+
+ Parameters: +
  • {HTMLElement} : elInput
    DOM element reference of an input field
  • {String} : elInput
    String ID of an input field
  • {HTMLElement} : elContainer
    DOM element reference of an existing DIV
  • {String} : elContainer
    String ID of an existing DIV
  • {Object} : oDataSource
    Instance of YAHOO.widget.DataSource for query/results
  • {Object} : oConfigs
    (optional) Object literal of configuration params
+
+
+
+
+ +

Method Details

+
+ +
+

doBeforeExpandContainer

+ public function doBeforeExpandContainer() +
+ Overridable method called before container expands allows implementers to access data +and DOM elements. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    Return true to continue expanding container, false to cancel the expand.
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

formatResult

+ public function formatResult(oResultItem {Object}, sQuery {String}) +
+ Overridable method that converts a result item object into HTML markup +for display. Return data values are accessible via the oResultItem object, +and the key return value will always be oResultItem[0]. Markup will be +displayed within <li> element tags in the container. +
+ Parameters: +
  • {Object} : oResultItem
    Result item representing one query result. Data is held in an array.
  • {String} : sQuery
    The current query string.
+ Returns: +
    +
  • String
    HTML markup of formatted result data.
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

getListItemData

+ public function getListItemData() +
+ Public accessor to the data held in an <li> element of the +results container. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Object/Array
    Object or array of result data or null
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

getListItems

+ public function getListItems() +
+ Public accessor to the internal array of DOM <li> elements that +display query results within the results container. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • HTMLElement[]
    Array of <li> elements within the results container.
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

isContainerOpen

+ public function isContainerOpen() +
+ Returns true if container is in an expanded state, false otherwise. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Boolean
    Returns true if container is in an expanded state, false otherwise.
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

sendQuery

+ public function sendQuery(sQuery {String}) +
+ Makes query request to the DataSource. +
+ Parameters: +
  • {String} : sQuery
    Query string.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

setBody

+ public function setBody(sHeader {String}) +
+ Sets HTML markup for the results container body. This markup will be +inserted within a <div> tag with a class of "ac_bd". +
+ Parameters: +
  • {String} : sHeader
    HTML markup for results container body.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

setFooter

+ public function setFooter(sFooter {String}) +
+ Sets HTML markup for the results container footer. This markup will be +inserted within a <div> tag with a class of "ac_ft". +
+ Parameters: +
  • {String} : sFooter
    HTML markup for results container footer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

setHeader

+ public function setHeader(sHeader {String}) +
+ Sets HTML markup for the results container header. This markup will be +inserted within a <div> tag with a class of "ac_hd". +
+ Parameters: +
  • {String} : sHeader
    HTML markup for results container header.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by AutoComplete.
+
+ +
+

toString

+ public function toString() +
+ Public accessor to the unique name of the AutoComplete instance. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    Unique name of the AutoComplete instance.
  • +
+
+
+
This method is defined by AutoComplete.
+
+
+ +

Event Details

+
+ +
+

containerCollapseEvent

+ public event containerCollapseEvent +
+ Fired when the results container is collapsed. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

containerExpandEvent

+ public event containerExpandEvent +
+ Fired when the results container is expanded. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

dataErrorEvent

+ public event dataErrorEvent +
+ Fired when the AutoComplete instance does not receive query results from the +DataSource due to an error. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {String} : sQuery
    The query string.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

dataRequestEvent

+ public event dataRequestEvent +
+ Fired when the AutoComplete instance makes a query to the DataSource. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {String} : sQuery
    The query string.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

dataReturnEvent

+ public event dataReturnEvent +
+ Fired when the AutoComplete instance receives query results from the data +source. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {String} : sQuery
    The query string.
  • {Array} : aResults
    Results array.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

itemArrowFromEvent

+ public event itemArrowFromEvent +
+ Fired when result item has been arrowed away from. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {HTMLElement} : elItem
    The <li> element item arrowed from.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

itemArrowToEvent

+ public event itemArrowToEvent +
+ Fired when result item has been arrowed to. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {HTMLElement} : elItem
    The <li> element item arrowed to.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

itemMouseOutEvent

+ public event itemMouseOutEvent +
+ Fired when result item has been moused out. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {HTMLElement} : elItem
    The <li> element item moused from.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

itemMouseOverEvent

+ public event itemMouseOverEvent +
+ Fired when result item has been moused over. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {HTMLElement} : elItem
    The <li> element item moused to.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

itemSelectEvent

+ public event itemSelectEvent +
+ Fired when an item is selected via mouse click, ENTER key, or TAB key. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {HTMLElement} : elItem
    The selected <li> element item.
  • {Object} : oData
    The data returned for the item, either as an object, or mapped from the schema into an array.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

selectionEnforceEvent

+ public event selectionEnforceEvent +
+ Fired if forceSelection is enabled and the user's input has been cleared +because it did not match one of the returned query results. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

textboxBlurEvent

+ public event textboxBlurEvent +
+ Fired when the input field loses focus. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

textboxFocusEvent

+ public event textboxFocusEvent +
+ Fired when the input field receives focus. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

textboxKeyEvent

+ public event textboxKeyEvent +
+ Fired when the input field receives key input. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {Number} : nKeycode
    The keycode number.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

typeAheadEvent

+ public event typeAheadEvent +
+ Fired when the input field has been prefilled by the type-ahead +feature. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {String} : sQuery
    The query string.
  • {String} : sPrefill
    The prefill string.
+
+
+
This event is defined by AutoComplete.
+
+ +
+

unmatchedItemSelectEvent

+ public event unmatchedItemSelectEvent +
+ Fired when a user selection does not match any of the displayed result items. +Note that this event may not behave as expected when delimiter characters +have been defined. +
+ Subscribers will be called with the following parameters: +
  • {Object} : oSelf
    The AutoComplete instance.
  • {String} : sQuery
    The user-typed query string.
+
+
+
This event is defined by AutoComplete.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar.html new file mode 100644 index 000000000..36c00b0ff --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar.html @@ -0,0 +1,2984 @@ + + + + YAHOO.widget.Calendar + + + + + +
+ +

Class YAHOO.widget.Calendar

+ + + + + + +
Package:YAHOO.widget
Class:Calendar
Extends:Object
Subclasses:Calendar_Core
Defined In:calendar.js
+
+ Calendar is the base class for the Calendar widget. In its most basic +implementation, it has the ability to render a calendar widget on the page +that can be manipulated to select a single date, move back and forth between +months and years. +

To construct the placeholder for the calendar widget, the code is as +follows: +

+<div id="cal1Container"></div> + +Note that the table can be replaced with any kind of element. +

+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 CSS_CALENDAR : ObjectCalendar
 CSS_CELL : ObjectCalendar
 CSS_CELL_BOTTOM : ObjectCalendar
 CSS_CELL_HIGHLIGHT1 : ObjectCalendar
 CSS_CELL_HIGHLIGHT2 : ObjectCalendar
 CSS_CELL_HIGHLIGHT3 : ObjectCalendar
 CSS_CELL_HIGHLIGHT4 : ObjectCalendar
 CSS_CELL_HOVER : ObjectCalendar
 CSS_CELL_LEFT : ObjectCalendar
 CSS_CELL_OOB : ObjectCalendar
 CSS_CELL_OOM : ObjectCalendar
 CSS_CELL_RESTRICTED : ObjectCalendar
 CSS_CELL_RIGHT : ObjectCalendar
 CSS_CELL_SELECTABLE : ObjectCalendar
 CSS_CELL_SELECTED : ObjectCalendar
 CSS_CELL_TODAY : ObjectCalendar
 CSS_CELL_TOP : ObjectCalendar
 CSS_CONTAINER : ObjectCalendar
 CSS_FOOTER : ObjectCalendar
 CSS_HEADER : ObjectCalendar
 CSS_HEADER_TEXT : ObjectCalendar
 CSS_NAV_LEFT : ObjectCalendar
 CSS_NAV_RIGHT : ObjectCalendar
 CSS_ROW_FOOTER : ObjectCalendar
 CSS_ROW_HEADER : ObjectCalendar
 CSS_SINGLE : ObjectCalendar
 CSS_WEEKDAY_CELL : ObjectCalendar
 CSS_WEEKDAY_ROW : ObjectCalendar
 DATE<static> : StringCalendar
<static> Type constant used for renderers to represent an individual date (M/D/Y)
 DISPLAY_DAYS<static> : NumberCalendar
<static> Constant that represents the total number of date cells that are displayed in a given month
 Locale : ObjectCalendar
The local object which contains the Calendar's locale settings
 MONTH<static> : StringCalendar
<static> Type constant used for renderers to represent a month across any year
 MONTH_DAY<static> : StringCalendar
<static> Type constant used for renderers to represent an individual date across any year (M/D)
 Options : ObjectCalendar
The local object which contains the Calendar's options
 RANGE<static> : StringCalendar
<static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
 STOP_RENDER<static> : StringCalendar
<static> Constant used for halting the execution of the remainder of the render stack
 Style : ObjectCalendar
Collection of Style constants for the Calendar
 WEEKDAY<static> : StringCalendar
<static> Type constant used for renderers to represent a weekday
 browser : StringCalendar
Returns a string representing the current browser.
 cellDates : Array[](Number[])Calendar
The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays...
 cells : HTMLTableCellElement[]Calendar
The collection of calendar table cells
 cfg : YAHOO.util.ConfigCalendar
The Config object used to hold the configuration variables for the Calendar
 domEventMap : ObjectCalendar
A map of DOM event handlers to attach to cells associated with specific CSS class names
 https : StringCalendar
<static> The path to be used for images loaded for the Calendar
 id : StringCalendar
The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
 index : NumberCalendar
The index of this item in the parent group
 oDomContainer : HTMLElementCalendar
The DOM element reference that points to this calendar's container element. The calendar will be inserted into this e...
 parent : CalendarGroupCalendar
The parent CalendarGroup, only to be set explicitly by the parent group
 renderStack : Array[]Calendar
The list of render functions, along with required parameters, used to render cells.
 today : DateCalendar
A Date object representing today's date.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 Calendar(String id, String containerId, Object config)Calendar
 addMonthRenderer(Number month, Function fnRender) : voidCalendar
Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
 addMonths(Number count) : voidCalendar
Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
 addRenderer(String sDates, Function fnRender) : voidCalendar
Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
 addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendar
Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
 addYears(Number count) : voidCalendar
Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
 applyListeners() : voidCalendar
Applies the Calendar's DOM listeners to applicable elements.
 buildDayLabel(Date workingDate) : StringCalendar
Builds the date digit that will be displayed in calendar cells
 buildMonthLabel() : StringCalendar
Builds the date label that will be displayed in the calendar header or +footer, depending on configuration.
 buildWeekdays(Array html) : ArrayCalendar
Renders the Calendar's weekday headers.
 clear() : voidCalendar
Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
 clearAllBodyCellStyles(style The) : voidCalendar
Removes all styles from all body cells in the current calendar table.
 clearElement(HTMLTableCellElement The) : voidCalendar
Clears the inner HTML, CSS class and style information from the specified cell.
 configClose() : voidCalendar
Default handler for the "close" property
 configIframe() : voidCalendar
Renders the built-in IFRAME shim for the IE6 and below
 configLocale() : voidCalendar
The default handler for all configuration locale properties
 configLocaleValues() : voidCalendar
The default handler for all configuration locale field length properties
 configMaxDate() : voidCalendar
The default handler for the "maxdate" property
 configMinDate() : voidCalendar
The default handler for the "mindate" property
 configOptions() : voidCalendar
The default handler for all configuration options properties
 configPageDate() : voidCalendar
The default handler for the "pagedate" property
 configSelected() : voidCalendar
The default handler for the "selected" property
 configTitle() : voidCalendar
Default handler for the "title" property
 deselect(String/Date/Date[] date) : Date[]Calendar
Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
 deselectAll() : Date[]Calendar
Deselects all dates on the current calendar.
 deselectCell(Number cellIndex) : Date[]Calendar
Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
 doCellMouseOut(DOMEvent e, Calendar cal) : voidCalendar
The event that is executed when the user moves the mouse out of a cell
 doCellMouseOver(DOMEvent e, Calendar cal) : voidCalendar
The event that is executed when the user hovers over a cell
 doSelectCell(DOMEvent e, Calendar cal) : voidCalendar
The default event function that is attached to a date link within a calendar cell +when the calendar is rendered.
 getDateByCellId(String id) : DateCalendar
Retrieves the Date object for the specified Calendar cell
 getDateFieldsByCellId(String id) : ArrayCalendar
Retrieves the Date object for the specified Calendar cell
 getSelectedDates() : Date[]Calendar
Gets the list of currently selected dates from the calendar.
 hide() : voidCalendar
Hides the Calendar's outer container from view.
 init(String id, String containerId, Object config) : voidCalendar
Initializes the Calendar widget.
 initEvents() : voidCalendar
Initializes Calendar's built-in CustomEvents
 initStyles() : voidCalendar
Defines the style constants for the Calendar
 isDateOOM(Date date) : BooleanCalendar
Determines whether a given date is OOM (out of month).
 nextMonth() : voidCalendar
Navigates to the next month page in the calendar widget.
 nextYear() : voidCalendar
Navigates to the next year in the currently selected month in the calendar widget.
 onBeforeDeselect() : voidCalendar
Deprecated. Event executed before a date is deselected in the calendar widget.
 onBeforeSelect() : voidCalendar
Deprecated. Event executed before a date is selected in the calendar widget.
 onChangePage() : voidCalendar
Deprecated. Event executed when the user navigates to a different calendar page.
 onDeselect(Array selected) : voidCalendar
Deprecated. Event executed when a date is deselected in the calendar widget.
 onRender() : voidCalendar
Deprecated. Event executed when the calendar widget is rendered.
 onSelect(Array selected) : voidCalendar
Deprecated. Event executed when a date is selected in the calendar widget.
 previousMonth() : voidCalendar
Navigates to the previous month page in the calendar widget.
 previousYear() : voidCalendar
Navigates to the previous year in the currently selected month in the calendar widget.
 render() : voidCalendar
Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections.
 renderBody(Date workingDate, Array html) : ArrayCalendar
Renders the calendar body.
 renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style.
 renderCellDefault(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard defaul...
 renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing th...
 renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight1 style
 renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight2 style
 renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight3 style
 renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight4 style
 renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Applies the default style used for rendering selected dates to the current calendar cell
 renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Applies the default style used for rendering today's date to the current calendar cell
 renderFooter(Array html) : ArrayCalendar
Renders the calendar footer. In the default implementation, there is +no footer.
 renderHeader(Array html) : ArrayCalendar
Renders the calendar header.
 renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Renders a cell that falls before the minimum date or after the maximum date. +widget class.
 renderRowFooter(Number weekNum, Array cell) : voidCalendar
Renders the row footer for a week.
 renderRowHeader(Number weekNum, Array cell) : voidCalendar
Renders the row header for a week.
 reset() : voidCalendar
Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
 resetRenderers() : voidCalendar
Resets the render stack of the current calendar to its original pre-render value.
 select(String/Date/Date[] date) : Date[]Calendar
Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
 selectCell(Number cellIndex) : Date[]Calendar
Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
 setMonth(Number month) : voidCalendar
Sets the calendar's month explicitly
 setYear(Number year) : voidCalendar
Sets the calendar's year explicitly.
 show() : voidCalendar
Shows the Calendar's outer container.
 styleCellDefault(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Styles a selectable cell.
 subtractMonths(Number count) : voidCalendar
Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
 subtractYears(Number count) : voidCalendar
Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
 toString() : StringCalendar
Returns a string representation of the object.
 validate() : ShouldCalendar
Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeDeselectEvent : ()Calendar
Fired before a selection is made
 beforeRenderEvent : ()Calendar
Fired before the Calendar is rendered
 beforeSelectEvent : ()Calendar
Fired before a selection is made
 changePageEvent : ()Calendar
Fired when the Calendar page is changed
 clearEvent : ()Calendar
Fired when the Calendar is cleared
 deselectEvent : (Array Array)Calendar
Fired when a selection is made
 renderEvent : ()Calendar
Fired when the Calendar is rendered
 resetEvent : ()Calendar
Fired when the Calendar is reset
 selectEvent : (Array Array)Calendar
Fired when a selection is made
+ +

Property Details

+
+ +
+

CSS_CALENDAR

+ public Object CSS_CALENDAR +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL

+ public Object CSS_CELL +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_BOTTOM

+ public Object CSS_CELL_BOTTOM +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT1

+ public Object CSS_CELL_HIGHLIGHT1 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT2

+ public Object CSS_CELL_HIGHLIGHT2 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT3

+ public Object CSS_CELL_HIGHLIGHT3 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT4

+ public Object CSS_CELL_HIGHLIGHT4 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HOVER

+ public Object CSS_CELL_HOVER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_LEFT

+ public Object CSS_CELL_LEFT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_OOB

+ public Object CSS_CELL_OOB +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_OOM

+ public Object CSS_CELL_OOM +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_RESTRICTED

+ public Object CSS_CELL_RESTRICTED +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_RIGHT

+ public Object CSS_CELL_RIGHT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_SELECTABLE

+ public Object CSS_CELL_SELECTABLE +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_SELECTED

+ public Object CSS_CELL_SELECTED +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_TODAY

+ public Object CSS_CELL_TODAY +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_TOP

+ public Object CSS_CELL_TOP +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CONTAINER

+ public Object CSS_CONTAINER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_FOOTER

+ public Object CSS_FOOTER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_HEADER

+ public Object CSS_HEADER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_HEADER_TEXT

+ public Object CSS_HEADER_TEXT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_NAV_LEFT

+ public Object CSS_NAV_LEFT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_NAV_RIGHT

+ public Object CSS_NAV_RIGHT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_ROW_FOOTER

+ public Object CSS_ROW_FOOTER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_ROW_HEADER

+ public Object CSS_ROW_HEADER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_SINGLE

+ public Object CSS_SINGLE +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_WEEKDAY_CELL

+ public Object CSS_WEEKDAY_CELL +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_WEEKDAY_ROW

+ public Object CSS_WEEKDAY_ROW +
+
+
This property is defined by Calendar.
+
+ +
+

DATE<static>

+ public String DATE<static> +
+ <static> Type constant used for renderers to represent an individual date (M/D/Y)
+
This property is defined by Calendar.
+
+ +
+

DISPLAY_DAYS<static>

+ public Number DISPLAY_DAYS<static> +
+ <static> Constant that represents the total number of date cells that are displayed in a given month
+
This property is defined by Calendar.
+
+ +
+

Locale

+ public Object Locale +
+ The local object which contains the Calendar's locale settings
+
This property is defined by Calendar.
+
+ +
+

MONTH<static>

+ public String MONTH<static> +
+ <static> Type constant used for renderers to represent a month across any year
+
This property is defined by Calendar.
+
+ +
+

MONTH_DAY<static>

+ public String MONTH_DAY<static> +
+ <static> Type constant used for renderers to represent an individual date across any year (M/D)
+
This property is defined by Calendar.
+
+ +
+

Options

+ public Object Options +
+ The local object which contains the Calendar's options
+
This property is defined by Calendar.
+
+ +
+

RANGE<static>

+ public String RANGE<static> +
+ <static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
+
This property is defined by Calendar.
+
+ +
+

STOP_RENDER<static>

+ public String STOP_RENDER<static> +
+ <static> Constant used for halting the execution of the remainder of the render stack
+
This property is defined by Calendar.
+
+ +
+

Style

+ public Object Style +
+ Collection of Style constants for the Calendar
+
This property is defined by Calendar.
+
+ +
+

WEEKDAY<static>

+ public String WEEKDAY<static> +
+ <static> Type constant used for renderers to represent a weekday
+
This property is defined by Calendar.
+
+ +
+

browser

+ public String browser +
+ Returns a string representing the current browser.
+
This property is defined by Calendar.
+
+ +
+

cellDates

+ public Array[](Number[]) cellDates +
+ The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
+
This property is defined by Calendar.
+
+ +
+

cells

+ public HTMLTableCellElement[] cells +
+ The collection of calendar table cells
+
This property is defined by Calendar.
+
+ +
+

cfg

+ public YAHOO.util.Config cfg +
+ The Config object used to hold the configuration variables for the Calendar
+
This property is defined by Calendar.
+
+ +
+

domEventMap

+ public Object domEventMap +
+ A map of DOM event handlers to attach to cells associated with specific CSS class names
+
This property is defined by Calendar.
+
+ +
+

https

+ public String https +
+ <static> The path to be used for images loaded for the Calendar
+
This property is defined by Calendar.
+
+ +
+

id

+ public String id +
+ The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
+
This property is defined by Calendar.
+
+ +
+

index

+ public Number index +
+ The index of this item in the parent group
+
This property is defined by Calendar.
+
+ +
+

oDomContainer

+ public HTMLElement oDomContainer +
+ The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
+
This property is defined by Calendar.
+
+ +
+

parent

+ public CalendarGroup parent +
+ The parent CalendarGroup, only to be set explicitly by the parent group
+
This property is defined by Calendar.
+
+ +
+

renderStack

+ public Array[] renderStack +
+ The list of render functions, along with required parameters, used to render cells.
+
This property is defined by Calendar.
+
+ +
+

today

+ public Date today +
+ A Date object representing today's date.
+
This property is defined by Calendar.
+
+
+ + +

Constructor Details

+
+
+

Calendar

+ public function Calendar(String id, String containerId, Object config) +
+
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+
+
+
+
+ +

Method Details

+
+ +
+

addMonthRenderer

+ public function addMonthRenderer(Number month, Function fnRender) +
+ Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
+ Parameters: +
  • month : Number
    The month (1-12) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addMonths

+ public function addMonths(Number count) +
+ Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addRenderer

+ public function addRenderer(String sDates, Function fnRender) +
+ Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
+ Parameters: +
  • sDates : String
    A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addWeekdayRenderer

+ public function addWeekdayRenderer(Number weekday, Function fnRender) +
+ Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
+ Parameters: +
  • weekday : Number
    The weekday (0-6) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addYears

+ public function addYears(Number count) +
+ Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

applyListeners

+ public function applyListeners() +
+ Applies the Calendar's DOM listeners to applicable elements. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildDayLabel

+ public function buildDayLabel(Date workingDate) +
+ Builds the date digit that will be displayed in calendar cells +
+ Parameters: +
  • workingDate : Date
    The current working date
+ Returns: +
    +
  • String
    The formatted day label
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildMonthLabel

+ public function buildMonthLabel() +
+ Builds the date label that will be displayed in the calendar header or +footer, depending on configuration. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The formatted calendar month label
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildWeekdays

+ public function buildWeekdays(Array html) +
+ Renders the Calendar's weekday headers. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clear

+ public function clear() +
+ Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clearAllBodyCellStyles

+ public function clearAllBodyCellStyles(style The) +
+ Removes all styles from all body cells in the current calendar table. +
+ Parameters: +
  • The : style
    CSS class name to remove from all calendar body cells
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clearElement

+ public function clearElement(HTMLTableCellElement The) +
+ Clears the inner HTML, CSS class and style information from the specified cell. +
+ Parameters: +
  • The : HTMLTableCellElement
    cell to clear
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configClose

+ public function configClose() +
+ Default handler for the "close" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configIframe

+ public function configIframe() +
+ Renders the built-in IFRAME shim for the IE6 and below +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configLocale

+ public function configLocale() +
+ The default handler for all configuration locale properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configLocaleValues

+ public function configLocaleValues() +
+ The default handler for all configuration locale field length properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configMaxDate

+ public function configMaxDate() +
+ The default handler for the "maxdate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configMinDate

+ public function configMinDate() +
+ The default handler for the "mindate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configOptions

+ public function configOptions() +
+ The default handler for all configuration options properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configPageDate

+ public function configPageDate() +
+ The default handler for the "pagedate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configSelected

+ public function configSelected() +
+ The default handler for the "selected" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configTitle

+ public function configTitle() +
+ Default handler for the "title" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselect

+ public function deselect(String/Date/Date[] date) +
+ Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselectAll

+ public function deselectAll() +
+ Deselects all dates on the current calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselectCell

+ public function deselectCell(Number cellIndex) +
+ Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to deselect in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doCellMouseOut

+ public function doCellMouseOut(DOMEvent e, Calendar cal) +
+ The event that is executed when the user moves the mouse out of a cell +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doCellMouseOver

+ public function doCellMouseOver(DOMEvent e, Calendar cal) +
+ The event that is executed when the user hovers over a cell +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doSelectCell

+ public function doSelectCell(DOMEvent e, Calendar cal) +
+ The default event function that is attached to a date link within a calendar cell +when the calendar is rendered. +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getDateByCellId

+ public function getDateByCellId(String id) +
+ Retrieves the Date object for the specified Calendar cell +
+ Parameters: +
  • id : String
    The id of the cell
+ Returns: +
    +
  • Date
    The Date object for the specified Calendar cell
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getDateFieldsByCellId

+ public function getDateFieldsByCellId(String id) +
+ Retrieves the Date object for the specified Calendar cell +
+ Parameters: +
  • id : String
    The id of the cell
+ Returns: +
    +
  • Array
    The array of Date fields for the specified Calendar cell
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getSelectedDates

+ public function getSelectedDates() +
+ Gets the list of currently selected dates from the calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    An array of currently selected JavaScript Date objects.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

hide

+ public function hide() +
+ Hides the Calendar's outer container from view. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

init

+ public function init(String id, String containerId, Object config) +
+ Initializes the Calendar widget. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

initEvents

+ public function initEvents() +
+ Initializes Calendar's built-in CustomEvents +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

initStyles

+ public function initStyles() +
+ Defines the style constants for the Calendar +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

isDateOOM

+ public function isDateOOM(Date date) +
+ Determines whether a given date is OOM (out of month). +
+ Parameters: +
  • date : Date
    The JavaScript Date object for which to check the OOM status
+ Returns: +
    +
  • Boolean
    true if the date is OOM
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

nextMonth

+ public function nextMonth() +
+ Navigates to the next month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

nextYear

+ public function nextYear() +
+ Navigates to the next year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onBeforeDeselect

+ public function onBeforeDeselect() +
+ Deprecated. Event executed before a date is deselected in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onBeforeSelect

+ public function onBeforeSelect() +
+ Deprecated. Event executed before a date is selected in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onChangePage

+ public function onChangePage() +
+ Deprecated. Event executed when the user navigates to a different calendar page. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onDeselect

+ public function onDeselect(Array selected) +
+ Deprecated. Event executed when a date is deselected in the calendar widget. +
+ Parameters: +
  • selected : Array
    An array of date field arrays representing which date or dates were deselected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onRender

+ public function onRender() +
+ Deprecated. Event executed when the calendar widget is rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onSelect

+ public function onSelect(Array selected) +
+ Deprecated. Event executed when a date is selected in the calendar widget. +
+ Parameters: +
  • selected : Array
    An array of date field arrays representing which date or dates were selected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

previousMonth

+ public function previousMonth() +
+ Navigates to the previous month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

previousYear

+ public function previousYear() +
+ Navigates to the previous year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

render

+ public function render() +
+ Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderBody

+ public function renderBody(Date workingDate, Array html) +
+ Renders the calendar body. +
+ Parameters: +
  • workingDate : Date
    The current working Date being used for the render process
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderBodyCellRestricted

+ public function renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) +
+ Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellDefault

+ public function renderCellDefault(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard default cell will be rendered is +encapsulated in this method, and must be accounted for when extending the +widget class. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellNotThisMonth

+ public function renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing the cells for the current month) +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight1

+ public function renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight1 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight2

+ public function renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight2 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight3

+ public function renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight3 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight4

+ public function renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight4 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleSelected

+ public function renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering selected dates to the current calendar cell +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleToday

+ public function renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering today's date to the current calendar cell +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderFooter

+ public function renderFooter(Array html) +
+ Renders the calendar footer. In the default implementation, there is +no footer. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderHeader

+ public function renderHeader(Array html) +
+ Renders the calendar header. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderOutOfBoundsDate

+ public function renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) +
+ Renders a cell that falls before the minimum date or after the maximum date. +widget class. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderRowFooter

+ public function renderRowFooter(Number weekNum, Array cell) +
+ Renders the row footer for a week. +
+ Parameters: +
  • weekNum : Number
    The week number of the current row
  • cell : Array
    The current working HTML array
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderRowHeader

+ public function renderRowHeader(Number weekNum, Array cell) +
+ Renders the row header for a week. +
+ Parameters: +
  • weekNum : Number
    The week number of the current row
  • cell : Array
    The current working HTML array
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

reset

+ public function reset() +
+ Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

resetRenderers

+ public function resetRenderers() +
+ Resets the render stack of the current calendar to its original pre-render value. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

select

+ public function select(String/Date/Date[] date) +
+ Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

selectCell

+ public function selectCell(Number cellIndex) +
+ Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to select in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

setMonth

+ public function setMonth(Number month) +
+ Sets the calendar's month explicitly +
+ Parameters: +
  • month : Number
    The numeric month, from 0 (January) to 11 (December)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

setYear

+ public function setYear(Number year) +
+ Sets the calendar's year explicitly. +
+ Parameters: +
  • year : Number
    The numeric 4-digit year
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

show

+ public function show() +
+ Shows the Calendar's outer container. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

styleCellDefault

+ public function styleCellDefault(Date workingDate, HTMLTableCellElement cell) +
+ Styles a selectable cell. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

subtractMonths

+ public function subtractMonths(Number count) +
+ Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

subtractYears

+ public function subtractYears(Number count) +
+ Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    A string representation of the Calendar object.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

validate

+ public function validate() +
+ Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Should
    return true if the widget validates, and false if it doesn't.
  • +
+
+
+
This method is defined by Calendar.
+
+
+ +

Event Details

+
+ +
+

beforeDeselectEvent

+ public event beforeDeselectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

beforeRenderEvent

+ public event beforeRenderEvent +
+ Fired before the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

beforeSelectEvent

+ public event beforeSelectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

changePageEvent

+ public event changePageEvent +
+ Fired when the Calendar page is changed +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

clearEvent

+ public event clearEvent +
+ Fired when the Calendar is cleared +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

deselectEvent

+ public event deselectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by Calendar.
+
+ +
+

renderEvent

+ public event renderEvent +
+ Fired when the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

resetEvent

+ public event resetEvent +
+ Fired when the Calendar is reset +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

selectEvent

+ public event selectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by Calendar.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar2up.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar2up.html new file mode 100644 index 000000000..e30de4ae3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar2up.html @@ -0,0 +1,1294 @@ + + + + YAHOO.widget.Calendar2up + + + + + +
+ +

Class YAHOO.widget.Calendar2up

+ + + + + +
Package:YAHOO.widget
Class:Calendar2up
Extends:CalendarGroup
Defined In:calendar.js
+
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 CSS_2UPCLOSE<static> : StringCalendarGroup
<static> CSS class representing the close icon for the 2-up calendar
 CSS_2UPTITLE<static> : StringCalendarGroup
<static> CSS class representing the title for the 2-up calendar
 CSS_CONTAINER<static> : StringCalendarGroup
<static> CSS class representing the container for the calendar
 CSS_MULTI_UP<static> : StringCalendarGroup
<static> CSS class representing the container for the calendar
 Locale : ObjectCalendarGroup
The local object which contains the CalendarGroup's locale settings
 Options : ObjectCalendarGroup
The local object which contains the CalendarGroup's options
 cfg : YAHOO.util.ConfigCalendarGroup
The Config object used to hold the configuration variables for the CalendarGroup
 containerId : StringCalendarGroup
The unique id associated with the CalendarGroup container
 id : StringCalendarGroup
The unique id associated with the CalendarGroup
 oDomContainer : HTMLElementCalendarGroup
The outer containing element for the CalendarGroup
 pages : YAHOO.widget.Calendar[]CalendarGroup
The collection of Calendar pages contained within the CalendarGroup
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addMonthRenderer(Number month, Function fnRender) : voidCalendarGroup
Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
 addMonths(Number count) : voidCalendarGroup
Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
 addRenderer(String sDates, Function fnRender) : voidCalendarGroup
Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
 addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendarGroup
Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
 addYears(Number count) : voidCalendarGroup
Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
 callChildFunction(String fnName, Array args) : voidCalendarGroup
Calls a function within all child Calendars within this CalendarGroup.
 clear() : voidCalendarGroup
Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
 configPageDate(String type, Object[] args, Object obj) : voidCalendarGroup
The default Config handler for the "pagedate" property
 configPages(String type, Object[] args, Object obj) : voidCalendarGroup
The default Config handler for the "pages" property
 constructChild(String id, String containerId, Object config) : YAHOO.widget.CalendarCalendarGroup
Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be u...
 delegateConfig(String type, Object[] args, Object obj) : voidCalendarGroup
Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
 deselect(String/Date/Date[] date) : Date[]CalendarGroup
Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
 deselectAll() : Date[]CalendarGroup
Deselects all dates on the current calendar.
 deselectCell(Number cellIndex) : Date[]CalendarGroup
Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
 getSelectedDates() : AnCalendarGroup
Gets the list of currently selected dates from the calendar.
 init(String id, String containerId, Object config) : voidCalendarGroup
Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly.
 initEvents() : voidCalendarGroup
Initializes CalendarGroup's built-in CustomEvents
 nextMonth() : voidCalendarGroup
Navigates to the next month page in the calendar widget.
 nextYear() : voidCalendarGroup
Navigates to the next year in the currently selected month in the calendar widget.
 previousMonth() : voidCalendarGroup
Navigates to the previous month page in the calendar widget.
 previousYear() : voidCalendarGroup
Navigates to the previous year in the currently selected month in the calendar widget.
 render() : voidCalendarGroup
Calls the render function of all child calendars within the group.
 renderFooter() : voidCalendarGroup
Renders a footer for the 2-up calendar container. By default, this method is +unimplemented.
 renderHeader() : voidCalendarGroup
Renders the header for the CalendarGroup.
 reset() : voidCalendarGroup
Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
 select(String/Date/Date[] date) : Date[]CalendarGroup
Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
 selectCell(Number cellIndex) : Date[]CalendarGroup
Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
 setChildFunction(String fnName, Function fn) : voidCalendarGroup
Adds a function to all child Calendars within this CalendarGroup.
 setMonth(Number month) : voidCalendarGroup
Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, an...
 setYear(Number year) : voidCalendarGroup
Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and ...
 subtractMonths(Number count) : voidCalendarGroup
Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
 subtractYears(Number count) : voidCalendarGroup
Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
 toString() : StringCalendarGroup
Returns a string representation of the object.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeDeselectEvent : ()CalendarGroup
Fired before a selection is made
 beforeRenderEvent : ()CalendarGroup
Fired before the Calendar is rendered
 beforeSelectEvent : ()CalendarGroup
Fired before a selection is made
 changePageEvent : ()CalendarGroup
Fired when the Calendar page is changed
 clearEvent : ()CalendarGroup
Fired when the Calendar is cleared
 deselectEvent : (Array Array)CalendarGroup
Fired when a selection is made
 renderEvent : ()CalendarGroup
Fired when the Calendar is rendered
 resetEvent : ()CalendarGroup
Fired when the Calendar is reset
 selectEvent : (Array Array)CalendarGroup
Fired when a selection is made
+ +

Property Details

+
+ +
+

CSS_2UPCLOSE<static>

+ public String CSS_2UPCLOSE<static> +
+ <static> CSS class representing the close icon for the 2-up calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_2UPTITLE<static>

+ public String CSS_2UPTITLE<static> +
+ <static> CSS class representing the title for the 2-up calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_CONTAINER<static>

+ public String CSS_CONTAINER<static> +
+ <static> CSS class representing the container for the calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_MULTI_UP<static>

+ public String CSS_MULTI_UP<static> +
+ <static> CSS class representing the container for the calendar
+
This property is defined by CalendarGroup.
+
+ +
+

Locale

+ public Object Locale +
+ The local object which contains the CalendarGroup's locale settings
+
This property is defined by CalendarGroup.
+
+ +
+

Options

+ public Object Options +
+ The local object which contains the CalendarGroup's options
+
This property is defined by CalendarGroup.
+
+ +
+

cfg

+ public YAHOO.util.Config cfg +
+ The Config object used to hold the configuration variables for the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

containerId

+ public String containerId +
+ The unique id associated with the CalendarGroup container
+
This property is defined by CalendarGroup.
+
+ +
+

id

+ public String id +
+ The unique id associated with the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

oDomContainer

+ public HTMLElement oDomContainer +
+ The outer containing element for the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

pages

+ public YAHOO.widget.Calendar[] pages +
+ The collection of Calendar pages contained within the CalendarGroup
+
This property is defined by CalendarGroup.
+
+
+ + +

Method Details

+
+ +
+

addMonthRenderer

+ public function addMonthRenderer(Number month, Function fnRender) +
+ Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
+ Parameters: +
  • month : Number
    The month (1-12) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addMonths

+ public function addMonths(Number count) +
+ Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addRenderer

+ public function addRenderer(String sDates, Function fnRender) +
+ Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
+ Parameters: +
  • sDates : String
    A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addWeekdayRenderer

+ public function addWeekdayRenderer(Number weekday, Function fnRender) +
+ Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
+ Parameters: +
  • weekday : Number
    The weekday (0-6) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addYears

+ public function addYears(Number count) +
+ Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

callChildFunction

+ public function callChildFunction(String fnName, Array args) +
+ Calls a function within all child Calendars within this CalendarGroup. +
+ Parameters: +
  • fnName : String
    The name of the function
  • args : Array
    The arguments to pass to the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

clear

+ public function clear() +
+ Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

configPageDate

+ public function configPageDate(String type, Object[] args, Object obj) +
+ The default Config handler for the "pagedate" property +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

configPages

+ public function configPages(String type, Object[] args, Object obj) +
+ The default Config handler for the "pages" property +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

constructChild

+ public function constructChild(String id, String containerId, Object config) +
+ Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be used. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • YAHOO.widget.Calendar
    The YAHOO.widget.Calendar instance that is constructed
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

delegateConfig

+ public function delegateConfig(String type, Object[] args, Object obj) +
+ Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselect

+ public function deselect(String/Date/Date[] date) +
+ Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselectAll

+ public function deselectAll() +
+ Deselects all dates on the current calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselectCell

+ public function deselectCell(Number cellIndex) +
+ Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to deselect in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

getSelectedDates

+ public function getSelectedDates() +
+ Gets the list of currently selected dates from the calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • An
    array of currently selected JavaScript Date objects.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

init

+ public function init(String id, String containerId, Object config) +
+ Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

initEvents

+ public function initEvents() +
+ Initializes CalendarGroup's built-in CustomEvents +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

nextMonth

+ public function nextMonth() +
+ Navigates to the next month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

nextYear

+ public function nextYear() +
+ Navigates to the next year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

previousMonth

+ public function previousMonth() +
+ Navigates to the previous month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

previousYear

+ public function previousYear() +
+ Navigates to the previous year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

render

+ public function render() +
+ Calls the render function of all child calendars within the group. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

renderFooter

+ public function renderFooter() +
+ Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

renderHeader

+ public function renderHeader() +
+ Renders the header for the CalendarGroup. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

reset

+ public function reset() +
+ Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

select

+ public function select(String/Date/Date[] date) +
+ Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

selectCell

+ public function selectCell(Number cellIndex) +
+ Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to select in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setChildFunction

+ public function setChildFunction(String fnName, Function fn) +
+ Adds a function to all child Calendars within this CalendarGroup. +
+ Parameters: +
  • fnName : String
    The name of the function
  • fn : Function
    The function to apply to each Calendar page object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setMonth

+ public function setMonth(Number month) +
+ Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
+ Parameters: +
  • month : Number
    The numeric month, from 0 (January) to 11 (December)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setYear

+ public function setYear(Number year) +
+ Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
+ Parameters: +
  • year : Number
    The numeric 4-digit year
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

subtractMonths

+ public function subtractMonths(Number count) +
+ Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

subtractYears

+ public function subtractYears(Number count) +
+ Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    A string representation of the CalendarGroup object.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+
+ +

Event Details

+
+ +
+

beforeDeselectEvent

+ public event beforeDeselectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

beforeRenderEvent

+ public event beforeRenderEvent +
+ Fired before the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

beforeSelectEvent

+ public event beforeSelectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

changePageEvent

+ public event changePageEvent +
+ Fired when the Calendar page is changed +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

clearEvent

+ public event clearEvent +
+ Fired when the Calendar is cleared +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

deselectEvent

+ public event deselectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

renderEvent

+ public event renderEvent +
+ Fired when the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

resetEvent

+ public event resetEvent +
+ Fired when the Calendar is reset +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

selectEvent

+ public event selectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by CalendarGroup.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.CalendarGroup.html b/www/extras/yui-ext/docs/output/YAHOO.widget.CalendarGroup.html new file mode 100644 index 000000000..b16af3d7d --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.CalendarGroup.html @@ -0,0 +1,1327 @@ + + + + YAHOO.widget.CalendarGroup + + + + + +
+ +

Class YAHOO.widget.CalendarGroup

+ + + + + + +
Package:YAHOO.widget
Class:CalendarGroup
Extends:Object
Subclasses:Calendar2up
Defined In:calendar.js
+
+ YAHOO.widget.CalendarGroup is a special container class for YAHOO.widget.Calendar. This class facilitates +the ability to have multi-page calendar views that share a single dataset and are +dependent on each other. +The calendar group instance will refer to each of its elements using a 0-based index. +For example, to construct the placeholder for a calendar group widget with id "cal1" and +containerId of "cal1Container", the markup would be as follows: + +<div id="cal1Container_0"></div> +<div id="cal1Container_1"></div> + +The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 CSS_2UPCLOSE<static> : StringCalendarGroup
<static> CSS class representing the close icon for the 2-up calendar
 CSS_2UPTITLE<static> : StringCalendarGroup
<static> CSS class representing the title for the 2-up calendar
 CSS_CONTAINER<static> : StringCalendarGroup
<static> CSS class representing the container for the calendar
 CSS_MULTI_UP<static> : StringCalendarGroup
<static> CSS class representing the container for the calendar
 Locale : ObjectCalendarGroup
The local object which contains the CalendarGroup's locale settings
 Options : ObjectCalendarGroup
The local object which contains the CalendarGroup's options
 cfg : YAHOO.util.ConfigCalendarGroup
The Config object used to hold the configuration variables for the CalendarGroup
 containerId : StringCalendarGroup
The unique id associated with the CalendarGroup container
 id : StringCalendarGroup
The unique id associated with the CalendarGroup
 oDomContainer : HTMLElementCalendarGroup
The outer containing element for the CalendarGroup
 pages : YAHOO.widget.Calendar[]CalendarGroup
The collection of Calendar pages contained within the CalendarGroup
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 CalendarGroup(String id, String containerId, Object config)CalendarGroup
 addMonthRenderer(Number month, Function fnRender) : voidCalendarGroup
Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
 addMonths(Number count) : voidCalendarGroup
Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
 addRenderer(String sDates, Function fnRender) : voidCalendarGroup
Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
 addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendarGroup
Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
 addYears(Number count) : voidCalendarGroup
Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
 callChildFunction(String fnName, Array args) : voidCalendarGroup
Calls a function within all child Calendars within this CalendarGroup.
 clear() : voidCalendarGroup
Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
 configPageDate(String type, Object[] args, Object obj) : voidCalendarGroup
The default Config handler for the "pagedate" property
 configPages(String type, Object[] args, Object obj) : voidCalendarGroup
The default Config handler for the "pages" property
 constructChild(String id, String containerId, Object config) : YAHOO.widget.CalendarCalendarGroup
Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be u...
 delegateConfig(String type, Object[] args, Object obj) : voidCalendarGroup
Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
 deselect(String/Date/Date[] date) : Date[]CalendarGroup
Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
 deselectAll() : Date[]CalendarGroup
Deselects all dates on the current calendar.
 deselectCell(Number cellIndex) : Date[]CalendarGroup
Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
 getSelectedDates() : AnCalendarGroup
Gets the list of currently selected dates from the calendar.
 init(String id, String containerId, Object config) : voidCalendarGroup
Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly.
 initEvents() : voidCalendarGroup
Initializes CalendarGroup's built-in CustomEvents
 nextMonth() : voidCalendarGroup
Navigates to the next month page in the calendar widget.
 nextYear() : voidCalendarGroup
Navigates to the next year in the currently selected month in the calendar widget.
 previousMonth() : voidCalendarGroup
Navigates to the previous month page in the calendar widget.
 previousYear() : voidCalendarGroup
Navigates to the previous year in the currently selected month in the calendar widget.
 render() : voidCalendarGroup
Calls the render function of all child calendars within the group.
 renderFooter() : voidCalendarGroup
Renders a footer for the 2-up calendar container. By default, this method is +unimplemented.
 renderHeader() : voidCalendarGroup
Renders the header for the CalendarGroup.
 reset() : voidCalendarGroup
Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
 select(String/Date/Date[] date) : Date[]CalendarGroup
Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
 selectCell(Number cellIndex) : Date[]CalendarGroup
Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
 setChildFunction(String fnName, Function fn) : voidCalendarGroup
Adds a function to all child Calendars within this CalendarGroup.
 setMonth(Number month) : voidCalendarGroup
Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, an...
 setYear(Number year) : voidCalendarGroup
Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and ...
 subtractMonths(Number count) : voidCalendarGroup
Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
 subtractYears(Number count) : voidCalendarGroup
Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
 toString() : StringCalendarGroup
Returns a string representation of the object.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeDeselectEvent : ()CalendarGroup
Fired before a selection is made
 beforeRenderEvent : ()CalendarGroup
Fired before the Calendar is rendered
 beforeSelectEvent : ()CalendarGroup
Fired before a selection is made
 changePageEvent : ()CalendarGroup
Fired when the Calendar page is changed
 clearEvent : ()CalendarGroup
Fired when the Calendar is cleared
 deselectEvent : (Array Array)CalendarGroup
Fired when a selection is made
 renderEvent : ()CalendarGroup
Fired when the Calendar is rendered
 resetEvent : ()CalendarGroup
Fired when the Calendar is reset
 selectEvent : (Array Array)CalendarGroup
Fired when a selection is made
+ +

Property Details

+
+ +
+

CSS_2UPCLOSE<static>

+ public String CSS_2UPCLOSE<static> +
+ <static> CSS class representing the close icon for the 2-up calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_2UPTITLE<static>

+ public String CSS_2UPTITLE<static> +
+ <static> CSS class representing the title for the 2-up calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_CONTAINER<static>

+ public String CSS_CONTAINER<static> +
+ <static> CSS class representing the container for the calendar
+
This property is defined by CalendarGroup.
+
+ +
+

CSS_MULTI_UP<static>

+ public String CSS_MULTI_UP<static> +
+ <static> CSS class representing the container for the calendar
+
This property is defined by CalendarGroup.
+
+ +
+

Locale

+ public Object Locale +
+ The local object which contains the CalendarGroup's locale settings
+
This property is defined by CalendarGroup.
+
+ +
+

Options

+ public Object Options +
+ The local object which contains the CalendarGroup's options
+
This property is defined by CalendarGroup.
+
+ +
+

cfg

+ public YAHOO.util.Config cfg +
+ The Config object used to hold the configuration variables for the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

containerId

+ public String containerId +
+ The unique id associated with the CalendarGroup container
+
This property is defined by CalendarGroup.
+
+ +
+

id

+ public String id +
+ The unique id associated with the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

oDomContainer

+ public HTMLElement oDomContainer +
+ The outer containing element for the CalendarGroup
+
This property is defined by CalendarGroup.
+
+ +
+

pages

+ public YAHOO.widget.Calendar[] pages +
+ The collection of Calendar pages contained within the CalendarGroup
+
This property is defined by CalendarGroup.
+
+
+ + +

Constructor Details

+
+
+

CalendarGroup

+ public function CalendarGroup(String id, String containerId, Object config) +
+
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+
+
+
+
+ +

Method Details

+
+ +
+

addMonthRenderer

+ public function addMonthRenderer(Number month, Function fnRender) +
+ Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
+ Parameters: +
  • month : Number
    The month (1-12) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addMonths

+ public function addMonths(Number count) +
+ Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addRenderer

+ public function addRenderer(String sDates, Function fnRender) +
+ Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
+ Parameters: +
  • sDates : String
    A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addWeekdayRenderer

+ public function addWeekdayRenderer(Number weekday, Function fnRender) +
+ Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
+ Parameters: +
  • weekday : Number
    The weekday (0-6) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

addYears

+ public function addYears(Number count) +
+ Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

callChildFunction

+ public function callChildFunction(String fnName, Array args) +
+ Calls a function within all child Calendars within this CalendarGroup. +
+ Parameters: +
  • fnName : String
    The name of the function
  • args : Array
    The arguments to pass to the function
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

clear

+ public function clear() +
+ Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

configPageDate

+ public function configPageDate(String type, Object[] args, Object obj) +
+ The default Config handler for the "pagedate" property +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

configPages

+ public function configPages(String type, Object[] args, Object obj) +
+ The default Config handler for the "pages" property +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

constructChild

+ public function constructChild(String id, String containerId, Object config) +
+ Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be used. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • YAHOO.widget.Calendar
    The YAHOO.widget.Calendar instance that is constructed
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

delegateConfig

+ public function delegateConfig(String type, Object[] args, Object obj) +
+ Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselect

+ public function deselect(String/Date/Date[] date) +
+ Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselectAll

+ public function deselectAll() +
+ Deselects all dates on the current calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

deselectCell

+ public function deselectCell(Number cellIndex) +
+ Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to deselect in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

getSelectedDates

+ public function getSelectedDates() +
+ Gets the list of currently selected dates from the calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • An
    array of currently selected JavaScript Date objects.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

init

+ public function init(String id, String containerId, Object config) +
+ Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

initEvents

+ public function initEvents() +
+ Initializes CalendarGroup's built-in CustomEvents +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

nextMonth

+ public function nextMonth() +
+ Navigates to the next month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

nextYear

+ public function nextYear() +
+ Navigates to the next year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

previousMonth

+ public function previousMonth() +
+ Navigates to the previous month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

previousYear

+ public function previousYear() +
+ Navigates to the previous year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

render

+ public function render() +
+ Calls the render function of all child calendars within the group. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

renderFooter

+ public function renderFooter() +
+ Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

renderHeader

+ public function renderHeader() +
+ Renders the header for the CalendarGroup. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

reset

+ public function reset() +
+ Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

select

+ public function select(String/Date/Date[] date) +
+ Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

selectCell

+ public function selectCell(Number cellIndex) +
+ Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to select in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setChildFunction

+ public function setChildFunction(String fnName, Function fn) +
+ Adds a function to all child Calendars within this CalendarGroup. +
+ Parameters: +
  • fnName : String
    The name of the function
  • fn : Function
    The function to apply to each Calendar page object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setMonth

+ public function setMonth(Number month) +
+ Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
+ Parameters: +
  • month : Number
    The numeric month, from 0 (January) to 11 (December)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

setYear

+ public function setYear(Number year) +
+ Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
+ Parameters: +
  • year : Number
    The numeric 4-digit year
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

subtractMonths

+ public function subtractMonths(Number count) +
+ Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

subtractYears

+ public function subtractYears(Number count) +
+ Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by CalendarGroup.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    A string representation of the CalendarGroup object.
  • +
+
+
+
This method is defined by CalendarGroup.
+
+
+ +

Event Details

+
+ +
+

beforeDeselectEvent

+ public event beforeDeselectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

beforeRenderEvent

+ public event beforeRenderEvent +
+ Fired before the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

beforeSelectEvent

+ public event beforeSelectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

changePageEvent

+ public event changePageEvent +
+ Fired when the Calendar page is changed +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

clearEvent

+ public event clearEvent +
+ Fired when the Calendar is cleared +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

deselectEvent

+ public event deselectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

renderEvent

+ public event renderEvent +
+ Fired when the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

resetEvent

+ public event resetEvent +
+ Fired when the Calendar is reset +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by CalendarGroup.
+
+ +
+

selectEvent

+ public event selectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by CalendarGroup.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar_Core.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar_Core.html new file mode 100644 index 000000000..ec6b46a9b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Calendar_Core.html @@ -0,0 +1,2951 @@ + + + + YAHOO.widget.Calendar_Core + + + + + +
+ +

Class YAHOO.widget.Calendar_Core

+ + + + + +
Package:YAHOO.widget
Class:Calendar_Core
Extends:Calendar
Defined In:calendar.js
+
+
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 CSS_CALENDAR : ObjectCalendar
 CSS_CELL : ObjectCalendar
 CSS_CELL_BOTTOM : ObjectCalendar
 CSS_CELL_HIGHLIGHT1 : ObjectCalendar
 CSS_CELL_HIGHLIGHT2 : ObjectCalendar
 CSS_CELL_HIGHLIGHT3 : ObjectCalendar
 CSS_CELL_HIGHLIGHT4 : ObjectCalendar
 CSS_CELL_HOVER : ObjectCalendar
 CSS_CELL_LEFT : ObjectCalendar
 CSS_CELL_OOB : ObjectCalendar
 CSS_CELL_OOM : ObjectCalendar
 CSS_CELL_RESTRICTED : ObjectCalendar
 CSS_CELL_RIGHT : ObjectCalendar
 CSS_CELL_SELECTABLE : ObjectCalendar
 CSS_CELL_SELECTED : ObjectCalendar
 CSS_CELL_TODAY : ObjectCalendar
 CSS_CELL_TOP : ObjectCalendar
 CSS_CONTAINER : ObjectCalendar
 CSS_FOOTER : ObjectCalendar
 CSS_HEADER : ObjectCalendar
 CSS_HEADER_TEXT : ObjectCalendar
 CSS_NAV_LEFT : ObjectCalendar
 CSS_NAV_RIGHT : ObjectCalendar
 CSS_ROW_FOOTER : ObjectCalendar
 CSS_ROW_HEADER : ObjectCalendar
 CSS_SINGLE : ObjectCalendar
 CSS_WEEKDAY_CELL : ObjectCalendar
 CSS_WEEKDAY_ROW : ObjectCalendar
 DATE<static> : StringCalendar
<static> Type constant used for renderers to represent an individual date (M/D/Y)
 DISPLAY_DAYS<static> : NumberCalendar
<static> Constant that represents the total number of date cells that are displayed in a given month
 Locale : ObjectCalendar
The local object which contains the Calendar's locale settings
 MONTH<static> : StringCalendar
<static> Type constant used for renderers to represent a month across any year
 MONTH_DAY<static> : StringCalendar
<static> Type constant used for renderers to represent an individual date across any year (M/D)
 Options : ObjectCalendar
The local object which contains the Calendar's options
 RANGE<static> : StringCalendar
<static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
 STOP_RENDER<static> : StringCalendar
<static> Constant used for halting the execution of the remainder of the render stack
 Style : ObjectCalendar
Collection of Style constants for the Calendar
 WEEKDAY<static> : StringCalendar
<static> Type constant used for renderers to represent a weekday
 browser : StringCalendar
Returns a string representing the current browser.
 cellDates : Array[](Number[])Calendar
The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays...
 cells : HTMLTableCellElement[]Calendar
The collection of calendar table cells
 cfg : YAHOO.util.ConfigCalendar
The Config object used to hold the configuration variables for the Calendar
 domEventMap : ObjectCalendar
A map of DOM event handlers to attach to cells associated with specific CSS class names
 https : StringCalendar
<static> The path to be used for images loaded for the Calendar
 id : StringCalendar
The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
 index : NumberCalendar
The index of this item in the parent group
 oDomContainer : HTMLElementCalendar
The DOM element reference that points to this calendar's container element. The calendar will be inserted into this e...
 parent : CalendarGroupCalendar
The parent CalendarGroup, only to be set explicitly by the parent group
 renderStack : Array[]Calendar
The list of render functions, along with required parameters, used to render cells.
 today : DateCalendar
A Date object representing today's date.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 addMonthRenderer(Number month, Function fnRender) : voidCalendar
Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
 addMonths(Number count) : voidCalendar
Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
 addRenderer(String sDates, Function fnRender) : voidCalendar
Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
 addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendar
Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
 addYears(Number count) : voidCalendar
Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
 applyListeners() : voidCalendar
Applies the Calendar's DOM listeners to applicable elements.
 buildDayLabel(Date workingDate) : StringCalendar
Builds the date digit that will be displayed in calendar cells
 buildMonthLabel() : StringCalendar
Builds the date label that will be displayed in the calendar header or +footer, depending on configuration.
 buildWeekdays(Array html) : ArrayCalendar
Renders the Calendar's weekday headers.
 clear() : voidCalendar
Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
 clearAllBodyCellStyles(style The) : voidCalendar
Removes all styles from all body cells in the current calendar table.
 clearElement(HTMLTableCellElement The) : voidCalendar
Clears the inner HTML, CSS class and style information from the specified cell.
 configClose() : voidCalendar
Default handler for the "close" property
 configIframe() : voidCalendar
Renders the built-in IFRAME shim for the IE6 and below
 configLocale() : voidCalendar
The default handler for all configuration locale properties
 configLocaleValues() : voidCalendar
The default handler for all configuration locale field length properties
 configMaxDate() : voidCalendar
The default handler for the "maxdate" property
 configMinDate() : voidCalendar
The default handler for the "mindate" property
 configOptions() : voidCalendar
The default handler for all configuration options properties
 configPageDate() : voidCalendar
The default handler for the "pagedate" property
 configSelected() : voidCalendar
The default handler for the "selected" property
 configTitle() : voidCalendar
Default handler for the "title" property
 deselect(String/Date/Date[] date) : Date[]Calendar
Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
 deselectAll() : Date[]Calendar
Deselects all dates on the current calendar.
 deselectCell(Number cellIndex) : Date[]Calendar
Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
 doCellMouseOut(DOMEvent e, Calendar cal) : voidCalendar
The event that is executed when the user moves the mouse out of a cell
 doCellMouseOver(DOMEvent e, Calendar cal) : voidCalendar
The event that is executed when the user hovers over a cell
 doSelectCell(DOMEvent e, Calendar cal) : voidCalendar
The default event function that is attached to a date link within a calendar cell +when the calendar is rendered.
 getDateByCellId(String id) : DateCalendar
Retrieves the Date object for the specified Calendar cell
 getDateFieldsByCellId(String id) : ArrayCalendar
Retrieves the Date object for the specified Calendar cell
 getSelectedDates() : Date[]Calendar
Gets the list of currently selected dates from the calendar.
 hide() : voidCalendar
Hides the Calendar's outer container from view.
 init(String id, String containerId, Object config) : voidCalendar
Initializes the Calendar widget.
 initEvents() : voidCalendar
Initializes Calendar's built-in CustomEvents
 initStyles() : voidCalendar
Defines the style constants for the Calendar
 isDateOOM(Date date) : BooleanCalendar
Determines whether a given date is OOM (out of month).
 nextMonth() : voidCalendar
Navigates to the next month page in the calendar widget.
 nextYear() : voidCalendar
Navigates to the next year in the currently selected month in the calendar widget.
 onBeforeDeselect() : voidCalendar
Deprecated. Event executed before a date is deselected in the calendar widget.
 onBeforeSelect() : voidCalendar
Deprecated. Event executed before a date is selected in the calendar widget.
 onChangePage() : voidCalendar
Deprecated. Event executed when the user navigates to a different calendar page.
 onDeselect(Array selected) : voidCalendar
Deprecated. Event executed when a date is deselected in the calendar widget.
 onRender() : voidCalendar
Deprecated. Event executed when the calendar widget is rendered.
 onSelect(Array selected) : voidCalendar
Deprecated. Event executed when a date is selected in the calendar widget.
 previousMonth() : voidCalendar
Navigates to the previous month page in the calendar widget.
 previousYear() : voidCalendar
Navigates to the previous year in the currently selected month in the calendar widget.
 render() : voidCalendar
Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections.
 renderBody(Date workingDate, Array html) : ArrayCalendar
Renders the calendar body.
 renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style.
 renderCellDefault(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard defaul...
 renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing th...
 renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight1 style
 renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight2 style
 renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight3 style
 renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Renders a single standard calendar cell using the CSS hightlight4 style
 renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Applies the default style used for rendering selected dates to the current calendar cell
 renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Applies the default style used for rendering today's date to the current calendar cell
 renderFooter(Array html) : ArrayCalendar
Renders the calendar footer. In the default implementation, there is +no footer.
 renderHeader(Array html) : ArrayCalendar
Renders the calendar header.
 renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) : StringCalendar
Renders a cell that falls before the minimum date or after the maximum date. +widget class.
 renderRowFooter(Number weekNum, Array cell) : voidCalendar
Renders the row footer for a week.
 renderRowHeader(Number weekNum, Array cell) : voidCalendar
Renders the row header for a week.
 reset() : voidCalendar
Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
 resetRenderers() : voidCalendar
Resets the render stack of the current calendar to its original pre-render value.
 select(String/Date/Date[] date) : Date[]Calendar
Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
 selectCell(Number cellIndex) : Date[]Calendar
Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
 setMonth(Number month) : voidCalendar
Sets the calendar's month explicitly
 setYear(Number year) : voidCalendar
Sets the calendar's year explicitly.
 show() : voidCalendar
Shows the Calendar's outer container.
 styleCellDefault(Date workingDate, HTMLTableCellElement cell) : voidCalendar
Styles a selectable cell.
 subtractMonths(Number count) : voidCalendar
Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
 subtractYears(Number count) : voidCalendar
Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
 toString() : StringCalendar
Returns a string representation of the object.
 validate() : ShouldCalendar
Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget.
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 beforeDeselectEvent : ()Calendar
Fired before a selection is made
 beforeRenderEvent : ()Calendar
Fired before the Calendar is rendered
 beforeSelectEvent : ()Calendar
Fired before a selection is made
 changePageEvent : ()Calendar
Fired when the Calendar page is changed
 clearEvent : ()Calendar
Fired when the Calendar is cleared
 deselectEvent : (Array Array)Calendar
Fired when a selection is made
 renderEvent : ()Calendar
Fired when the Calendar is rendered
 resetEvent : ()Calendar
Fired when the Calendar is reset
 selectEvent : (Array Array)Calendar
Fired when a selection is made
+ +

Property Details

+
+ +
+

CSS_CALENDAR

+ public Object CSS_CALENDAR +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL

+ public Object CSS_CELL +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_BOTTOM

+ public Object CSS_CELL_BOTTOM +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT1

+ public Object CSS_CELL_HIGHLIGHT1 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT2

+ public Object CSS_CELL_HIGHLIGHT2 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT3

+ public Object CSS_CELL_HIGHLIGHT3 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HIGHLIGHT4

+ public Object CSS_CELL_HIGHLIGHT4 +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_HOVER

+ public Object CSS_CELL_HOVER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_LEFT

+ public Object CSS_CELL_LEFT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_OOB

+ public Object CSS_CELL_OOB +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_OOM

+ public Object CSS_CELL_OOM +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_RESTRICTED

+ public Object CSS_CELL_RESTRICTED +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_RIGHT

+ public Object CSS_CELL_RIGHT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_SELECTABLE

+ public Object CSS_CELL_SELECTABLE +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_SELECTED

+ public Object CSS_CELL_SELECTED +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_TODAY

+ public Object CSS_CELL_TODAY +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CELL_TOP

+ public Object CSS_CELL_TOP +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_CONTAINER

+ public Object CSS_CONTAINER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_FOOTER

+ public Object CSS_FOOTER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_HEADER

+ public Object CSS_HEADER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_HEADER_TEXT

+ public Object CSS_HEADER_TEXT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_NAV_LEFT

+ public Object CSS_NAV_LEFT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_NAV_RIGHT

+ public Object CSS_NAV_RIGHT +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_ROW_FOOTER

+ public Object CSS_ROW_FOOTER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_ROW_HEADER

+ public Object CSS_ROW_HEADER +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_SINGLE

+ public Object CSS_SINGLE +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_WEEKDAY_CELL

+ public Object CSS_WEEKDAY_CELL +
+
+
This property is defined by Calendar.
+
+ +
+

CSS_WEEKDAY_ROW

+ public Object CSS_WEEKDAY_ROW +
+
+
This property is defined by Calendar.
+
+ +
+

DATE<static>

+ public String DATE<static> +
+ <static> Type constant used for renderers to represent an individual date (M/D/Y)
+
This property is defined by Calendar.
+
+ +
+

DISPLAY_DAYS<static>

+ public Number DISPLAY_DAYS<static> +
+ <static> Constant that represents the total number of date cells that are displayed in a given month
+
This property is defined by Calendar.
+
+ +
+

Locale

+ public Object Locale +
+ The local object which contains the Calendar's locale settings
+
This property is defined by Calendar.
+
+ +
+

MONTH<static>

+ public String MONTH<static> +
+ <static> Type constant used for renderers to represent a month across any year
+
This property is defined by Calendar.
+
+ +
+

MONTH_DAY<static>

+ public String MONTH_DAY<static> +
+ <static> Type constant used for renderers to represent an individual date across any year (M/D)
+
This property is defined by Calendar.
+
+ +
+

Options

+ public Object Options +
+ The local object which contains the Calendar's options
+
This property is defined by Calendar.
+
+ +
+

RANGE<static>

+ public String RANGE<static> +
+ <static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
+
This property is defined by Calendar.
+
+ +
+

STOP_RENDER<static>

+ public String STOP_RENDER<static> +
+ <static> Constant used for halting the execution of the remainder of the render stack
+
This property is defined by Calendar.
+
+ +
+

Style

+ public Object Style +
+ Collection of Style constants for the Calendar
+
This property is defined by Calendar.
+
+ +
+

WEEKDAY<static>

+ public String WEEKDAY<static> +
+ <static> Type constant used for renderers to represent a weekday
+
This property is defined by Calendar.
+
+ +
+

browser

+ public String browser +
+ Returns a string representing the current browser.
+
This property is defined by Calendar.
+
+ +
+

cellDates

+ public Array[](Number[]) cellDates +
+ The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
+
This property is defined by Calendar.
+
+ +
+

cells

+ public HTMLTableCellElement[] cells +
+ The collection of calendar table cells
+
This property is defined by Calendar.
+
+ +
+

cfg

+ public YAHOO.util.Config cfg +
+ The Config object used to hold the configuration variables for the Calendar
+
This property is defined by Calendar.
+
+ +
+

domEventMap

+ public Object domEventMap +
+ A map of DOM event handlers to attach to cells associated with specific CSS class names
+
This property is defined by Calendar.
+
+ +
+

https

+ public String https +
+ <static> The path to be used for images loaded for the Calendar
+
This property is defined by Calendar.
+
+ +
+

id

+ public String id +
+ The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
+
This property is defined by Calendar.
+
+ +
+

index

+ public Number index +
+ The index of this item in the parent group
+
This property is defined by Calendar.
+
+ +
+

oDomContainer

+ public HTMLElement oDomContainer +
+ The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
+
This property is defined by Calendar.
+
+ +
+

parent

+ public CalendarGroup parent +
+ The parent CalendarGroup, only to be set explicitly by the parent group
+
This property is defined by Calendar.
+
+ +
+

renderStack

+ public Array[] renderStack +
+ The list of render functions, along with required parameters, used to render cells.
+
This property is defined by Calendar.
+
+ +
+

today

+ public Date today +
+ A Date object representing today's date.
+
This property is defined by Calendar.
+
+
+ + +

Method Details

+
+ +
+

addMonthRenderer

+ public function addMonthRenderer(Number month, Function fnRender) +
+ Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
+ Parameters: +
  • month : Number
    The month (1-12) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addMonths

+ public function addMonths(Number count) +
+ Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addRenderer

+ public function addRenderer(String sDates, Function fnRender) +
+ Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
+ Parameters: +
  • sDates : String
    A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addWeekdayRenderer

+ public function addWeekdayRenderer(Number weekday, Function fnRender) +
+ Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
+ Parameters: +
  • weekday : Number
    The weekday (0-6) to associate with this renderer
  • fnRender : Function
    The function executed to render cells that match the render rules for this renderer.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

addYears

+ public function addYears(Number count) +
+ Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to add to the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

applyListeners

+ public function applyListeners() +
+ Applies the Calendar's DOM listeners to applicable elements. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildDayLabel

+ public function buildDayLabel(Date workingDate) +
+ Builds the date digit that will be displayed in calendar cells +
+ Parameters: +
  • workingDate : Date
    The current working date
+ Returns: +
    +
  • String
    The formatted day label
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildMonthLabel

+ public function buildMonthLabel() +
+ Builds the date label that will be displayed in the calendar header or +footer, depending on configuration. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The formatted calendar month label
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

buildWeekdays

+ public function buildWeekdays(Array html) +
+ Renders the Calendar's weekday headers. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clear

+ public function clear() +
+ Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clearAllBodyCellStyles

+ public function clearAllBodyCellStyles(style The) +
+ Removes all styles from all body cells in the current calendar table. +
+ Parameters: +
  • The : style
    CSS class name to remove from all calendar body cells
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

clearElement

+ public function clearElement(HTMLTableCellElement The) +
+ Clears the inner HTML, CSS class and style information from the specified cell. +
+ Parameters: +
  • The : HTMLTableCellElement
    cell to clear
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configClose

+ public function configClose() +
+ Default handler for the "close" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configIframe

+ public function configIframe() +
+ Renders the built-in IFRAME shim for the IE6 and below +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configLocale

+ public function configLocale() +
+ The default handler for all configuration locale properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configLocaleValues

+ public function configLocaleValues() +
+ The default handler for all configuration locale field length properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configMaxDate

+ public function configMaxDate() +
+ The default handler for the "maxdate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configMinDate

+ public function configMinDate() +
+ The default handler for the "mindate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configOptions

+ public function configOptions() +
+ The default handler for all configuration options properties +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configPageDate

+ public function configPageDate() +
+ The default handler for the "pagedate" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configSelected

+ public function configSelected() +
+ The default handler for the "selected" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

configTitle

+ public function configTitle() +
+ Default handler for the "title" property +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselect

+ public function deselect(String/Date/Date[] date) +
+ Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselectAll

+ public function deselectAll() +
+ Deselects all dates on the current calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

deselectCell

+ public function deselectCell(Number cellIndex) +
+ Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to deselect in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doCellMouseOut

+ public function doCellMouseOut(DOMEvent e, Calendar cal) +
+ The event that is executed when the user moves the mouse out of a cell +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doCellMouseOver

+ public function doCellMouseOver(DOMEvent e, Calendar cal) +
+ The event that is executed when the user hovers over a cell +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

doSelectCell

+ public function doSelectCell(DOMEvent e, Calendar cal) +
+ The default event function that is attached to a date link within a calendar cell +when the calendar is rendered. +
+ Parameters: +
  • e : DOMEvent
    The event
  • cal : Calendar
    A reference to the calendar passed by the Event utility
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getDateByCellId

+ public function getDateByCellId(String id) +
+ Retrieves the Date object for the specified Calendar cell +
+ Parameters: +
  • id : String
    The id of the cell
+ Returns: +
    +
  • Date
    The Date object for the specified Calendar cell
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getDateFieldsByCellId

+ public function getDateFieldsByCellId(String id) +
+ Retrieves the Date object for the specified Calendar cell +
+ Parameters: +
  • id : String
    The id of the cell
+ Returns: +
    +
  • Array
    The array of Date fields for the specified Calendar cell
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

getSelectedDates

+ public function getSelectedDates() +
+ Gets the list of currently selected dates from the calendar. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Date[]
    An array of currently selected JavaScript Date objects.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

hide

+ public function hide() +
+ Hides the Calendar's outer container from view. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

init

+ public function init(String id, String containerId, Object config) +
+ Initializes the Calendar widget. +
+ Parameters: +
  • id : String
    The id of the table element that will represent the calendar widget
  • containerId : String
    The id of the container div element that will wrap the calendar table
  • config : Object
    The configuration object containing the Calendar's arguments
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

initEvents

+ public function initEvents() +
+ Initializes Calendar's built-in CustomEvents +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

initStyles

+ public function initStyles() +
+ Defines the style constants for the Calendar +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

isDateOOM

+ public function isDateOOM(Date date) +
+ Determines whether a given date is OOM (out of month). +
+ Parameters: +
  • date : Date
    The JavaScript Date object for which to check the OOM status
+ Returns: +
    +
  • Boolean
    true if the date is OOM
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

nextMonth

+ public function nextMonth() +
+ Navigates to the next month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

nextYear

+ public function nextYear() +
+ Navigates to the next year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onBeforeDeselect

+ public function onBeforeDeselect() +
+ Deprecated. Event executed before a date is deselected in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onBeforeSelect

+ public function onBeforeSelect() +
+ Deprecated. Event executed before a date is selected in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onChangePage

+ public function onChangePage() +
+ Deprecated. Event executed when the user navigates to a different calendar page. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onDeselect

+ public function onDeselect(Array selected) +
+ Deprecated. Event executed when a date is deselected in the calendar widget. +
+ Parameters: +
  • selected : Array
    An array of date field arrays representing which date or dates were deselected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onRender

+ public function onRender() +
+ Deprecated. Event executed when the calendar widget is rendered. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

onSelect

+ public function onSelect(Array selected) +
+ Deprecated. Event executed when a date is selected in the calendar widget. +
+ Parameters: +
  • selected : Array
    An array of date field arrays representing which date or dates were selected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

previousMonth

+ public function previousMonth() +
+ Navigates to the previous month page in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

previousYear

+ public function previousYear() +
+ Navigates to the previous year in the currently selected month in the calendar widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

render

+ public function render() +
+ Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderBody

+ public function renderBody(Date workingDate, Array html) +
+ Renders the calendar body. +
+ Parameters: +
  • workingDate : Date
    The current working Date being used for the render process
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderBodyCellRestricted

+ public function renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) +
+ Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellDefault

+ public function renderCellDefault(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard default cell will be rendered is +encapsulated in this method, and must be accounted for when extending the +widget class. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellNotThisMonth

+ public function renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing the cells for the current month) +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight1

+ public function renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight1 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight2

+ public function renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight2 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight3

+ public function renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight3 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleHighlight4

+ public function renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) +
+ Renders a single standard calendar cell using the CSS hightlight4 style +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleSelected

+ public function renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering selected dates to the current calendar cell +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderCellStyleToday

+ public function renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) +
+ Applies the default style used for rendering today's date to the current calendar cell +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderFooter

+ public function renderFooter(Array html) +
+ Renders the calendar footer. In the default implementation, there is +no footer. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderHeader

+ public function renderHeader(Array html) +
+ Renders the calendar header. +
+ Parameters: +
  • html : Array
    The current working HTML array
+ Returns: +
    +
  • Array
    The current working HTML array
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderOutOfBoundsDate

+ public function renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) +
+ Renders a cell that falls before the minimum date or after the maximum date. +widget class. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • String
    YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderRowFooter

+ public function renderRowFooter(Number weekNum, Array cell) +
+ Renders the row footer for a week. +
+ Parameters: +
  • weekNum : Number
    The week number of the current row
  • cell : Array
    The current working HTML array
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

renderRowHeader

+ public function renderRowHeader(Number weekNum, Array cell) +
+ Renders the row header for a week. +
+ Parameters: +
  • weekNum : Number
    The week number of the current row
  • cell : Array
    The current working HTML array
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

reset

+ public function reset() +
+ Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

resetRenderers

+ public function resetRenderers() +
+ Resets the render stack of the current calendar to its original pre-render value. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

select

+ public function select(String/Date/Date[] date) +
+ Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
+ Parameters: +
  • date : String/Date/Date[]
    The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

selectCell

+ public function selectCell(Number cellIndex) +
+ Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
+ Parameters: +
  • cellIndex : Number
    The index of the cell to select in the current calendar.
+ Returns: +
    +
  • Date[]
    Array of JavaScript Date objects representing all individual dates that are currently selected.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

setMonth

+ public function setMonth(Number month) +
+ Sets the calendar's month explicitly +
+ Parameters: +
  • month : Number
    The numeric month, from 0 (January) to 11 (December)
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

setYear

+ public function setYear(Number year) +
+ Sets the calendar's year explicitly. +
+ Parameters: +
  • year : Number
    The numeric 4-digit year
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

show

+ public function show() +
+ Shows the Calendar's outer container. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

styleCellDefault

+ public function styleCellDefault(Date workingDate, HTMLTableCellElement cell) +
+ Styles a selectable cell. +
+ Parameters: +
  • workingDate : Date
    The current working Date object being used to generate the calendar
  • cell : HTMLTableCellElement
    The current working cell in the calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

subtractMonths

+ public function subtractMonths(Number count) +
+ Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of months to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

subtractYears

+ public function subtractYears(Number count) +
+ Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
+ Parameters: +
  • count : Number
    The number of years to subtract from the current calendar
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    A string representation of the Calendar object.
  • +
+
+
+
This method is defined by Calendar.
+
+ +
+

validate

+ public function validate() +
+ Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Should
    return true if the widget validates, and false if it doesn't.
  • +
+
+
+
This method is defined by Calendar.
+
+
+ +

Event Details

+
+ +
+

beforeDeselectEvent

+ public event beforeDeselectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

beforeRenderEvent

+ public event beforeRenderEvent +
+ Fired before the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

beforeSelectEvent

+ public event beforeSelectEvent +
+ Fired before a selection is made +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

changePageEvent

+ public event changePageEvent +
+ Fired when the Calendar page is changed +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

clearEvent

+ public event clearEvent +
+ Fired when the Calendar is cleared +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

deselectEvent

+ public event deselectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by Calendar.
+
+ +
+

renderEvent

+ public event renderEvent +
+ Fired when the Calendar is rendered +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

resetEvent

+ public event resetEvent +
+ Fired when the Calendar is reset +
+ Subscribers will be called with the following parameters: +
  • None.
+
+
+
This event is defined by Calendar.
+
+ +
+

selectEvent

+ public event selectEvent +
+ Fired when a selection is made +
+ Subscribers will be called with the following parameters: +
  • Array : Array
    of Date field arrays in the format [YYYY, MM, DD].
+
+
+
This event is defined by Calendar.
+
+
+
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.ContainerEffect.html b/www/extras/yui-ext/docs/output/YAHOO.widget.ContainerEffect.html new file mode 100644 index 000000000..d8d5969e1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.ContainerEffect.html @@ -0,0 +1,457 @@ + + + + YAHOO.widget.ContainerEffect + + + + + +
+ +

Class YAHOO.widget.ContainerEffect

+ + + + + +
Package:YAHOO.widget
Class:ContainerEffect
Extends:Object
Defined In:container_core.js
+
+ ContainerEffect encapsulates animation transitions that are executed when an Overlay is shown or hidden.
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 animClass : classContainerEffect
The animation class to use for animating the overlay
 attrIn : ObjectContainerEffect
The animation attributes to use when transitioning into view
 attrOut : ObjectContainerEffect
The animation attributes to use when transitioning out of view
 overlay : YAHOO.widget.OverlayContainerEffect
The overlay to animate
 targetElement : HTMLElementContainerEffect
The target element to be animated
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ContainerEffect(YAHOO.widget.Overlay overlay, Object attrIn, Object attrOut, HTMLElement targetElement, class Optional.)ContainerEffect
 FADE(Overlay The, Number The) : ContainerEffectContainerEffect
<static> A pre-configured ContainerEffect instance that can be used for fading an overlay in and out.
 SLIDE(Overlay The, Number The) : ContainerEffectContainerEffect
<static> A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out.
 animateIn() : voidContainerEffect
Triggers the in-animation.
 animateOut() : voidContainerEffect
Triggers the out-animation.
 handleCompleteAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
The default onComplete handler for the in-animation.
 handleCompleteAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
The default onComplete handler for the out-animation.
 handleStartAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
The default onStart handler for the in-animation.
 handleStartAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
The default onStart handler for the out-animation.
 handleTweenAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
The default onTween handler for the in-animation.
 handleTweenAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
The default onTween handler for the out-animation.
 init() : voidContainerEffect
Initializes the animation classes and events.
 toString() : StringContainerEffect
Returns a string representation of the object.
+ +

Public Events

+
This class has no public events.
+

Property Details

+
+ +
+

animClass

+ public class animClass +
+ The animation class to use for animating the overlay
+
This property is defined by ContainerEffect.
+
+ +
+

attrIn

+ public Object attrIn +
+ The animation attributes to use when transitioning into view
+
This property is defined by ContainerEffect.
+
+ +
+

attrOut

+ public Object attrOut +
+ The animation attributes to use when transitioning out of view
+
This property is defined by ContainerEffect.
+
+ +
+

overlay

+ public YAHOO.widget.Overlay overlay +
+ The overlay to animate
+
This property is defined by ContainerEffect.
+
+ +
+

targetElement

+ public HTMLElement targetElement +
+ The target element to be animated
+
This property is defined by ContainerEffect.
+
+
+ + +

Constructor Details

+
+
+

ContainerEffect

+ public function ContainerEffect(YAHOO.widget.Overlay overlay, Object attrIn, Object attrOut, HTMLElement targetElement, class Optional.) +
+
+ Parameters: +
  • overlay : YAHOO.widget.Overlay
    The Overlay that the animation should be associated with
  • attrIn : Object
    The object literal representing the animation arguments to be used for the animate-in transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
  • attrOut : Object
    The object literal representing the animation arguments to be used for the animate-out transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
  • targetElement : HTMLElement
    Optional. The target element that should be animated during the transition. Defaults to overlay.element.
  • Optional. : class
    The animation class to instantiate. Defaults to YAHOO.util.Anim. Other options include YAHOO.util.Motion.
+
+
+
+
+ +

Method Details

+
+ +
+

FADE

+ public function FADE(Overlay The, Number The) +
+ <static> A pre-configured ContainerEffect instance that can be used for fading an overlay in and out. +
+ Parameters: +
  • The : Overlay
    Overlay object to animate
  • The : Number
    duration of the animation
+ Returns: +
    +
  • ContainerEffect
    The configured ContainerEffect object
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

SLIDE

+ public function SLIDE(Overlay The, Number The) +
+ <static> A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out. +
+ Parameters: +
  • The : Overlay
    Overlay object to animate
  • The : Number
    duration of the animation
+ Returns: +
    +
  • ContainerEffect
    The configured ContainerEffect object
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

animateIn

+ public function animateIn() +
+ Triggers the in-animation. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

animateOut

+ public function animateOut() +
+ Triggers the out-animation. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleCompleteAnimateIn

+ public function handleCompleteAnimateIn(String type, Object[] args, Object obj) +
+ The default onComplete handler for the in-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleCompleteAnimateOut

+ public function handleCompleteAnimateOut(String type, Object[] args, Object obj) +
+ The default onComplete handler for the out-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleStartAnimateIn

+ public function handleStartAnimateIn(String type, Object[] args, Object obj) +
+ The default onStart handler for the in-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleStartAnimateOut

+ public function handleStartAnimateOut(String type, Object[] args, Object obj) +
+ The default onStart handler for the out-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleTweenAnimateIn

+ public function handleTweenAnimateIn(String type, Object[] args, Object obj) +
+ The default onTween handler for the in-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

handleTweenAnimateOut

+ public function handleTweenAnimateOut(String type, Object[] args, Object obj) +
+ The default onTween handler for the out-animation. +
+ Parameters: +
  • type : String
    The CustomEvent type
  • args : Object[]
    The CustomEvent arguments
  • obj : Object
    The scope object
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

init

+ public function init() +
+ Initializes the animation classes and events. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContainerEffect.
+
+ +
+

toString

+ public function toString() +
+ Returns a string representation of the object. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • String
    The string representation of the ContainerEffect
  • +
+
+
+
This method is defined by ContainerEffect.
+
+
+ +
+
+ Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenu.html b/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenu.html new file mode 100644 index 000000000..b134ef81d --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenu.html @@ -0,0 +1,2738 @@ + + + + YAHOO.widget.ContextMenu + + + + + +
+ +

Class YAHOO.widget.ContextMenu

+ + + + + +
Package:YAHOO.widget
Class:ContextMenu
Extends:Menu
Defined In:menu.js
+
+ Creates a list of options or commands which are made visible in response to +an HTML element's "contextmenu" event ("mousedown" for Opera).
+
+ +

Public Properties

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDefined By
 BOTTOM_LEFT<static> : StringOverlay
<static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
 BOTTOM_RIGHT<static> : StringOverlay
<static> Constant representing the bottom right corner of an element, used for configuring the context element ...
 CSS_BODY<static> : StringModule
<static> Constant representing the module body
 CSS_CLASS_NAME : StringMenu
String representing the CSS class(es) to be applied to the +menu's <div> element.
 CSS_FOOTER<static> : StringModule
<static> Constant representing the module footer
 CSS_HEADER<static> : StringModule
<static> Constant representing the module header
 CSS_MODULE<static> : StringModule
<static> Constant for the default CSS class name that represents a Module
 CSS_OVERLAY<static> : StringOverlay
<static> Constant representing the default CSS class used for an Overlay
 GROUP_TITLE_TAG_NAME : StringMenu
String representing the tagname of the HTML element used to +title the menu's item groups.
 ITEM_TYPE : YAHOO.widget.MenuItemMenu
Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> el...
 TOP_LEFT<static> : StringOverlay
<static> Constant representing the top left corner of an element, used for configuring the context element alig...
 TOP_RIGHT<static> : StringOverlay
<static> Constant representing the top right corner of an element, used for configuring the context element ali...
 activeItem : YAHOO.widget.MenuItemMenu
Object reference to the item in the menu that has focus.
 body : HTMLElementModule
The body element, denoted with CSS class "bd"
 browser : StringModule
String representing the current user-agent browser
 cfg : YAHOO.util.ConfigModule
The Module's Config object used for monitoring configuration properties.
 contextEventTarget : + ContextMenu
Object reference for the HTML element that was the target of the +"contextmenu" DOM event ("mousedown" for Opera) that...
 contructor : FunctionModule
The class's constructor function
 element : HTMLElementModule
The main module element that contains the header, body, and footer
 footer : HTMLElementModule
The footer element, denoted with CSS class "ft"
 header : HTMLElementModule
The header element, denoted with CSS class "hd"
 http : StringModule
<static> Constant representing the prefix path to use for non-secure images
 https : StringModule
<static> Constant representing the prefix path to use for securely served images
 id : StringModule
The id of the element
 imageRoot : StringModule
The String representing the image root
 isSecure : BooleanModule
Boolean representing whether or not the current browsing context is secure (https)
 itemData : ArrayMenu
Array of items to be added to the menu. The array can contain +strings representing the text for each item to be crea...
 javascript : StringModule
<static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
 lazyLoad : BooleanMenu
Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of t...
 parent : YAHOO.widget.MenuItemMenu
Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the confi...
 platform : StringModule
String representing the current user-agent platform
 srcElement : + Menu
Object reference to the HTML element (either +<select> or <div>) used to +create the menu.
+ +

Public Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MethodDefined By
 ContextMenu()ContextMenu
 _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
"click" event handler for the menu. +@protected
 _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
"keydown" event handler for the menu. +@protected
 _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
"mouseout" event handler for the menu. +@protected
 _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
"mouseover" event handler for the menu. +@protected
 addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
Appends an item to the menu.
 addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
Adds an array of items to the menu.
 align(String elementAlign, String contextAlign) : voidOverlay
Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
 appendToBody(HTMLElement element) : voidModule
Appends the passed element to the body. If no body is present, one will be automatically created.
 appendToFooter(HTMLElement element) : voidModule
Appends the passed element to the footer. If no footer is present, one will be automatically created.
 appendToHeader(HTMLElement element) : voidModule
Appends the passed element to the header. If no header is present, one will be automatically created.
 center() : voidOverlay
Centers the container in the viewport.
 clearActiveItem(Boolean p_bBlur) : voidMenu
Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu.
 configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "constraintoviewport" property is changed.
 configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
Event handler for when the "container" configuration property +of the menu changes.
 configContext(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "context" property is changed.
 configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "fixedcenter" property is changed.
 configHeight(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "height" property is changed.
 configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
Event handler for when the "hidedelay" configuration property +of the menu changes.
 configIframe(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "iframe" property is changed.
 configMonitorResize(String type, Object[] args, Object obj) : voidModule
Default event handler for the "monitorresize" configuration property
 configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
Event handler for when the "position" configuration property +of the menu changes.
 configTrigger(String p_sType, Array p_aArgs, YAHOO.widget.ContextMenu p_oMenu) : voidContextMenu
Event handler for when the value of the "trigger" configuration +property changes.
 configVisible(String type, Object[] args, Object obj) : voidModule
Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
 configWidth(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "width" property is changed.
 configX(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "x" property is changed.
 configXY(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "xy" property is changed.
 configY(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "y" property is changed.
 configzIndex(String type, Object[] args, Object obj) : voidOverlay
The default event handler fired when the "zIndex" property is changed.
 destroy() : voidContextMenu
Removes the context menu's <div> element +(and accompanying child nodes) from the document.
 doCenterOnDOMEvent() : voidOverlay
Center event handler used for centering on scroll/resize, but only if the Overlay is visible
 enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
 getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
Returns the item at the specified index.
 getItemGroups() : ArrayMenu
Returns a multi-dimensional array of all of the items in the menu.
 getRoot() : voidMenu
Finds the menu's root menu.
 hide() : voidModule
Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
 hideIframe() : voidOverlay
Hides the iframe shim, if it has been enabled
 hideMacGeckoScrollbars() : voidOverlay
Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
 init(String p_oElement, String p_oElement, , Object p_oConfig) : voidContextMenu
The ContextMenu class's initialization method. This method is +automatically called by the constructor, and sets up al...
 initDefaultConfig() : voidContextMenu
Initializes the class's configurable properties which can be +changed using the context menu's Config object ("cfg").
 initEvents() : voidModule
Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
 initResizeMonitor() : voidModule
Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
 insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
Inserts an item into the menu at the specified index.
 moveTo(Number x, Number y) : voidOverlay
Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
 onDomResize(DOMEvent e, Object obj) : voidModule
Event handler fired when the resize monitor element is resized.
 removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
Removes the specified item from the menu.
 render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
 setBody(String bodyContent, HTMLElement bodyContent) : voidModule
Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
 setFooter(String footerContent, HTMLElement footerContent) : voidModule
Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
 setHeader(String headerContent, HTMLElement headerContent) : voidModule
Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
 setInitialFocus() : voidMenu
Sets focus to the menu's first enabled item.
 setInitialSelection() : voidMenu
Sets the "selected" configuration property of the menu's first +enabled item to "true."
 setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
Sets the title of a group of menu items.
 show() : voidModule
Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
 showIframe() : voidOverlay
Shows the iframe shim, if it has been enabled
 showMacGeckoScrollbars() : voidOverlay
Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
 syncPosition() : voidOverlay
Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
 toString() : StringContextMenu
Returns a string representing the context menu.
 windowResizeHandler<static>(DOMEvent e) : voidOverlay
<static> The DOM event handler used to fire the CustomEvent for window resize
 windowScrollHandler<static>(DOMEvent e) : voidOverlay
<static> The DOM event handler used to fire the CustomEvent for window scroll
+ +

Public Events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EventDefined By
 YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
A singleton CustomEvent used for reacting to the DOM event for window resize
 YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
A singleton CustomEvent used for reacting to the DOM event for window scroll
 appendEvent : ()Module
CustomEvent fired when the Module is appended to the DOM
 beforeHideEvent : ()Module
CustomEvent fired before the Module is hidden
 beforeInitEvent : (class classRef)Module
CustomEvent fired prior to class initalization.
 beforeMoveEvent : (Number x, Number y)Overlay
CustomEvent fired before the Overlay is moved.
 beforeRenderEvent : ()Module
CustomEvent fired before the Module is rendered
 beforeShowEvent : ()Module
CustomEvent fired before the Module is shown
 changeBodyEvent : (String/HTMLElement content)Module
CustomEvent fired when the body content of the Module is modified
 changeContentEvent : ()Module
CustomEvent fired when the content of the Module is modified
 changeFooterEvent : (String/HTMLElement content)Module
CustomEvent fired when the footer content of the Module is modified
 changeHeaderEvent : (String/HTMLElement content)Module
CustomEvent fired when the header content of the Module is modified
 clickEvent : ()Menu
Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
 destroyEvent : ()Module
CustomEvent fired when the Module is destroyed
 hideEvent : ()Module
CustomEvent fired after the Module is hidden
 initEvent : (class classRef)Module
CustomEvent fired after class initalization.
 itemAddedEvent : ()Menu
Fires when an item is added to the menu.
 itemRemovedEvent : ()Menu
Fires when an item is removed to the menu.
 keyDownEvent : ()Menu
Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an arg...
 keyPressEvent : ()Menu
Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event ob...
 keyUpEvent : ()Menu
Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an ar...
 mouseDownEvent : ()Menu
Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
 mouseOutEvent : ()Menu
Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
 mouseOverEvent : ()Menu
Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
 mouseUpEvent : ()Menu
Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an...
 moveEvent : (Number x, Number y)Overlay
CustomEvent fired after the Overlay is moved.
 renderEvent : ()Module
CustomEvent fired after the Module is rendered
 showEvent : ()Module
CustomEvent fired after the Module is shown
+ +

Property Details

+
+ +
+

BOTTOM_LEFT<static>

+ public String BOTTOM_LEFT<static> +
+ <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
+
This property is defined by Overlay.
+
+ +
+

BOTTOM_RIGHT<static>

+ public String BOTTOM_RIGHT<static> +
+ <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
+
This property is defined by Overlay.
+
+ +
+

CSS_BODY<static>

+ public String CSS_BODY<static> +
+ <static> Constant representing the module body
+
This property is defined by Module.
+
+ +
+

CSS_CLASS_NAME

+ public String CSS_CLASS_NAME +
+ String representing the CSS class(es) to be applied to the +menu's <div> element.
+
This property is defined by Menu.
+
+ +
+

CSS_FOOTER<static>

+ public String CSS_FOOTER<static> +
+ <static> Constant representing the module footer
+
This property is defined by Module.
+
+ +
+

CSS_HEADER<static>

+ public String CSS_HEADER<static> +
+ <static> Constant representing the module header
+
This property is defined by Module.
+
+ +
+

CSS_MODULE<static>

+ public String CSS_MODULE<static> +
+ <static> Constant for the default CSS class name that represents a Module
+
This property is defined by Module.
+
+ +
+

CSS_OVERLAY<static>

+ public String CSS_OVERLAY<static> +
+ <static> Constant representing the default CSS class used for an Overlay
+
This property is defined by Overlay.
+
+ +
+

GROUP_TITLE_TAG_NAME

+ public String GROUP_TITLE_TAG_NAME +
+ String representing the tagname of the HTML element used to +title the menu's item groups.
+
This property is defined by Menu.
+
+ +
+

ITEM_TYPE

+ public YAHOO.widget.MenuItem ITEM_TYPE +
+ Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element.
+
This property is defined by Menu.
+
+ +
+

TOP_LEFT<static>

+ public String TOP_LEFT<static> +
+ <static> Constant representing the top left corner of an element, used for configuring the context element alignment
+
This property is defined by Overlay.
+
+ +
+

TOP_RIGHT<static>

+ public String TOP_RIGHT<static> +
+ <static> Constant representing the top right corner of an element, used for configuring the context element alignment
+
This property is defined by Overlay.
+
+ +
+

activeItem

+ public YAHOO.widget.MenuItem activeItem +
+ Object reference to the item in the menu that has focus.
+
This property is defined by Menu.
+
+ +
+

body

+ public HTMLElement body +
+ The body element, denoted with CSS class "bd"
+
This property is defined by Module.
+
+ +
+

browser

+ public String browser +
+ String representing the current user-agent browser
+
This property is defined by Module.
+
+ +
+

cfg

+ public YAHOO.util.Config cfg +
+ The Module's Config object used for monitoring configuration properties.
+
This property is defined by Module.
+
+ + + +
+

contructor

+ public Function contructor +
+ The class's constructor function
+
This property is defined by Module.
+
+ +
+

element

+ public HTMLElement element +
+ The main module element that contains the header, body, and footer
+
This property is defined by Module.
+
+ +
+

footer

+ public HTMLElement footer +
+ The footer element, denoted with CSS class "ft"
+
This property is defined by Module.
+
+ +
+

header

+ public HTMLElement header +
+ The header element, denoted with CSS class "hd"
+
This property is defined by Module.
+
+ +
+

http

+ public String http +
+ <static> Constant representing the prefix path to use for non-secure images
+
This property is defined by Module.
+
+ +
+

https

+ public String https +
+ <static> Constant representing the prefix path to use for securely served images
+
This property is defined by Module.
+
+ +
+

id

+ public String id +
+ The id of the element
+
This property is defined by Module.
+
+ +
+

imageRoot

+ public String imageRoot +
+ The String representing the image root
+
This property is defined by Module.
+
+ +
+

isSecure

+ public Boolean isSecure +
+ Boolean representing whether or not the current browsing context is secure (https)
+
This property is defined by Module.
+
+ +
+

itemData

+ public Array itemData +
+ Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal.
+
This property is defined by Menu.
+
+ +
+

javascript

+ public String javascript +
+ <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
+
This property is defined by Module.
+
+ +
+

lazyLoad

+ public Boolean lazyLoad +
+ Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal.
+
This property is defined by Menu.
+
+ +
+

parent

+ public YAHOO.widget.MenuItem parent +
+ Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal.
+
This property is defined by Menu.
+
+ +
+

platform

+ public String platform +
+ String representing the current user-agent platform
+
This property is defined by Module.
+
+ + +
+ + +

Constructor Details

+
+
+

ContextMenu

+ public function ContextMenu() +
+
+ Parameters: +
  • None.
+
+
+
+
+ +

Method Details

+
+ +
+

_onClick

+ public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ "click" event handler for the menu. +@protected +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

_onKeyDown

+ public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ "keydown" event handler for the menu. +@protected +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

_onMouseOut

+ public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ "mouseout" event handler for the menu. +@protected +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

_onMouseOver

+ public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ "mouseover" event handler for the menu. +@protected +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addItem

+ public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
+ Appends an item to the menu. +
+ Parameters: +
  • p_oItem : YAHOO.widget.MenuItem
    Object reference for the MenuItem instance to be added to the menu.
  • p_oItem : String
    String specifying the text of the item to be added to the menu.
  • p_oItem : Object
    Object literal containing a set of menu item configuration properties.
  • p_nGroupIndex : Number
    Optional. Number indicating the group to which the item belongs.
+ Returns: +
    +
  • YAHOO.widget.MenuItem
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

addItems

+ public function addItems(Array p_aItems, Number p_nGroupIndex) +
+ Adds an array of items to the menu. +
+ Parameters: +
  • p_aItems : Array
    Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
  • p_nGroupIndex : Number
    Optional. Number specifying the group to which the items belongs.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

align

+ public function align(String elementAlign, String contextAlign) +
+ Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
+ Parameters: +
  • elementAlign : String
    The String representing the corner of the Overlay that should be aligned to the context element
  • contextAlign : String
    The corner of the context element that the elementAlign corner should stick to.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

appendToBody

+ public function appendToBody(HTMLElement element) +
+ Appends the passed element to the body. If no body is present, one will be automatically created. +
+ Parameters: +
  • element : HTMLElement
    The element to append to the body
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

appendToFooter

+ public function appendToFooter(HTMLElement element) +
+ Appends the passed element to the footer. If no footer is present, one will be automatically created. +
+ Parameters: +
  • element : HTMLElement
    The element to append to the footer
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

appendToHeader

+ public function appendToHeader(HTMLElement element) +
+ Appends the passed element to the header. If no header is present, one will be automatically created. +
+ Parameters: +
  • element : HTMLElement
    The element to append to the header
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

center

+ public function center() +
+ Centers the container in the viewport. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

clearActiveItem

+ public function clearActiveItem(Boolean p_bBlur) +
+ Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
+ Parameters: +
  • p_bBlur : Boolean
    Boolean indicating if the menu's active item should be blurred.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

configConstrainToViewport

+ public function configConstrainToViewport(String type, Object[] args, Object obj) +
+ The default event handler fired when the "constraintoviewport" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configContainer

+ public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ Event handler for when the "container" configuration property +of the menu changes. +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

configContext

+ public function configContext(String type, Object[] args, Object obj) +
+ The default event handler fired when the "context" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configFixedCenter

+ public function configFixedCenter(String type, Object[] args, Object obj) +
+ The default event handler fired when the "fixedcenter" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configHeight

+ public function configHeight(String type, Object[] args, Object obj) +
+ The default event handler fired when the "height" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configHideDelay

+ public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ Event handler for when the "hidedelay" configuration property +of the menu changes. +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

configIframe

+ public function configIframe(String type, Object[] args, Object obj) +
+ The default event handler fired when the "iframe" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configMonitorResize

+ public function configMonitorResize(String type, Object[] args, Object obj) +
+ Default event handler for the "monitorresize" configuration property +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

configPosition

+ public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
+ Event handler for when the "position" configuration property +of the menu changes. +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.Menu
    Object representing the menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

configTrigger

+ public function configTrigger(String p_sType, Array p_aArgs, YAHOO.widget.ContextMenu p_oMenu) +
+ Event handler for when the value of the "trigger" configuration +property changes. +
+ Parameters: +
  • p_sType : String
    String representing the name of the event that was fired.
  • p_aArgs : Array
    Array of arguments sent when the event was fired.
  • p_oMenu : YAHOO.widget.ContextMenu
    Object representing the context menu that fired the event.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContextMenu.
+
+ +
+

configVisible

+ public function configVisible(String type, Object[] args, Object obj) +
+ Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

configWidth

+ public function configWidth(String type, Object[] args, Object obj) +
+ The default event handler fired when the "width" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configX

+ public function configX(String type, Object[] args, Object obj) +
+ The default event handler fired when the "x" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configXY

+ public function configXY(String type, Object[] args, Object obj) +
+ The default event handler fired when the "xy" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configY

+ public function configY(String type, Object[] args, Object obj) +
+ The default event handler fired when the "y" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

configzIndex

+ public function configzIndex(String type, Object[] args, Object obj) +
+ The default event handler fired when the "zIndex" property is changed. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

destroy

+ public function destroy() +
+ Removes the context menu's <div> element +(and accompanying child nodes) from the document. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by ContextMenu.
+
+ +
+

doCenterOnDOMEvent

+ public function doCenterOnDOMEvent() +
+ Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

enforceConstraints

+ public function enforceConstraints(String type, Object[] args, Object obj) +
+ The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
+ Parameters: +
  • type : String
    The CustomEvent type (usually the property name)
  • args : Object[]
    The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
  • obj : Object
    The scope object. For configuration handlers, this will usually equal the owner.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

getItem

+ public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
+ Returns the item at the specified index. +
+ Parameters: +
  • p_nItemIndex : Number
    Number indicating the ordinal position of the item to be retrieved.
  • p_nGroupIndex : Number
    Optional. Number indicating the group to which the item belongs.
+ Returns: +
    +
  • YAHOO.widget.MenuItem
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

getItemGroups

+ public function getItemGroups() +
+ Returns a multi-dimensional array of all of the items in the menu. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • Array
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

getRoot

+ public function getRoot() +
+ Finds the menu's root menu. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Menu.
+
+ +
+

hide

+ public function hide() +
+ Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Module.
+
+ +
+

hideIframe

+ public function hideIframe() +
+ Hides the iframe shim, if it has been enabled +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

hideMacGeckoScrollbars

+ public function hideMacGeckoScrollbars() +
+ Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
+ Parameters: +
  • None.
+ Returns: +
    +
  • void
  • +
+
+
+
This method is defined by Overlay.
+
+ +
+

init

+ public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the context menu. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be +changed using the context menu's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the context menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenuItem.html b/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenuItem.html new file mode 100644 index 000000000..ecf507573 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.ContextMenuItem.html @@ -0,0 +1,1277 @@ + + + + YAHOO.widget.ContextMenuItem + + + + + +
    + +

    Class YAHOO.widget.ContextMenuItem

    + + + + + +
    Package:YAHOO.widget
    Class:ContextMenuItem
    Extends:MenuItem
    Defined In:menu.js
    +
    + Creates an item for a context menu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image.
     CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the checked state.
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator.
     CSS_CLASS_NAME : StringMenuItem
    String representing the CSS class(es) to be applied to the +<li> element of the menu item.
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image when the item is disabled.
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the disabled checked state.
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disab...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled.
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
     IMG_ROOT : StringMenuItem
    String representing the prefix path to use for +non-secure images.
     IMG_ROOT_SSL : StringMenuItem
    String representing the prefix path to use for securely +served images.
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the selected checked state.
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected.
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +menu item's submenu arrow indicator.
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HT...
     browser : StringMenuItem
    String representing the browser.
     constructor : YAHOO.widget.MenuItemMenuItem
    Object reference to the menu item's constructor function.
     element : + MenuItem
    Object reference to the menu item's +<li> element.
     groupIndex : NumberMenuItem
    Number indicating the index of the group to which the menu +item belongs.
     imageRoot : StringMenuItem
    String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    Number indicating the ordinal position of the menu item in +its group.
     isSecure : BooleanMenuItem
    Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    Object reference to the menu item's parent menu.
     srcElement : + MenuItem
    Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used create the me...
     submenuIndicator : + MenuItem
    Object reference to the <img> element +used to create the submenu indicator for the menu item.
     value : ObjectMenuItem
    Object reference to the menu item's value.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     ContextMenuItem()ContextMenuItem
     blur() : voidMenuItem
    Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's previous enabled sibling.
     init(String p_oObject, , ContextMenuItem
    The ContextMenuItem class's initialization method. This method +is automatically called by the constructor, and sets u...
     initDefaultConfig() : voidMenuItem
    Initializes an item's configurable properties.
     toString() : StringContextMenuItem
    Returns a string representing the context menu item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     keyPressEvent : ()MenuItem
    Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an...
     keyUpEvent : ()MenuItem
    Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     mouseDownEvent : ()MenuItem
    Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + String representing the CSS class(es) to be applied to the +<li> element of the menu item.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image when the item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the disabled checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + String representing the prefix path to use for +non-secure images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + String representing the prefix path to use for securely +served images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the selected checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +menu item's submenu arrow indicator.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + Object reference to the menu item's constructor function.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + Number indicating the index of the group to which the menu +item belongs.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + Number indicating the ordinal position of the menu item in +its group.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + Object reference to the menu item's parent menu.
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + Object reference to the menu item's value.
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    ContextMenuItem

    + public function ContextMenuItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + The ContextMenuItem class's initialization method. This method +is automatically called by the constructor, and sets up all DOM references +for pre-existing markup, and creates required markup if it is not +already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the context menu item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the context menu item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the context menu item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by ContextMenuItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the context menu item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by ContextMenuItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSArray.html b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSArray.html new file mode 100644 index 000000000..e60940590 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSArray.html @@ -0,0 +1,447 @@ + + + + YAHOO.widget.DS_JSArray + + + + + +
    + +

    Class YAHOO.widget.DS_JSArray

    + + + + + +
    Package:YAHOO.widget
    Class:DS_JSArray
    Extends:DataSource
    Defined In:autocomplete.js
    +
    + Implementation of YAHOO.widget.DataSource using a native Javascript array as +its live data source.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ERROR_DATANULL : StringDataSource
    <static> Error message for null data responses.
     ERROR_DATAPARSE : StringDataSource
    <static> Error message for data responses with parsing errors.
     data : ArrayDS_JSArray
    In-memory Javascript array of strings.
     maxCacheEntries : NumberDataSource
    Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connect...
     queryMatchCase : BooleanDataSource
    Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return result...
     queryMatchContains : BooleanDataSource
    Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and query...
     queryMatchSubset : BooleanDataSource
    Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return match...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DS_JSArray(aData {String[]}, [oConfigs {Object}])DS_JSArray
     doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDS_JSArray
    Queries the live data source defined by data for results. Results are passed +back to a callback function.
     flushCache() : voidDataSource
    Flushes cache.
     getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDataSource
    Retrieves query results, first checking the local cache, then making the +query request to the live data source as def...
     toString() : StringDataSource
    Public accessor to the unique name of the DataSource instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     cacheFlushEvent : (oSelf {Object})DataSource
    Fired when the local cache is flushed.
     cacheQueryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the local cache.
     dataErrorEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, sMsg {String})DataSource
    Fired when an error is encountered with the live data source.
     getCachedResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the local cache.
     getResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the live data source.
     queryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the live data source.
    + +

    Property Details

    +
    + +
    +

    ERROR_DATANULL

    + public String ERROR_DATANULL +
    + <static> Error message for null data responses.
    +
    This property is defined by DataSource.
    +
    + +
    +

    ERROR_DATAPARSE

    + public String ERROR_DATAPARSE +
    + <static> Error message for data responses with parsing errors.
    +
    This property is defined by DataSource.
    +
    + +
    +

    data

    + public Array data +
    + In-memory Javascript array of strings.
    +
    This property is defined by DS_JSArray.
    +
    + +
    +

    maxCacheEntries

    + public Number maxCacheEntries +
    + Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connections. Recommended only for data +sources that return comprehensive results for queries or when stale data is +not an issue.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchCase

    + public Boolean queryMatchCase +
    + Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return results for case-sensitive +matches.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchContains

    + public Boolean queryMatchContains +
    + Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and queryMatchContains is true, the cache +returns results that "contain" the query string. By default, +queryMatchContains is set to false, meaning the cache only returns results +that "start with" the query string.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchSubset

    + public Boolean queryMatchSubset +
    + Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return matching cached results. For +instance, if the first query is for "abc" susequent queries that start with +"abc", like "abcd", will be queried against the cache, and not the live data +source. Recommended only for DataSources that return comprehensive results +for queries with very few characters.
    +
    This property is defined by DataSource.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DS_JSArray

    + public function DS_JSArray(aData {String[]}, [oConfigs {Object}]) +
    +
    + Parameters: +
    • {String[]} : aData
      In-memory Javascript array of simple string data.
    • {Object} : oConfigs
      (optional) Object literal of config params.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    doQuery

    + public function doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Queries the live data source defined by data for results. Results are passed +back to a callback function. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DS_JSArray.
    +
    + +
    +

    flushCache

    + public function flushCache() +
    + Flushes cache. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    getResults

    + public function getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Retrieves query results, first checking the local cache, then making the +query request to the live data source as defined by the function doQuery. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the DataSource instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the DataSource instance
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    +
    + +

    Event Details

    +
    + +
    +

    cacheFlushEvent

    + public event cacheFlushEvent +
    + Fired when the local cache is flushed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    cacheQueryEvent

    + public event cacheQueryEvent +
    + Fired when a query is made to the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    dataErrorEvent

    + public event dataErrorEvent +
    + Fired when an error is encountered with the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {String} : sMsg
      Error message string
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getCachedResultsEvent

    + public event getCachedResultsEvent +
    + Fired when data is retrieved from the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getResultsEvent

    + public event getResultsEvent +
    + Fired when data is retrieved from the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    queryEvent

    + public event queryEvent +
    + Fired when a query is made to the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSFunction.html b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSFunction.html new file mode 100644 index 000000000..c74390f98 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_JSFunction.html @@ -0,0 +1,447 @@ + + + + YAHOO.widget.DS_JSFunction + + + + + +
    + +

    Class YAHOO.widget.DS_JSFunction

    + + + + + +
    Package:YAHOO.widget
    Class:DS_JSFunction
    Extends:DataSource
    Defined In:autocomplete.js
    +
    + Implementation of YAHOO.widget.DataSource using a native Javascript function as +its live data source.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ERROR_DATANULL : StringDataSource
    <static> Error message for null data responses.
     ERROR_DATAPARSE : StringDataSource
    <static> Error message for data responses with parsing errors.
     dataFunction : HTMLFunctionDS_JSFunction
    In-memory Javascript function that returns query results.
     maxCacheEntries : NumberDataSource
    Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connect...
     queryMatchCase : BooleanDataSource
    Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return result...
     queryMatchContains : BooleanDataSource
    Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and query...
     queryMatchSubset : BooleanDataSource
    Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return match...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DS_JSFunction(oFunction {String}, [oConfigs {Object}])DS_JSFunction
     doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDS_JSFunction
    Queries the live data source defined by function for results. Results are +passed back to a callback function.
     flushCache() : voidDataSource
    Flushes cache.
     getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDataSource
    Retrieves query results, first checking the local cache, then making the +query request to the live data source as def...
     toString() : StringDataSource
    Public accessor to the unique name of the DataSource instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     cacheFlushEvent : (oSelf {Object})DataSource
    Fired when the local cache is flushed.
     cacheQueryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the local cache.
     dataErrorEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, sMsg {String})DataSource
    Fired when an error is encountered with the live data source.
     getCachedResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the local cache.
     getResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the live data source.
     queryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the live data source.
    + +

    Property Details

    +
    + +
    +

    ERROR_DATANULL

    + public String ERROR_DATANULL +
    + <static> Error message for null data responses.
    +
    This property is defined by DataSource.
    +
    + +
    +

    ERROR_DATAPARSE

    + public String ERROR_DATAPARSE +
    + <static> Error message for data responses with parsing errors.
    +
    This property is defined by DataSource.
    +
    + +
    +

    dataFunction

    + public HTMLFunction dataFunction +
    + In-memory Javascript function that returns query results.
    +
    This property is defined by DS_JSFunction.
    +
    + +
    +

    maxCacheEntries

    + public Number maxCacheEntries +
    + Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connections. Recommended only for data +sources that return comprehensive results for queries or when stale data is +not an issue.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchCase

    + public Boolean queryMatchCase +
    + Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return results for case-sensitive +matches.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchContains

    + public Boolean queryMatchContains +
    + Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and queryMatchContains is true, the cache +returns results that "contain" the query string. By default, +queryMatchContains is set to false, meaning the cache only returns results +that "start with" the query string.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchSubset

    + public Boolean queryMatchSubset +
    + Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return matching cached results. For +instance, if the first query is for "abc" susequent queries that start with +"abc", like "abcd", will be queried against the cache, and not the live data +source. Recommended only for DataSources that return comprehensive results +for queries with very few characters.
    +
    This property is defined by DataSource.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DS_JSFunction

    + public function DS_JSFunction(oFunction {String}, [oConfigs {Object}]) +
    +
    + Parameters: +
    • {String} : oFunction
      In-memory Javascript function that returns query results as an array of objects.
    • {Object} : oConfigs
      (optional) Object literal of config params.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    doQuery

    + public function doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Queries the live data source defined by function for results. Results are +passed back to a callback function. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DS_JSFunction.
    +
    + +
    +

    flushCache

    + public function flushCache() +
    + Flushes cache. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    getResults

    + public function getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Retrieves query results, first checking the local cache, then making the +query request to the live data source as defined by the function doQuery. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the DataSource instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the DataSource instance
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    +
    + +

    Event Details

    +
    + +
    +

    cacheFlushEvent

    + public event cacheFlushEvent +
    + Fired when the local cache is flushed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    cacheQueryEvent

    + public event cacheQueryEvent +
    + Fired when a query is made to the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    dataErrorEvent

    + public event dataErrorEvent +
    + Fired when an error is encountered with the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {String} : sMsg
      Error message string
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getCachedResultsEvent

    + public event getCachedResultsEvent +
    + Fired when data is retrieved from the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getResultsEvent

    + public event getResultsEvent +
    + Fired when data is retrieved from the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    queryEvent

    + public event queryEvent +
    + Fired when a query is made to the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.DS_XHR.html b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_XHR.html new file mode 100644 index 000000000..d7f9d5cd3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.DS_XHR.html @@ -0,0 +1,652 @@ + + + + YAHOO.widget.DS_XHR + + + + + +
    + +

    Class YAHOO.widget.DS_XHR

    + + + + + +
    Package:YAHOO.widget
    Class:DS_XHR
    Extends:DataSource
    Defined In:autocomplete.js
    +
    + Implementation of YAHOO.widget.DataSource using XML HTTP requests that return +query results.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ERROR_DATANULL : StringDataSource
    <static> Error message for null data responses.
     ERROR_DATAPARSE : StringDataSource
    <static> Error message for data responses with parsing errors.
     ERROR_DATAXHR : StringDS_XHR
    <static> Error message for XHR failure.
     TYPE_FLAT : NumberDS_XHR
    <static> Flat-file data type.
     TYPE_JSON : NumberDS_XHR
    <static> JSON data type.
     TYPE_XML : NumberDS_XHR
    <static> XML data type.
     connMgr : ObjectDS_XHR
    Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager ut...
     connTimeout : NumberDS_XHR
    Number of milliseconds the XHR connection will wait for a server response. A +a value of zero indicates the XHR connec...
     maxCacheEntries : NumberDataSource
    Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connect...
     queryMatchCase : BooleanDataSource
    Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return result...
     queryMatchContains : BooleanDataSource
    Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and query...
     queryMatchSubset : BooleanDataSource
    Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return match...
     responseStripAfter : StringDS_XHR
    String after which to strip results. If the results from the XHR are sent +back as HTML, the gzip HTML comment appears...
     responseType : StringDS_XHR
    XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML +and YAHOO.widget.DS_XHR.TYPE...
     scriptQueryAppend : StringDS_XHR
    String of key/value pairs to append to requests made to scriptURI. Define +this string when you want to send additiona...
     scriptQueryParam : StringDS_XHR
    Query string parameter name sent to scriptURI. For instance, queries will be +sent to <scriptURI>?<scriptQ...
     scriptURI : StringDS_XHR
    Absolute or relative URI to script that returns query results. For instance, +queries will be sent to <scriptURI&#...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DS_XHR(sScriptURI {String}, aSchema {String[]}, [oConfigs {Object}])DS_XHR
     doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDS_XHR
    Queries the live data source defined by scriptURI for results. Results are +passed back to a callback function.
     flushCache() : voidDataSource
    Flushes cache.
     getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDataSource
    Retrieves query results, first checking the local cache, then making the +query request to the live data source as def...
     parseResponse(sQuery {String}, oResponse {Object}, oParent {Object}) : sDS_XHR
    Parses raw response data into an array of result objects. The result data key +is always stashed in the [0] element of...
     toString() : StringDataSource
    Public accessor to the unique name of the DataSource instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     cacheFlushEvent : (oSelf {Object})DataSource
    Fired when the local cache is flushed.
     cacheQueryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the local cache.
     dataErrorEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, sMsg {String})DataSource
    Fired when an error is encountered with the live data source.
     getCachedResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the local cache.
     getResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the live data source.
     queryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the live data source.
    + +

    Property Details

    +
    + +
    +

    ERROR_DATANULL

    + public String ERROR_DATANULL +
    + <static> Error message for null data responses.
    +
    This property is defined by DataSource.
    +
    + +
    +

    ERROR_DATAPARSE

    + public String ERROR_DATAPARSE +
    + <static> Error message for data responses with parsing errors.
    +
    This property is defined by DataSource.
    +
    + +
    +

    ERROR_DATAXHR

    + public String ERROR_DATAXHR +
    + <static> Error message for XHR failure.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    TYPE_FLAT

    + public Number TYPE_FLAT +
    + <static> Flat-file data type.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    TYPE_JSON

    + public Number TYPE_JSON +
    + <static> JSON data type.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    TYPE_XML

    + public Number TYPE_XML +
    + <static> XML data type.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    connMgr

    + public Object connMgr +
    + Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager utility.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    connTimeout

    + public Number connTimeout +
    + Number of milliseconds the XHR connection will wait for a server response. A +a value of zero indicates the XHR connection will wait forever. Any value +greater than zero will use the Connection utility's Auto-Abort feature.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    maxCacheEntries

    + public Number maxCacheEntries +
    + Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connections. Recommended only for data +sources that return comprehensive results for queries or when stale data is +not an issue.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchCase

    + public Boolean queryMatchCase +
    + Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return results for case-sensitive +matches.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchContains

    + public Boolean queryMatchContains +
    + Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and queryMatchContains is true, the cache +returns results that "contain" the query string. By default, +queryMatchContains is set to false, meaning the cache only returns results +that "start with" the query string.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchSubset

    + public Boolean queryMatchSubset +
    + Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return matching cached results. For +instance, if the first query is for "abc" susequent queries that start with +"abc", like "abcd", will be queried against the cache, and not the live data +source. Recommended only for DataSources that return comprehensive results +for queries with very few characters.
    +
    This property is defined by DataSource.
    +
    + +
    +

    responseStripAfter

    + public String responseStripAfter +
    + String after which to strip results. If the results from the XHR are sent +back as HTML, the gzip HTML comment appears at the end of the data and should +be ignored.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    responseType

    + public String responseType +
    + XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML +and YAHOO.widget.DS_XHR.TYPE_FLAT.
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    scriptQueryAppend

    + public String scriptQueryAppend +
    + String of key/value pairs to append to requests made to scriptURI. Define +this string when you want to send additional query parameters to your script. +When defined, queries will be sent to +<scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend>
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    scriptQueryParam

    + public String scriptQueryParam +
    + Query string parameter name sent to scriptURI. For instance, queries will be +sent to <scriptURI>?<scriptQueryParam>=userinput
    +
    This property is defined by DS_XHR.
    +
    + +
    +

    scriptURI

    + public String scriptURI +
    + Absolute or relative URI to script that returns query results. For instance, +queries will be sent to <scriptURI>?<scriptQueryParam>=userinput
    +
    This property is defined by DS_XHR.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DS_XHR

    + public function DS_XHR(sScriptURI {String}, aSchema {String[]}, [oConfigs {Object}]) +
    +
    + Parameters: +
    • {String} : sScriptURI
      Absolute or relative URI to script that returns query results as JSON, XML, or delimited flat-file data.
    • {String[]} : aSchema
      Data schema definition of results.
    • {Object} : oConfigs
      (optional) Object literal of config params.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    doQuery

    + public function doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Queries the live data source defined by scriptURI for results. Results are +passed back to a callback function. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DS_XHR.
    +
    + +
    +

    flushCache

    + public function flushCache() +
    + Flushes cache. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    getResults

    + public function getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Retrieves query results, first checking the local cache, then making the +query request to the live data source as defined by the function doQuery. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    parseResponse

    + public function parseResponse(sQuery {String}, oResponse {Object}, oParent {Object}) +
    + Parses raw response data into an array of result objects. The result data key +is always stashed in the [0] element of each result object. +
    + Parameters: +
    • {String} : sQuery
      Query string.
    • {Object} : oResponse
      The raw response data to parse.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • s
      {Object[]} Array of result objects.
    • +
    +
    +
    +
    This method is defined by DS_XHR.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the DataSource instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the DataSource instance
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    +
    + +

    Event Details

    +
    + +
    +

    cacheFlushEvent

    + public event cacheFlushEvent +
    + Fired when the local cache is flushed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    cacheQueryEvent

    + public event cacheQueryEvent +
    + Fired when a query is made to the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    dataErrorEvent

    + public event dataErrorEvent +
    + Fired when an error is encountered with the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {String} : sMsg
      Error message string
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getCachedResultsEvent

    + public event getCachedResultsEvent +
    + Fired when data is retrieved from the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getResultsEvent

    + public event getResultsEvent +
    + Fired when data is retrieved from the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    queryEvent

    + public event queryEvent +
    + Fired when a query is made to the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.DataSource.html b/www/extras/yui-ext/docs/output/YAHOO.widget.DataSource.html new file mode 100644 index 000000000..5b30b9791 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.DataSource.html @@ -0,0 +1,435 @@ + + + + YAHOO.widget.DataSource + + + + + +
    + +

    Class YAHOO.widget.DataSource

    + + + + + + +
    Package:YAHOO.widget
    Class:DataSource
    Extends:Object
    Subclasses:DS_JSArray, DS_JSFunction, DS_XHR
    Defined In:autocomplete.js
    +
    + The DataSource classes manages sending a request and returning response from a live +database. Supported data include local JavaScript arrays and objects and databases +accessible via XHR connections. Supported response formats include JavaScript arrays, +JSON, XML, and flat-file textual data.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ERROR_DATANULL : StringDataSource
    <static> Error message for null data responses.
     ERROR_DATAPARSE : StringDataSource
    <static> Error message for data responses with parsing errors.
     maxCacheEntries : NumberDataSource
    Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connect...
     queryMatchCase : BooleanDataSource
    Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return result...
     queryMatchContains : BooleanDataSource
    Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and query...
     queryMatchSubset : BooleanDataSource
    Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return match...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DataSource()DataSource
     doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDataSource
    Abstract method implemented by subclasses to make a query to the live data +source. Must call the callback function wi...
     flushCache() : voidDataSource
    Flushes cache.
     getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidDataSource
    Retrieves query results, first checking the local cache, then making the +query request to the live data source as def...
     toString() : StringDataSource
    Public accessor to the unique name of the DataSource instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     cacheFlushEvent : (oSelf {Object})DataSource
    Fired when the local cache is flushed.
     cacheQueryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the local cache.
     dataErrorEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, sMsg {String})DataSource
    Fired when an error is encountered with the live data source.
     getCachedResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the local cache.
     getResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})DataSource
    Fired when data is retrieved from the live data source.
     queryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})DataSource
    Fired when a query is made to the live data source.
    + +

    Property Details

    +
    + +
    +

    ERROR_DATANULL

    + public String ERROR_DATANULL +
    + <static> Error message for null data responses.
    +
    This property is defined by DataSource.
    +
    + +
    +

    ERROR_DATAPARSE

    + public String ERROR_DATAPARSE +
    + <static> Error message for data responses with parsing errors.
    +
    This property is defined by DataSource.
    +
    + +
    +

    maxCacheEntries

    + public Number maxCacheEntries +
    + Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connections. Recommended only for data +sources that return comprehensive results for queries or when stale data is +not an issue.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchCase

    + public Boolean queryMatchCase +
    + Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return results for case-sensitive +matches.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchContains

    + public Boolean queryMatchContains +
    + Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and queryMatchContains is true, the cache +returns results that "contain" the query string. By default, +queryMatchContains is set to false, meaning the cache only returns results +that "start with" the query string.
    +
    This property is defined by DataSource.
    +
    + +
    +

    queryMatchSubset

    + public Boolean queryMatchSubset +
    + Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return matching cached results. For +instance, if the first query is for "abc" susequent queries that start with +"abc", like "abcd", will be queried against the cache, and not the live data +source. Recommended only for DataSources that return comprehensive results +for queries with very few characters.
    +
    This property is defined by DataSource.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DataSource

    + public function DataSource() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    doQuery

    + public function doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Abstract method implemented by subclasses to make a query to the live data +source. Must call the callback function with the response returned from the +query. Populates cache (if enabled). +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function implemented by oParent to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    flushCache

    + public function flushCache() +
    + Flushes cache. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    getResults

    + public function getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Retrieves query results, first checking the local cache, then making the +query request to the live data source as defined by the function doQuery. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the DataSource instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the DataSource instance
    • +
    +
    +
    +
    This method is defined by DataSource.
    +
    +
    + +

    Event Details

    +
    + +
    +

    cacheFlushEvent

    + public event cacheFlushEvent +
    + Fired when the local cache is flushed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    cacheQueryEvent

    + public event cacheQueryEvent +
    + Fired when a query is made to the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    dataErrorEvent

    + public event dataErrorEvent +
    + Fired when an error is encountered with the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {String} : sMsg
      Error message string
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getCachedResultsEvent

    + public event getCachedResultsEvent +
    + Fired when data is retrieved from the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    getResultsEvent

    + public event getResultsEvent +
    + Fired when data is retrieved from the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by DataSource.
    +
    + +
    +

    queryEvent

    + public event queryEvent +
    + Fired when a query is made to the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by DataSource.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.DateMath.html b/www/extras/yui-ext/docs/output/YAHOO.widget.DateMath.html new file mode 100644 index 000000000..59e2b9fc9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.DateMath.html @@ -0,0 +1,469 @@ + + + + YAHOO.widget.DateMath + + + + + +
    + +

    Class YAHOO.widget.DateMath

    + + + + + +
    Package:YAHOO.widget
    Class:DateMath
    Extends:Object
    Defined In:calendar.js
    +
    + YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility +used for adding, subtracting, and comparing dates.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     DAY : StringDateMath
    <static> Constant field representing Day
     MONTH : StringDateMath
    <static> Constant field representing Month
     ONE_DAY_MS : NumberDateMath
    <static> Constant field representing one day, in milliseconds
     WEEK : StringDateMath
    <static> Constant field representing Week
     YEAR : StringDateMath
    <static> Constant field representing Year
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     add(Date date, String field, Number amount) : DateDateMath
    Adds the specified amount of time to the this instance.
     after(Date date, Date compareTo) : BooleanDateMath
    Determines whether a given date is after another date on the calendar.
     before(Date date, Date compareTo) : BooleanDateMath
    Determines whether a given date is before another date on the calendar.
     between(Date date, Date dateBegin, Date dateEnd) : BooleanDateMath
    Determines whether a given date is between two other dates on the calendar.
     clearTime(Date date) : DateDateMath
    Clears the time fields from a given date, effectively setting the time to midnight.
     findMonthEnd(Date date) : DateDateMath
    Gets the last day of a month containing a given date.
     findMonthStart(Date date) : DateDateMath
    Gets the first day of a month containing a given date.
     getDayOffset(Date date, Number calendarYear) : NumberDateMath
    Calculates the number of days the specified date is from January 1 of the specified calendar year. +Passing January 1 ...
     getJan1(Number calendarYear) : DateDateMath
    Retrieves a JavaScript Date object representing January 1 of any given year.
     getWeekNumber(Date date, Number calendarYear, Number weekStartsOn) : NumberDateMath
    Calculates the week number for the given date. This function assumes that week 1 is the +week in which January 1 appea...
     isMonthOverlapWeek(Date weekBeginDate) : BooleanDateMath
    Determines if a given week overlaps two different months.
     isYearOverlapWeek(Date weekBeginDate) : BooleanDateMath
    Determines if a given week overlaps two different years.
     subtract(Date date, Number field, Number amount) : DateDateMath
    Subtracts the specified amount of time from the this instance.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    DAY

    + public String DAY +
    + <static> Constant field representing Day
    +
    This property is defined by DateMath.
    +
    + +
    +

    MONTH

    + public String MONTH +
    + <static> Constant field representing Month
    +
    This property is defined by DateMath.
    +
    + +
    +

    ONE_DAY_MS

    + public Number ONE_DAY_MS +
    + <static> Constant field representing one day, in milliseconds
    +
    This property is defined by DateMath.
    +
    + +
    +

    WEEK

    + public String WEEK +
    + <static> Constant field representing Week
    +
    This property is defined by DateMath.
    +
    + +
    +

    YEAR

    + public String YEAR +
    + <static> Constant field representing Year
    +
    This property is defined by DateMath.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    add

    + public function add(Date date, String field, Number amount) +
    + Adds the specified amount of time to the this instance. +
    + Parameters: +
    • date : Date
      The JavaScript Date object to perform addition on
    • field : String
      The field constant to be used for performing addition.
    • amount : Number
      The number of units (measured in the field constant) to add to the date.
    + Returns: +
      +
    • Date
      The resulting Date object
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    after

    + public function after(Date date, Date compareTo) +
    + Determines whether a given date is after another date on the calendar. +
    + Parameters: +
    • date : Date
      The Date object to compare with the compare argument
    • compareTo : Date
      The Date object to use for the comparison
    + Returns: +
      +
    • Boolean
      true if the date occurs after the compared date; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    before

    + public function before(Date date, Date compareTo) +
    + Determines whether a given date is before another date on the calendar. +
    + Parameters: +
    • date : Date
      The Date object to compare with the compare argument
    • compareTo : Date
      The Date object to use for the comparison
    + Returns: +
      +
    • Boolean
      true if the date occurs before the compared date; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    between

    + public function between(Date date, Date dateBegin, Date dateEnd) +
    + Determines whether a given date is between two other dates on the calendar. +
    + Parameters: +
    • date : Date
      The date to check for
    • dateBegin : Date
      The start of the range
    • dateEnd : Date
      The end of the range
    + Returns: +
      +
    • Boolean
      true if the date occurs between the compared dates; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    clearTime

    + public function clearTime(Date date) +
    + Clears the time fields from a given date, effectively setting the time to midnight. +
    + Parameters: +
    • date : Date
      The JavaScript Date for which the time fields will be cleared
    + Returns: +
      +
    • Date
      The JavaScript Date cleared of all time fields
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    findMonthEnd

    + public function findMonthEnd(Date date) +
    + Gets the last day of a month containing a given date. +
    + Parameters: +
    • date : Date
      The JavaScript Date used to calculate the month end
    + Returns: +
      +
    • Date
      The JavaScript Date representing the last day of the month
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    findMonthStart

    + public function findMonthStart(Date date) +
    + Gets the first day of a month containing a given date. +
    + Parameters: +
    • date : Date
      The JavaScript Date used to calculate the month start
    + Returns: +
      +
    • Date
      The JavaScript Date representing the first day of the month
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getDayOffset

    + public function getDayOffset(Date date, Number calendarYear) +
    + Calculates the number of days the specified date is from January 1 of the specified calendar year. +Passing January 1 to this function would return an offset value of zero. +
    + Parameters: +
    • date : Date
      The JavaScript date for which to find the offset
    • calendarYear : Number
      The calendar year to use for determining the offset
    + Returns: +
      +
    • Number
      The number of days since January 1 of the given year
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getJan1

    + public function getJan1(Number calendarYear) +
    + Retrieves a JavaScript Date object representing January 1 of any given year. +
    + Parameters: +
    • calendarYear : Number
      The calendar year for which to retrieve January 1
    + Returns: +
      +
    • Date
      January 1 of the calendar year specified.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getWeekNumber

    + public function getWeekNumber(Date date, Number calendarYear, Number weekStartsOn) +
    + Calculates the week number for the given date. This function assumes that week 1 is the +week in which January 1 appears, regardless of whether the week consists of a full 7 days. +The calendar year can be specified to help find what a the week number would be for a given +date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or +week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction +easily. +
    + Parameters: +
    • date : Date
      The JavaScript date for which to find the week number
    • calendarYear : Number
      OPTIONAL - The calendar year to use for determining the week number. Default is the calendar year of parameter "date".
    • weekStartsOn : Number
      OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday).
    + Returns: +
      +
    • Number
      The week number of the given date.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    isMonthOverlapWeek

    + public function isMonthOverlapWeek(Date weekBeginDate) +
    + Determines if a given week overlaps two different months. +
    + Parameters: +
    • weekBeginDate : Date
      The JavaScript Date representing the first day of the week.
    + Returns: +
      +
    • Boolean
      true if the date overlaps two different months.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    isYearOverlapWeek

    + public function isYearOverlapWeek(Date weekBeginDate) +
    + Determines if a given week overlaps two different years. +
    + Parameters: +
    • weekBeginDate : Date
      The JavaScript Date representing the first day of the week.
    + Returns: +
      +
    • Boolean
      true if the date overlaps two different years.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    subtract

    + public function subtract(Date date, Number field, Number amount) +
    + Subtracts the specified amount of time from the this instance. +
    + Parameters: +
    • date : Date
      The JavaScript Date object to perform subtraction on
    • field : Number
      The this field constant to be used for performing subtraction.
    • amount : Number
      The number of units (measured in the field constant) to subtract from the date.
    + Returns: +
      +
    • Date
      The resulting Date object
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Dialog.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Dialog.html new file mode 100644 index 000000000..77b5e73c4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Dialog.html @@ -0,0 +1,2789 @@ + + + + YAHOO.widget.Dialog + + + + + +
    + +

    Class YAHOO.widget.Dialog

    + + + + + + +
    Package:YAHOO.widget
    Class:Dialog
    Extends:Panel
    Subclasses:SimpleDialog
    Defined In:container.js
    +
    + Dialog is an implementation of Panel that can be used to submit form data. Built-in functionality for buttons with event handlers is included, and button sets can be build dynamically, or the preincluded ones for Submit/Cancel and OK/Cancel can be utilized. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_DIALOG<static> : StringDialog
    <static> Constant representing the default CSS class used for a Dialog
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     argument : ObjectDialog
    The arbitraty argument or arguments to pass to the Connection callback functions
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     callback : ObjectDialog
    The internally maintained callback object for use with the Connection utility
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     failure : FunctionDialog
    The function to execute upon failure of the Connection submission
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
     success : FunctionDialog
    The function to execute upon success of the Connection submission
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Dialog(String el, HTMLElement el, Object userConfig)Dialog
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     blurButtons() : voidDialog
    Blurs all the html buttons
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     cancel() : voidDialog
    Executes the cancel of the Dialog followed by a hide.
     center() : voidOverlay
    Centers the container in the viewport.
     configButtons(String type, Object[] args, Object obj) : voidDialog
    The default event handler for the "buttons" configuration property
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doSubmit() : voidDialog
    Performs the submission of the Dialog form depending on the value of "postmethod" property.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     focusDefaultButton() : voidDialog
    Sets the focus to the button that is designated as the default. By default, his handler is executed when the show eve...
     focusFirst() : voidDialog
    The default event handler used to focus the first field of the form when the Dialog is shown.
     focusFirstButton() : voidDialog
    Sets the focus to the first button in the button list
     focusLast() : voidDialog
    Sets the focus to the last button in the button or form element in the Dialog
     focusLastButton() : voidDialog
    Sets the focus to the first button in the button list
     getData() : ObjectDialog
    Returns a JSON-compatible data structure representing the data currently contained in the form.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidDialog
    The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automaticall...
     initDefaultConfig() : voidDialog
    Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg).
     initEvents() : voidDialog
    Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     registerForm() : voidDialog
    Prepares the Dialog's internal FORM object, creating one if one is not currently present.
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     submit() : voidDialog
    Executes a submit of the Dialog followed by a hide, if validation is successful.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringDialog
    Returns a string representation of the object.
     validate() : voidDialog
    Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. T...
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     asyncSubmitEvent : ()Dialog
    CustomEvent fired prior to asynchronous submission
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     beforeSumitEvent : ()Dialog
    CustomEvent fired prior to submission
     cancelEvent : ()Dialog
    CustomEvent fired after cancel
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     formSubmitEvent : ()Dialog
    CustomEvent fired prior to form-based submission
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     manualSubmitEvent : ()Dialog
    CustomEvent fired prior to manual submission
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
     submitEvent : ()Dialog
    CustomEvent fired after submission
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_DIALOG<static>

    + public String CSS_DIALOG<static> +
    + <static> Constant representing the default CSS class used for a Dialog
    +
    This property is defined by Dialog.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    argument

    + public Object argument +
    + The arbitraty argument or arguments to pass to the Connection callback functions
    +
    This property is defined by Dialog.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    callback

    + public Object callback +
    + The internally maintained callback object for use with the Connection utility
    +
    This property is defined by Dialog.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    failure

    + public Function failure +
    + The function to execute upon failure of the Connection submission
    +
    This property is defined by Dialog.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    + +
    +

    success

    + public Function success +
    + The function to execute upon success of the Connection submission
    +
    This property is defined by Dialog.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Dialog

    + public function Dialog(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Dialog OR
    • el : HTMLElement
      The element representing the Dialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    blurButtons

    + public function blurButtons() +
    + Blurs all the html buttons +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    cancel

    + public function cancel() +
    + Executes the cancel of the Dialog followed by a hide. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configButtons

    + public function configButtons(String type, Object[] args, Object obj) +
    + The default event handler for the "buttons" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doSubmit

    + public function doSubmit() +
    + Performs the submission of the Dialog form depending on the value of "postmethod" property. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    focusDefaultButton

    + public function focusDefaultButton() +
    + Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirst

    + public function focusFirst() +
    + The default event handler used to focus the first field of the form when the Dialog is shown. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirstButton

    + public function focusFirstButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLast

    + public function focusLast() +
    + Sets the focus to the last button in the button or form element in the Dialog +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLastButton

    + public function focusLastButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    getData

    + public function getData() +
    + Returns a JSON-compatible data structure representing the data currently contained in the form. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      A JSON object reprsenting the data of the current form.
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Dialog OR
    • el : HTMLElement
      The element representing the Dialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerForm

    + public function registerForm() +
    + Prepares the Dialog's internal FORM object, creating one if one is not currently present. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    submit

    + public function submit() +
    + Executes a submit of the Dialog followed by a hide, if validation is successful. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Dialog
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    validate

    + public function validate() +
    + Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    asyncSubmitEvent

    + public event asyncSubmitEvent +
    + CustomEvent fired prior to asynchronous submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeSumitEvent

    + public event beforeSumitEvent +
    + CustomEvent fired prior to submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    cancelEvent

    + public event cancelEvent +
    + CustomEvent fired after cancel +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    formSubmitEvent

    + public event formSubmitEvent +
    + CustomEvent fired prior to form-based submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    manualSubmitEvent

    + public event manualSubmitEvent +
    + CustomEvent fired prior to manual submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    submitEvent

    + public event submitEvent +
    + CustomEvent fired after submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.HTMLNode.html b/www/extras/yui-ext/docs/output/YAHOO.widget.HTMLNode.html new file mode 100644 index 000000000..aa85c40f4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.HTMLNode.html @@ -0,0 +1,1438 @@ + + + + YAHOO.widget.HTMLNode + + + + + +
    + +

    Class YAHOO.widget.HTMLNode

    + + + + + +
    Package:YAHOO.widget
    Class:HTMLNode
    Extends:Node
    Defined In:treeview.js
    +
    + This implementation takes either a string or object for the +oData argument. If is it a string, we will use it for the display +of this node (and it can contain any html code). If the parameter +is an object, we look for a parameter called "html" that will be +used for this node's display.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     content : stringHTMLNode
    The HTML content to use for this node's display
     contentElId : stringHTMLNode
    The generated id that will contain the data passed in by the implementer.
     contentStyle : stringHTMLNode
    The CSS class for the html content container. Defaults to ygtvhtml, but +can be overridden to provide a custom prese...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     initContent : ObjectHTMLNode
    Sets up the node label
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     HTMLNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}, hasIcon {boolean})HTMLNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getContentEl() : HTMLElementHTMLNode
    Returns the outer html element for this node's content
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    content

    + public string content +
    + The HTML content to use for this node's display
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    contentElId

    + public string contentElId +
    + The generated id that will contain the data passed in by the implementer.
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    contentStyle

    + public string contentStyle +
    + The CSS class for the html content container. Defaults to ygtvhtml, but +can be overridden to provide a custom presentation for a specific node.
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    initContent

    + public Object initContent +
    + Sets up the node label
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    HTMLNode

    + public function HTMLNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}, hasIcon {boolean}) +
    +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {YAHOO.widget.Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    • {boolean} : hasIcon
      specifies whether or not leaf nodes should have an icon
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getContentEl

    + public function getContentEl() +
    + Returns the outer html element for this node's content +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the element
    • +
    +
    +
    +
    This method is defined by HTMLNode.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.LogMsg.html b/www/extras/yui-ext/docs/output/YAHOO.widget.LogMsg.html new file mode 100644 index 000000000..7bd2d0559 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.LogMsg.html @@ -0,0 +1,156 @@ + + + + YAHOO.widget.LogMsg + + + + + +
    + +

    Class YAHOO.widget.LogMsg

    + + + + + +
    Package:YAHOO.widget
    Class:LogMsg
    Extends:Object
    Defined In:logger.js
    +
    + The LogMsg class defines a single log message.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     category : StringLogMsg
    Log category.
     msg : StringLogMsg
    Log message.
     source : StringLogMsg
    Log source. The first word passed in as the source argument.
     sourceDetail : StringLogMsg
    Log source detail. The remainder of the string passed in as the source argument, not +including the first word (if any).
     time : DateLogMsg
    Log timestamp.
    + +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     LogMsg(oConfigs {Object})LogMsg
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    category

    + public String category +
    + Log category.
    +
    This property is defined by LogMsg.
    +
    + +
    +

    msg

    + public String msg +
    + Log message.
    +
    This property is defined by LogMsg.
    +
    + +
    +

    source

    + public String source +
    + Log source. The first word passed in as the source argument.
    +
    This property is defined by LogMsg.
    +
    + +
    +

    sourceDetail

    + public String sourceDetail +
    + Log source detail. The remainder of the string passed in as the source argument, not +including the first word (if any).
    +
    This property is defined by LogMsg.
    +
    + +
    +

    time

    + public Date time +
    + Log timestamp.
    +
    This property is defined by LogMsg.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    LogMsg

    + public function LogMsg(oConfigs {Object}) +
    +
    + Parameters: +
    • {Object} : oConfigs
      Object literal of configuration params.
    +
    +
    +
    +
    + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.LogReader.html b/www/extras/yui-ext/docs/output/YAHOO.widget.LogReader.html new file mode 100644 index 000000000..06486dc02 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.LogReader.html @@ -0,0 +1,493 @@ + + + + YAHOO.widget.LogReader + + + + + +
    + +

    Class YAHOO.widget.LogReader

    + + + + + +
    Package:YAHOO.widget
    Class:LogReader
    Extends:Object
    Defined In:logger.js
    +
    + The LogReader class provides UI to read messages logged to YAHOO.widget.Logger.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     bottom : StringLogReader
    Public member to access CSS bottom position of the log reader container.
     fontSize : StringLogReader
    Public member to access CSS font size of the log reader container.
     footerEnabled : BooleanLogReader
    Whether or not the footer UI is enabled for the log reader.
     height : StringLogReader
    Public member to access CSS height of the log reader container.
     left : StringLogReader
    Public member to access CSS left position of the log reader container.
     logReaderEnabled : BooleanLogReader
    Whether or not the log reader is enabled to output log messages.
     newestOnTop : BooleanLogReader
    Whether or not newest message is printed on top.
     right : StringLogReader
    Public member to access CSS right position of the log reader container.
     thresholdMax : NumberLogReader
    Maximum number of messages a LogReader console will display.
     thresholdMin : NumberLogReader
    When a LogReader console reaches its thresholdMax, it will clear out messages +and print out the latest thresholdMin n...
     top : StringLogReader
    Public member to access CSS top position of the log reader container.
     verboseOutput : BooleanLogReader
    Whether or not output is verbose (more readable). Setting to true will make +output more compact (less readable).
     width : StringLogReader
    Public member to access CSS width of the log reader container.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     LogReader([elContainer {HTMLElement}], [elContainer {String}], [oConfigs {Object}])LogReader
     formatMsg(oLogMsg {Object}) : StringLogReader
    Formats message string to HTML for output to console.
     getLastTime() : DateLogReader
    Gets timestamp of the last log.
     hide() : voidLogReader
    Hides UI of log reader. Logging functionality is not disrupted.
     pause() : voidLogReader
    Pauses output of log messages. While paused, log messages are not lost, but +get saved to a buffer and then output upo...
     resume() : voidLogReader
    Resumes output of log messages, including outputting any log messages that +have been saved to buffer while paused.
     setTitle(sTitle {String}) : voidLogReader
    Updates title to given string.
     show() : voidLogReader
    Shows UI of log reader. Logging functionality is not disrupted.
     toString() : StringLogReader
    Public accessor to the unique name of the LogReader instance.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    bottom

    + public String bottom +
    + Public member to access CSS bottom position of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    fontSize

    + public String fontSize +
    + Public member to access CSS font size of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    footerEnabled

    + public Boolean footerEnabled +
    + Whether or not the footer UI is enabled for the log reader.
    +
    This property is defined by LogReader.
    +
    + +
    +

    height

    + public String height +
    + Public member to access CSS height of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    left

    + public String left +
    + Public member to access CSS left position of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    logReaderEnabled

    + public Boolean logReaderEnabled +
    + Whether or not the log reader is enabled to output log messages.
    +
    This property is defined by LogReader.
    +
    + +
    +

    newestOnTop

    + public Boolean newestOnTop +
    + Whether or not newest message is printed on top.
    +
    This property is defined by LogReader.
    +
    + +
    +

    right

    + public String right +
    + Public member to access CSS right position of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    thresholdMax

    + public Number thresholdMax +
    + Maximum number of messages a LogReader console will display.
    +
    This property is defined by LogReader.
    +
    + +
    +

    thresholdMin

    + public Number thresholdMin +
    + When a LogReader console reaches its thresholdMax, it will clear out messages +and print out the latest thresholdMin number of messages.
    +
    This property is defined by LogReader.
    +
    + +
    +

    top

    + public String top +
    + Public member to access CSS top position of the log reader container.
    +
    This property is defined by LogReader.
    +
    + +
    +

    verboseOutput

    + public Boolean verboseOutput +
    + Whether or not output is verbose (more readable). Setting to true will make +output more compact (less readable).
    +
    This property is defined by LogReader.
    +
    + +
    +

    width

    + public String width +
    + Public member to access CSS width of the log reader container.
    +
    This property is defined by LogReader.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    LogReader

    + public function LogReader([elContainer {HTMLElement}], [elContainer {String}], [oConfigs {Object}]) +
    +
    + Parameters: +
    • {HTMLElement} : elContainer
      (optional) DOM element reference of an existing DIV.
    • {String} : elContainer
      (optional) String ID of an existing DIV.
    • {Object} : oConfigs
      (optional) Object literal of configuration params.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    formatMsg

    + public function formatMsg(oLogMsg {Object}) +
    + Formats message string to HTML for output to console. +
    + Parameters: +
    • {Object} : oLogMsg
      Log message object.
    + Returns: +
      +
    • String
      HTML-formatted message for output to console.
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    getLastTime

    + public function getLastTime() +
    + Gets timestamp of the last log. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date
      Timestamp of the last log.
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides UI of log reader. Logging functionality is not disrupted. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    pause

    + public function pause() +
    + Pauses output of log messages. While paused, log messages are not lost, but +get saved to a buffer and then output upon resume of log reader. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    resume

    + public function resume() +
    + Resumes output of log messages, including outputting any log messages that +have been saved to buffer while paused. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    setTitle

    + public function setTitle(sTitle {String}) +
    + Updates title to given string. +
    + Parameters: +
    • {String} : sTitle
      New title.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    show

    + public function show() +
    + Shows UI of log reader. Logging functionality is not disrupted. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the LogReader instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the LogReader instance.
    • +
    +
    +
    +
    This method is defined by LogReader.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.LogWriter.html b/www/extras/yui-ext/docs/output/YAHOO.widget.LogWriter.html new file mode 100644 index 000000000..96a732753 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.LogWriter.html @@ -0,0 +1,169 @@ + + + + YAHOO.widget.LogWriter + + + + + +
    + +

    Class YAHOO.widget.LogWriter

    + + + + + +
    Package:YAHOO.widget
    Class:LogWriter
    Extends:Object
    Defined In:logger.js
    +
    + The LogWriter class provides a mechanism to log messages through +YAHOO.widget.Logger from a named source.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     LogWriter(sSource {String})LogWriter
     getSource() : StringLogWriter
    Public accessor to get the source name.
     log(sMsg {String}, sCategory {String}) : voidLogWriter
    Logs a message attached to the source of the LogWriter.
     setSource(sSource {String}) : voidLogWriter
    Public accessor to set the source name.
     toString() : StringLogWriter
    Public accessor to the unique name of the LogWriter instance.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    LogWriter

    + public function LogWriter(sSource {String}) +
    +
    + Parameters: +
    • {String} : sSource
      Source of LogWriter instance.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    getSource

    + public function getSource() +
    + Public accessor to get the source name. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The LogWriter source.
    • +
    +
    +
    +
    This method is defined by LogWriter.
    +
    + +
    +

    log

    + public function log(sMsg {String}, sCategory {String}) +
    + Logs a message attached to the source of the LogWriter. +
    + Parameters: +
    • {String} : sMsg
      The log message.
    • {String} : sCategory
      Category name.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogWriter.
    +
    + +
    +

    setSource

    + public function setSource(sSource {String}) +
    + Public accessor to set the source name. +
    + Parameters: +
    • {String} : sSource
      Source of LogWriter instance.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by LogWriter.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the LogWriter instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the LogWriter instance.
    • +
    +
    +
    +
    This method is defined by LogWriter.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Logger.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Logger.html new file mode 100644 index 000000000..0f522b0cb --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Logger.html @@ -0,0 +1,301 @@ + + + + YAHOO.widget.Logger + + + + + +
    + +

    Class YAHOO.widget.Logger

    + + + + + +
    Package:YAHOO.widget
    Class:Logger
    Extends:Object
    Defined In:logger.js
    +
    + The singleton Logger class provides core log management functionality. Saves +logs written through the global YAHOO.log function or written by a LogWriter +instance. Provides access to logs for reading by a LogReader instance or +native browser console such as the Firebug extension to Firefox or Safari's +JavaScript console through integration with the console.log() method.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     disableBrowserConsole() : voidLogger
    Disables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as ...
     enableBrowserConsole() : voidLogger
    Enables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as w...
     getStack() : Object[]Logger
    Public accessor to internal stack of log message objects.
     getStartTime() : DateLogger
    Public accessor to internal start time.
     log(sMsg {String}, sCategory {String}, sSource {String}) : voidLogger
    Saves a log message to the stack and fires newLogEvent. If the log message is +assigned to an unknown category, create...
     reset() : voidLogger
    Resets internal stack and startTime, enables Logger, and fires logResetEvent.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     categoryCreateEvent : (sCategory {String})Logger
    Fired when a new category has been created.
     logResetEvent : ()Logger
    Fired when the Logger has been reset has been created.
     newLogEvent : (sMsg {String})Logger
    Fired when a new log message has been created.
     sourceCreateEvent : (sSource {String})Logger
    Fired when a new source has been named.
    + + + +

    Method Details

    +
    + +
    +

    disableBrowserConsole

    + public function disableBrowserConsole() +
    + Disables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    enableBrowserConsole

    + public function enableBrowserConsole() +
    + Enables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    getStack

    + public function getStack() +
    + Public accessor to internal stack of log message objects. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object[]
      Array of log message objects.
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    getStartTime

    + public function getStartTime() +
    + Public accessor to internal start time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date
      Internal date of when Logger singleton was initialized.
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    log

    + public function log(sMsg {String}, sCategory {String}, sSource {String}) +
    + Saves a log message to the stack and fires newLogEvent. If the log message is +assigned to an unknown category, creates a new category. If the log message is +from an unknown source, creates a new source. If browser console is enabled, +outputs the log message to browser console. +
    + Parameters: +
    • {String} : sMsg
      The log message.
    • {String} : sCategory
      Category of log message, or null.
    • {String} : sSource
      Source of LogWriter, or null if global.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets internal stack and startTime, enables Logger, and fires logResetEvent. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    +
    + +

    Event Details

    +
    + +
    +

    categoryCreateEvent

    + public event categoryCreateEvent +
    + Fired when a new category has been created. +
    + Subscribers will be called with the following parameters: +
    • {String} : sCategory
      Category name.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    logResetEvent

    + public event logResetEvent +
    + Fired when the Logger has been reset has been created. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    newLogEvent

    + public event newLogEvent +
    + Fired when a new log message has been created. +
    + Subscribers will be called with the following parameters: +
    • {String} : sMsg
      Log message.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    sourceCreateEvent

    + public event sourceCreateEvent +
    + Fired when a new source has been named. +
    + Subscribers will be called with the following parameters: +
    • {String} : sSource
      Source name.
    +
    +
    +
    This event is defined by Logger.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Menu.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Menu.html new file mode 100644 index 000000000..e0c818370 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Menu.html @@ -0,0 +1,2700 @@ + + + + YAHOO.widget.Menu + + + + + +
    + +

    Class YAHOO.widget.Menu

    + + + + + + +
    Package:YAHOO.widget
    Class:Menu
    Extends:Overlay
    Subclasses:ContextMenu, Menubar
    Defined In:menu.js
    +
    + The Menu class creates a container that holds a vertical list representing +a set of options or commands. Menu is the base class for all +menu containers.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_CLASS_NAME : StringMenu
    String representing the CSS class(es) to be applied to the +menu's <div> element.
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     GROUP_TITLE_TAG_NAME : StringMenu
    String representing the tagname of the HTML element used to +title the menu's item groups.
     ITEM_TYPE : YAHOO.widget.MenuItemMenu
    Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> el...
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     activeItem : YAHOO.widget.MenuItemMenu
    Object reference to the item in the menu that has focus.
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     itemData : ArrayMenu
    Array of items to be added to the menu. The array can contain +strings representing the text for each item to be crea...
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     lazyLoad : BooleanMenu
    Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of t...
     parent : YAHOO.widget.MenuItemMenu
    Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the confi...
     platform : StringModule
    String representing the current user-agent platform
     srcElement : + Menu
    Object reference to the HTML element (either +<select> or <div>) used to +create the menu.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Menu()Menu
     _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "click" event handler for the menu. +@protected
     _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "keydown" event handler for the menu. +@protected
     _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "mouseout" event handler for the menu. +@protected
     _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "mouseover" event handler for the menu. +@protected
     addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Appends an item to the menu.
     addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
    Adds an array of items to the menu.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     center() : voidOverlay
    Centers the container in the viewport.
     clearActiveItem(Boolean p_bBlur) : voidMenu
    Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "container" configuration property +of the menu changes.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "hidedelay" configuration property +of the menu changes.
     configIframe(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "iframe" configuration property of +the menu changes.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "position" configuration property +of the menu changes.
     configVisible(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "visible" configuration property +the menu changes.
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidMenu
    Removes the menu's <div> element +(and accompanying child nodes) from the document.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Array args, Array obj) : voidMenu
    The default event handler executed when the moveEvent is fired, +if the "constraintoviewport" configuration property i...
     getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Returns the item at the specified index.
     getItemGroups() : ArrayMenu
    Returns a multi-dimensional array of all of the items in the menu.
     getRoot() : voidMenu
    Finds the menu's root menu.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String p_oElement, String p_oElement, , Object p_oConfig) : voidMenu
    The Menu class's initialization method. This method is +automatically called by the constructor, and sets up all DOM r...
     initDefaultConfig() : voidMenu
    Initializes the class's configurable properties which can be +changed using the menu's Config object ("cfg").
     initEvents() : voidMenu
    Initializes the custom events for the menu.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Inserts an item into the menu at the specified index.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize() : voidMenu
    Event handler called when the resize monitor element's "resize" evet is fired.
     removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Removes the specified item from the menu.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     setInitialFocus() : voidMenu
    Sets focus to the menu's first enabled item.
     setInitialSelection() : voidMenu
    Sets the "selected" configuration property of the menu's first +enabled item to "true."
     setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
    Sets the title of a group of menu items.
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringMenu
    Returns a string representing the menu.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     clickEvent : ()Menu
    Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     itemAddedEvent : ()Menu
    Fires when an item is added to the menu.
     itemRemovedEvent : ()Menu
    Fires when an item is removed to the menu.
     keyDownEvent : ()Menu
    Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an arg...
     keyPressEvent : ()Menu
    Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event ob...
     keyUpEvent : ()Menu
    Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an ar...
     mouseDownEvent : ()Menu
    Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
     mouseOutEvent : ()Menu
    Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
     mouseOverEvent : ()Menu
    Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
     mouseUpEvent : ()Menu
    Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an...
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + String representing the CSS class(es) to be applied to the +menu's <div> element.
    +
    This property is defined by Menu.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    GROUP_TITLE_TAG_NAME

    + public String GROUP_TITLE_TAG_NAME +
    + String representing the tagname of the HTML element used to +title the menu's item groups.
    +
    This property is defined by Menu.
    +
    + +
    +

    ITEM_TYPE

    + public YAHOO.widget.MenuItem ITEM_TYPE +
    + Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element.
    +
    This property is defined by Menu.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    activeItem

    + public YAHOO.widget.MenuItem activeItem +
    + Object reference to the item in the menu that has focus.
    +
    This property is defined by Menu.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    itemData

    + public Array itemData +
    + Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    lazyLoad

    + public Boolean lazyLoad +
    + Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    parent

    + public YAHOO.widget.MenuItem parent +
    + Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    + + +
    + + +

    Constructor Details

    +
    +
    +

    Menu

    + public function Menu() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    _onClick

    + public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "click" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onKeyDown

    + public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "keydown" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOut

    + public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "mouseout" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOver

    + public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "mouseover" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItem

    + public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
    + Appends an item to the menu. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItems

    + public function addItems(Array p_aItems, Number p_nGroupIndex) +
    + Adds an array of items to the menu. +
    + Parameters: +
    • p_aItems : Array
      Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the items belongs.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    clearActiveItem

    + public function clearActiveItem(Boolean p_bBlur) +
    + Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
    + Parameters: +
    • p_bBlur : Boolean
      Boolean indicating if the menu's active item should be blurred.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "container" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHideDelay

    + public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "hidedelay" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configIframe

    + public function configIframe(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "iframe" configuration property of +the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configPosition

    + public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "position" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configVisible

    + public function configVisible(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "visible" configuration property +the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the menu's <div> element +(and accompanying child nodes) from the document. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Array args, Array obj) +
    + The default event handler executed when the moveEvent is fired, +if the "constraintoviewport" configuration property is set to true. +
    + Parameters: +
    • type : String
      The name of the event that was fired.
    • args : Array
      Collection of arguments sent when the event was fired.
    • obj : Array
      Array containing the current Menu instance and the item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItem

    + public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
    + Returns the item at the specified index. +
    + Parameters: +
    • p_nItemIndex : Number
      Number indicating the ordinal position of the item to be retrieved.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItemGroups

    + public function getItemGroups() +
    + Returns a multi-dimensional array of all of the items in the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + Finds the menu's root menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be +changed using the menu's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize() +
    + Event handler called when the resize monitor element's "resize" evet is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuBarItem.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuBarItem.html new file mode 100644 index 000000000..fc0a4decd --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuBarItem.html @@ -0,0 +1,1276 @@ + + + + YAHOO.widget.MenuBarItem + + + + + +
    + +

    Class YAHOO.widget.MenuBarItem

    + + + + + +
    Package:YAHOO.widget
    Class:MenuBarItem
    Extends:MenuItem
    Defined In:menu.js
    +
    + Creates an item for a menu bar.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image.
     CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the checked state.
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator.
     CSS_CLASS_NAME : StringMenuBarItem
    String representing the CSS class(es) to be applied to the +<li> element of the menu bar item.
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image when the item is disabled.
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the disabled checked state.
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disab...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is disabled.
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
     IMG_ROOT : StringMenuItem
    String representing the prefix path to use for +non-secure images.
     IMG_ROOT_SSL : StringMenuItem
    String representing the prefix path to use for securely +served images.
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the selected checked state.
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is selected.
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    String representing the path to the image to be used for the +menu bar item's submenu arrow indicator.
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HT...
     browser : StringMenuItem
    String representing the browser.
     constructor : YAHOO.widget.MenuItemMenuItem
    Object reference to the menu item's constructor function.
     element : + MenuItem
    Object reference to the menu item's +<li> element.
     groupIndex : NumberMenuItem
    Number indicating the index of the group to which the menu +item belongs.
     imageRoot : StringMenuItem
    String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    Number indicating the ordinal position of the menu item in +its group.
     isSecure : BooleanMenuItem
    Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    Object reference to the menu item's parent menu.
     srcElement : + MenuItem
    Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used create the me...
     submenuIndicator : + MenuItem
    Object reference to the <img> element +used to create the submenu indicator for the menu item.
     value : ObjectMenuItem
    Object reference to the menu item's value.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuBarItem()MenuBarItem
     blur() : voidMenuItem
    Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's previous enabled sibling.
     init(String p_oObject, , MenuBarItem
    The MenuBarItem class's initialization method. This method is +automatically called by the constructor, and sets up al...
     initDefaultConfig() : voidMenuItem
    Initializes an item's configurable properties.
     toString() : StringMenuBarItem
    Returns a string representing the menu bar item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     keyPressEvent : ()MenuItem
    Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an...
     keyUpEvent : ()MenuItem
    Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     mouseDownEvent : ()MenuItem
    Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + String representing the CSS class(es) to be applied to the +<li> element of the menu bar item.
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image when the item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the disabled checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is disabled.
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + String representing the prefix path to use for +non-secure images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + String representing the prefix path to use for securely +served images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the selected checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is selected.
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +menu bar item's submenu arrow indicator.
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + Object reference to the menu item's constructor function.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + Number indicating the index of the group to which the menu +item belongs.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + Number indicating the ordinal position of the menu item in +its group.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + Object reference to the menu item's parent menu.
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + Object reference to the menu item's value.
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuBarItem

    + public function MenuBarItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + The MenuBarItem class's initialization method. This method is +automatically called by the constructor, and sets up all DOM references for +pre-existing markup, and creates required markup if it is not already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the menu bar item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the menu bar item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu bar item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by MenuBarItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the menu bar item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuBarItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuItem.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuItem.html new file mode 100644 index 000000000..1a377e3b7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuItem.html @@ -0,0 +1,1278 @@ + + + + YAHOO.widget.MenuItem + + + + + +
    + +

    Class YAHOO.widget.MenuItem

    + + + + + + +
    Package:YAHOO.widget
    Class:MenuItem
    Extends:Object
    Subclasses:ContextMenuItem, MenuBarItem
    Defined In:menu.js
    +
    + Creates an item for a menu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image.
     CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the checked state.
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator.
     CSS_CLASS_NAME : StringMenuItem
    String representing the CSS class(es) to be applied to the +<li> element of the menu item.
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the checked image when the item is disabled.
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the disabled checked state.
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disab...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled.
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
     IMG_ROOT : StringMenuItem
    String representing the prefix path to use for +non-secure images.
     IMG_ROOT_SSL : StringMenuItem
    String representing the prefix path to use for securely +served images.
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for +the selected checked state.
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected.
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    String representing the path to the image to be used for the +menu item's submenu arrow indicator.
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HT...
     browser : StringMenuItem
    String representing the browser.
     constructor : YAHOO.widget.MenuItemMenuItem
    Object reference to the menu item's constructor function.
     element : + MenuItem
    Object reference to the menu item's +<li> element.
     groupIndex : NumberMenuItem
    Number indicating the index of the group to which the menu +item belongs.
     imageRoot : StringMenuItem
    String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    Number indicating the ordinal position of the menu item in +its group.
     isSecure : BooleanMenuItem
    Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    Object reference to the menu item's parent menu.
     srcElement : + MenuItem
    Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used create the me...
     submenuIndicator : + MenuItem
    Object reference to the <img> element +used to create the submenu indicator for the menu item.
     value : ObjectMenuItem
    Object reference to the menu item's value.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuItem()MenuItem
     blur() : voidMenuItem
    Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    Finds the menu item's previous enabled sibling.
     init(String p_oObject, , MenuItem
    The MenuItem class's initialization method. This method is +automatically called by the constructor, and sets up all D...
     initDefaultConfig() : voidMenuItem
    Initializes an item's configurable properties.
     toString() : StringMenuItem
    Returns a string representing the menu item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     keyPressEvent : ()MenuItem
    Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an...
     keyUpEvent : ()MenuItem
    Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument.
     mouseDownEvent : ()MenuItem
    Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + String representing the CSS class(es) to be applied to the +<li> element of the menu item.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + String representing the alt text for the image to be used +for the checked image when the item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the disabled checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + String representing the prefix path to use for +non-secure images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + String representing the prefix path to use for securely +served images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + String representing the path to the image to be used for +the selected checked state.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + String representing the path to the image to be used for the +menu item's submenu arrow indicator.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + Object reference to the menu item's constructor function.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + Number indicating the index of the group to which the menu +item belongs.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + Number indicating the ordinal position of the menu item in +its group.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + Object reference to the menu item's parent menu.
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + Object reference to the menu item's value.
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuItem

    + public function MenuItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + The MenuItem class's initialization method. This method is +automatically called by the constructor, and sets up all DOM references +for pre-existing markup, and creates required markup if it is not +already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the menu item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the menu item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by MenuItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the menu item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuManager.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuManager.html new file mode 100644 index 000000000..8ccbf3f40 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuManager.html @@ -0,0 +1,200 @@ + + + + YAHOO.widget.MenuManager + + + + + +
    + +

    Class YAHOO.widget.MenuManager

    + + + + + +
    Package:YAHOO.widget
    Class:MenuManager
    Extends:Object
    Defined In:menu.js
    +
    + Singleton that manages a collection of all menus and menu items. Listens for +DOM events at the document level and dispatches the events to the +corresponding menu or menu item.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addMenu(YAHOO.widget.Menu p_oMenu) : voidMenuManager
    Adds a menu to the collection of known menus.
     getMenu(String p_sId) : YAHOO.widget.MenuMenuManager
    Returns a menu with the specified id.
     getMenus() : ArrayMenuManager
    Returns an array of all menus registered with the +menu manger.
     hideVisible() : voidMenuManager
    Hides all visible, dynamically positioned menus.
     removeMenu(YAHOO.widget.Menu p_oMenu) : voidMenuManager
    Removes a menu from the collection of known menus.
     toString() : StringMenuManager
    Returns a string representing the menu manager.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    addMenu

    + public function addMenu(YAHOO.widget.Menu p_oMenu) +
    + Adds a menu to the collection of known menus. +
    + Parameters: +
    • p_oMenu : YAHOO.widget.Menu
      Object specifying the Menu instance to be added.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    getMenu

    + public function getMenu(String p_sId) +
    + Returns a menu with the specified id. +
    + Parameters: +
    • p_sId : String
      String specifying the id of the menu to be retrieved.
    + Returns: +
      +
    • YAHOO.widget.Menu
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    getMenus

    + public function getMenus() +
    + Returns an array of all menus registered with the +menu manger. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    hideVisible

    + public function hideVisible() +
    + Hides all visible, dynamically positioned menus. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    removeMenu

    + public function removeMenu(YAHOO.widget.Menu p_oMenu) +
    + Removes a menu from the collection of known menus. +
    + Parameters: +
    • p_oMenu : YAHOO.widget.Menu
      Object specifying the Menu instance to be removed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the menu manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModule.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModule.html new file mode 100644 index 000000000..ef81b5e73 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModule.html @@ -0,0 +1,1837 @@ + + + + YAHOO.widget.MenuModule + + + + + +
    + +

    Class YAHOO.widget.MenuModule

    + + + + + +
    Package:YAHOO.widget
    Class:MenuModule
    Extends:Overlay
    Defined In:menu.js
    +
    + The base class for all menuing containers.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuModule()MenuModule
    Deprecated.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidModule
    The Module class's initialization method, which is executed for Module and all of its subclasses. This method is auto...
     initDefaultConfig() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initEvents() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringModule
    Returns a String representation of the Object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuModule

    + public function MenuModule() +
    + Deprecated.
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Module class's initialization method, which is executed for Module and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Module OR
    • el : HTMLElement
      The element representing the Module
    • userConfig : Object
      The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the Object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Module
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModuleItem.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModuleItem.html new file mode 100644 index 000000000..395f396ec --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuModuleItem.html @@ -0,0 +1,65 @@ + + + + YAHOO.widget.MenuModuleItem + + + + + +
    + +

    Class YAHOO.widget.MenuModuleItem

    + + + + + +
    Package:YAHOO.widget
    Class:MenuModuleItem
    Extends:Object
    Defined In:menu.js
    +
    + Creates an item for a menu module.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     MenuModuleItem()MenuModuleItem
    Deprecated.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    MenuModuleItem

    + public function MenuModuleItem() +
    + Deprecated.
    + Parameters: +
    • None.
    +
    +
    +
    +
    + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.MenuNode.html b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuNode.html new file mode 100644 index 000000000..e53d5e322 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.MenuNode.html @@ -0,0 +1,1500 @@ + + + + YAHOO.widget.MenuNode + + + + + +
    + +

    Class YAHOO.widget.MenuNode

    + + + + + +
    Package:YAHOO.widget
    Class:MenuNode
    Extends:TextNode
    Defined In:treeview.js
    +
    + A menu-specific implementation that differs from TextNode in that only +one sibling can be expanded at a time.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     label : stringTextNode
    The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the labe...
     labelElId : stringTextNode
    The derived element id of the label for this node
     labelStyle : stringTextNode
    The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for ...
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuNode()MenuNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getLabelEl() : objectTextNode
    Returns the label element +@for YAHOO.widget.TextNode
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     onLabelClick(me {Node}) : falseTextNode
    Executed when the label is clicked. Fires the labelClick custom event.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     setUpLabel(oData string) : voidTextNode
    Sets up the node label
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     labelClick : (YAHOO.widget.Node node)TextNode
    Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so...
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    label

    + public string label +
    + The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the label, or an object that +has a property called "label" that we will use.
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelElId

    + public string labelElId +
    + The derived element id of the label for this node
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelStyle

    + public string labelStyle +
    + The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for a specific node.
    +
    This property is defined by TextNode.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuNode

    + public function MenuNode() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getLabelEl

    + public function getLabelEl() +
    + Returns the label element +@for YAHOO.widget.TextNode +
    + Parameters: +
    • None.
    + Returns: +
      +
    • object
      the element
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    onLabelClick

    + public function onLabelClick(me {Node}) +
    + Executed when the label is clicked. Fires the labelClick custom event. +
    + Parameters: +
    • {Node} : me
      this node @scope the anchor tag clicked
    + Returns: +
      +
    • false
      to cancel the anchor click
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setUpLabel

    + public function setUpLabel(oData string) +
    + Sets up the node label +
    + Parameters: +
    • string : oData
      containing the label, or an object with a label property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    labelClick

    + public event labelClick +
    + Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so there is a single +event that handles all nodes in the tree. The node clicked is +provided as an argument +@for YAHOO.widget.TreeView +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node clicked
    +
    +
    +
    This event is defined by TextNode.
    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Menubar.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Menubar.html new file mode 100644 index 000000000..71d78bb75 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Menubar.html @@ -0,0 +1,2689 @@ + + + + YAHOO.widget.Menubar + + + + + +
    + +

    Class YAHOO.widget.Menubar

    + + + + + +
    Package:YAHOO.widget
    Class:Menubar
    Extends:Menu
    Defined In:menu.js
    +
    + Horizontal collection of items, each of which can contain a submenu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_CLASS_NAME : StringMenubar
    String representing the CSS class(es) to be applied to the menu +bar's <div> element.
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     GROUP_TITLE_TAG_NAME : StringMenu
    String representing the tagname of the HTML element used to +title the menu's item groups.
     ITEM_TYPE : YAHOO.widget.MenuItemMenu
    Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> el...
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     activeItem : YAHOO.widget.MenuItemMenu
    Object reference to the item in the menu that has focus.
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     itemData : ArrayMenu
    Array of items to be added to the menu. The array can contain +strings representing the text for each item to be crea...
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     lazyLoad : BooleanMenu
    Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of t...
     parent : YAHOO.widget.MenuItemMenu
    Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the confi...
     platform : StringModule
    String representing the current user-agent platform
     srcElement : + Menu
    Object reference to the HTML element (either +<select> or <div>) used to +create the menu.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Menubar()Menubar
     _onClick(String p_sType, Array p_aArgs, YAHOO.widget.MenuBar p_oMenuBar) : voidMenubar
    "click" event handler for the menu bar. +@protected
     _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "keydown" event handler for the menu. +@protected
     _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "mouseout" event handler for the menu. +@protected
     _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    "mouseover" event handler for the menu. +@protected
     addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Appends an item to the menu.
     addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
    Adds an array of items to the menu.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     center() : voidOverlay
    Centers the container in the viewport.
     clearActiveItem(Boolean p_bBlur) : voidMenu
    Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "container" configuration property +of the menu changes.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "hidedelay" configuration property +of the menu changes.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    Event handler for when the "position" configuration property +of the menu changes.
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Returns the item at the specified index.
     getItemGroups() : ArrayMenu
    Returns a multi-dimensional array of all of the items in the menu.
     getRoot() : voidMenu
    Finds the menu's root menu.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String p_oElement, String p_oElement, , Object p_oConfig) : voidMenubar
    The MenuBar class's initialization method. This method is +automatically called by the constructor, and sets up all DO...
     initDefaultConfig() : voidMenubar
    Initializes the class's configurable properties which can be +changed using the menu bar's Config object ("cfg").
     initEvents() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Inserts an item into the menu at the specified index.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    Removes the specified item from the menu.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     setInitialFocus() : voidMenu
    Sets focus to the menu's first enabled item.
     setInitialSelection() : voidMenu
    Sets the "selected" configuration property of the menu's first +enabled item to "true."
     setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
    Sets the title of a group of menu items.
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringMenubar
    Returns a string representing the menu bar.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     clickEvent : ()Menu
    Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     itemAddedEvent : ()Menu
    Fires when an item is added to the menu.
     itemRemovedEvent : ()Menu
    Fires when an item is removed to the menu.
     keyDownEvent : ()Menu
    Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an arg...
     keyPressEvent : ()Menu
    Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event ob...
     keyUpEvent : ()Menu
    Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an ar...
     mouseDownEvent : ()Menu
    Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
     mouseOutEvent : ()Menu
    Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
     mouseOverEvent : ()Menu
    Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
     mouseUpEvent : ()Menu
    Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an...
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + String representing the CSS class(es) to be applied to the menu +bar's <div> element.
    +
    This property is defined by Menubar.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    GROUP_TITLE_TAG_NAME

    + public String GROUP_TITLE_TAG_NAME +
    + String representing the tagname of the HTML element used to +title the menu's item groups.
    +
    This property is defined by Menu.
    +
    + +
    +

    ITEM_TYPE

    + public YAHOO.widget.MenuItem ITEM_TYPE +
    + Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element.
    +
    This property is defined by Menu.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    activeItem

    + public YAHOO.widget.MenuItem activeItem +
    + Object reference to the item in the menu that has focus.
    +
    This property is defined by Menu.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    itemData

    + public Array itemData +
    + Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    lazyLoad

    + public Boolean lazyLoad +
    + Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    parent

    + public YAHOO.widget.MenuItem parent +
    + Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal.
    +
    This property is defined by Menu.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    + + +
    + + +

    Constructor Details

    +
    +
    +

    Menubar

    + public function Menubar() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    _onClick

    + public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.MenuBar p_oMenuBar) +
    + "click" event handler for the menu bar. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenuBar : YAHOO.widget.MenuBar
      Object representing the menu bar that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    _onKeyDown

    + public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "keydown" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOut

    + public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "mouseout" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOver

    + public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + "mouseover" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItem

    + public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
    + Appends an item to the menu. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItems

    + public function addItems(Array p_aItems, Number p_nGroupIndex) +
    + Adds an array of items to the menu. +
    + Parameters: +
    • p_aItems : Array
      Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the items belongs.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    clearActiveItem

    + public function clearActiveItem(Boolean p_bBlur) +
    + Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
    + Parameters: +
    • p_bBlur : Boolean
      Boolean indicating if the menu's active item should be blurred.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "container" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHideDelay

    + public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "hidedelay" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configPosition

    + public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + Event handler for when the "position" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    getItem

    + public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
    + Returns the item at the specified index. +
    + Parameters: +
    • p_nItemIndex : Number
      Number indicating the ordinal position of the item to be retrieved.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItemGroups

    + public function getItemGroups() +
    + Returns a multi-dimensional array of all of the items in the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + Finds the menu's root menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu bar. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be +changed using the menu bar's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representing the menu bar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Module.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Module.html new file mode 100644 index 000000000..c33e5d73f --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Module.html @@ -0,0 +1,1120 @@ + + + + YAHOO.widget.Module + + + + + +
    + +

    Class YAHOO.widget.Module

    + + + + + + +
    Package:YAHOO.widget
    Class:Module
    Extends:Object
    Subclasses:Overlay
    Defined In:container_core.js
    +
    + Module is a JavaScript representation of the Standard Module Format. Standard Module Format is a simple standard for markup containers where child nodes representing the header, body, and footer of the content are denoted using the CSS classes "hd", "bd", and "ft" respectively. Module is the base class for all other classes in the YUI Container package.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Module(String el, HTMLElement el, Object userConfig)Module
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     init(String el, HTMLElement el, Object userConfig) : voidModule
    The Module class's initialization method, which is executed for Module and all of its subclasses. This method is auto...
     initDefaultConfig() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initEvents() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     toString() : StringModule
    Returns a String representation of the Object.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Module

    + public function Module(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Module OR
    • el : HTMLElement
      The element representing the Module
    • userConfig : Object
      The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Module class's initialization method, which is executed for Module and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Module OR
    • el : HTMLElement
      The element representing the Module
    • userConfig : Object
      The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the Object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Module
    • +
    +
    +
    +
    This method is defined by Module.
    +
    +
    + +

    Event Details

    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Node.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Node.html new file mode 100644 index 000000000..ee50d8f8c --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Node.html @@ -0,0 +1,1345 @@ + + + + YAHOO.widget.Node + + + + + +
    + +

    Class YAHOO.widget.Node

    + + + + + + +
    Package:YAHOO.widget
    Class:Node
    Extends:Object
    Subclasses:HTMLNode, RootNode, TextNode
    Defined In:treeview.js
    +
    + The base class for all tree nodes. The node's presentation and behavior in +response to mouse events is handled in Node subclasses.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Node()Node
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Node

    + public function Node() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Overlay.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Overlay.html new file mode 100644 index 000000000..e7304a940 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Overlay.html @@ -0,0 +1,1837 @@ + + + + YAHOO.widget.Overlay + + + + + +
    + +

    Class YAHOO.widget.Overlay

    + + + + + + +
    Package:YAHOO.widget
    Class:Overlay
    Extends:Module
    Subclasses:Menu, MenuModule, Panel, Tooltip
    Defined In:container_core.js
    +
    + Overlay is a Module that is absolutely positioned above the page flow. It has convenience methods for positioning and sizing, as well as options for controlling zIndex and constraining the Overlay's position to the current visible viewport. Overlay also contains a dynamicly generated IFRAME which is placed beneath it for Internet Explorer 6 and 5.x so that it will be properly rendered above SELECT elements.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     platform : StringModule
    String representing the current user-agent platform
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Overlay()Overlay
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidOverlay
    The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatica...
     initDefaultConfig() : voidOverlay
    Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringOverlay
    Returns a String representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Overlay

    + public function Overlay() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Overlay OR
    • el : HTMLElement
      The element representing the Overlay
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Overlay.
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.OverlayManager.html b/www/extras/yui-ext/docs/output/YAHOO.widget.OverlayManager.html new file mode 100644 index 000000000..bade5ea88 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.OverlayManager.html @@ -0,0 +1,416 @@ + + + + YAHOO.widget.OverlayManager + + + + + +
    + +

    Class YAHOO.widget.OverlayManager

    + + + + + +
    Package:YAHOO.widget
    Class:OverlayManager
    Extends:Object
    Defined In:container_core.js
    +
    + OverlayManager is used for maintaining the focus status of multiple Overlays.*
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_FOCUSED<static> : StringOverlayManager
    <static> The CSS class representing a focused Overlay
     cfg : YAHOO.util.ConfigOverlayManager
    The OverlayManager's Config object used for monitoring configuration properties.
     contructor : FunctionOverlayManager
    The class's constructor function
     overlays : YAHOO.widget.Overlay[]OverlayManager
    The array of Overlays that are currently registered
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     OverlayManager(Array overlays, Object userConfig)OverlayManager
     blurAll() : voidOverlayManager
    Removes focus from all registered Overlays in the manager
     find(YAHOO.widget.Overlay overlay, String overlay) : YAHOO.widget.OverlayOverlayManager
    Attempts to locate an Overlay by instance or ID.
     focus(YAHOO.widget.Overlay overlay, String overlay) : voidOverlayManager
    Focuses the specified Overlay
     getActive() : YAHOO.widget.OverlayOverlayManager
    Returns the currently focused Overlay
     hideAll() : voidOverlayManager
    Hides all Overlays in the manager.
     init(YAHOO.widget.Overlay[] overlays, Object userConfig) : voidOverlayManager
    Initializes the OverlayManager
     initDefaultConfig() : voidOverlayManager
    Initializes the default configuration of the OverlayManager
     register(YAHOO.widget.Overlay overlay, YAHOO.widget.Overlay[] overlay) : BooleanOverlayManager
    Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for ...
     remove(YAHOO.widget.Overlay overlay, String overlay) : voidOverlayManager
    Removes the specified Overlay from the manager
     showAll() : voidOverlayManager
    Shows all Overlays in the manager.
     toString() : StringOverlayManager
    Returns a string representation of the object.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    CSS_FOCUSED<static>

    + public String CSS_FOCUSED<static> +
    + <static> The CSS class representing a focused Overlay
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The OverlayManager's Config object used for monitoring configuration properties.
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    overlays

    + public YAHOO.widget.Overlay[] overlays +
    + The array of Overlays that are currently registered
    +
    This property is defined by OverlayManager.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    OverlayManager

    + public function OverlayManager(Array overlays, Object userConfig) +
    +
    + Parameters: +
    • overlays : Array
      Optional. A collection of Overlays to register with the manager.
    • userConfig : Object
      The object literal representing the user configuration of the OverlayManager
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blurAll

    + public function blurAll() +
    + Removes focus from all registered Overlays in the manager +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    find

    + public function find(YAHOO.widget.Overlay overlay, String overlay) +
    + Attempts to locate an Overlay by instance or ID. +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      An Overlay to locate within the manager
    • overlay : String
      An Overlay id to locate within the manager
    + Returns: +
      +
    • YAHOO.widget.Overlay
      The requested Overlay, if found, or null if it cannot be located.
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    focus

    + public function focus(YAHOO.widget.Overlay overlay, String overlay) +
    + Focuses the specified Overlay +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      The Overlay to focus
    • overlay : String
      The id of the Overlay to focus
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    getActive

    + public function getActive() +
    + Returns the currently focused Overlay +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.Overlay
      The currently focused Overlay
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    hideAll

    + public function hideAll() +
    + Hides all Overlays in the manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    init

    + public function init(YAHOO.widget.Overlay[] overlays, Object userConfig) +
    + Initializes the OverlayManager +
    + Parameters: +
    • overlays : YAHOO.widget.Overlay[]
      Optional. A collection of Overlays to register with the manager.
    • userConfig : Object
      The object literal representing the user configuration of the OverlayManager
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the default configuration of the OverlayManager +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    register

    + public function register(YAHOO.widget.Overlay overlay, YAHOO.widget.Overlay[] overlay) +
    + Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for focus and blur, along with CustomEvents for each. +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      An Overlay to register with the manager.
    • overlay : YAHOO.widget.Overlay[]
      An array of Overlays to register with the manager.
    + Returns: +
      +
    • Boolean
      True if any Overlays are registered.
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    remove

    + public function remove(YAHOO.widget.Overlay overlay, String overlay) +
    + Removes the specified Overlay from the manager +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      The Overlay to remove
    • overlay : String
      The id of the Overlay to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    showAll

    + public function showAll() +
    + Shows all Overlays in the manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the OverlayManager
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Panel.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Panel.html new file mode 100644 index 000000000..e4f63a189 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Panel.html @@ -0,0 +1,2258 @@ + + + + YAHOO.widget.Panel + + + + + +
    + +

    Class YAHOO.widget.Panel

    + + + + + + +
    Package:YAHOO.widget
    Class:Panel
    Extends:Overlay
    Subclasses:Dialog
    Defined In:container.js
    +
    + Panel is an implementation of Overlay that behaves like an OS window, with a draggable header and an optional close icon at the top right.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Panel(String el, HTMLElement el, Object userConfig)Panel
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     center() : voidOverlay
    Centers the container in the viewport.
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidPanel
    The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatica...
     initDefaultConfig() : voidPanel
    Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg).
     initEvents() : voidPanel
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidPanel
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode) : booleanPanel
    Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optiona...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringPanel
    Returns a String representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Panel

    + public function Panel(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Panel OR
    • el : HTMLElement
      The element representing the Panel
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Panel. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Overlay OR
    • el : HTMLElement
      The element representing the Overlay
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode) +
    + Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optionally appends the Panel to the specified node prior to the render's execution. NOTE: For Panels without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    + Returns: +
      +
    • boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Panel.
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.RootNode.html b/www/extras/yui-ext/docs/output/YAHOO.widget.RootNode.html new file mode 100644 index 000000000..118cbf734 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.RootNode.html @@ -0,0 +1,1344 @@ + + + + YAHOO.widget.RootNode + + + + + +
    + +

    Class YAHOO.widget.RootNode

    + + + + + +
    Package:YAHOO.widget
    Class:RootNode
    Extends:Node
    Defined In:treeview.js
    +
    + A custom YAHOO.widget.Node that handles the unique nature of +the virtual, presentationless root node.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     RootNode()RootNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    RootNode

    + public function RootNode() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.SimpleDialog.html b/www/extras/yui-ext/docs/output/YAHOO.widget.SimpleDialog.html new file mode 100644 index 000000000..24ca8eff7 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.SimpleDialog.html @@ -0,0 +1,2950 @@ + + + + YAHOO.widget.SimpleDialog + + + + + +
    + +

    Class YAHOO.widget.SimpleDialog

    + + + + + +
    Package:YAHOO.widget
    Class:SimpleDialog
    Extends:Dialog
    Defined In:container.js
    +
    + SimpleDialog is a simple implementation of Dialog that can be used to submit a single value. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_DIALOG<static> : StringDialog
    <static> Constant representing the default CSS class used for a Dialog
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     CSS_SIMPLEDIALOG<static> : StringSimpleDialog
    <static> Constant representing the default CSS class used for a SimpleDialog
     ICON_ALARM<static> : StringSimpleDialog
    <static> Constant for the standard network icon for alarm
     ICON_BLOCK<static> : StringSimpleDialog
    <static> Constant for the standard network icon for a blocking action
     ICON_HELP<static> : StringSimpleDialog
    <static> Constant for the standard network icon for help
     ICON_INFO<static> : StringSimpleDialog
    <static> Constant for the standard network icon for info
     ICON_TIP<static> : StringSimpleDialog
    <static> Constant for the standard network icon for a tip
     ICON_WARN<static> : StringSimpleDialog
    <static> Constant for the standard network icon for warn
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     argument : ObjectDialog
    The arbitraty argument or arguments to pass to the Connection callback functions
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     callback : ObjectDialog
    The internally maintained callback object for use with the Connection utility
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     failure : FunctionDialog
    The function to execute upon failure of the Connection submission
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
     success : FunctionDialog
    The function to execute upon success of the Connection submission
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     SimpleDialog(String el, HTMLElement el, Object userConfig)SimpleDialog
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     blurButtons() : voidDialog
    Blurs all the html buttons
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     cancel() : voidDialog
    Executes the cancel of the Dialog followed by a hide.
     center() : voidOverlay
    Centers the container in the viewport.
     configButtons(String type, Object[] args, Object obj) : voidDialog
    The default event handler for the "buttons" configuration property
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIcon(String type, Object[] args, Object obj) : voidSimpleDialog
    Fired when the "icon" property is set.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configText(String type, Object[] args, Object obj) : voidSimpleDialog
    Fired when the "text" property is set.
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doSubmit() : voidDialog
    Performs the submission of the Dialog form depending on the value of "postmethod" property.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     focusDefaultButton() : voidDialog
    Sets the focus to the button that is designated as the default. By default, his handler is executed when the show eve...
     focusFirst() : voidDialog
    The default event handler used to focus the first field of the form when the Dialog is shown.
     focusFirstButton() : voidDialog
    Sets the focus to the first button in the button list
     focusLast() : voidDialog
    Sets the focus to the last button in the button or form element in the Dialog
     focusLastButton() : voidDialog
    Sets the focus to the first button in the button list
     getData() : ObjectDialog
    Returns a JSON-compatible data structure representing the data currently contained in the form.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidSimpleDialog
    The SimpleDialog initialization method, which is executed for SimpleDialog and all of its subclasses. This method is ...
     initDefaultConfig() : voidSimpleDialog
    Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg).
     initEvents() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     registerForm() : voidSimpleDialog
    Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value ...
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     submit() : voidDialog
    Executes a submit of the Dialog followed by a hide, if validation is successful.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringSimpleDialog
    Returns a string representation of the object.
     validate() : voidDialog
    Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. T...
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     asyncSubmitEvent : ()Dialog
    CustomEvent fired prior to asynchronous submission
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     beforeSumitEvent : ()Dialog
    CustomEvent fired prior to submission
     cancelEvent : ()Dialog
    CustomEvent fired after cancel
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     formSubmitEvent : ()Dialog
    CustomEvent fired prior to form-based submission
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     manualSubmitEvent : ()Dialog
    CustomEvent fired prior to manual submission
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
     submitEvent : ()Dialog
    CustomEvent fired after submission
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_DIALOG<static>

    + public String CSS_DIALOG<static> +
    + <static> Constant representing the default CSS class used for a Dialog
    +
    This property is defined by Dialog.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_SIMPLEDIALOG<static>

    + public String CSS_SIMPLEDIALOG<static> +
    + <static> Constant representing the default CSS class used for a SimpleDialog
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_ALARM<static>

    + public String ICON_ALARM<static> +
    + <static> Constant for the standard network icon for alarm
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_BLOCK<static>

    + public String ICON_BLOCK<static> +
    + <static> Constant for the standard network icon for a blocking action
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_HELP<static>

    + public String ICON_HELP<static> +
    + <static> Constant for the standard network icon for help
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_INFO<static>

    + public String ICON_INFO<static> +
    + <static> Constant for the standard network icon for info
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_TIP<static>

    + public String ICON_TIP<static> +
    + <static> Constant for the standard network icon for a tip
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_WARN<static>

    + public String ICON_WARN<static> +
    + <static> Constant for the standard network icon for warn
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    argument

    + public Object argument +
    + The arbitraty argument or arguments to pass to the Connection callback functions
    +
    This property is defined by Dialog.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    callback

    + public Object callback +
    + The internally maintained callback object for use with the Connection utility
    +
    This property is defined by Dialog.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    failure

    + public Function failure +
    + The function to execute upon failure of the Connection submission
    +
    This property is defined by Dialog.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    + +
    +

    success

    + public Function success +
    + The function to execute upon success of the Connection submission
    +
    This property is defined by Dialog.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    SimpleDialog

    + public function SimpleDialog(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the SimpleDialog OR
    • el : HTMLElement
      The element representing the SimpleDialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    blurButtons

    + public function blurButtons() +
    + Blurs all the html buttons +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    cancel

    + public function cancel() +
    + Executes the cancel of the Dialog followed by a hide. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configButtons

    + public function configButtons(String type, Object[] args, Object obj) +
    + The default event handler for the "buttons" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIcon

    + public function configIcon(String type, Object[] args, Object obj) +
    + Fired when the "icon" property is set. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configText

    + public function configText(String type, Object[] args, Object obj) +
    + Fired when the "text" property is set. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doSubmit

    + public function doSubmit() +
    + Performs the submission of the Dialog form depending on the value of "postmethod" property. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    focusDefaultButton

    + public function focusDefaultButton() +
    + Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirst

    + public function focusFirst() +
    + The default event handler used to focus the first field of the form when the Dialog is shown. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirstButton

    + public function focusFirstButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLast

    + public function focusLast() +
    + Sets the focus to the last button in the button or form element in the Dialog +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLastButton

    + public function focusLastButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    getData

    + public function getData() +
    + Returns a JSON-compatible data structure representing the data currently contained in the form. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      A JSON object reprsenting the data of the current form.
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The SimpleDialog initialization method, which is executed for SimpleDialog and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the SimpleDialog OR
    • el : HTMLElement
      The element representing the SimpleDialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerForm

    + public function registerForm() +
    + Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value hidden field. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    submit

    + public function submit() +
    + Executes a submit of the Dialog followed by a hide, if validation is successful. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the SimpleDialog
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    validate

    + public function validate() +
    + Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    asyncSubmitEvent

    + public event asyncSubmitEvent +
    + CustomEvent fired prior to asynchronous submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeSumitEvent

    + public event beforeSumitEvent +
    + CustomEvent fired prior to submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    cancelEvent

    + public event cancelEvent +
    + CustomEvent fired after cancel +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    formSubmitEvent

    + public event formSubmitEvent +
    + CustomEvent fired prior to form-based submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    manualSubmitEvent

    + public event manualSubmitEvent +
    + CustomEvent fired prior to manual submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    submitEvent

    + public event submitEvent +
    + CustomEvent fired after submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Slider.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Slider.html new file mode 100644 index 000000000..816249b9a --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Slider.html @@ -0,0 +1,2081 @@ + + + + YAHOO.widget.Slider + + + + + +
    + +

    Class YAHOO.widget.Slider

    + + + + + +
    Package:YAHOO.widget
    Class:Slider
    Extends:DragDrop
    Defined In:slider.js
    +
    + A DragDrop implementation that can be used as a background for a +slider. It takes a reference to the thumb instance +so it can delegate some of the events to it. The goal is to make the +thumb jump to the location on the background when the background is +clicked.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ANIM_AVAIL<static> : booleanSlider
    <static> By default, animation is available if the animation library is detected.
     animate : booleanSlider
    Flag that determines if the thumb will animate when moved
     animationDuration : intSlider
    If animation is configured, specifies the length of the animation +in seconds.
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     backgroundEnabled : booleanSlider
    Set to false to disable a background click thumb move
     baselinePos : [int,Slider
    The basline position of the background element, used +to determine if the background has moved since the last +operation.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     enableKeys : booleanSlider
    Enables the arrow, home and end keys, defaults to true.
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : booleanDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     keyIncrement : intSlider
    Specifies the number of pixels the arrow keys will move the slider. +Default is 25.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     moveComplete : BooleanSlider
    moveComplete is set to true when the slider has moved to its final +destination. For animated slider, this value can ...
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     thumb : YAHOO.widget.SliderThumbSlider
    A YAHOO.widget.SliderThumb instance that we will use to +reposition the thumb when the background is clicked
     thumbCenterPoint : "x":Slider
    The center of the slider element is stored so we can position +place it in the correct position when the background i...
     tickPause : intSlider
    Adjustment factor for tick animation, the more ticks, the +faster the animation (by default)
     type : stringSlider
    The type of the slider (horiz, vert, region)
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Slider(String id, String sGroup, String sType)Slider
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidDragDrop
    Clears any tick interval defined for this instance
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     getHorizSlider<static>(String sBGElId, String sHandleElId, int iLeft, int iRight, int iTickSize) : SliderSlider
    <static> Factory method for creating a horizontal slider
     getSliderRegion<static>(String sBGElId, String sHandleElId, int iLeft, int iRight, int iUp, int iDown, int iTickSize) : SliderSlider
    <static> Factory method for creating a slider region like the one in the color +picker example
     getThumb() : SliderThumbSlider
    Returns a reference to this slider's thumb
     getValue() : intSlider
    Returns the slider's thumb offset from the start position
     getVertSlider<static>(String sBGElId, String sHandleElId, int iUp, int iDown, int iTickSize) : SliderSlider
    <static> Factory method for creating a vertical slider
     getXValue() : intSlider
    Returns the slider's thumb X offset from the start position
     getYValue() : intSlider
    Returns the slider's thumb Y offset from the start position
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidSlider
    Locks the slider, overrides YAHOO.util.DragDrop
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onChange(int firstOffset, int secondOffset) : voidSlider
    Deprecated. Event that fires when the value of the slider has changed
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     onSlideStart() : voidSlider
    Deprecated. Event that fires when the at the beginning of the slider thumb move
     onSliderEnd() : voidSlider
    Deprecated. Event that fires at the end of a slider thumb move
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setRegionValue(int newOffset, int newOffset2, boolean skipAnim, boolean force) : booleanSlider
    Provides a way to set the value of the region slider in code.
     setSliderStartState() : voidSlider
    Initialization that sets up the value offsets once the elements are ready
     setThumbCenterPoint() : voidSlider
    When the thumb is available, we cache the centerpoint of the element so +we can position the element correctly when th...
     setValue(int newOffset, boolean skipAnim, boolean force) : booleanSlider
    Provides a way to set the value of the slider in code.
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringSlider
    Slider toString
     unlock() : voidSlider
    Unlocks the slider, overrides YAHOO.util.DragDrop
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
     verifyOffset() : booleanSlider
    Checks the background position element position. If it has moved from the +baseline position, the constraints for the...
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     change : (int new, int firstOffset, int secondOffset)Slider
    Event the fires when the value of the control changes. If +the control is animated the event will fire every point +a...
     slideEnd : ()Slider
    Event that fires at the end of a slider thumb move
     slideStart : ()Slider
    Event that fires at the end of a slider thumb move.
    + +

    Property Details

    +
    + +
    +

    ANIM_AVAIL<static>

    + public boolean ANIM_AVAIL<static> +
    + <static> By default, animation is available if the animation library is detected.
    +
    This property is defined by Slider.
    +
    + +
    +

    animate

    + public boolean animate +
    + Flag that determines if the thumb will animate when moved
    +
    This property is defined by Slider.
    +
    + +
    +

    animationDuration

    + public int animationDuration +
    + If animation is configured, specifies the length of the animation +in seconds.
    +
    This property is defined by Slider.
    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    backgroundEnabled

    + public boolean backgroundEnabled +
    + Set to false to disable a background click thumb move
    +
    This property is defined by Slider.
    +
    + +
    +

    baselinePos

    + public [int, baselinePos +
    + The basline position of the background element, used +to determine if the background has moved since the last +operation.
    +
    This property is defined by Slider.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    enableKeys

    + public boolean enableKeys +
    + Enables the arrow, home and end keys, defaults to true.
    +
    This property is defined by Slider.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    keyIncrement

    + public int keyIncrement +
    + Specifies the number of pixels the arrow keys will move the slider. +Default is 25.
    +
    This property is defined by Slider.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    moveComplete

    + public Boolean moveComplete +
    + moveComplete is set to true when the slider has moved to its final +destination. For animated slider, this value can be checked in +the onChange handler to make it possible to execute logic only +when the move is complete rather than at all points along the way.
    +
    This property is defined by Slider.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    thumb

    + public YAHOO.widget.SliderThumb thumb +
    + A YAHOO.widget.SliderThumb instance that we will use to +reposition the thumb when the background is clicked
    +
    This property is defined by Slider.
    +
    + +
    +

    thumbCenterPoint

    + public "x": thumbCenterPoint +
    + The center of the slider element is stored so we can position +place it in the correct position when the background is clicked
    +
    This property is defined by Slider.
    +
    + +
    +

    tickPause

    + public int tickPause +
    + Adjustment factor for tick animation, the more ticks, the +faster the animation (by default)
    +
    This property is defined by Slider.
    +
    + +
    +

    type

    + public string type +
    + The type of the slider (horiz, vert, region)
    +
    This property is defined by Slider.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Slider

    + public function Slider(String id, String sGroup, String sType) +
    +
    + Parameters: +
    • id : String
      The id of the element linked to this instance
    • sGroup : String
      The group of related DragDrop items
    • sType : String
      The type of slider (horiz, vert, region)
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clears any tick interval defined for this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getHorizSlider<static>

    + public function getHorizSlider<static>(String sBGElId, String sHandleElId, int iLeft, int iRight, int iTickSize) +
    + <static> Factory method for creating a horizontal slider +
    + Parameters: +
    • sBGElId : String
      the id of the slider's background element
    • sHandleElId : String
      the id of the thumb element
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iTickSize : int
      optional parameter for specifying that the element should move a certain number pixels at a time.
    + Returns: +
      +
    • Slider
      a horizontal slider control
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getSliderRegion<static>

    + public function getSliderRegion<static>(String sBGElId, String sHandleElId, int iLeft, int iRight, int iUp, int iDown, int iTickSize) +
    + <static> Factory method for creating a slider region like the one in the color +picker example +
    + Parameters: +
    • sBGElId : String
      the id of the slider's background element
    • sHandleElId : String
      the id of the thumb element
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move a certain number pixels at a time.
    + Returns: +
      +
    • Slider
      a slider region control
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getThumb

    + public function getThumb() +
    + Returns a reference to this slider's thumb +
    + Parameters: +
    • None.
    + Returns: +
      +
    • SliderThumb
      this slider's thumb
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getValue

    + public function getValue() +
    + Returns the slider's thumb offset from the start position +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the current value
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getVertSlider<static>

    + public function getVertSlider<static>(String sBGElId, String sHandleElId, int iUp, int iDown, int iTickSize) +
    + <static> Factory method for creating a vertical slider +
    + Parameters: +
    • sBGElId : String
      the id of the slider's background element
    • sHandleElId : String
      the id of the thumb element
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move a certain number pixels at a time.
    + Returns: +
      +
    • Slider
      a vertical slider control
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getXValue

    + public function getXValue() +
    + Returns the slider's thumb X offset from the start position +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the current horizontal offset
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    getYValue

    + public function getYValue() +
    + Returns the slider's thumb Y offset from the start position +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the current vertical offset
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Locks the slider, overrides YAHOO.util.DragDrop +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onChange

    + public function onChange(int firstOffset, int secondOffset) +
    + Deprecated. Event that fires when the value of the slider has changed +
    + Parameters: +
    • firstOffset : int
      the number of pixels the thumb has moved from its start position. Normal horizontal and vertical sliders will only have the firstOffset. Regions will have both, the first is the horizontal offset, the second the vertical.
    • secondOffset : int
      the y offset for region sliders
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onSlideStart

    + public function onSlideStart() +
    + Deprecated. Event that fires when the at the beginning of the slider thumb move +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    onSliderEnd

    + public function onSliderEnd() +
    + Deprecated. Event that fires at the end of a slider thumb move +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setRegionValue

    + public function setRegionValue(int newOffset, int newOffset2, boolean skipAnim, boolean force) +
    + Provides a way to set the value of the region slider in code. +
    + Parameters: +
    • newOffset : int
      the number of pixels the thumb should be positioned away from the initial start point (x axis for region)
    • newOffset2 : int
      the number of pixels the thumb should be positioned away from the initial start point (y axis for region)
    • skipAnim : boolean
      set to true to disable the animation for this move action (but not others).
    • force : boolean
      ignore the locked setting and set value anyway
    + Returns: +
      +
    • boolean
      true if the move was performed, false if it failed
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    setSliderStartState

    + public function setSliderStartState() +
    + Initialization that sets up the value offsets once the elements are ready +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    setThumbCenterPoint

    + public function setThumbCenterPoint() +
    + When the thumb is available, we cache the centerpoint of the element so +we can position the element correctly when the background is clicked +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    setValue

    + public function setValue(int newOffset, boolean skipAnim, boolean force) +
    + Provides a way to set the value of the slider in code. +
    + Parameters: +
    • newOffset : int
      the number of pixels the thumb should be positioned away from the initial start point
    • skipAnim : boolean
      set to true to disable the animation for this move action (but not others).
    • force : boolean
      ignore the locked setting and set value anyway
    + Returns: +
      +
    • boolean
      true if the move was performed, false if it failed
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + Slider toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the instance
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlocks the slider, overrides YAHOO.util.DragDrop +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    verifyOffset

    + public function verifyOffset() +
    + Checks the background position element position. If it has moved from the +baseline position, the constraints for the thumb are reset +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      True if the offset is the same as the baseline.
    • +
    +
    +
    +
    This method is defined by Slider.
    +
    +
    + +

    Event Details

    +
    + +
    +

    change

    + public event change +
    + Event the fires when the value of the control changes. If +the control is animated the event will fire every point +along the way. +
    + Subscribers will be called with the following parameters: +
    • new : int
    • firstOffset : int
      the number of pixels the thumb has moved from its start position. Normal horizontal and vertical sliders will only have the firstOffset. Regions will have both, the first is the horizontal offset, the second the vertical.
    • secondOffset : int
      the y offset for region sliders
    +
    +
    +
    This event is defined by Slider.
    +
    + +
    +

    slideEnd

    + public event slideEnd +
    + Event that fires at the end of a slider thumb move +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Slider.
    +
    + +
    +

    slideStart

    + public event slideStart +
    + Event that fires at the end of a slider thumb move. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Slider.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.SliderThumb.html b/www/extras/yui-ext/docs/output/YAHOO.widget.SliderThumb.html new file mode 100644 index 000000000..caaa78aed --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.SliderThumb.html @@ -0,0 +1,1737 @@ + + + + YAHOO.widget.SliderThumb + + + + + +
    + +

    Class YAHOO.widget.SliderThumb

    + + + + + +
    Package:YAHOO.widget
    Class:SliderThumb
    Extends:DD
    Defined In:slider.js
    +
    + A drag and drop implementation to be used as the thumb of a slider.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : booleanDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     parentElId : stringSliderThumb
    The id of the thumbs parent HTML element (the slider background +element).
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     scroll : booleanDD
    When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
     startOffset : [int,SliderThumb
    The (X and Y) difference between the thumb location and its parent +(the slider background) when the control is insta...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     SliderThumb(String id, String sGroup, int iLeft, int iRight, int iUp, int iDown, int iTickSize)SliderThumb
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
    Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     autoOffset(int iPageX, int iPageY) : voidDD
    Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
     cachePosition(iPageX the, iPageY the) : voidDD
    Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidSliderThumb
    Clear's the slider's ticks
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     getOffsetFromParent([int, int]}) : voidSliderThumb
    Returns the difference between the location of the thumb and its parent.
     getValue() : intSliderThumb
    Gets the current offset from the element's start position in +pixels.
     getXValue() : intSliderThumb
    Gets the current X offset from the element's start position in +pixels.
     getYValue() : intSliderThumb
    Gets the current Y offset from the element's start position in +pixels.
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initSlider(int iLeft, int iRight, int iUp, int iDown, int iTickSize) : voidSliderThumb
    Set up the slider, must be called in the constructor of all subclasses
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDelta(int iDeltaX, int iDeltaY) : voidDD
    Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setDragElPos(int iPageX, int iPageY) : voidDD
    Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringSliderThumb
    Thumb toString
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    parentElId

    + public string parentElId +
    + The id of the thumbs parent HTML element (the slider background +element).
    +
    This property is defined by SliderThumb.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    scroll

    + public boolean scroll +
    + When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
    +
    This property is defined by DD.
    +
    + +
    +

    startOffset

    + public [int, startOffset +
    + The (X and Y) difference between the thumb location and its parent +(the slider background) when the control is instantiated.
    +
    This property is defined by SliderThumb.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    SliderThumb

    + public function SliderThumb(String id, String sGroup, int iLeft, int iRight, int iUp, int iDown, int iTickSize) +
    +
    + Parameters: +
    • id : String
      the id of the slider html element
    • sGroup : String
      the group of related DragDrop items
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move a certain number pixels at a time.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    alignElWithMouse

    + public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
    + Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • el : HTMLElement
      the element to move
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    autoOffset

    + public function autoOffset(int iPageX, int iPageY) +
    + Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
    + Parameters: +
    • iPageX : int
      the X coordinate of the click
    • iPageY : int
      the Y coordinate of the click
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    cachePosition

    + public function cachePosition(iPageX the, iPageY the) +
    + Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
    + Parameters: +
    • the : iPageX
      current x position (optional, this just makes it so we don't have to look it up again)
    • the : iPageY
      current y position (optional, this just makes it so we don't have to look it up again)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clear's the slider's ticks +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getOffsetFromParent

    + public function getOffsetFromParent([int, int]}) +
    + Returns the difference between the location of the thumb and its parent. +
    + Parameters: +
    • int]} : [int,
      parentPos Optionally accepts the position of the parent
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getValue

    + public function getValue() +
    + Gets the current offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getXValue

    + public function getXValue() +
    + Gets the current X offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved horizontally from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getYValue

    + public function getYValue() +
    + Gets the current Y offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved vertically from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initSlider

    + public function initSlider(int iLeft, int iRight, int iUp, int iDown, int iTickSize) +
    + Set up the slider, must be called in the constructor of all subclasses +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      the width of the tick interval.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDelta

    + public function setDelta(int iDeltaX, int iDeltaY) +
    + Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
    + Parameters: +
    • iDeltaX : int
      the distance from the left
    • iDeltaY : int
      the distance from the top
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElPos

    + public function setDragElPos(int iPageX, int iPageY) +
    + Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + Thumb toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the instance
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TVAnim.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TVAnim.html new file mode 100644 index 000000000..3d48395aa --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TVAnim.html @@ -0,0 +1,137 @@ + + + + YAHOO.widget.TVAnim + + + + + +
    + +

    Class YAHOO.widget.TVAnim

    + + + + + +
    Package:YAHOO.widget
    Class:TVAnim
    Extends:Object
    Defined In:treeview.js
    +
    + A static factory class for tree view expand/collapse animations
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     FADE_IN : stringTVAnim
    <static> Constant for the fade in animation
     FADE_OUT : stringTVAnim
    <static> Constant for the fade out animation
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     getAnim(type {string}, el {HTMLElement}, callback {function}) : YAHOO.util.AnimationTVAnim
    <static> Returns a ygAnim instance of the given type
     isValid(type {string}) : booleanTVAnim
    <static> Returns true if the specified animation class is available
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    FADE_IN

    + public string FADE_IN +
    + <static> Constant for the fade in animation
    +
    This property is defined by TVAnim.
    +
    + +
    +

    FADE_OUT

    + public string FADE_OUT +
    + <static> Constant for the fade out animation
    +
    This property is defined by TVAnim.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    getAnim

    + public function getAnim(type {string}, el {HTMLElement}, callback {function}) +
    + <static> Returns a ygAnim instance of the given type +
    + Parameters: +
    • {string} : type
      the type of animation
    • {HTMLElement} : el
      the element to element (probably the children div)
    • {function} : callback
      function to invoke when the animation is done.
    + Returns: +
      +
    • YAHOO.util.Animation
      the animation instance
    • +
    +
    +
    +
    This method is defined by TVAnim.
    +
    + +
    +

    isValid

    + public function isValid(type {string}) +
    + <static> Returns true if the specified animation class is available +
    + Parameters: +
    • {string} : type
      the type of animation
    + Returns: +
      +
    • boolean
      true if valid, false if not
    • +
    +
    +
    +
    This method is defined by TVAnim.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeIn.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeIn.html new file mode 100644 index 000000000..f0377c068 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeIn.html @@ -0,0 +1,184 @@ + + + + YAHOO.widget.TVFadeIn + + + + + +
    + +

    Class YAHOO.widget.TVFadeIn

    + + + + + +
    Package:YAHOO.widget
    Class:TVFadeIn
    Extends:Object
    Defined In:treeview.js
    +
    + A 1/2 second fade-in animation.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     callback : functionTVFadeIn
    the callback to invoke when the animation is complete
     el : HTMLElementTVFadeIn
    The element to animate
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TVFadeIn(el {HTMLElement}, callback {function})TVFadeIn
     animate() : voidTVFadeIn
    Performs the animation
     onComplete() : voidTVFadeIn
    Clean up and invoke callback
     toString() : stringTVFadeIn
    toString
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    callback

    + public function callback +
    + the callback to invoke when the animation is complete
    +
    This property is defined by TVFadeIn.
    +
    + +
    +

    el

    + public HTMLElement el +
    + The element to animate
    +
    This property is defined by TVFadeIn.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TVFadeIn

    + public function TVFadeIn(el {HTMLElement}, callback {function}) +
    +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {function} : callback
      function to invoke when the animation is finished
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    animate

    + public function animate() +
    + Performs the animation +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    + +
    +

    onComplete

    + public function onComplete() +
    + Clean up and invoke callback +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the string representation of the instance
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeOut.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeOut.html new file mode 100644 index 000000000..d62953f65 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TVFadeOut.html @@ -0,0 +1,184 @@ + + + + YAHOO.widget.TVFadeOut + + + + + +
    + +

    Class YAHOO.widget.TVFadeOut

    + + + + + +
    Package:YAHOO.widget
    Class:TVFadeOut
    Extends:Object
    Defined In:treeview.js
    +
    + A 1/2 second fade out animation.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     callback : functionTVFadeOut
    the callback to invoke when the animation is complete
     el : HTMLElementTVFadeOut
    The element to animate
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TVFadeOut(el {HTMLElement}, callback {Function})TVFadeOut
     animate() : voidTVFadeOut
    Performs the animation
     onComplete() : voidTVFadeOut
    Clean up and invoke callback
     toString() : stringTVFadeOut
    toString
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    callback

    + public function callback +
    + the callback to invoke when the animation is complete
    +
    This property is defined by TVFadeOut.
    +
    + +
    +

    el

    + public HTMLElement el +
    + The element to animate
    +
    This property is defined by TVFadeOut.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TVFadeOut

    + public function TVFadeOut(el {HTMLElement}, callback {Function}) +
    +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {Function} : callback
      function to invoke when the animation is finished
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    animate

    + public function animate() +
    + Performs the animation +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    + +
    +

    onComplete

    + public function onComplete() +
    + Clean up and invoke callback +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the string representation of the instance
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Tab.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Tab.html new file mode 100644 index 000000000..87c42add8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Tab.html @@ -0,0 +1,977 @@ + + + + YAHOO.widget.Tab + + + + + +
    + +

    Class YAHOO.widget.Tab

    + + + + + +
    Package:YAHOO.widget
    Class:Tab
    Extends:Element
    Defined In:tabview.js
    +
    + A representation of a Tab's label and content.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ACTIVE_CLASSNAME : StringTab
    The class name applied to active tabs.
     DISABLED_CLASSNAME : StringTab
    The class name applied to disabled tabs.
     DOM_EVENTS : ObjectElement
    Dom events supported by the Element instance.
     LABEL_INNER_TAGNAME : StringTab
    The default tag name for a Tab's inner element.
     LOADING_CLASSNAME : StringTab
    The class name applied to dynamic tabs while loading.
     dataConnection : ObjectTab
    Provides a reference to the connection request object when data is +loaded dynamically.
     loadHandler : objectTab
    Object containing success and failure callbacks for loading data.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Tab([element {HTMLElement/String}], Object properties)Tab
     addClass(String className) : voidElement
    Wrapper for Dom method.
     addListener(String type, Function fn, Any obj, Object scope) : voidElement
    Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEve...
     appendChild(Boolean deep) : voidElement
    Wrapper for HTMLElement method.
     appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) : voidElement
    Appends the HTMLElement into either the supplied parentNode.
     fireQueue() : voidElement
    Apply any queued set calls.
     getElementsByClassName(String className, [String tag]) : ArrayElement
    Wrapper for Dom method.
     getElementsByTagName(String tag) : voidElement
    Wrapper for HTMLElement method.
     getStyle(String property) : StringElement
    Wrapper for Dom method.
     hasChildNodes() : BooleanElement
    Wrapper for HTMLElement method.
     hasClass(String className) : BooleanElement
    Wrapper for Dom method.
     initAttributes(Object attr) : voidTab
    Registers TabView specific properties.
     insertBefore(HTMLElement element, HTMLElement before) : voidElement
    Wrapper for HTMLElement method.
     on(String type, Function fn, Any obj, Object scope) : voidElement
    Alias for addListener
     removeChild(HTMLElement child) : voidElement
    Wrapper for HTMLElement method.
     removeClass(String className) : voidElement
    Wrapper for Dom method.
     removeListener(String type, Function fn) : voidElement
    Remove an event listener
     replaceChild(HTMLElement newNode, HTMLElement oldNode) : voidElement
    Wrapper for HTMLElement method.
     replaceClass(String oldClassName, String newClassName) : voidElement
    Wrapper for Dom method.
     setStyle(String property, String value) : voidElement
    Wrapper for Dom method.
     toString() : StringTab
    Provides a readable name for the tab.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     activeChange : ()Tab
    Fires after the active state is changed. +See: Element.addListener +Event fields: +<String> type activeChange +<...
     available : ()Element
    Fires when the Element's HTMLElement can be retrieved by Id. +See: Element.addListener +Event fields: +<String> ty...
     beforeActiveChange : ()Tab
    Fires before the active state is changed. +See: Element.addListener +If handler returns false, the change will be cance...
     beforeContentChange : ()Tab
    Fires before the tab content is changed. +See: Element.addListener +If handler returns false, the change will be cancel...
     beforeLabelChange : ()Tab
    Fires before the tab label is changed. +See: Element.addListener +If handler returns false, the change will be cancelle...
     contentChange : ()Tab
    Fires after the tab content is changed. +See: Element.addListener +Event fields: +<String> type contentChange +<...
     contentReady : ()Element
    Fires when the Element's HTMLElement subtree is rendered. +See: Element.addListener +Event fields: +<String> type ...
     labelChange : ()Tab
    Fires after the tab label is changed. +See: Element.addListener +Event fields: +<String> type labelChange +<Stri...
    + +

    Property Details

    +
    + +
    +

    ACTIVE_CLASSNAME

    + public String ACTIVE_CLASSNAME +
    + The class name applied to active tabs.
    +
    This property is defined by Tab.
    +
    + +
    +

    DISABLED_CLASSNAME

    + public String DISABLED_CLASSNAME +
    + The class name applied to disabled tabs.
    +
    This property is defined by Tab.
    +
    + +
    +

    DOM_EVENTS

    + public Object DOM_EVENTS +
    + Dom events supported by the Element instance.
    +
    This property is defined by Element.
    +
    + +
    +

    LABEL_INNER_TAGNAME

    + public String LABEL_INNER_TAGNAME +
    + The default tag name for a Tab's inner element.
    +
    This property is defined by Tab.
    +
    + +
    +

    LOADING_CLASSNAME

    + public String LOADING_CLASSNAME +
    + The class name applied to dynamic tabs while loading.
    +
    This property is defined by Tab.
    +
    + +
    +

    dataConnection

    + public Object dataConnection +
    + Provides a reference to the connection request object when data is +loaded dynamically.
    +
    This property is defined by Tab.
    +
    + +
    +

    loadHandler

    + public object loadHandler +
    + Object containing success and failure callbacks for loading data.
    +
    This property is defined by Tab.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Tab

    + public function Tab([element {HTMLElement/String}], Object properties) +
    +
    + Parameters: +
    • {HTMLElement/String} : element
      (optional) The html element that represents the TabView. An element will be created if none provided.
    • properties : Object
      A key map of initial properties
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addClass

    + public function addClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addListener

    + public function addListener(String type, Function fn, Any obj, Object scope) +
    + Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEvent +can be listened for. All handlers receive an event object. +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The handler to call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendChild

    + public function appendChild(Boolean deep) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • deep : Boolean
      Whether or not to do a deep clone
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendTo

    + public function appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) +
    + Appends the HTMLElement into either the supplied parentNode. +
    + Parameters: +
    • parentNode : HTMLElement/Element
      The node to append to
    • before : HTMLElement/Element
      An optional node to insert before
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    fireQueue

    + public function fireQueue() +
    + Apply any queued set calls. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByClassName

    + public function getElementsByClassName(String className, [String tag]) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to collect
    • tag : String
      (optional) The tag to use in conjunction with class name
    + Returns: +
      +
    • Array
      Array of HTMLElements
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByTagName

    + public function getElementsByTagName(String tag) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • tag : String
      The tagName to collect
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getStyle

    + public function getStyle(String property) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to retrieve
    + Returns: +
      +
    • String
      The current value of the property
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasChildNodes

    + public function hasChildNodes() +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the element has childNodes
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasClass

    + public function hasClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • Boolean
      Whether or not the element has the class name
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    initAttributes

    + public function initAttributes(Object attr) +
    + Registers TabView specific properties. +
    + Parameters: +
    • attr : Object
      Hash of initial attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    insertBefore

    + public function insertBefore(HTMLElement element, HTMLElement before) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • element : HTMLElement
      The HTMLElement to insert
    • before : HTMLElement
      The HTMLElement to insert the element before.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    on

    + public function on(String type, Function fn, Any obj, Object scope) +
    + Alias for addListener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeChild

    + public function removeChild(HTMLElement child) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • child : HTMLElement
      The HTMLElement to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeClass

    + public function removeClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeListener

    + public function removeListener(String type, Function fn) +
    + Remove an event listener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceChild

    + public function replaceChild(HTMLElement newNode, HTMLElement oldNode) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • newNode : HTMLElement
      The HTMLElement to insert
    • oldNode : HTMLElement
      The HTMLElement to replace
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceClass

    + public function replaceClass(String oldClassName, String newClassName) +
    + Wrapper for Dom method. +
    + Parameters: +
    • oldClassName : String
      The className to replace
    • newClassName : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    setStyle

    + public function setStyle(String property, String value) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to set
    • value : String
      The value to apply to the style property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    toString

    + public function toString() +
    + Provides a readable name for the tab. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    +
    + +

    Event Details

    +
    + +
    +

    activeChange

    + public event activeChange +
    + Fires after the active state is changed. +

    See: Element.addListener

    +

    Event fields:
    +<String> type activeChange
    +<Boolean> +prevValue the previous value
    +<Boolean> +newValue the updated value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('activeChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    available

    + public event available +
    + Fires when the Element's HTMLElement can be retrieved by Id. +

    See: Element.addListener

    +

    Event fields:
    +<String> type available
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('available', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    + +
    +

    beforeActiveChange

    + public event beforeActiveChange +
    + Fires before the active state is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeActiveChange
    +<Boolean> +prevValue the current value
    +<Boolean> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeActiveChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeContentChange

    + public event beforeContentChange +
    + Fires before the tab content is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeContentChange
    +<String> +prevValue the current value
    +<String> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeContentChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeLabelChange

    + public event beforeLabelChange +
    + Fires before the tab label is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeLabelChange
    +<String> +prevValue the current value
    +<String> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeLabelChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    contentChange

    + public event contentChange +
    + Fires after the tab content is changed. +

    See: Element.addListener

    +

    Event fields:
    +<String> type contentChange
    +<String> +prevValue the previous value
    +<Boolean> +newValue the updated value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('contentChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    contentReady

    + public event contentReady +
    + Fires when the Element's HTMLElement subtree is rendered. +

    See: Element.addListener

    +

    Event fields:
    +<String> type contentReady
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('contentReady', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    + +
    +

    labelChange

    + public event labelChange +
    + Fires after the tab label is changed. +

    See: Element.addListener

    +

    Event fields:
    +<String> type labelChange
    +<String> +prevValue the previous value
    +<String> +newValue the updated value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('labelChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TabView.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TabView.html new file mode 100644 index 000000000..07a3f617c --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TabView.html @@ -0,0 +1,1019 @@ + + + + YAHOO.widget.TabView + + + + + +
    + +

    Class YAHOO.widget.TabView

    + + + + + +
    Package:YAHOO.widget
    Class:TabView
    Extends:Element
    Defined In:tabview.js
    +
    + A widget to control tabbed views.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CLASSNAME : ObjectTabView
    The className to add when building from scratch.
     CONTENT_PARENT_CLASSNAME : ObjectTabView
    The className of the HTMLElement containing the TabView's label elements +to look for when building from existing mark...
     DOM_EVENTS : ObjectElement
    Dom events supported by the Element instance.
     TAB_PARENT_CLASSNAME : ObjectTabView
    The className of the HTMLElement containing the TabView's tab elements +to look for when building from existing markup...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TabView(HTMLElement/String/Object el(optional), [Object attr])TabView
     DOMEventHandler(event e) : voidTabView
    Routes childNode events.
     addClass(String className) : voidElement
    Wrapper for Dom method.
     addListener(String type, Function fn, Any obj, Object scope) : voidElement
    Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEve...
     addTab(YAHOO.widget.Tab tab, Integer index) : voidTabView
    Adds a Tab to the TabView instance. +If no index is specified, the tab is added to the end of the tab list.
     appendChild(Boolean deep) : voidElement
    Wrapper for HTMLElement method.
     appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) : voidElement
    Appends the HTMLElement into either the supplied parentNode.
     contentTransition() : voidTabView
    The transiton to use when switching between tabs.
     fireQueue() : voidElement
    Apply any queued set calls.
     getElementsByClassName(String className, [String tag]) : ArrayElement
    Wrapper for Dom method.
     getElementsByTagName(String tag) : voidElement
    Wrapper for HTMLElement method.
     getStyle(String property) : StringElement
    Wrapper for Dom method.
     getTab(Integer index) : YAHOO.widget.TabTabView
    Returns the Tab instance at the specified index.
     getTabIndex(YAHOO.widget.Tab tab) : intTabView
    Returns the index of given tab.
     hasChildNodes() : BooleanElement
    Wrapper for HTMLElement method.
     hasClass(String className) : BooleanElement
    Wrapper for Dom method.
     initAttributes(Object attr) : voidTabView
    Registers TabView specific properties.
     insertBefore(HTMLElement element, HTMLElement before) : voidElement
    Wrapper for HTMLElement method.
     on(String type, Function fn, Any obj, Object scope) : voidElement
    Alias for addListener
     removeChild(HTMLElement child) : voidElement
    Wrapper for HTMLElement method.
     removeClass(String className) : voidElement
    Wrapper for Dom method.
     removeListener(String type, Function fn) : voidElement
    Remove an event listener
     removeTab(YAHOO.widget.Tab item) : voidTabView
    Removes the specified Tab from the TabView.
     replaceChild(HTMLElement newNode, HTMLElement oldNode) : voidElement
    Wrapper for HTMLElement method.
     replaceClass(String oldClassName, String newClassName) : voidElement
    Wrapper for Dom method.
     setStyle(String property, String value) : voidElement
    Wrapper for Dom method.
     toString() : StringTabView
    Provides a readable name for the TabView instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     activeTabChange : ()TabView
    Fires after the activeTab is changed. +See: Element.addListener +Event fields: +<String> type activeTabChange +<...
     available : ()Element
    Fires when the Element's HTMLElement can be retrieved by Id. +See: Element.addListener +Event fields: +<String> ty...
     beforeActiveTabChange : ()TabView
    Fires before the activeTab is changed. +See: Element.addListener +If handler returns false, the change will be cancelle...
     beforeOrientationChange : ()TabView
    Fires before the orientation is changed. +See: Element.addListener +If handler returns false, the change will be cancel...
     contentReady : ()Element
    Fires when the Element's HTMLElement subtree is rendered. +See: Element.addListener +Event fields: +<String> type ...
     orientationChange : ()TabView
    Fires after the orientation is changed. +See: Element.addListener +Event fields: +<String> type orientationChange +...
    + +

    Property Details

    +
    + +
    +

    CLASSNAME

    + public Object CLASSNAME +
    + The className to add when building from scratch.
    +
    This property is defined by TabView.
    +
    + +
    +

    CONTENT_PARENT_CLASSNAME

    + public Object CONTENT_PARENT_CLASSNAME +
    + The className of the HTMLElement containing the TabView's label elements +to look for when building from existing markup, or to add when building +from scratch. +All childNodes of the content container are treated as content elements when +building from existing markup.
    +
    This property is defined by TabView.
    +
    + +
    +

    DOM_EVENTS

    + public Object DOM_EVENTS +
    + Dom events supported by the Element instance.
    +
    This property is defined by Element.
    +
    + +
    +

    TAB_PARENT_CLASSNAME

    + public Object TAB_PARENT_CLASSNAME +
    + The className of the HTMLElement containing the TabView's tab elements +to look for when building from existing markup, or to add when building +from scratch. +All childNodes of the tab container are treated as Tabs when building +from existing markup.
    +
    This property is defined by TabView.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TabView

    + public function TabView(HTMLElement/String/Object el(optional), [Object attr]) +
    +
    + Parameters: +
    • el(optional) : HTMLElement/String/Object
      The html element that represents the TabView, or the attribute object to use. An element will be created if none provided.
    • attr : Object
      (optional) A key map of the tabView's initial attributes. Ignored if first arg is attributes object.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    DOMEventHandler

    + public function DOMEventHandler(event e) +
    + Routes childNode events. +
    + Parameters: +
    • e : event
      The Dom event that is being handled.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    addClass

    + public function addClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addListener

    + public function addListener(String type, Function fn, Any obj, Object scope) +
    + Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEvent +can be listened for. All handlers receive an event object. +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The handler to call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addTab

    + public function addTab(YAHOO.widget.Tab tab, Integer index) +
    + Adds a Tab to the TabView instance. +If no index is specified, the tab is added to the end of the tab list. +
    + Parameters: +
    • tab : YAHOO.widget.Tab
      A Tab instance to add.
    • index : Integer
      The position to add the tab.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    appendChild

    + public function appendChild(Boolean deep) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • deep : Boolean
      Whether or not to do a deep clone
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendTo

    + public function appendTo(HTMLElement/Element parentNode, HTMLElement/Element before) +
    + Appends the HTMLElement into either the supplied parentNode. +
    + Parameters: +
    • parentNode : HTMLElement/Element
      The node to append to
    • before : HTMLElement/Element
      An optional node to insert before
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    contentTransition

    + public function contentTransition() +
    + The transiton to use when switching between tabs. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    fireQueue

    + public function fireQueue() +
    + Apply any queued set calls. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByClassName

    + public function getElementsByClassName(String className, [String tag]) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to collect
    • tag : String
      (optional) The tag to use in conjunction with class name
    + Returns: +
      +
    • Array
      Array of HTMLElements
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByTagName

    + public function getElementsByTagName(String tag) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • tag : String
      The tagName to collect
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getStyle

    + public function getStyle(String property) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to retrieve
    + Returns: +
      +
    • String
      The current value of the property
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getTab

    + public function getTab(Integer index) +
    + Returns the Tab instance at the specified index. +
    + Parameters: +
    • index : Integer
      The position of the Tab.
    + Returns: +
      +
    • YAHOO.widget.Tab
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    getTabIndex

    + public function getTabIndex(YAHOO.widget.Tab tab) +
    + Returns the index of given tab. +
    + Parameters: +
    • tab : YAHOO.widget.Tab
      The tab whose index will be returned.
    + Returns: +
      +
    • int
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    hasChildNodes

    + public function hasChildNodes() +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the element has childNodes
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasClass

    + public function hasClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • Boolean
      Whether or not the element has the class name
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    initAttributes

    + public function initAttributes(Object attr) +
    + Registers TabView specific properties. +
    + Parameters: +
    • attr : Object
      Hash of initial attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    insertBefore

    + public function insertBefore(HTMLElement element, HTMLElement before) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • element : HTMLElement
      The HTMLElement to insert
    • before : HTMLElement
      The HTMLElement to insert the element before.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    on

    + public function on(String type, Function fn, Any obj, Object scope) +
    + Alias for addListener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeChild

    + public function removeChild(HTMLElement child) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • child : HTMLElement
      The HTMLElement to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeClass

    + public function removeClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeListener

    + public function removeListener(String type, Function fn) +
    + Remove an event listener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeTab

    + public function removeTab(YAHOO.widget.Tab item) +
    + Removes the specified Tab from the TabView. +
    + Parameters: +
    • item : YAHOO.widget.Tab
      The Tab instance to be removed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    + +
    +

    replaceChild

    + public function replaceChild(HTMLElement newNode, HTMLElement oldNode) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • newNode : HTMLElement
      The HTMLElement to insert
    • oldNode : HTMLElement
      The HTMLElement to replace
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceClass

    + public function replaceClass(String oldClassName, String newClassName) +
    + Wrapper for Dom method. +
    + Parameters: +
    • oldClassName : String
      The className to replace
    • newClassName : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    setStyle

    + public function setStyle(String property, String value) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to set
    • value : String
      The value to apply to the style property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    toString

    + public function toString() +
    + Provides a readable name for the TabView instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by TabView.
    +
    +
    + +

    Event Details

    +
    + +
    +

    activeTabChange

    + public event activeTabChange +
    + Fires after the activeTab is changed. +

    See: Element.addListener

    +

    Event fields:
    +<String> type activeTabChange
    +<YAHOO.widget.Tab> +prevValue the formerly active tab
    +<YAHOO.widget.Tab> +newValue the new active tab

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('activeTabChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by TabView.
    +
    + +
    +

    available

    + public event available +
    + Fires when the Element's HTMLElement can be retrieved by Id. +

    See: Element.addListener

    +

    Event fields:
    +<String> type available
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('available', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    + +
    +

    beforeActiveTabChange

    + public event beforeActiveTabChange +
    + Fires before the activeTab is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeActiveTabChange
    +<YAHOO.widget.Tab> +prevValue the currently active tab
    +<YAHOO.widget.Tab> +newValue the tab to be made active

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeActiveTabChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by TabView.
    +
    + +
    +

    beforeOrientationChange

    + public event beforeOrientationChange +
    + Fires before the orientation is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeOrientationChange
    +<String> +prevValue the current orientation
    +<String> +newValue the new orientation to be applied

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeOrientationChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by TabView.
    +
    + +
    +

    contentReady

    + public event contentReady +
    + Fires when the Element's HTMLElement subtree is rendered. +

    See: Element.addListener

    +

    Event fields:
    +<String> type contentReady
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('contentReady', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    + +
    +

    orientationChange

    + public event orientationChange +
    + Fires after the orientation is changed. +

    See: Element.addListener

    +

    Event fields:
    +<String> type orientationChange
    +<String> +prevValue the former orientation
    +<String> +newValue the new orientation

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('orientationChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by TabView.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TextNode.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TextNode.html new file mode 100644 index 000000000..1992f2794 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TextNode.html @@ -0,0 +1,1505 @@ + + + + YAHOO.widget.TextNode + + + + + +
    + +

    Class YAHOO.widget.TextNode

    + + + + + + +
    Package:YAHOO.widget
    Class:TextNode
    Extends:Node
    Subclasses:MenuNode
    Defined In:treeview.js
    +
    + The default node presentation. The first parameter should be +either a string that will be used as the node's label, or an object +that has a string propery called label. By default, the clicking the +label will toggle the expanded/collapsed state of the node. By +changing the href property of the instance, this behavior can be +changed so that the label will go to the specified href.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     label : stringTextNode
    The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the labe...
     labelElId : stringTextNode
    The derived element id of the label for this node
     labelStyle : stringTextNode
    The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for ...
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TextNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean})TextNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getLabelEl() : objectTextNode
    Returns the label element +@for YAHOO.widget.TextNode
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     onLabelClick(me {Node}) : falseTextNode
    Executed when the label is clicked. Fires the labelClick custom event.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     setUpLabel(oData string) : voidTextNode
    Sets up the node label
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     labelClick : (YAHOO.widget.Node node)TextNode
    Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so...
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    label

    + public string label +
    + The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the label, or an object that +has a property called "label" that we will use.
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelElId

    + public string labelElId +
    + The derived element id of the label for this node
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelStyle

    + public string labelStyle +
    + The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for a specific node.
    +
    This property is defined by TextNode.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TextNode

    + public function TextNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}) +
    +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {YAHOO.widget.Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getLabelEl

    + public function getLabelEl() +
    + Returns the label element +@for YAHOO.widget.TextNode +
    + Parameters: +
    • None.
    + Returns: +
      +
    • object
      the element
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    onLabelClick

    + public function onLabelClick(me {Node}) +
    + Executed when the label is clicked. Fires the labelClick custom event. +
    + Parameters: +
    • {Node} : me
      this node @scope the anchor tag clicked
    + Returns: +
      +
    • false
      to cancel the anchor click
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setUpLabel

    + public function setUpLabel(oData string) +
    + Sets up the node label +
    + Parameters: +
    • string : oData
      containing the label, or an object with a label property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    labelClick

    + public event labelClick +
    + Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so there is a single +event that handles all nodes in the tree. The node clicked is +provided as an argument +@for YAHOO.widget.TreeView +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node clicked
    +
    +
    +
    This event is defined by TextNode.
    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.Tooltip.html b/www/extras/yui-ext/docs/output/YAHOO.widget.Tooltip.html new file mode 100644 index 000000000..2d6f07518 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.Tooltip.html @@ -0,0 +1,2053 @@ + + + + YAHOO.widget.Tooltip + + + + + +
    + +

    Class YAHOO.widget.Tooltip

    + + + + + +
    Package:YAHOO.widget
    Class:Tooltip
    Extends:Overlay
    Defined In:container.js
    +
    + Tooltip is an implementation of Overlay that behaves like an OS tooltip, displaying when the user mouses over a particular element, and disappearing on mouse out.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_BODY<static> : StringModule
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringModule
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringModule
    <static> Constant representing the module header
     CSS_MODULE<static> : StringModule
    <static> Constant for the default CSS class name that represents a Module
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_TOOLTIP<static> : StringTooltip
    <static> Constant representing the Tooltip CSS class
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     body : HTMLElementModule
    The body element, denoted with CSS class "bd"
     browser : StringModule
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigModule
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionModule
    The class's constructor function
     element : HTMLElementModule
    The main module element that contains the header, body, and footer
     footer : HTMLElementModule
    The footer element, denoted with CSS class "ft"
     header : HTMLElementModule
    The header element, denoted with CSS class "hd"
     http : StringModule
    <static> Constant representing the prefix path to use for non-secure images
     https : StringModule
    <static> Constant representing the prefix path to use for securely served images
     id : StringModule
    The id of the element
     imageRoot : StringModule
    The String representing the image root
     isSecure : BooleanModule
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringModule
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     platform : StringModule
    String representing the current user-agent platform
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Tooltip(String el, HTMLElement el, Object userConfig)Tooltip
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     appendToBody(HTMLElement element) : voidModule
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidModule
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidModule
    Appends the passed element to the header. If no header is present, one will be automatically created.
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "container" property is changed.
     configContext(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configMonitorResize(String type, Object[] args, Object obj) : voidModule
    Default event handler for the "monitorresize" configuration property
     configText(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "text" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidModule
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidModule
    Removes the Module element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doHide() : voidTooltip
    Sets the timeout for the auto-dismiss delay, which by default is 5 seconds, meaning that a tooltip will automatically...
     doShow(DOMEvent e) : NumberTooltip
    Processes the showing of the Tooltip by setting the timeout delay and offset of the Tooltip.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hide() : voidModule
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidTooltip
    The Tooltip initialization method. This method is automatically called by the constructor. A Tooltip is automatically...
     initDefaultConfig() : voidTooltip
    Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
     initEvents() : voidModule
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidModule
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onContextMouseMove(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user moves the mouse while over the context element.
     onContextMouseOut(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user mouses out of the context element.
     onContextMouseOver(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user mouses over the context element.
     onDomResize(DOMEvent e, Object obj) : voidModule
    Event handler fired when the resize monitor element is resized.
     preventOverlay(Number pageX, Number pageY) : voidTooltip
    Fired when the Tooltip is moved, this event handler is used to prevent the Tooltip from overlapping with its context ...
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanModule
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     setBody(String bodyContent, HTMLElement bodyContent) : voidModule
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidModule
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidModule
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     show() : voidModule
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringTooltip
    Returns a string representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     appendEvent : ()Module
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Module
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Module
    CustomEvent fired prior to class initalization.
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeRenderEvent : ()Module
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Module
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Module
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Module
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Module
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Module
    CustomEvent fired when the header content of the Module is modified
     destroyEvent : ()Module
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Module
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Module
    CustomEvent fired after class initalization.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     renderEvent : ()Module
    CustomEvent fired after the Module is rendered
     showEvent : ()Module
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Module.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_TOOLTIP<static>

    + public String CSS_TOOLTIP<static> +
    + <static> Constant representing the Tooltip CSS class
    +
    This property is defined by Tooltip.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Module.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Module.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Module.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Module.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Module.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Module.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Module.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Module.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Module.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Module.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Module.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Module.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Module.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Module.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Tooltip

    + public function Tooltip(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Tooltip OR
    • el : HTMLElement
      The element representing the Tooltip
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String type, Object[] args, Object obj) +
    + The default event handler fired when the "container" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configText

    + public function configText(String type, Object[] args, Object obj) +
    + The default event handler fired when the "text" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doHide

    + public function doHide() +
    + Sets the timeout for the auto-dismiss delay, which by default is 5 seconds, meaning that a tooltip will automatically dismiss itself after 5 seconds of being displayed. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    doShow

    + public function doShow(DOMEvent e) +
    + Processes the showing of the Tooltip by setting the timeout delay and offset of the Tooltip. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    + Returns: +
      +
    • Number
      The process ID of the timeout function associated with doShow
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Tooltip initialization method. This method is automatically called by the constructor. A Tooltip is automatically rendered by the init method, and it also is set to be invisible by default, and constrained to viewport by default as well. +
    + Parameters: +
    • el : String
      The element ID representing the Tooltip OR
    • el : HTMLElement
      The element representing the Tooltip
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Tooltip. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onContextMouseMove

    + public function onContextMouseMove(DOMEvent e, Object obj) +
    + The default event handler fired when the user moves the mouse while over the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onContextMouseOut

    + public function onContextMouseOut(DOMEvent e, Object obj) +
    + The default event handler fired when the user mouses out of the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onContextMouseOver

    + public function onContextMouseOver(DOMEvent e, Object obj) +
    + The default event handler fired when the user mouses over the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    preventOverlay

    + public function preventOverlay(Number pageX, Number pageY) +
    + Fired when the Tooltip is moved, this event handler is used to prevent the Tooltip from overlapping with its context element. +
    + Parameters: +
    • pageX : Number
      The x coordinate position of the mouse pointer
    • pageY : Number
      The y coordinate position of the mouse pointer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Module.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Tooltip
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Module.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.TreeView.html b/www/extras/yui-ext/docs/output/YAHOO.widget.TreeView.html new file mode 100644 index 000000000..ab55e8d7b --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.TreeView.html @@ -0,0 +1,922 @@ + + + + YAHOO.widget.TreeView + + + + + +
    + +

    Class YAHOO.widget.TreeView

    + + + + + +
    Package:YAHOO.widget
    Class:TreeView
    Extends:Object
    Defined In:treeview.js
    +
    + Contains the tree view state data and the root node.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     id : StringTreeView
    The id of tree container element
     locked : booleanTreeView
    We lock the tree control while waiting for the dynamic loader to return
     maxAnim : intTreeView
    The maximum number of animations to run at one time.
     nodeCount<static> : intTreeView
    <static> Count of all nodes in all trees
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TreeView(string|HTMLElement id)TreeView
     addHandler<static>(el the, string sType, function fn) : voidTreeView
    <static> Add a DOM event
     animateCollapse(el {HTMLElement}, node {YAHOO.util.Node}) : booleanTreeView
    Perform the collapse animation if configured, or just show the +element if not configured or too many animations are i...
     animateExpand(el {HTMLElement}, node {YAHOO.util.Node}) : booleanTreeView
    Perform the expand animation if configured, or just show the +element if not configured or too many animations are in ...
     collapseAll() : voidTreeView
    Collapses all expanded child nodes in the entire tree.
     collapseComplete() : voidTreeView
    Function executed when the collapse animation completes
     draw() : voidTreeView
    Renders the tree boilerplate and visible nodes
     expandAll() : voidTreeView
    Expands all child nodes. Note: this conflicts with the "multiExpand" +node property. If expand all is called in a tr...
     expandComplete() : voidTreeView
    Function executed when the expand animation completes
     getEl() : HTMLElementTreeView
    Returns the tree's host element
     getNode<static>(treeId {String}, nodeIndex {String}) : NodeTreeView
    <static> Global method for getting a node by its id. Used in the generated +tree html.
     getNodeByIndex(int nodeIndex) : NodeTreeView
    Returns a node in the tree that has the specified index (this index +is created internally, so this function probably ...
     getNodeByProperty(object property, object value) : NodeTreeView
    Returns a node that has a matching property and value in the data +object that was passed into its constructor.
     getNodesByProperty(object property, object value) : ArrayTreeView
    Returns a collection of nodes that have a matching property +and value in the data object that was passed into its co...
     getRoot() : NodeTreeView
    Returns the root node of this tree
     getTree<static>(treeId {String}) : TreeViewTreeView
    <static> Global method for getting a tree by its id. Used in the generated +tree html.
     onCollapse(node {Node}) : voidTreeView
    Deprecated. Abstract method that is executed when a node is collapsed.
     onExpand(node {Node}) : voidTreeView
    Deprecated. Abstract method that is executed when a node is expanded
     popNode(Node the) : voidTreeView
    Removes the node from the tree, preserving the child collection +to make it possible to insert the branch into anothe...
     preload<static>(string prefix) : voidTreeView
    <static> Attempts to preload the images defined in the styles used to draw the tree by +rendering off-screen ele...
     removeChildren(Node node) : voidTreeView
    Deletes this nodes child collection, recursively. Also collapses +the node, and resets the dynamic load flag. The pr...
     removeHandler<static>(el the, string sType, function fn) : voidTreeView
    <static> Remove a DOM event
     removeNode(Node The, boolean autoRefresh) : booleanTreeView
    Removes the node and its children, and optionally refreshes the +branch of the tree that was affected.
     setCollapseAnim(string the) : voidTreeView
    Sets up the animation for collapsing children
     setDynamicLoad(function fnDataLoader, iconMode {int}) : voidTreeView
    Configures this tree to dynamically load all child data
     setExpandAnim(string type) : voidTreeView
    Sets up the animation for expanding children
     toString() : stringTreeView
    TreeView instance toString
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     animComplete : (YAHOO.widget.Node node)TreeView
    When animation is enabled, this event fires when the animation +completes
     animStart : (YAHOO.widget.Node node)TreeView
    When animation is enabled, this event fires when the animation +starts
     collapse : (YAHOO.widget.Node node)TreeView
    Fires when a node is going to be expanded. Return false to stop +the expand.
     expand : (YAHOO.widget.Node node)TreeView
    Fires when a node is going to be collapsed. Return false to stop +the collapse.
    + +

    Property Details

    +
    + +
    +

    id

    + public String id +
    + The id of tree container element
    +
    This property is defined by TreeView.
    +
    + +
    +

    locked

    + public boolean locked +
    + We lock the tree control while waiting for the dynamic loader to return
    +
    This property is defined by TreeView.
    +
    + +
    +

    maxAnim

    + public int maxAnim +
    + The maximum number of animations to run at one time.
    +
    This property is defined by TreeView.
    +
    + +
    +

    nodeCount<static>

    + public int nodeCount<static> +
    + <static> Count of all nodes in all trees
    +
    This property is defined by TreeView.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TreeView

    + public function TreeView(string|HTMLElement id) +
    +
    + Parameters: +
    • id : string|HTMLElement
      The id of the element, or the element itself that the tree will be inserted into.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addHandler<static>

    + public function addHandler<static>(el the, string sType, function fn) +
    + <static> Add a DOM event +
    + Parameters: +
    • the : el
      elment to bind the handler to
    • sType : string
      the type of event handler
    • fn : function
      the callback to invoke
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    animateCollapse

    + public function animateCollapse(el {HTMLElement}, node {YAHOO.util.Node}) +
    + Perform the collapse animation if configured, or just show the +element if not configured or too many animations are in progress +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {YAHOO.util.Node} : node
      the node that was expanded
    + Returns: +
      +
    • boolean
      true if animation could be invoked, false otherwise
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    animateExpand

    + public function animateExpand(el {HTMLElement}, node {YAHOO.util.Node}) +
    + Perform the expand animation if configured, or just show the +element if not configured or too many animations are in progress +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {YAHOO.util.Node} : node
      the node that was expanded
    + Returns: +
      +
    • boolean
      true if animation could be invoked, false otherwise
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Collapses all expanded child nodes in the entire tree. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    collapseComplete

    + public function collapseComplete() +
    + Function executed when the collapse animation completes +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    draw

    + public function draw() +
    + Renders the tree boilerplate and visible nodes +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Expands all child nodes. Note: this conflicts with the "multiExpand" +node property. If expand all is called in a tree with nodes that +do not allow multiple siblings to be displayed, only the last sibling +will be expanded. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    expandComplete

    + public function expandComplete() +
    + Function executed when the expand animation completes +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns the tree's host element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the host element
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getNode<static>

    + public function getNode<static>(treeId {String}, nodeIndex {String}) +
    + <static> Global method for getting a node by its id. Used in the generated +tree html. +
    + Parameters: +
    • {String} : treeId
      the id of the tree instance
    • {String} : nodeIndex
      the index of the node to return
    + Returns: +
      +
    • Node
      the node instance requested, null if not found
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getNodeByIndex

    + public function getNodeByIndex(int nodeIndex) +
    + Returns a node in the tree that has the specified index (this index +is created internally, so this function probably will only be used +in html generated for a given node.) +
    + Parameters: +
    • nodeIndex : int
      the index of the node wanted
    + Returns: +
      +
    • Node
      the node with index=nodeIndex, null if no match
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getNodeByProperty

    + public function getNodeByProperty(object property, object value) +
    + Returns a node that has a matching property and value in the data +object that was passed into its constructor. +
    + Parameters: +
    • property : object
      the property to search (usually a string)
    • value : object
      the value we want to find (usuall an int or string)
    + Returns: +
      +
    • Node
      the matching node, null if no match
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getNodesByProperty

    + public function getNodesByProperty(object property, object value) +
    + Returns a collection of nodes that have a matching property +and value in the data object that was passed into its constructor. +
    + Parameters: +
    • property : object
      the property to search (usually a string)
    • value : object
      the value we want to find (usuall an int or string)
    + Returns: +
      +
    • Array
      the matching collection of nodes, null if no match
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + Returns the root node of this tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node
      the root node
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    getTree<static>

    + public function getTree<static>(treeId {String}) +
    + <static> Global method for getting a tree by its id. Used in the generated +tree html. +
    + Parameters: +
    • {String} : treeId
      the id of the tree instance
    + Returns: +
      +
    • TreeView
      the tree instance requested, null if not found.
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    onCollapse

    + public function onCollapse(node {Node}) +
    + Deprecated. Abstract method that is executed when a node is collapsed. +
    + Parameters: +
    • {Node} : node
      the node that was collapsed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    onExpand

    + public function onExpand(node {Node}) +
    + Deprecated. Abstract method that is executed when a node is expanded +
    + Parameters: +
    • {Node} : node
      the node that was expanded
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    popNode

    + public function popNode(Node the) +
    + Removes the node from the tree, preserving the child collection +to make it possible to insert the branch into another part of the +tree, or another tree. +
    + Parameters: +
    • the : Node
      node to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    preload<static>

    + public function preload<static>(string prefix) +
    + <static> Attempts to preload the images defined in the styles used to draw the tree by +rendering off-screen elements that use the styles. +
    + Parameters: +
    • prefix : string
      the prefix to use to generate the names of the images to preload, default is ygtv
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    removeChildren

    + public function removeChildren(Node node) +
    + Deletes this nodes child collection, recursively. Also collapses +the node, and resets the dynamic load flag. The primary use for +this method is to purge a node and allow it to fetch its data +dynamically again. +
    + Parameters: +
    • node : Node
      the node to purge
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    removeHandler<static>

    + public function removeHandler<static>(el the, string sType, function fn) +
    + <static> Remove a DOM event +
    + Parameters: +
    • the : el
      elment to bind the handler to
    • sType : string
      the type of event handler
    • fn : function
      the callback to invoke
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    removeNode

    + public function removeNode(Node The, boolean autoRefresh) +
    + Removes the node and its children, and optionally refreshes the +branch of the tree that was affected. +
    + Parameters: +
    • The : Node
      node to remove
    • autoRefresh : boolean
      automatically refreshes branch if true
    + Returns: +
      +
    • boolean
      False is there was a problem, true otherwise.
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    setCollapseAnim

    + public function setCollapseAnim(string the) +
    + Sets up the animation for collapsing children +
    + Parameters: +
    • the : string
      type of animation (acceptable values defined in YAHOO.widget.TVAnim)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(function fnDataLoader, iconMode {int}) +
    + Configures this tree to dynamically load all child data +
    + Parameters: +
    • fnDataLoader : function
      the function that will be called to get the data
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    setExpandAnim

    + public function setExpandAnim(string type) +
    + Sets up the animation for expanding children +
    + Parameters: +
    • type : string
      the type of animation (acceptable values defined in YAHOO.widget.TVAnim)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    + +
    +

    toString

    + public function toString() +
    + TreeView instance toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the tree
    • +
    +
    +
    +
    This method is defined by TreeView.
    +
    +
    + +

    Event Details

    +
    + +
    +

    animComplete

    + public event animComplete +
    + When animation is enabled, this event fires when the animation +completes +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node that is expanding/collapsing @parm {String} type the type of animation ("expand" or "collapse")
    +
    +
    +
    This event is defined by TreeView.
    +
    + +
    +

    animStart

    + public event animStart +
    + When animation is enabled, this event fires when the animation +starts +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node that is expanding/collapsing @parm {String} type the type of animation ("expand" or "collapse")
    +
    +
    +
    This event is defined by TreeView.
    +
    + +
    +

    collapse

    + public event collapse +
    + Fires when a node is going to be expanded. Return false to stop +the expand. +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node that is expanding/collapsing
    +
    +
    +
    This event is defined by TreeView.
    +
    + +
    +

    expand

    + public event expand +
    + Fires when a node is going to be collapsed. Return false to stop +the collapse. +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node that is expanding/collapsing
    +
    +
    +
    This event is defined by TreeView.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/YAHOO.widget.YAHOO.widget.Calendar2up.html b/www/extras/yui-ext/docs/output/YAHOO.widget.YAHOO.widget.Calendar2up.html new file mode 100644 index 000000000..c6af08303 --- /dev/null +++ b/www/extras/yui-ext/docs/output/YAHOO.widget.YAHOO.widget.Calendar2up.html @@ -0,0 +1,1298 @@ + + + + YAHOO.widget.YAHOO.widget.Calendar2up + + + + + +
    + +

    Class YAHOO.widget.YAHOO.widget.Calendar2up

    + + + + + +
    Package:YAHOO.widget.YAHOO.widget
    Class:Calendar2up
    Extends:CalendarGroup
    Defined In:calendar.js
    +
    +
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_2UPCLOSE<static> : StringCalendarGroup
    <static> CSS class representing the close icon for the 2-up calendar
     CSS_2UPTITLE<static> : StringCalendarGroup
    <static> CSS class representing the title for the 2-up calendar
     CSS_CONTAINER<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     CSS_MULTI_UP<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     Locale : ObjectCalendarGroup
    The local object which contains the CalendarGroup's locale settings
     Options : ObjectCalendarGroup
    The local object which contains the CalendarGroup's options
     cfg : Number +@defaultCalendarGroup
    The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
     containerId : StringCalendarGroup
    The unique id associated with the CalendarGroup container
     id : StringCalendarGroup
    The unique id associated with the CalendarGroup
     oDomContainer : HTMLElementCalendarGroup
    The outer containing element for the CalendarGroup
     pages : YAHOO.widget.Calendar[]CalendarGroup
    The collection of Calendar pages contained within the CalendarGroup
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addMonthRenderer(Number month, Function fnRender) : voidCalendarGroup
    Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
     addMonths(Number count) : voidCalendarGroup
    Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
     addRenderer(String sDates, Function fnRender) : voidCalendarGroup
    Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
     addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendarGroup
    Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
     addYears(Number count) : voidCalendarGroup
    Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
     callChildFunction(String fnName, Array args) : voidCalendarGroup
    Calls a function within all child Calendars within this CalendarGroup.
     clear() : voidCalendarGroup
    Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
     configPageDate(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pagedate" property
     configPages(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pages" property
     constructChild(String id, String containerId, Object config) : YAHOO.widget.CalendarCalendarGroup
    Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be u...
     delegateConfig(String type, Object[] args, Object obj) : voidCalendarGroup
    Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
     deselect(String/Date/Date[] date) : Date[]CalendarGroup
    Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
     deselectAll() : Date[]CalendarGroup
    Deselects all dates on the current calendar.
     deselectCell(Number cellIndex) : Date[]CalendarGroup
    Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
     getSelectedDates() : AnCalendarGroup
    Gets the list of currently selected dates from the calendar.
     init(String id, String containerId, Object config) : voidCalendarGroup
    Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly.
     initEvents() : voidCalendarGroup
    Initializes CalendarGroup's built-in CustomEvents
     nextMonth() : voidCalendarGroup
    Navigates to the next month page in the calendar widget.
     nextYear() : voidCalendarGroup
    Navigates to the next year in the currently selected month in the calendar widget.
     previousMonth() : voidCalendarGroup
    Navigates to the previous month page in the calendar widget.
     previousYear() : voidCalendarGroup
    Navigates to the previous year in the currently selected month in the calendar widget.
     render() : voidCalendarGroup
    Calls the render function of all child calendars within the group.
     renderFooter() : voidCalendarGroup
    Renders a footer for the 2-up calendar container. By default, this method is +unimplemented.
     renderHeader() : voidCalendarGroup
    Renders the header for the CalendarGroup.
     reset() : voidCalendarGroup
    Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
     select(String/Date/Date[] date) : Date[]CalendarGroup
    Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
     selectCell(Number cellIndex) : Date[]CalendarGroup
    Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
     setChildFunction(String fnName, Function fn) : voidCalendarGroup
    Adds a function to all child Calendars within this CalendarGroup.
     setMonth(Number month) : voidCalendarGroup
    Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, an...
     setYear(Number year) : voidCalendarGroup
    Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and ...
     subtractMonths(Number count) : voidCalendarGroup
    Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
     subtractYears(Number count) : voidCalendarGroup
    Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
     toString() : StringCalendarGroup
    Returns a string representation of the object.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     beforeDeselectEvent : ()CalendarGroup
    Fired before a selection is made
     beforeRenderEvent : ()CalendarGroup
    Fired before the Calendar is rendered
     beforeSelectEvent : ()CalendarGroup
    Fired before a selection is made
     changePageEvent : ()CalendarGroup
    Fired when the Calendar page is changed
     clearEvent : ()CalendarGroup
    Fired when the Calendar is cleared
     deselectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
     renderEvent : ()CalendarGroup
    Fired when the Calendar is rendered
     resetEvent : ()CalendarGroup
    Fired when the Calendar is reset
     selectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
    + +

    Property Details

    +
    + +
    +

    CSS_2UPCLOSE<static>

    + public String CSS_2UPCLOSE<static> +
    + <static> CSS class representing the close icon for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_2UPTITLE<static>

    + public String CSS_2UPTITLE<static> +
    + <static> CSS class representing the title for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_CONTAINER<static>

    + public String CSS_CONTAINER<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_MULTI_UP<static>

    + public String CSS_MULTI_UP<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Locale

    + public Object Locale +
    + The local object which contains the CalendarGroup's locale settings
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Options

    + public Object Options +
    + The local object which contains the CalendarGroup's options
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    cfg

    + public Number +@default cfg +
    + The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    containerId

    + public String containerId +
    + The unique id associated with the CalendarGroup container
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    id

    + public String id +
    + The unique id associated with the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    oDomContainer

    + public HTMLElement oDomContainer +
    + The outer containing element for the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    pages

    + public YAHOO.widget.Calendar[] pages +
    + The collection of Calendar pages contained within the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    addMonthRenderer

    + public function addMonthRenderer(Number month, Function fnRender) +
    + Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
    + Parameters: +
    • month : Number
      The month (1-12) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addMonths

    + public function addMonths(Number count) +
    + Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addRenderer

    + public function addRenderer(String sDates, Function fnRender) +
    + Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
    + Parameters: +
    • sDates : String
      A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addWeekdayRenderer

    + public function addWeekdayRenderer(Number weekday, Function fnRender) +
    + Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
    + Parameters: +
    • weekday : Number
      The weekday (0-6) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addYears

    + public function addYears(Number count) +
    + Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    callChildFunction

    + public function callChildFunction(String fnName, Array args) +
    + Calls a function within all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • args : Array
      The arguments to pass to the function
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    clear

    + public function clear() +
    + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPageDate

    + public function configPageDate(String type, Object[] args, Object obj) +
    + The default Config handler for the "pagedate" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPages

    + public function configPages(String type, Object[] args, Object obj) +
    + The default Config handler for the "pages" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    constructChild

    + public function constructChild(String id, String containerId, Object config) +
    + Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be used. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • YAHOO.widget.Calendar
      The YAHOO.widget.Calendar instance that is constructed
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    delegateConfig

    + public function delegateConfig(String type, Object[] args, Object obj) +
    + Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselect

    + public function deselect(String/Date/Date[] date) +
    + Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectAll

    + public function deselectAll() +
    + Deselects all dates on the current calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectCell

    + public function deselectCell(Number cellIndex) +
    + Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to deselect in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    getSelectedDates

    + public function getSelectedDates() +
    + Gets the list of currently selected dates from the calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • An
      array of currently selected JavaScript Date objects.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    init

    + public function init(String id, String containerId, Object config) +
    + Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes CalendarGroup's built-in CustomEvents +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextMonth

    + public function nextMonth() +
    + Navigates to the next month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextYear

    + public function nextYear() +
    + Navigates to the next year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousMonth

    + public function previousMonth() +
    + Navigates to the previous month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousYear

    + public function previousYear() +
    + Navigates to the previous year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    render

    + public function render() +
    + Calls the render function of all child calendars within the group. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderFooter

    + public function renderFooter() +
    + Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderHeader

    + public function renderHeader() +
    + Renders the header for the CalendarGroup. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    select

    + public function select(String/Date/Date[] date) +
    + Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    selectCell

    + public function selectCell(Number cellIndex) +
    + Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to select in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setChildFunction

    + public function setChildFunction(String fnName, Function fn) +
    + Adds a function to all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • fn : Function
      The function to apply to each Calendar page object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setMonth

    + public function setMonth(Number month) +
    + Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • month : Number
      The numeric month, from 0 (January) to 11 (December)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setYear

    + public function setYear(Number year) +
    + Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • year : Number
      The numeric 4-digit year
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractMonths

    + public function subtractMonths(Number count) +
    + Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractYears

    + public function subtractYears(Number count) +
    + Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      A string representation of the CalendarGroup object.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    +
    + +

    Event Details

    +
    + +
    +

    beforeDeselectEvent

    + public event beforeDeselectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + Fired before the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeSelectEvent

    + public event beforeSelectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    changePageEvent

    + public event changePageEvent +
    + Fired when the Calendar page is changed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    clearEvent

    + public event clearEvent +
    + Fired when the Calendar is cleared +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    deselectEvent

    + public event deselectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + Fired when the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    resetEvent

    + public event resetEvent +
    + Fired when the Calendar is reset +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    selectEvent

    + public event selectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/animation.js.html b/www/extras/yui-ext/docs/output/animation.js.html new file mode 100644 index 000000000..c0f965e5e --- /dev/null +++ b/www/extras/yui-ext/docs/output/animation.js.html @@ -0,0 +1,1273 @@ +animation.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The animation module provides allows effects to be added to HTMLElements.
    + * @module animation
    + */
    +// holder
    +/**
    + *
    + * Base animation class that provides the interface for building animated effects.
    + * <p>Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);</p>
    + * @class Anim
    + * @namespace YAHOO.util
    + * @requires YAHOO.util.AnimMgr
    + * @requires YAHOO.util.Easing
    + * @requires YAHOO.util.Dom
    + * @requires YAHOO.util.Event
    + * @requires YAHOO.util.CustomEvent
    + * @constructor
    + * @param {String | HTMLElement} el Reference to the element that will be animated
    + * @param {Object} attributes The attribute(s) to be animated.
    + * Each attribute is an object with at minimum a "to" or "by" member defined.
    + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
    + * All attribute names use camelCase.
    + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    + */
    +
    +YAHOO.util.Anim = function(el, attributes, duration, method) {
    +   if (el) {
    +      this.init(el, attributes, duration, method);
    +   }
    +};
    +
    +YAHOO.util.Anim.prototype = {
    +   /**
    +    * Provides a readable name for the Anim instance.
    +    * @method toString
    +    * @return {String}
    +    */
    +   toString: function() {
    +      var el = this.getEl();
    +      var id = el.id || el.tagName;
    +      return ("Anim " + id);
    +   },
    +
    +   patterns: { // cached for performance
    +      noNegatives:      /width|height|opacity|padding/i, // keep at zero or above
    +      offsetAttribute:  /^((width|height)|(top|left))$/, // use offsetValue as default
    +      defaultUnit:      /width|height|top$|bottom$|left$|right$/i, // use 'px' by default
    +      offsetUnit:       /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset
    +   },
    +
    +   /**
    +    * Returns the value computed by the animation's "method".
    +    * @method doMethod
    +    * @param {String} attr The name of the attribute.
    +    * @param {Number} start The value this attribute should start from for this animation.
    +    * @param {Number} end  The value this attribute should end at for this animation.
    +    * @return {Number} The Value to be applied to the attribute.
    +    */
    +   doMethod: function(attr, start, end) {
    +      return this.method(this.currentFrame, start, end - start, this.totalFrames);
    +   },
    +
    +   /**
    +    * Applies a value to an attribute.
    +    * @method setAttribute
    +    * @param {String} attr The name of the attribute.
    +    * @param {Number} val The value to be applied to the attribute.
    +    * @param {String} unit The unit ('px', '%', etc.) of the value.
    +    */
    +   setAttribute: function(attr, val, unit) {
    +      if ( this.patterns.noNegatives.test(attr) ) {
    +         val = (val > 0) ? val : 0;
    +      }
    +
    +      YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit);
    +   },
    +
    +   /**
    +    * Returns current value of the attribute.
    +    * @method getAttribute
    +    * @param {String} attr The name of the attribute.
    +    * @return {Number} val The current value of the attribute.
    +    */
    +   getAttribute: function(attr) {
    +      var el = this.getEl();
    +      var val = YAHOO.util.Dom.getStyle(el, attr);
    +
    +      if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) {
    +         return parseFloat(val);
    +      }
    +
    +      var a = this.patterns.offsetAttribute.exec(attr) || [];
    +      var pos = !!( a[3] ); // top or left
    +      var box = !!( a[2] ); // width or height
    +
    +      // use offsets for width/height and abs pos top/left
    +      if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) {
    +         val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)];
    +      } else { // default to zero for other 'auto'
    +         val = 0;
    +      }
    +
    +      return val;
    +   },
    +
    +   /**
    +    * Returns the unit to use when none is supplied.
    +    * @method getDefaultUnit
    +    * @param {attr} attr The name of the attribute.
    +    * @return {String} The default unit to be used.
    +    */
    +   getDefaultUnit: function(attr) {
    +       if ( this.patterns.defaultUnit.test(attr) ) {
    +         return 'px';
    +       }
    +
    +       return '';
    +   },
    +
    +   /**
    +    * Sets the actual values to be used during the animation.
    +    * @method setRuntimeAttribute
    +    * Should only be needed for subclass use.
    +    * @param {Object} attr The attribute object
    +    * @private
    +    */
    +   setRuntimeAttribute: function(attr) {
    +      var start;
    +      var end;
    +      var attributes = this.attributes;
    +
    +      this.runtimeAttributes[attr] = {};
    +
    +      var isset = function(prop) {
    +         return (typeof prop !== 'undefined');
    +      };
    +
    +      if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) {
    +         return false; // note return; nothing to animate to
    +      }
    +
    +      start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr);
    +
    +      // To beats by, per SMIL 2.1 spec
    +      if ( isset(attributes[attr]['to']) ) {
    +         end = attributes[attr]['to'];
    +      } else if ( isset(attributes[attr]['by']) ) {
    +         if (start.constructor == Array) {
    +            end = [];
    +            for (var i = 0, len = start.length; i < len; ++i) {
    +               end[i] = start[i] + attributes[attr]['by'][i];
    +            }
    +         } else {
    +            end = start + attributes[attr]['by'];
    +         }
    +      }
    +
    +      this.runtimeAttributes[attr].start = start;
    +      this.runtimeAttributes[attr].end = end;
    +
    +      // set units if needed
    +      this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr);
    +   },
    +
    +   /**
    +    * Constructor for Anim instance.
    +    * @method init
    +    * @param {String | HTMLElement} el Reference to the element that will be animated
    +    * @param {Object} attributes The attribute(s) to be animated.
    +    * Each attribute is an object with at minimum a "to" or "by" member defined.
    +    * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
    +    * All attribute names use camelCase.
    +    * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    +    * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    +    */
    +   init: function(el, attributes, duration, method) {
    +      /**
    +       * Whether or not the animation is running.
    +       * @property isAnimated
    +       * @private
    +       * @type Boolean
    +       */
    +      var isAnimated = false;
    +
    +      /**
    +       * A Date object that is created when the animation begins.
    +       * @property startTime
    +       * @private
    +       * @type Date
    +       */
    +      var startTime = null;
    +
    +      /**
    +       * The number of frames this animation was able to execute.
    +       * @property actualFrames
    +       * @private
    +       * @type Int
    +       */
    +      var actualFrames = 0;
    +
    +      /**
    +       * The element to be animated.
    +       * @property el
    +       * @private
    +       * @type HTMLElement
    +       */
    +      el = YAHOO.util.Dom.get(el);
    +
    +      /**
    +       * The collection of attributes to be animated.
    +       * Each attribute must have at least a "to" or "by" defined in order to animate.
    +       * If "to" is supplied, the animation will end with the attribute at that value.
    +       * If "by" is supplied, the animation will end at that value plus its starting value.
    +       * If both are supplied, "to" is used, and "by" is ignored.
    +       * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values).
    +       * @property attributes
    +       * @type Object
    +       */
    +      this.attributes = attributes || {};
    +
    +      /**
    +       * The length of the animation.  Defaults to "1" (second).
    +       * @property duration
    +       * @type Number
    +       */
    +      this.duration = duration || 1;
    +
    +      /**
    +       * The method that will provide values to the attribute(s) during the animation.
    +       * Defaults to "YAHOO.util.Easing.easeNone".
    +       * @property method
    +       * @type Function
    +       */
    +      this.method = method || YAHOO.util.Easing.easeNone;
    +
    +      /**
    +       * Whether or not the duration should be treated as seconds.
    +       * Defaults to true.
    +       * @property useSeconds
    +       * @type Boolean
    +       */
    +      this.useSeconds = true; // default to seconds
    +
    +      /**
    +       * The location of the current animation on the timeline.
    +       * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
    +       * @property currentFrame
    +       * @type Int
    +       */
    +      this.currentFrame = 0;
    +
    +      /**
    +       * The total number of frames to be executed.
    +       * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time.
    +       * @property totalFrames
    +       * @type Int
    +       */
    +      this.totalFrames = YAHOO.util.AnimMgr.fps;
    +
    +
    +      /**
    +       * Returns a reference to the animated element.
    +       * @method getEl
    +       * @return {HTMLElement}
    +       */
    +      this.getEl = function() { return el; };
    +
    +      /**
    +       * Checks whether the element is currently animated.
    +       * @method isAnimated
    +       * @return {Boolean} current value of isAnimated.
    +       */
    +      this.isAnimated = function() {
    +         return isAnimated;
    +      };
    +
    +      /**
    +       * Returns the animation start time.
    +       * @method getStartTime
    +       * @return {Date} current value of startTime.
    +       */
    +      this.getStartTime = function() {
    +         return startTime;
    +      };
    +
    +      this.runtimeAttributes = {};
    +
    +
    +
    +      /**
    +       * Starts the animation by registering it with the animation manager.
    +       * @method animate
    +       */
    +      this.animate = function() {
    +         if ( this.isAnimated() ) { return false; }
    +
    +         this.currentFrame = 0;
    +
    +         this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration;
    +
    +         YAHOO.util.AnimMgr.registerElement(this);
    +      };
    +
    +      /**
    +       * Stops the animation.  Normally called by AnimMgr when animation completes.
    +       * @method stop
    +       * @param {Boolean} finish (optional) If true, animation will jump to final frame.
    +       */
    +      this.stop = function(finish) {
    +         if (finish) {
    +             this.currentFrame = this.totalFrames;
    +             this._onTween.fire();
    +         }
    +         YAHOO.util.AnimMgr.stop(this);
    +      };
    +
    +      var onStart = function() {
    +         this.onStart.fire();
    +
    +         this.runtimeAttributes = {};
    +         for (var attr in this.attributes) {
    +            this.setRuntimeAttribute(attr);
    +         }
    +
    +         isAnimated = true;
    +         actualFrames = 0;
    +         startTime = new Date();
    +      };
    +
    +      /**
    +       * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s).
    +       * @private
    +       */
    +
    +      var onTween = function() {
    +         var data = {
    +            duration: new Date() - this.getStartTime(),
    +            currentFrame: this.currentFrame
    +         };
    +
    +         data.toString = function() {
    +            return (
    +               'duration: ' + data.duration +
    +               ', currentFrame: ' + data.currentFrame
    +            );
    +         };
    +
    +         this.onTween.fire(data);
    +
    +         var runtimeAttributes = this.runtimeAttributes;
    +
    +         for (var attr in runtimeAttributes) {
    +            this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit);
    +         }
    +
    +         actualFrames += 1;
    +      };
    +
    +      var onComplete = function() {
    +         var actual_duration = (new Date() - startTime) / 1000 ;
    +
    +         var data = {
    +            duration: actual_duration,
    +            frames: actualFrames,
    +            fps: actualFrames / actual_duration
    +         };
    +
    +         data.toString = function() {
    +            return (
    +               'duration: ' + data.duration +
    +               ', frames: ' + data.frames +
    +               ', fps: ' + data.fps
    +            );
    +         };
    +
    +         isAnimated = false;
    +         actualFrames = 0;
    +         this.onComplete.fire(data);
    +      };
    +
    +      /**
    +       * Custom event that fires after onStart, useful in subclassing
    +       * @private
    +       */
    +      this._onStart = new YAHOO.util.CustomEvent('_start', this, true);
    +
    +      /**
    +       * Custom event that fires when animation begins
    +       * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction)
    +       * @event onStart
    +       */
    +      this.onStart = new YAHOO.util.CustomEvent('start', this);
    +
    +      /**
    +       * Custom event that fires between each frame
    +       * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction)
    +       * @event onTween
    +       */
    +      this.onTween = new YAHOO.util.CustomEvent('tween', this);
    +
    +      /**
    +       * Custom event that fires after onTween
    +       * @private
    +       */
    +      this._onTween = new YAHOO.util.CustomEvent('_tween', this, true);
    +
    +      /**
    +       * Custom event that fires when animation ends
    +       * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction)
    +       * @event onComplete
    +       */
    +      this.onComplete = new YAHOO.util.CustomEvent('complete', this);
    +      /**
    +       * Custom event that fires after onComplete
    +       * @private
    +       */
    +      this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true);
    +
    +      this._onStart.subscribe(onStart);
    +      this._onTween.subscribe(onTween);
    +      this._onComplete.subscribe(onComplete);
    +   }
    +};
    +
    +/**
    + * Handles animation queueing and threading.
    + * Used by Anim and subclasses.
    + * @class AnimMgr
    + * @namespace YAHOO.util
    + */
    +YAHOO.util.AnimMgr = new function() {
    +   /**
    +    * Reference to the animation Interval.
    +    * @property thread
    +    * @private
    +    * @type Int
    +    */
    +   var thread = null;
    +
    +   /**
    +    * The current queue of registered animation objects.
    +    * @property queue
    +    * @private
    +    * @type Array
    +    */
    +   var queue = [];
    +
    +   /**
    +    * The number of active animations.
    +    * @property tweenCount
    +    * @private
    +    * @type Int
    +    */
    +   var tweenCount = 0;
    +
    +   /**
    +    * Base frame rate (frames per second).
    +    * Arbitrarily high for better x-browser calibration (slower browsers drop more frames).
    +    * @property fps
    +    * @type Int
    +    *
    +    */
    +   this.fps = 200;
    +
    +   /**
    +    * Interval delay in milliseconds, defaults to fastest possible.
    +    * @property delay
    +    * @type Int
    +    *
    +    */
    +   this.delay = 1;
    +
    +   /**
    +    * Adds an animation instance to the animation queue.
    +    * All animation instances must be registered in order to animate.
    +    * @method registerElement
    +    * @param {object} tween The Anim instance to be be registered
    +    */
    +   this.registerElement = function(tween) {
    +      queue[queue.length] = tween;
    +      tweenCount += 1;
    +      tween._onStart.fire();
    +      this.start();
    +   };
    +
    +   /**
    +    * removes an animation instance from the animation queue.
    +    * All animation instances must be registered in order to animate.
    +    * @method unRegister
    +    * @param {object} tween The Anim instance to be be registered
    +    * @param {Int} index The index of the Anim instance
    +    * @private
    +    */
    +   this.unRegister = function(tween, index) {
    +      tween._onComplete.fire();
    +      index = index || getIndex(tween);
    +      if (index != -1) { queue.splice(index, 1); }
    +
    +      tweenCount -= 1;
    +      if (tweenCount <= 0) { this.stop(); }
    +   };
    +
    +   /**
    +    * Starts the animation thread.
    +	* Only one thread can run at a time.
    +    * @method start
    +    */
    +   this.start = function() {
    +      if (thread === null) { thread = setInterval(this.run, this.delay); }
    +   };
    +
    +   /**
    +    * Stops the animation thread or a specific animation instance.
    +    * @method stop
    +    * @param {object} tween A specific Anim instance to stop (optional)
    +    * If no instance given, Manager stops thread and all animations.
    +    */
    +   this.stop = function(tween) {
    +      if (!tween) {
    +         clearInterval(thread);
    +         for (var i = 0, len = queue.length; i < len; ++i) {
    +            if (queue[i].isAnimated()) {
    +               this.unRegister(tween, i);
    +            }
    +         }
    +         queue = [];
    +         thread = null;
    +         tweenCount = 0;
    +      }
    +      else {
    +         this.unRegister(tween);
    +      }
    +   };
    +
    +   /**
    +    * Called per Interval to handle each animation frame.
    +    * @method run
    +    */
    +   this.run = function() {
    +      for (var i = 0, len = queue.length; i < len; ++i) {
    +         var tween = queue[i];
    +         if ( !tween || !tween.isAnimated() ) { continue; }
    +
    +         if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null)
    +         {
    +            tween.currentFrame += 1;
    +
    +            if (tween.useSeconds) {
    +               correctFrame(tween);
    +            }
    +            tween._onTween.fire();
    +         }
    +         else { YAHOO.util.AnimMgr.stop(tween, i); }
    +      }
    +   };
    +
    +   var getIndex = function(anim) {
    +      for (var i = 0, len = queue.length; i < len; ++i) {
    +         if (queue[i] == anim) {
    +            return i; // note return;
    +         }
    +      }
    +      return -1;
    +   };
    +
    +   /**
    +    * On the fly frame correction to keep animation on time.
    +    * @method correctFrame
    +    * @private
    +    * @param {Object} tween The Anim instance being corrected.
    +    */
    +   var correctFrame = function(tween) {
    +      var frames = tween.totalFrames;
    +      var frame = tween.currentFrame;
    +      var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames);
    +      var elapsed = (new Date() - tween.getStartTime());
    +      var tweak = 0;
    +
    +      if (elapsed < tween.duration * 1000) { // check if falling behind
    +         tweak = Math.round((elapsed / expected - 1) * tween.currentFrame);
    +      } else { // went over duration, so jump to end
    +         tweak = frames - (frame + 1);
    +      }
    +      if (tweak > 0 && isFinite(tweak)) { // adjust if needed
    +         if (tween.currentFrame + tweak >= frames) {// dont go past last frame
    +            tweak = frames - (frame + 1);
    +         }
    +
    +         tween.currentFrame += tweak;
    +      }
    +   };
    +};
    +/**
    + * Used to calculate Bezier splines for any number of control points.
    + * @class Bezier
    + * @namespace YAHOO.util
    + *
    + */
    +YAHOO.util.Bezier = new function()
    +{
    +   /**
    +    * Get the current position of the animated element based on t.
    +    * Each point is an array of "x" and "y" values (0 = x, 1 = y)
    +    * At least 2 points are required (start and end).
    +    * First point is start. Last point is end.
    +    * Additional control points are optional.
    +    * @method getPosition
    +    * @param {Array} points An array containing Bezier points
    +    * @param {Number} t A number between 0 and 1 which is the basis for determining current position
    +    * @return {Array} An array containing int x and y member data
    +    */
    +   this.getPosition = function(points, t)
    +   {
    +      var n = points.length;
    +      var tmp = [];
    +
    +      for (var i = 0; i < n; ++i){
    +         tmp[i] = [points[i][0], points[i][1]]; // save input
    +      }
    +
    +      for (var j = 1; j < n; ++j) {
    +         for (i = 0; i < n - j; ++i) {
    +            tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0];
    +            tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1];
    +         }
    +      }
    +
    +      return [ tmp[0][0], tmp[0][1] ];
    +
    +   };
    +};
    +/**
    + * Anim subclass for color transitions.
    + * <p>Usage: <code>var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut);</code> Color values can be specified with either 112233, #112233,
    + * [255,255,255], or rgb(255,255,255)</p>
    + * @class ColorAnim
    + * @namespace YAHOO.util
    + * @requires YAHOO.util.Anim
    + * @requires YAHOO.util.AnimMgr
    + * @requires YAHOO.util.Easing
    + * @requires YAHOO.util.Bezier
    + * @requires YAHOO.util.Dom
    + * @requires YAHOO.util.Event
    + * @constructor
    + * @extends YAHOO.util.Anim
    + * @param {HTMLElement | String} el Reference to the element that will be animated
    + * @param {Object} attributes The attribute(s) to be animated.
    + * Each attribute is an object with at minimum a "to" or "by" member defined.
    + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
    + * All attribute names use camelCase.
    + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    + */
    +(function() {
    +   YAHOO.util.ColorAnim = function(el, attributes, duration,  method) {
    +      YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method);
    +   };
    +
    +   YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim);
    +
    +   // shorthand
    +   var Y = YAHOO.util;
    +   var superclass = Y.ColorAnim.superclass;
    +   var proto = Y.ColorAnim.prototype;
    +
    +   proto.toString = function() {
    +      var el = this.getEl();
    +      var id = el.id || el.tagName;
    +      return ("ColorAnim " + id);
    +   };
    +
    +   proto.patterns.color = /color$/i;
    +   proto.patterns.rgb         = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;
    +   proto.patterns.hex         = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
    +   proto.patterns.hex3        = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;
    +   proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari
    +
    +   /**
    +    * Attempts to parse the given string and return a 3-tuple.
    +    * @method parseColor
    +    * @param {String} s The string to parse.
    +    * @return {Array} The 3-tuple of rgb values.
    +    */
    +   proto.parseColor = function(s) {
    +      if (s.length == 3) { return s; }
    +
    +      var c = this.patterns.hex.exec(s);
    +      if (c && c.length == 4) {
    +         return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ];
    +      }
    +
    +      c = this.patterns.rgb.exec(s);
    +      if (c && c.length == 4) {
    +         return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ];
    +      }
    +
    +      c = this.patterns.hex3.exec(s);
    +      if (c && c.length == 4) {
    +         return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ];
    +      }
    +
    +      return null;
    +   };
    +
    +   proto.getAttribute = function(attr) {
    +      var el = this.getEl();
    +      if (  this.patterns.color.test(attr) ) {
    +         var val = YAHOO.util.Dom.getStyle(el, attr);
    +
    +         if (this.patterns.transparent.test(val)) { // bgcolor default
    +            var parent = el.parentNode; // try and get from an ancestor
    +            val = Y.Dom.getStyle(parent, attr);
    +
    +            while (parent && this.patterns.transparent.test(val)) {
    +               parent = parent.parentNode;
    +               val = Y.Dom.getStyle(parent, attr);
    +               if (parent.tagName.toUpperCase() == 'HTML') {
    +                  val = '#fff';
    +               }
    +            }
    +         }
    +      } else {
    +         val = superclass.getAttribute.call(this, attr);
    +      }
    +
    +      return val;
    +   };
    +
    +   proto.doMethod = function(attr, start, end) {
    +      var val;
    +
    +      if ( this.patterns.color.test(attr) ) {
    +         val = [];
    +         for (var i = 0, len = start.length; i < len; ++i) {
    +            val[i] = superclass.doMethod.call(this, attr, start[i], end[i]);
    +         }
    +
    +         val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')';
    +      }
    +      else {
    +         val = superclass.doMethod.call(this, attr, start, end);
    +      }
    +
    +      return val;
    +   };
    +
    +   proto.setRuntimeAttribute = function(attr) {
    +      superclass.setRuntimeAttribute.call(this, attr);
    +
    +      if ( this.patterns.color.test(attr) ) {
    +         var attributes = this.attributes;
    +         var start = this.parseColor(this.runtimeAttributes[attr].start);
    +         var end = this.parseColor(this.runtimeAttributes[attr].end);
    +         // fix colors if going "by"
    +         if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) {
    +            end = this.parseColor(attributes[attr].by);
    +
    +            for (var i = 0, len = start.length; i < len; ++i) {
    +               end[i] = start[i] + end[i];
    +            }
    +         }
    +
    +         this.runtimeAttributes[attr].start = start;
    +         this.runtimeAttributes[attr].end = end;
    +      }
    +   };
    +})();/*
    +TERMS OF USE - EASING EQUATIONS
    +Open source under the BSD License.
    +Copyright 2001 Robert Penner All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
    +
    + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
    + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +*/
    +// holder
    +/**
    + * Singleton that determines how an animation proceeds from start to end.
    + * @class Easing
    + * @namespace YAHOO.util
    +*/
    +
    +YAHOO.util.Easing = {
    +
    +   /**
    +    * Uniform speed between points.
    +    * @method easeNone
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeNone: function (t, b, c, d) {
    +   	return c*t/d + b;
    +   },
    +
    +   /**
    +    * Begins slowly and accelerates towards end. (quadratic)
    +    * @method easeIn
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeIn: function (t, b, c, d) {
    +   	return c*(t/=d)*t + b;
    +   },
    +
    +   /**
    +    * Begins quickly and decelerates towards end.  (quadratic)
    +    * @method easeOut
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeOut: function (t, b, c, d) {
    +   	return -c *(t/=d)*(t-2) + b;
    +   },
    +
    +   /**
    +    * Begins slowly and decelerates towards end. (quadratic)
    +    * @method easeBoth
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeBoth: function (t, b, c, d) {
    +   	if ((t/=d/2) < 1) return c/2*t*t + b;
    +   	return -c/2 * ((--t)*(t-2) - 1) + b;
    +   },
    +
    +   /**
    +    * Begins slowly and accelerates towards end. (quartic)
    +    * @method easeInStrong
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeInStrong: function (t, b, c, d) {
    +   	return c*(t/=d)*t*t*t + b;
    +   },
    +
    +   /**
    +    * Begins quickly and decelerates towards end.  (quartic)
    +    * @method easeOutStrong
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeOutStrong: function (t, b, c, d) {
    +   	return -c * ((t=t/d-1)*t*t*t - 1) + b;
    +   },
    +
    +   /**
    +    * Begins slowly and decelerates towards end. (quartic)
    +    * @method easeBothStrong
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   easeBothStrong: function (t, b, c, d) {
    +   	if ((t/=d/2) < 1) return c/2*t*t*t*t + b;
    +   	return -c/2 * ((t-=2)*t*t*t - 2) + b;
    +   },
    +
    +   /**
    +    * Snap in elastic effect.
    +    * @method elasticIn
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} p Period (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +
    +   elasticIn: function (t, b, c, d, a, p) {
    +   	if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
    +   	if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    +   	else var s = p/(2*Math.PI) * Math.asin (c/a);
    +   	return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    +   },
    +
    +   /**
    +    * Snap out elastic effect.
    +    * @method elasticOut
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} p Period (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   elasticOut: function (t, b, c, d, a, p) {
    +   	if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
    +   	if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    +   	else var s = p/(2*Math.PI) * Math.asin (c/a);
    +   	return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
    +   },
    +
    +   /**
    +    * Snap both elastic effect.
    +    * @method elasticBoth
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} p Period (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   elasticBoth: function (t, b, c, d, a, p) {
    +   	if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
    +   	if (!a || a < Math.abs(c)) { a=c; var s=p/4; }
    +   	else var s = p/(2*Math.PI) * Math.asin (c/a);
    +   	if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
    +   	return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
    +   },
    +
    +   /**
    +    * Backtracks slightly, then reverses direction and moves to end.
    +    * @method backIn
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} s Overshoot (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   backIn: function (t, b, c, d, s) {
    +   	if (typeof s == 'undefined') s = 1.70158;
    +   	return c*(t/=d)*t*((s+1)*t - s) + b;
    +   },
    +
    +   /**
    +    * Overshoots end, then reverses and comes back to end.
    +    * @method backOut
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} s Overshoot (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   backOut: function (t, b, c, d, s) {
    +   	if (typeof s == 'undefined') s = 1.70158;
    +   	return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
    +   },
    +
    +   /**
    +    * Backtracks slightly, then reverses direction, overshoots end,
    +    * then reverses and comes back to end.
    +    * @method backBoth
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @param {Number} s Overshoot (optional)
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   backBoth: function (t, b, c, d, s) {
    +   	if (typeof s == 'undefined') s = 1.70158;
    +   	if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
    +   	return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
    +   },
    +
    +   /**
    +    * Bounce off of start.
    +    * @method bounceIn
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   bounceIn: function (t, b, c, d) {
    +   	return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b;
    +   },
    +
    +   /**
    +    * Bounces off end.
    +    * @method bounceOut
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   bounceOut: function (t, b, c, d) {
    +   	if ((t/=d) < (1/2.75)) {
    +   		return c*(7.5625*t*t) + b;
    +   	} else if (t < (2/2.75)) {
    +   		return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    +   	} else if (t < (2.5/2.75)) {
    +   		return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    +   	} else {
    +   		return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    +   	}
    +   },
    +
    +   /**
    +    * Bounces off start and end.
    +    * @method bounceBoth
    +    * @param {Number} t Time value used to compute current value
    +    * @param {Number} b Starting value
    +    * @param {Number} c Delta between start and end values
    +    * @param {Number} d Total length of animation
    +    * @return {Number} The computed value for the current animation frame
    +    */
    +   bounceBoth: function (t, b, c, d) {
    +   	if (t < d/2) return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b;
    +   	return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b;
    +   }
    +};
    +
    +/**
    + * Anim subclass for moving elements along a path defined by the "points"
    + * member of "attributes".  All "points" are arrays with x, y coordinates.
    + * <p>Usage: <code>var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);</code></p>
    + * @class Motion
    + * @namespace YAHOO.util
    + * @requires YAHOO.util.Anim
    + * @requires YAHOO.util.AnimMgr
    + * @requires YAHOO.util.Easing
    + * @requires YAHOO.util.Bezier
    + * @requires YAHOO.util.Dom
    + * @requires YAHOO.util.Event
    + * @requires YAHOO.util.CustomEvent
    + * @constructor
    + * @extends YAHOO.util.Anim
    + * @param {String | HTMLElement} el Reference to the element that will be animated
    + * @param {Object} attributes The attribute(s) to be animated.
    + * Each attribute is an object with at minimum a "to" or "by" member defined.
    + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
    + * All attribute names use camelCase.
    + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    + */
    +(function() {
    +   YAHOO.util.Motion = function(el, attributes, duration,  method) {
    +      if (el) { // dont break existing subclasses not using YAHOO.extend
    +         YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method);
    +      }
    +   };
    +
    +   YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim);
    +
    +   // shorthand
    +   var Y = YAHOO.util;
    +   var superclass = Y.Motion.superclass;
    +   var proto = Y.Motion.prototype;
    +
    +   proto.toString = function() {
    +      var el = this.getEl();
    +      var id = el.id || el.tagName;
    +      return ("Motion " + id);
    +   };
    +
    +   proto.patterns.points = /^points$/i;
    +
    +   proto.setAttribute = function(attr, val, unit) {
    +      if (  this.patterns.points.test(attr) ) {
    +         unit = unit || 'px';
    +         superclass.setAttribute.call(this, 'left', val[0], unit);
    +         superclass.setAttribute.call(this, 'top', val[1], unit);
    +      } else {
    +         superclass.setAttribute.call(this, attr, val, unit);
    +      }
    +   };
    +
    +   proto.getAttribute = function(attr) {
    +      if (  this.patterns.points.test(attr) ) {
    +         var val = [
    +            superclass.getAttribute.call(this, 'left'),
    +            superclass.getAttribute.call(this, 'top')
    +         ];
    +      } else {
    +         val = superclass.getAttribute.call(this, attr);
    +      }
    +
    +      return val;
    +   };
    +
    +   proto.doMethod = function(attr, start, end) {
    +      var val = null;
    +
    +      if ( this.patterns.points.test(attr) ) {
    +         var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100;
    +         val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t);
    +      } else {
    +         val = superclass.doMethod.call(this, attr, start, end);
    +      }
    +      return val;
    +   };
    +
    +   proto.setRuntimeAttribute = function(attr) {
    +      if ( this.patterns.points.test(attr) ) {
    +         var el = this.getEl();
    +         var attributes = this.attributes;
    +         var start;
    +         var control = attributes['points']['control'] || [];
    +         var end;
    +         var i, len;
    +
    +         if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points
    +            control = [control];
    +         } else { // break reference to attributes.points.control
    +            var tmp = [];
    +            for (i = 0, len = control.length; i< len; ++i) {
    +               tmp[i] = control[i];
    +            }
    +            control = tmp;
    +         }
    +
    +         if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative
    +            Y.Dom.setStyle(el, 'position', 'relative');
    +         }
    +
    +         if ( isset(attributes['points']['from']) ) {
    +            Y.Dom.setXY(el, attributes['points']['from']); // set position to from point
    +         }
    +         else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position
    +
    +         start = this.getAttribute('points'); // get actual top & left
    +
    +         // TO beats BY, per SMIL 2.1 spec
    +         if ( isset(attributes['points']['to']) ) {
    +            end = translateValues.call(this, attributes['points']['to'], start);
    +
    +            var pageXY = Y.Dom.getXY(this.getEl());
    +            for (i = 0, len = control.length; i < len; ++i) {
    +               control[i] = translateValues.call(this, control[i], start);
    +            }
    +
    +
    +         } else if ( isset(attributes['points']['by']) ) {
    +            end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ];
    +
    +            for (i = 0, len = control.length; i < len; ++i) {
    +               control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ];
    +            }
    +         }
    +
    +         this.runtimeAttributes[attr] = [start];
    +
    +         if (control.length > 0) {
    +            this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control);
    +         }
    +
    +         this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end;
    +      }
    +      else {
    +         superclass.setRuntimeAttribute.call(this, attr);
    +      }
    +   };
    +
    +   var translateValues = function(val, start) {
    +      var pageXY = Y.Dom.getXY(this.getEl());
    +      val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ];
    +
    +      return val;
    +   };
    +
    +   var isset = function(prop) {
    +      return (typeof prop !== 'undefined');
    +   };
    +})();
    +/**
    + * Anim subclass for scrolling elements to a position defined by the "scroll"
    + * member of "attributes".  All "scroll" members are arrays with x, y scroll positions.
    + * <p>Usage: <code>var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);</code></p>
    + * @class Scroll
    + * @namespace YAHOO.util
    + * @requires YAHOO.util.Anim
    + * @requires YAHOO.util.AnimMgr
    + * @requires YAHOO.util.Easing
    + * @requires YAHOO.util.Bezier
    + * @requires YAHOO.util.Dom
    + * @requires YAHOO.util.Event
    + * @requires YAHOO.util.CustomEvent
    + * @extends YAHOO.util.Anim
    + * @constructor
    + * @param {String or HTMLElement} el Reference to the element that will be animated
    + * @param {Object} attributes The attribute(s) to be animated.
    + * Each attribute is an object with at minimum a "to" or "by" member defined.
    + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px").
    + * All attribute names use camelCase.
    + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    + */
    +(function() {
    +   YAHOO.util.Scroll = function(el, attributes, duration,  method) {
    +      if (el) { // dont break existing subclasses not using YAHOO.extend
    +         YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method);
    +      }
    +   };
    +
    +   YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim);
    +
    +   // shorthand
    +   var Y = YAHOO.util;
    +   var superclass = Y.Scroll.superclass;
    +   var proto = Y.Scroll.prototype;
    +
    +   proto.toString = function() {
    +      var el = this.getEl();
    +      var id = el.id || el.tagName;
    +      return ("Scroll " + id);
    +   };
    +
    +   proto.doMethod = function(attr, start, end) {
    +      var val = null;
    +
    +      if (attr == 'scroll') {
    +         val = [
    +            this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames),
    +            this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames)
    +         ];
    +
    +      } else {
    +         val = superclass.doMethod.call(this, attr, start, end);
    +      }
    +      return val;
    +   };
    +
    +   proto.getAttribute = function(attr) {
    +      var val = null;
    +      var el = this.getEl();
    +
    +      if (attr == 'scroll') {
    +         val = [ el.scrollLeft, el.scrollTop ];
    +      } else {
    +         val = superclass.getAttribute.call(this, attr);
    +      }
    +
    +      return val;
    +   };
    +
    +   proto.setAttribute = function(attr, val, unit) {
    +      var el = this.getEl();
    +
    +      if (attr == 'scroll') {
    +         el.scrollLeft = val[0];
    +         el.scrollTop = val[1];
    +      } else {
    +         superclass.setAttribute.call(this, attr, val, unit);
    +      }
    +   };
    +})();
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/autocomplete.js.html b/www/extras/yui-ext/docs/output/autocomplete.js.html new file mode 100644 index 000000000..f4c2a0687 --- /dev/null +++ b/www/extras/yui-ext/docs/output/autocomplete.js.html @@ -0,0 +1,3077 @@ +autocomplete.js
    /*
    
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    
    +Code licensed under the BSD License:
    
    +http://developer.yahoo.com/yui/license.txt
    
    +version: 0.12.0
    
    +*/
    +// holder
    +/**
    + * The AutoComplete control provides the front-end logic for text-entry suggestion and
    + * completion functionality.
    + *
    + * @module autocomplete
    + * @requires yahoo, dom, event, datasource
    + * @optional animation, connection, json
    + * @namespace YAHOO.widget
    + * @title AutoComplete Widget
    + */
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML
    + * auto completion widget.  Some key features:
    + * <ul>
    + * <li>Navigate with up/down arrow keys and/or mouse to pick a selection</li>
    + * <li>The drop down container can "roll down" or "fly out" via configurable
    + * animation</li>
    + * <li>UI look-and-feel customizable through CSS, including container
    + * attributes, borders, position, fonts, etc</li>
    + * </ul>
    + *
    + * @class AutoComplete
    + * @constructor
    + * @param elInput {HTMLElement} DOM element reference of an input field
    + * @param elInput {String} String ID of an input field
    + * @param elContainer {HTMLElement} DOM element reference of an existing DIV
    + * @param elContainer {String} String ID of an existing DIV
    + * @param oDataSource {Object} Instance of YAHOO.widget.DataSource for query/results
    + * @param oConfigs {Object} (optional) Object literal of configuration params
    + */
    +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) {
    +    if(elInput && elContainer && oDataSource) {
    +        // Validate DataSource
    +        if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) {
    +            this.dataSource = oDataSource;
    +        }
    +        else {
    +            return;
    +        }
    +
    +        // Validate input element
    +        if(YAHOO.util.Dom.inDocument(elInput)) {
    +            if(typeof elInput == "string") {
    +                    this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput;
    +                    this._oTextbox = document.getElementById(elInput);
    +            }
    +            else {
    +                this._sName = (elInput.id) ?
    +                    "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id:
    +                    "instance" + YAHOO.widget.AutoComplete._nIndex;
    +                this._oTextbox = elInput;
    +            }
    +        }
    +        else {
    +            return;
    +        }
    +
    +        // Validate container element
    +        if(YAHOO.util.Dom.inDocument(elContainer)) {
    +            if(typeof elContainer == "string") {
    +                    this._oContainer = document.getElementById(elContainer);
    +            }
    +            else {
    +                this._oContainer = elContainer;
    +            }
    +            if(this._oContainer.style.display == "none") {
    +            }
    +        }
    +        else {
    +            return;
    +        }
    +
    +        // Set any config params passed in to override defaults
    +        if (typeof oConfigs == "object") {
    +            for(var sConfig in oConfigs) {
    +                if (sConfig) {
    +                    this[sConfig] = oConfigs[sConfig];
    +                }
    +            }
    +        }
    +
    +        // Initialization sequence
    +        this._initContainer();
    +        this._initProps();
    +        this._initList();
    +        this._initContainerHelpers();
    +
    +        // Set up events
    +        var oSelf = this;
    +        var oTextbox = this._oTextbox;
    +        // Events are actually for the content module within the container
    +        var oContent = this._oContainer._oContent;
    +
    +        // Dom events
    +        YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf);
    +        YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf);
    +        YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf);
    +        YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf);
    +        YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf);
    +        YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf);
    +        YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf);
    +        YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf);
    +        if(oTextbox.form) {
    +            YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf);
    +        }
    +        YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf);
    +
    +        // Custom events
    +        this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this);
    +        this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this);
    +        this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this);
    +        this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this);
    +        this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this);
    +        this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this);
    +        this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this);
    +        this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this);
    +        this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this);
    +        this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this);
    +        this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this);
    +        this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this);
    +        this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this);
    +        this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this);
    +        this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this);
    +        this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this);
    +        
    +        // Finish up
    +        oTextbox.setAttribute("autocomplete","off");
    +        YAHOO.widget.AutoComplete._nIndex++;
    +    }
    +    // Required arguments were not found
    +    else {
    +    }
    +};
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Public member variables
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * The DataSource object that encapsulates the data used for auto completion.
    + * This object should be an inherited object from YAHOO.widget.DataSource.
    + *
    + * @property dataSource
    + * @type Object
    + */
    +YAHOO.widget.AutoComplete.prototype.dataSource = null;
    +
    +/**
    + * Number of characters that must be entered before querying for results. A negative value
    + * effectively turns off the widget. A value of 0 allows queries of null or empty string
    + * values.
    + *
    + * @property minQueryLength
    + * @type Number
    + * @default 1
    + */
    +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1;
    +
    +/**
    + * Maximum number of results to display in results container.
    + *
    + * @property maxResultsDisplayed
    + * @type Number
    + * @default 10
    + */
    +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10;
    +
    +/**
    + * Number of seconds to delay before submitting a query request.  If a query
    + * request is received before a previous one has completed its delay, the
    + * previous request is cancelled and the new request is set to the delay.
    + *
    + * @property queryDelay
    + * @type Number
    + * @default 0.5
    + */
    +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5;
    +
    +/**
    + * Class name of a highlighted item within results container.
    + *
    + * @property highlighClassName
    + * @type String
    + * @default "yui-ac-highlight"
    + */
    +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight";
    +
    +/**
    + * Class name of a pre-highlighted item within results container.
    + *
    + * @property prehighlightClassName
    + * @type String
    + */
    +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null;
    +
    +/**
    + * Query delimiter. A single character separator for multiple delimited
    + * selections. Multiple delimiter characteres may be defined as an array of
    + * strings. A null value or empty string indicates that query results cannot
    + * be delimited. This feature is not recommended if you need forceSelection to
    + * be true.
    + *
    + * @property delimChar
    + * @type String | String[]
    + */
    +YAHOO.widget.AutoComplete.prototype.delimChar = null;
    +
    +/**
    + * Whether or not the first item in results container should be automatically highlighted
    + * on expand.
    + *
    + * @property autoHighlight
    + * @type Boolean
    + * @default true
    + */
    +YAHOO.widget.AutoComplete.prototype.autoHighlight = true;
    +
    +/**
    + * Whether or not the input field should be automatically updated
    + * with the first query result as the user types, auto-selecting the substring
    + * that the user has not typed.
    + *
    + * @property typeAhead
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.typeAhead = false;
    +
    +/**
    + * Whether or not to animate the expansion/collapse of the results container in the
    + * horizontal direction.
    + *
    + * @property animHoriz
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.animHoriz = false;
    +
    +/**
    + * Whether or not to animate the expansion/collapse of the results container in the
    + * vertical direction.
    + *
    + * @property animVert
    + * @type Boolean
    + * @default true
    + */
    +YAHOO.widget.AutoComplete.prototype.animVert = true;
    +
    +/**
    + * Speed of container expand/collapse animation, in seconds..
    + *
    + * @property animSpeed
    + * @type Number
    + * @default 0.3
    + */
    +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3;
    +
    +/**
    + * Whether or not to force the user's selection to match one of the query
    + * results. Enabling this feature essentially transforms the input field into a
    + * &lt;select&gt; field. This feature is not recommended with delimiter character(s)
    + * defined.
    + *
    + * @property forceSelection
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.forceSelection = false;
    +
    +/**
    + * Whether or not to allow browsers to cache user-typed input in the input
    + * field. Disabling this feature will prevent the widget from setting the
    + * autocomplete="off" on the input field. When autocomplete="off"
    + * and users click the back button after form submission, user-typed input can
    + * be prefilled by the browser from its cache. This caching of user input may
    + * not be desired for sensitive data, such as credit card numbers, in which
    + * case, implementers should consider setting allowBrowserAutocomplete to false.
    + *
    + * @property allowBrowserAutocomplete
    + * @type Boolean
    + * @default true
    + */
    +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true;
    +
    +/**
    + * Whether or not the results container should always be displayed.
    + * Enabling this feature displays the container when the widget is instantiated
    + * and prevents the toggling of the container to a collapsed state.
    + *
    + * @property alwaysShowContainer
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false;
    +
    +/**
    + * Whether or not to use an iFrame to layer over Windows form elements in
    + * IE. Set to true only when the results container will be on top of a
    + * &lt;select&gt; field in IE and thus exposed to the IE z-index bug (i.e.,
    + * 5.5 < IE < 7).
    + *
    + * @property useIFrame
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.useIFrame = false;
    +
    +/**
    + * Whether or not the results container should have a shadow.
    + *
    + * @property useShadow
    + * @type Boolean
    + * @default false
    + */
    +YAHOO.widget.AutoComplete.prototype.useShadow = false;
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Public methods
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    + /**
    + * Public accessor to the unique name of the AutoComplete instance.
    + *
    + * @method toString
    + * @return {String} Unique name of the AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.toString = function() {
    +    return "AutoComplete " + this._sName;
    +};
    +
    + /**
    + * Returns true if container is in an expanded state, false otherwise.
    + *
    + * @method isContainerOpen
    + * @return {Boolean} Returns true if container is in an expanded state, false otherwise.
    + */
    +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() {
    +    return this._bContainerOpen;
    +};
    +
    +/**
    + * Public accessor to the internal array of DOM &lt;li&gt; elements that
    + * display query results within the results container.
    + *
    + * @method getListItems
    + * @return {HTMLElement[]} Array of &lt;li&gt; elements within the results container.
    + */
    +YAHOO.widget.AutoComplete.prototype.getListItems = function() {
    +    return this._aListItems;
    +};
    +
    +/**
    + * Public accessor to the data held in an &lt;li&gt; element of the
    + * results container.
    + *
    + * @method getListItemData
    + * @return {Object | Array} Object or array of result data or null
    + */
    +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) {
    +    if(oListItem._oResultData) {
    +        return oListItem._oResultData;
    +    }
    +    else {
    +        return false;
    +    }
    +};
    +
    +/**
    + * Sets HTML markup for the results container header. This markup will be
    + * inserted within a &lt;div&gt; tag with a class of "ac_hd".
    + *
    + * @method setHeader
    + * @param sHeader {String} HTML markup for results container header.
    + */
    +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) {
    +    if(sHeader) {
    +        if(this._oContainer._oContent._oHeader) {
    +            this._oContainer._oContent._oHeader.innerHTML = sHeader;
    +            this._oContainer._oContent._oHeader.style.display = "block";
    +        }
    +    }
    +    else {
    +        this._oContainer._oContent._oHeader.innerHTML = "";
    +        this._oContainer._oContent._oHeader.style.display = "none";
    +    }
    +};
    +
    +/**
    + * Sets HTML markup for the results container footer. This markup will be
    + * inserted within a &lt;div&gt; tag with a class of "ac_ft".
    + *
    + * @method setFooter
    + * @param sFooter {String} HTML markup for results container footer.
    + */
    +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) {
    +    if(sFooter) {
    +        if(this._oContainer._oContent._oFooter) {
    +            this._oContainer._oContent._oFooter.innerHTML = sFooter;
    +            this._oContainer._oContent._oFooter.style.display = "block";
    +        }
    +    }
    +    else {
    +        this._oContainer._oContent._oFooter.innerHTML = "";
    +        this._oContainer._oContent._oFooter.style.display = "none";
    +    }
    +};
    +
    +/**
    + * Sets HTML markup for the results container body. This markup will be
    + * inserted within a &lt;div&gt; tag with a class of "ac_bd".
    + *
    + * @method setBody
    + * @param sHeader {String} HTML markup for results container body.
    + */
    +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) {
    +    if(sBody) {
    +        if(this._oContainer._oContent._oBody) {
    +            this._oContainer._oContent._oBody.innerHTML = sBody;
    +            this._oContainer._oContent._oBody.style.display = "block";
    +            this._oContainer._oContent.style.display = "block";
    +        }
    +    }
    +    else {
    +        this._oContainer._oContent._oBody.innerHTML = "";
    +        this._oContainer._oContent.style.display = "none";
    +    }
    +    this._maxResultsDisplayed = 0;
    +};
    +
    +/**
    + * Overridable method that converts a result item object into HTML markup
    + * for display. Return data values are accessible via the oResultItem object,
    + * and the key return value will always be oResultItem[0]. Markup will be
    + * displayed within &lt;li&gt; element tags in the container.
    + *
    + * @method formatResult
    + * @param oResultItem {Object} Result item representing one query result. Data is held in an array.
    + * @param sQuery {String} The current query string.
    + * @return {String} HTML markup of formatted result data.
    + */
    +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) {
    +    var sResult = oResultItem[0];
    +    if(sResult) {
    +        return sResult;
    +    }
    +    else {
    +        return "";
    +    }
    +};
    +
    +/**
    + * Overridable method called before container expands allows implementers to access data
    + * and DOM elements.
    + *
    + * @method doBeforeExpandContainer
    + * @return {Boolean} Return true to continue expanding container, false to cancel the expand.
    + */
    +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) {
    +    return true;
    +};
    +
    +/**
    + * Makes query request to the DataSource.
    + *
    + * @method sendQuery
    + * @param sQuery {String} Query string.
    + */
    +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) {
    +    this._sendQuery(sQuery);
    +};
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Public events
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * Fired when the input field receives focus.
    + *
    + * @event textboxFocusEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null;
    +
    +/**
    + * Fired when the input field receives key input.
    + *
    + * @event textboxKeyEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param nKeycode {Number} The keycode number.
    + */
    +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null;
    +
    +/**
    + * Fired when the AutoComplete instance makes a query to the DataSource.
    + * 
    + * @event dataRequestEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param sQuery {String} The query string.
    + */
    +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null;
    +
    +/**
    + * Fired when the AutoComplete instance receives query results from the data
    + * source.
    + *
    + * @event dataReturnEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param sQuery {String} The query string.
    + * @param aResults {Array} Results array.
    + */
    +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null;
    +
    +/**
    + * Fired when the AutoComplete instance does not receive query results from the
    + * DataSource due to an error.
    + *
    + * @event dataErrorEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param sQuery {String} The query string.
    + */
    +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null;
    +
    +/**
    + * Fired when the results container is expanded.
    + *
    + * @event containerExpandEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null;
    +
    +/**
    + * Fired when the input field has been prefilled by the type-ahead
    + * feature. 
    + *
    + * @event typeAheadEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param sQuery {String} The query string.
    + * @param sPrefill {String} The prefill string.
    + */
    +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null;
    +
    +/**
    + * Fired when result item has been moused over.
    + *
    + * @event itemMouseOverEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param elItem {HTMLElement} The &lt;li&gt element item moused to.
    + */
    +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null;
    +
    +/**
    + * Fired when result item has been moused out.
    + *
    + * @event itemMouseOutEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param elItem {HTMLElement} The &lt;li&gt; element item moused from.
    + */
    +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null;
    +
    +/**
    + * Fired when result item has been arrowed to. 
    + *
    + * @event itemArrowToEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param elItem {HTMLElement} The &lt;li&gt; element item arrowed to.
    + */
    +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null;
    +
    +/**
    + * Fired when result item has been arrowed away from.
    + *
    + * @event itemArrowFromEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param elItem {HTMLElement} The &lt;li&gt; element item arrowed from.
    + */
    +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null;
    +
    +/**
    + * Fired when an item is selected via mouse click, ENTER key, or TAB key.
    + *
    + * @event itemSelectEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param elItem {HTMLElement} The selected &lt;li&gt; element item.
    + * @param oData {Object} The data returned for the item, either as an object,
    + * or mapped from the schema into an array.
    + */
    +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null;
    +
    +/**
    + * Fired when a user selection does not match any of the displayed result items.
    + * Note that this event may not behave as expected when delimiter characters
    + * have been defined. 
    + *
    + * @event unmatchedItemSelectEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + * @param sQuery {String} The user-typed query string.
    + */
    +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null;
    +
    +/**
    + * Fired if forceSelection is enabled and the user's input has been cleared
    + * because it did not match one of the returned query results.
    + *
    + * @event selectionEnforceEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null;
    +
    +/**
    + * Fired when the results container is collapsed.
    + *
    + * @event containerCollapseEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null;
    +
    +/**
    + * Fired when the input field loses focus.
    + *
    + * @event textboxBlurEvent
    + * @param oSelf {Object} The AutoComplete instance.
    + */
    +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null;
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Private member variables
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * Internal class variable to index multiple AutoComplete instances.
    + *
    + * @property _nIndex
    + * @type Number
    + * @default 0
    + * @private
    + */
    +YAHOO.widget.AutoComplete._nIndex = 0;
    +
    +/**
    + * Name of AutoComplete instance.
    + *
    + * @property _sName
    + * @type String
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._sName = null;
    +
    +/**
    + * Text input field DOM element.
    + *
    + * @property _oTextbox
    + * @type HTMLElement
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._oTextbox = null;
    +
    +/**
    + * Whether or not the input field is currently in focus. If query results come back
    + * but the user has already moved on, do not proceed with auto complete behavior.
    + *
    + * @property _bFocused
    + * @type Boolean
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._bFocused = true;
    +
    +/**
    + * Animation instance for container expand/collapse.
    + *
    + * @property _oAnim
    + * @type Boolean
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._oAnim = null;
    +
    +/**
    + * Container DOM element.
    + *
    + * @property _oContainer
    + * @type HTMLElement
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._oContainer = null;
    +
    +/**
    + * Whether or not the results container is currently open.
    + *
    + * @property _bContainerOpen
    + * @type Boolean
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false;
    +
    +/**
    + * Whether or not the mouse is currently over the results
    + * container. This is necessary in order to prevent clicks on container items
    + * from being text input field blur events.
    + *
    + * @property _bOverContainer
    + * @type Boolean
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._bOverContainer = false;
    +
    +/**
    + * Array of &lt;li&gt; elements references that contain query results within the
    + * results container.
    + *
    + * @property _aListItems
    + * @type Array
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._aListItems = null;
    +
    +/**
    + * Number of &lt;li&gt; elements currently displayed in results container.
    + *
    + * @property _nDisplayedItems
    + * @type Number
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0;
    +
    +/**
    + * Internal count of &lt;li&gt; elements displayed and hidden in results container.
    + *
    + * @property _maxResultsDisplayed
    + * @type Number
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0;
    +
    +/**
    + * Current query string
    + *
    + * @property _sCurQuery
    + * @type String
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._sCurQuery = null;
    +
    +/**
    + * Past queries this session (for saving delimited queries).
    + *
    + * @property _sSavedQuery
    + * @type String
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null;
    +
    +/**
    + * Pointer to the currently highlighted &lt;li&gt; element in the container.
    + *
    + * @property _oCurItem
    + * @type HTMLElement
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._oCurItem = null;
    +
    +/**
    + * Whether or not an item has been selected since the container was populated
    + * with results. Reset to false by _populateList, and set to true when item is
    + * selected.
    + *
    + * @property _bItemSelected
    + * @type Boolean
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._bItemSelected = false;
    +
    +/**
    + * Key code of the last key pressed in textbox.
    + *
    + * @property _nKeyCode
    + * @type Number
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._nKeyCode = null;
    +
    +/**
    + * Delay timeout ID.
    + *
    + * @property _nDelayID
    + * @type Number
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._nDelayID = -1;
    +
    +/**
    + * Src to iFrame used when useIFrame = true. Supports implementations over SSL
    + * as well.
    + *
    + * @property _iFrameSrc
    + * @type String
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;";
    +
    +/**
    + * For users typing via certain IMEs, queries must be triggered by intervals,
    + * since key events yet supported across all browsers for all IMEs.
    + *
    + * @property _queryInterval
    + * @type Object
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._queryInterval = null;
    +
    +/**
    + * Internal tracker to last known textbox value, used to determine whether or not
    + * to trigger a query via interval for certain IME users.
    + *
    + * @event _sLastTextboxValue
    + * @type String
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null;
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Private methods
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * Updates and validates latest public config properties.
    + *
    + * @method __initProps
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._initProps = function() {
    +    // Correct any invalid values
    +    var minQueryLength = this.minQueryLength;
    +    if(isNaN(minQueryLength) || (minQueryLength < 1)) {
    +        minQueryLength = 1;
    +    }
    +    var maxResultsDisplayed = this.maxResultsDisplayed;
    +    if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) {
    +        this.maxResultsDisplayed = 10;
    +    }
    +    var queryDelay = this.queryDelay;
    +    if(isNaN(this.queryDelay) || (this.queryDelay < 0)) {
    +        this.queryDelay = 0.5;
    +    }
    +    var aDelimChar = (this.delimChar) ? this.delimChar : null;
    +    if(aDelimChar) {
    +        if(typeof aDelimChar == "string") {
    +            this.delimChar = [aDelimChar];
    +        }
    +        else if(aDelimChar.constructor != Array) {
    +            this.delimChar = null;
    +        }
    +    }
    +    var animSpeed = this.animSpeed;
    +    if((this.animHoriz || this.animVert) && YAHOO.util.Anim) {
    +        if(isNaN(animSpeed) || (animSpeed < 0)) {
    +            animSpeed = 0.3;
    +        }
    +        if(!this._oAnim ) {
    +            oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed);
    +            this._oAnim = oAnim;
    +        }
    +        else {
    +            this._oAnim.duration = animSpeed;
    +        }
    +    }
    +    if(this.forceSelection && this.delimChar) {
    +    }
    +};
    +
    +/**
    + * Initializes the results container helpers if they are enabled and do
    + * not exist
    + *
    + * @method _initContainerHelpers
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() {
    +    if(this.useShadow && !this._oContainer._oShadow) {
    +        var oShadow = document.createElement("div");
    +        oShadow.className = "yui-ac-shadow";
    +        this._oContainer._oShadow = this._oContainer.appendChild(oShadow);
    +    }
    +    if(this.useIFrame && !this._oContainer._oIFrame) {
    +        var oIFrame = document.createElement("iframe");
    +        oIFrame.src = this._iFrameSrc;
    +        oIFrame.frameBorder = 0;
    +        oIFrame.scrolling = "no";
    +        oIFrame.style.position = "absolute";
    +        oIFrame.style.width = "100%";
    +        oIFrame.style.height = "100%";
    +        oIFrame.tabIndex = -1;
    +        this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame);
    +    }
    +};
    +
    +/**
    + * Initializes the results container once at object creation
    + *
    + * @method _initContainer
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._initContainer = function() {
    +    if(!this._oContainer._oContent) {
    +        // The oContent div helps size the iframe and shadow properly
    +        var oContent = document.createElement("div");
    +        oContent.className = "yui-ac-content";
    +        oContent.style.display = "none";
    +        this._oContainer._oContent = this._oContainer.appendChild(oContent);
    +
    +        var oHeader = document.createElement("div");
    +        oHeader.className = "yui-ac-hd";
    +        oHeader.style.display = "none";
    +        this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader);
    +
    +        var oBody = document.createElement("div");
    +        oBody.className = "yui-ac-bd";
    +        this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody);
    +
    +        var oFooter = document.createElement("div");
    +        oFooter.className = "yui-ac-ft";
    +        oFooter.style.display = "none";
    +        this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter);
    +    }
    +    else {
    +    }
    +};
    +
    +/**
    + * Clears out contents of container body and creates up to
    + * YAHOO.widget.AutoComplete#maxResultsDisplayed &lt;li&gt; elements in an
    + * &lt;ul&gt; element.
    + *
    + * @method _initList
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._initList = function() {
    +    this._aListItems = [];
    +    while(this._oContainer._oContent._oBody.hasChildNodes()) {
    +        var oldListItems = this.getListItems();
    +        if(oldListItems) {
    +            for(var oldi = oldListItems.length-1; oldi >= 0; i--) {
    +                oldListItems[oldi] = null;
    +            }
    +        }
    +        this._oContainer._oContent._oBody.innerHTML = "";
    +    }
    +
    +    var oList = document.createElement("ul");
    +    oList = this._oContainer._oContent._oBody.appendChild(oList);
    +    for(var i=0; i<this.maxResultsDisplayed; i++) {
    +        var oItem = document.createElement("li");
    +        oItem = oList.appendChild(oItem);
    +        this._aListItems[i] = oItem;
    +        this._initListItem(oItem, i);
    +    }
    +    this._maxResultsDisplayed = this.maxResultsDisplayed;
    +};
    +
    +/**
    + * Initializes each &lt;li&gt; element in the container list.
    + *
    + * @method _initListItem
    + * @param oItem {HTMLElement} The &lt;li&gt; DOM element.
    + * @param nItemIndex {Number} The index of the element.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._initListItem = function(oItem, nItemIndex) {
    +    var oSelf = this;
    +    oItem.style.display = "none";
    +    oItem._nItemIndex = nItemIndex;
    +
    +    oItem.mouseover = oItem.mouseout = oItem.onclick = null;
    +    YAHOO.util.Event.addListener(oItem,"mouseover",oSelf._onItemMouseover,oSelf);
    +    YAHOO.util.Event.addListener(oItem,"mouseout",oSelf._onItemMouseout,oSelf);
    +    YAHOO.util.Event.addListener(oItem,"click",oSelf._onItemMouseclick,oSelf);
    +};
    +
    +/**
    + * Enables interval detection for  Korean IME support.
    + *
    + * @method _onIMEDetected
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onIMEDetected = function(oSelf) {
    +    oSelf._enableIntervalDetection();
    +};
    +
    +/**
    + * Enables query triggers based on text input detection by intervals (rather
    + * than by key events).
    + *
    + * @method _enableIntervalDetection
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._enableIntervalDetection = function() {
    +    var currValue = this._oTextbox.value;
    +    var lastValue = this._sLastTextboxValue;
    +    if(currValue != lastValue) {
    +        this._sLastTextboxValue = currValue;
    +        this._sendQuery(currValue);
    +    }
    +};
    +
    +/**
    + * Cancels text input detection by intervals.
    + *
    + * @method _cancelIntervalDetection
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._cancelIntervalDetection = function(oSelf) {
    +    if(oSelf._queryInterval) {
    +        clearInterval(oSelf._queryInterval);
    +    }
    +};
    +
    +/**
    + * Whether or not key is functional or should be ignored. Note that the right
    + * arrow key is NOT an ignored key since it triggers queries for certain intl
    + * charsets.
    + *
    + * @method _isIgnoreKey
    + * @param nKeycode {Number} Code of key pressed.
    + * @return {Boolean} True if key should be ignored, false otherwise.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._isIgnoreKey = function(nKeyCode) {
    +    if ((nKeyCode == 9) || (nKeyCode == 13)  || // tab, enter
    +            (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl
    +            (nKeyCode >= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock
    +            (nKeyCode == 27) || // esc
    +            (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end
    +            (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up
    +            (nKeyCode == 40) || // down
    +            (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert
    +        return true;
    +    }
    +    return false;
    +};
    +
    +/**
    + * Makes query request to the DataSource.
    + *
    + * @method _sendQuery
    + * @param sQuery {String} Query string.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) {
    +    // Widget has been effectively turned off
    +    if(this.minQueryLength == -1) {
    +        this._toggleContainer(false);
    +        return;
    +    }
    +    // Delimiter has been enabled
    +    var aDelimChar = (this.delimChar) ? this.delimChar : null;
    +    if(aDelimChar) {
    +        // Loop through all possible delimiters and find the latest one
    +        // A " " may be a false positive if they are defined as delimiters AND
    +        // are used to separate delimited queries
    +        var nDelimIndex = -1;
    +        for(var i = aDelimChar.length-1; i >= 0; i--) {
    +            var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]);
    +            if(nNewIndex > nDelimIndex) {
    +                nDelimIndex = nNewIndex;
    +            }
    +        }
    +        // If we think the last delimiter is a space (" "), make sure it is NOT
    +        // a false positive by also checking the char directly before it
    +        if(aDelimChar[i] == " ") {
    +            for (var j = aDelimChar.length-1; j >= 0; j--) {
    +                if(sQuery[nDelimIndex - 1] == aDelimChar[j]) {
    +                    nDelimIndex--;
    +                    break;
    +                }
    +            }
    +        }
    +        // A delimiter has been found so extract the latest query
    +        if (nDelimIndex > -1) {
    +            var nQueryStart = nDelimIndex + 1;
    +            // Trim any white space from the beginning...
    +            while(sQuery.charAt(nQueryStart) == " ") {
    +                nQueryStart += 1;
    +            }
    +            // ...and save the rest of the string for later
    +            this._sSavedQuery = sQuery.substring(0,nQueryStart);
    +            // Here is the query itself
    +            sQuery = sQuery.substr(nQueryStart);
    +        }
    +        else if(sQuery.indexOf(this._sSavedQuery) < 0){
    +            this._sSavedQuery = null;
    +        }
    +    }
    +
    +    // Don't search queries that are too short
    +    if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) {
    +        if (this._nDelayID != -1) {
    +            clearTimeout(this._nDelayID);
    +        }
    +        this._toggleContainer(false);
    +        return;
    +    }
    +
    +    sQuery = encodeURIComponent(sQuery);
    +    this._nDelayID = -1;    // Reset timeout ID because request has been made
    +    this.dataRequestEvent.fire(this, sQuery);
    +    this.dataSource.getResults(this._populateList, sQuery, this);
    +};
    +
    +/**
    + * Populates the array of &lt;li&gt; elements in the container with query
    + * results. This method is passed to YAHOO.widget.DataSource#getResults as a
    + * callback function so results from the DataSource instance are returned to the
    + * AutoComplete instance.
    + *
    + * @method _populateList
    + * @param sQuery {String} The query string.
    + * @param aResults {Array} An array of query result objects from the DataSource.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) {
    +    if(aResults === null) {
    +        oSelf.dataErrorEvent.fire(oSelf, sQuery);
    +    }
    +    if (!oSelf._bFocused || !aResults) {
    +        return;
    +    }
    +
    +    var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
    +    var contentStyle = oSelf._oContainer._oContent.style;
    +    contentStyle.width = (!isOpera) ? null : "";
    +    contentStyle.height = (!isOpera) ? null : "";
    +
    +    var sCurQuery = decodeURIComponent(sQuery);
    +    oSelf._sCurQuery = sCurQuery;
    +    oSelf._bItemSelected = false;
    +
    +    if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) {
    +        oSelf._initList();
    +    }
    +
    +    var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed);
    +    oSelf._nDisplayedItems = nItems;
    +    if (nItems > 0) {
    +        oSelf._initContainerHelpers();
    +        var aItems = oSelf._aListItems;
    +
    +        // Fill items with data
    +        for(var i = nItems-1; i >= 0; i--) {
    +            var oItemi = aItems[i];
    +            var oResultItemi = aResults[i];
    +            oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery);
    +            oItemi.style.display = "list-item";
    +            oItemi._sResultKey = oResultItemi[0];
    +            oItemi._oResultData = oResultItemi;
    +
    +        }
    +
    +        // Empty out remaining items if any
    +        for(var j = aItems.length-1; j >= nItems ; j--) {
    +            var oItemj = aItems[j];
    +            oItemj.innerHTML = null;
    +            oItemj.style.display = "none";
    +            oItemj._sResultKey = null;
    +            oItemj._oResultData = null;
    +        }
    +
    +        if(oSelf.autoHighlight) {
    +            // Go to the first item
    +            var oFirstItem = aItems[0];
    +            oSelf._toggleHighlight(oFirstItem,"to");
    +            oSelf.itemArrowToEvent.fire(oSelf, oFirstItem);
    +            oSelf._typeAhead(oFirstItem,sQuery);
    +        }
    +        else {
    +            oSelf._oCurItem = null;
    +        }
    +
    +        // Expand the container
    +        var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults);
    +        oSelf._toggleContainer(ok);
    +    }
    +    else {
    +        oSelf._toggleContainer(false);
    +    }
    +    oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults);
    +};
    +
    +/**
    + * When forceSelection is true and the user attempts
    + * leave the text input box without selecting an item from the query results,
    + * the user selection is cleared.
    + *
    + * @method _clearSelection
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._clearSelection = function() {
    +    var sValue = this._oTextbox.value;
    +    var sChar = (this.delimChar) ? this.delimChar[0] : null;
    +    var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1;
    +    if(nIndex > -1) {
    +        this._oTextbox.value = sValue.substring(0,nIndex);
    +    }
    +    else {
    +         this._oTextbox.value = "";
    +    }
    +    this._sSavedQuery = this._oTextbox.value;
    +
    +    // Fire custom event
    +    this.selectionEnforceEvent.fire(this);
    +};
    +
    +/**
    + * Whether or not user-typed value in the text input box matches any of the
    + * query results.
    + *
    + * @method _textMatchesOption
    + * @return {Boolean} True if user-input text matches a result, false otherwise.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() {
    +    var foundMatch = false;
    +
    +    for(var i = this._nDisplayedItems-1; i >= 0 ; i--) {
    +        var oItem = this._aListItems[i];
    +        var sMatch = oItem._sResultKey.toLowerCase();
    +        if (sMatch == this._sCurQuery.toLowerCase()) {
    +            foundMatch = true;
    +            break;
    +        }
    +    }
    +    return(foundMatch);
    +};
    +
    +/**
    + * Updates in the text input box with the first query result as the user types,
    + * selecting the substring that the user has not typed.
    + *
    + * @method _typeAhead
    + * @param oItem {HTMLElement} The &lt;li&gt; element item whose data populates the input field.
    + * @param sQuery {String} Query string.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) {
    +    // Don't update if turned off
    +    if (!this.typeAhead) {
    +        return;
    +    }
    +
    +    var oTextbox = this._oTextbox;
    +    var sValue = this._oTextbox.value; // any saved queries plus what user has typed
    +
    +    // Don't update with type-ahead if text selection is not supported
    +    if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) {
    +        return;
    +    }
    +
    +    // Select the portion of text that the user has not typed
    +    var nStart = sValue.length;
    +    this._updateValue(oItem);
    +    var nEnd = oTextbox.value.length;
    +    this._selectText(oTextbox,nStart,nEnd);
    +    var sPrefill = oTextbox.value.substr(nStart,nEnd);
    +    this.typeAheadEvent.fire(this,sQuery,sPrefill);
    +};
    +
    +/**
    + * Selects text in the input field.
    + *
    + * @method _selectText
    + * @param oTextbox {HTMLElement} Text input box element in which to select text.
    + * @param nStart {Number} Starting index of text string to select.
    + * @param nEnd {Number} Ending index of text selection.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) {
    +    if (oTextbox.setSelectionRange) { // For Mozilla
    +        oTextbox.setSelectionRange(nStart,nEnd);
    +    }
    +    else if (oTextbox.createTextRange) { // For IE
    +        var oTextRange = oTextbox.createTextRange();
    +        oTextRange.moveStart("character", nStart);
    +        oTextRange.moveEnd("character", nEnd-oTextbox.value.length);
    +        oTextRange.select();
    +    }
    +    else {
    +        oTextbox.select();
    +    }
    +};
    +
    +/**
    + * Syncs results container with its helpers.
    + *
    + * @method _toggleContainerHelpers
    + * @param bShow {Boolean} True if container is expanded, false if collapsed
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) {
    +    var bFireEvent = false;
    +    var width = this._oContainer._oContent.offsetWidth + "px";
    +    var height = this._oContainer._oContent.offsetHeight + "px";
    +
    +    if(this.useIFrame && this._oContainer._oIFrame) {
    +        bFireEvent = true;
    +        if(bShow) {
    +            this._oContainer._oIFrame.style.width = width;
    +            this._oContainer._oIFrame.style.height = height;
    +        }
    +        else {
    +            this._oContainer._oIFrame.style.width = 0;
    +            this._oContainer._oIFrame.style.height = 0;
    +        }
    +    }
    +    if(this.useShadow && this._oContainer._oShadow) {
    +        bFireEvent = true;
    +        if(bShow) {
    +            this._oContainer._oShadow.style.width = width;
    +            this._oContainer._oShadow.style.height = height;
    +        }
    +        else {
    +           this._oContainer._oShadow.style.width = 0;
    +            this._oContainer._oShadow.style.height = 0;
    +        }
    +    }
    +};
    +
    +/**
    + * Animates expansion or collapse of the container.
    + *
    + * @method _toggleContainer
    + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) {
    +    var oContainer = this._oContainer;
    +
    +    // Implementer has container always open so don't mess with it
    +    if(this.alwaysShowContainer && this._bContainerOpen) {
    +        return;
    +    }
    +    
    +    // Clear contents of container
    +    if(!bShow) {
    +        this._oContainer._oContent.scrollTop = 0;
    +        var aItems = this._aListItems;
    +
    +        if(aItems && (aItems.length > 0)) {
    +            for(var i = aItems.length-1; i >= 0 ; i--) {
    +                aItems[i].style.display = "none";
    +            }
    +        }
    +
    +        if (this._oCurItem) {
    +            this._toggleHighlight(this._oCurItem,"from");
    +        }
    +
    +        this._oCurItem = null;
    +        this._nDisplayedItems = 0;
    +        this._sCurQuery = null;
    +    }
    +
    +    // Container is already closed
    +    if (!bShow && !this._bContainerOpen) {
    +        oContainer._oContent.style.display = "none";
    +        return;
    +    }
    +
    +    // If animation is enabled...
    +    var oAnim = this._oAnim;
    +    if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) {
    +        // If helpers need to be collapsed, do it right away...
    +        // but if helpers need to be expanded, wait until after the container expands
    +        if(!bShow) {
    +            this._toggleContainerHelpers(bShow);
    +        }
    +
    +        if(oAnim.isAnimated()) {
    +            oAnim.stop();
    +        }
    +
    +        // Clone container to grab current size offscreen
    +        var oClone = oContainer._oContent.cloneNode(true);
    +        oContainer.appendChild(oClone);
    +        oClone.style.top = "-9000px";
    +        oClone.style.display = "block";
    +
    +        // Current size of the container is the EXPANDED size
    +        var wExp = oClone.offsetWidth;
    +        var hExp = oClone.offsetHeight;
    +
    +        // Calculate COLLAPSED sizes based on horiz and vert anim
    +        var wColl = (this.animHoriz) ? 0 : wExp;
    +        var hColl = (this.animVert) ? 0 : hExp;
    +
    +        // Set animation sizes
    +        oAnim.attributes = (bShow) ?
    +            {width: { to: wExp }, height: { to: hExp }} :
    +            {width: { to: wColl}, height: { to: hColl }};
    +
    +        // If opening anew, set to a collapsed size...
    +        if(bShow && !this._bContainerOpen) {
    +            oContainer._oContent.style.width = wColl+"px";
    +            oContainer._oContent.style.height = hColl+"px";
    +        }
    +        // Else, set it to its last known size.
    +        else {
    +            oContainer._oContent.style.width = wExp+"px";
    +            oContainer._oContent.style.height = hExp+"px";
    +        }
    +
    +        oContainer.removeChild(oClone);
    +        oClone = null;
    +
    +    	var oSelf = this;
    +    	var onAnimComplete = function() {
    +            // Finish the collapse
    +    		oAnim.onComplete.unsubscribeAll();
    +
    +            if(bShow) {
    +                oSelf.containerExpandEvent.fire(oSelf);
    +            }
    +            else {
    +                oContainer._oContent.style.display = "none";
    +                oSelf.containerCollapseEvent.fire(oSelf);
    +            }
    +            oSelf._toggleContainerHelpers(bShow);
    +     	};
    +
    +        // Display container and animate it
    +        oContainer._oContent.style.display = "block";
    +        oAnim.onComplete.subscribe(onAnimComplete);
    +        oAnim.animate();
    +        this._bContainerOpen = bShow;
    +    }
    +    // Else don't animate, just show or hide
    +    else {
    +        if(bShow) {
    +            oContainer._oContent.style.display = "block";
    +            this.containerExpandEvent.fire(this);
    +        }
    +        else {
    +            oContainer._oContent.style.display = "none";
    +            this.containerCollapseEvent.fire(this);
    +        }
    +        this._toggleContainerHelpers(bShow);
    +        this._bContainerOpen = bShow;
    +   }
    +
    +};
    +
    +/**
    + * Toggles the highlight on or off for an item in the container, and also cleans
    + * up highlighting of any previous item.
    + *
    + * @method _toggleHighlight
    + * @param oNewItem {HTMLElement} The &lt;li&gt; element item to receive highlight behavior.
    + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) {
    +    var sHighlight = this.highlightClassName;
    +    if(this._oCurItem) {
    +        // Remove highlight from old item
    +        YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight);
    +    }
    +
    +    if((sType == "to") && sHighlight) {
    +        // Apply highlight to new item
    +        YAHOO.util.Dom.addClass(oNewItem, sHighlight);
    +        this._oCurItem = oNewItem;
    +    }
    +};
    +
    +/**
    + * Toggles the pre-highlight on or off for an item in the container.
    + *
    + * @method _togglePrehighlight
    + * @param oNewItem {HTMLElement} The &lt;li&gt; element item to receive highlight behavior.
    + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) {
    +    if(oNewItem == this._oCurItem) {
    +        return;
    +    }
    +
    +    var sPrehighlight = this.prehighlightClassName;
    +    if((sType == "mouseover") && sPrehighlight) {
    +        // Apply prehighlight to new item
    +        YAHOO.util.Dom.addClass(oNewItem, sPrehighlight);
    +    }
    +    else {
    +        // Remove prehighlight from old item
    +        YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight);
    +    }
    +};
    +
    +/**
    + * Updates the text input box value with selected query result. If a delimiter
    + * has been defined, then the value gets appended with the delimiter.
    + *
    + * @method _updateValue
    + * @param oItem {HTMLElement} The &lt;li&gt; element item with which to update the value.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) {
    +    var oTextbox = this._oTextbox;
    +    var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null;
    +    var sSavedQuery = this._sSavedQuery;
    +    var sResultKey = oItem._sResultKey;
    +    oTextbox.focus();
    +
    +    // First clear text field
    +    oTextbox.value = "";
    +    // Grab data to put into text field
    +    if(sDelimChar) {
    +        if(sSavedQuery) {
    +            oTextbox.value = sSavedQuery;
    +        }
    +        oTextbox.value += sResultKey + sDelimChar;
    +        if(sDelimChar != " ") {
    +            oTextbox.value += " ";
    +        }
    +    }
    +    else { oTextbox.value = sResultKey; }
    +
    +    // scroll to bottom of textarea if necessary
    +    if(oTextbox.type == "textarea") {
    +        oTextbox.scrollTop = oTextbox.scrollHeight;
    +    }
    +
    +    // move cursor to end
    +    var end = oTextbox.value.length;
    +    this._selectText(oTextbox,end,end);
    +
    +    this._oCurItem = oItem;
    +};
    +
    +/**
    + * Selects a result item from the container
    + *
    + * @method _selectItem
    + * @param oItem {HTMLElement} The selected &lt;li&gt; element item.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) {
    +    this._bItemSelected = true;
    +    this._updateValue(oItem);
    +    this._cancelIntervalDetection(this);
    +    this.itemSelectEvent.fire(this, oItem, oItem._oResultData);
    +    this._toggleContainer(false);
    +};
    +
    +/**
    + * For values updated by type-ahead, the right arrow key jumps to the end
    + * of the textbox, otherwise the container is closed.
    + *
    + * @method _jumpSelection
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() {
    +    if(!this.typeAhead) {
    +        return;
    +    }
    +    else {
    +        this._toggleContainer(false);
    +    }
    +};
    +
    +/**
    + * Triggered by up and down arrow keys, changes the current highlighted
    + * &lt;li&gt; element item. Scrolls container if necessary.
    + *
    + * @method _moveSelection
    + * @param nKeyCode {Number} Code of key pressed.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) {
    +    if(this._bContainerOpen) {
    +        // Determine current item's id number
    +        var oCurItem = this._oCurItem;
    +        var nCurItemIndex = -1;
    +
    +        if (oCurItem) {
    +            nCurItemIndex = oCurItem._nItemIndex;
    +        }
    +
    +        var nNewItemIndex = (nKeyCode == 40) ?
    +                (nCurItemIndex + 1) : (nCurItemIndex - 1);
    +
    +        // Out of bounds
    +        if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) {
    +            return;
    +        }
    +
    +        if (oCurItem) {
    +            // Unhighlight current item
    +            this._toggleHighlight(oCurItem, "from");
    +            this.itemArrowFromEvent.fire(this, oCurItem);
    +        }
    +        if (nNewItemIndex == -1) {
    +           // Go back to query (remove type-ahead string)
    +            if(this.delimChar && this._sSavedQuery) {
    +                if (!this._textMatchesOption()) {
    +                    this._oTextbox.value = this._sSavedQuery;
    +                }
    +                else {
    +                    this._oTextbox.value = this._sSavedQuery + this._sCurQuery;
    +                }
    +            }
    +            else {
    +                this._oTextbox.value = this._sCurQuery;
    +            }
    +            this._oCurItem = null;
    +            return;
    +        }
    +        if (nNewItemIndex == -2) {
    +            // Close container
    +            this._toggleContainer(false);
    +            return;
    +        }
    +
    +        var oNewItem = this._aListItems[nNewItemIndex];
    +
    +        // Scroll the container if necessary
    +        var oContent = this._oContainer._oContent;
    +        var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") ||
    +            (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto"));
    +        if(scrollOn && (nNewItemIndex > -1) &&
    +        (nNewItemIndex < this._nDisplayedItems)) {
    +            // User is keying down
    +            if(nKeyCode == 40) {
    +                // Bottom of selected item is below scroll area...
    +                if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) {
    +                    // Set bottom of scroll area to bottom of selected item
    +                    oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight;
    +                }
    +                // Bottom of selected item is above scroll area...
    +                else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) {
    +                    // Set top of selected item to top of scroll area
    +                    oContent.scrollTop = oNewItem.offsetTop;
    +
    +                }
    +            }
    +            // User is keying up
    +            else {
    +                // Top of selected item is above scroll area
    +                if(oNewItem.offsetTop < oContent.scrollTop) {
    +                    // Set top of scroll area to top of selected item
    +                    this._oContainer._oContent.scrollTop = oNewItem.offsetTop;
    +                }
    +                // Top of selected item is below scroll area
    +                else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) {
    +                    // Set bottom of selected item to bottom of scroll area
    +                    this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight;
    +                }
    +            }
    +        }
    +
    +        this._toggleHighlight(oNewItem, "to");
    +        this.itemArrowToEvent.fire(this, oNewItem);
    +        if(this.typeAhead) {
    +            this._updateValue(oNewItem);
    +        }
    +    }
    +};
    +
    +/////////////////////////////////////////////////////////////////////////////
    +//
    +// Private event handlers
    +//
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * Handles &lt;li&gt; element mouseover events in the container.
    + *
    + * @method _onItemMouseover
    + * @param v {HTMLEvent} The mouseover event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) {
    +    if(oSelf.prehighlightClassName) {
    +        oSelf._togglePrehighlight(this,"mouseover");
    +    }
    +    else {
    +        oSelf._toggleHighlight(this,"to");
    +    }
    +
    +    oSelf.itemMouseOverEvent.fire(oSelf, this);
    +};
    +
    +/**
    + * Handles &lt;li&gt; element mouseout events in the container.
    + *
    + * @method _onItemMouseout
    + * @param v {HTMLEvent} The mouseout event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) {
    +    if(oSelf.prehighlightClassName) {
    +        oSelf._togglePrehighlight(this,"mouseout");
    +    }
    +    else {
    +        oSelf._toggleHighlight(this,"from");
    +    }
    +
    +    oSelf.itemMouseOutEvent.fire(oSelf, this);
    +};
    +
    +/**
    + * Handles &lt;li&gt; element click events in the container.
    + *
    + * @method _onItemMouseclick
    + * @param v {HTMLEvent} The click event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) {
    +    // In case item has not been moused over
    +    oSelf._toggleHighlight(this,"to");
    +    oSelf._selectItem(this);
    +};
    +
    +/**
    + * Handles container mouseover events.
    + *
    + * @method _onContainerMouseover
    + * @param v {HTMLEvent} The mouseover event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) {
    +    oSelf._bOverContainer = true;
    +};
    +
    +/**
    + * Handles container mouseout events.
    + *
    + * @method _onContainerMouseout
    + * @param v {HTMLEvent} The mouseout event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) {
    +    oSelf._bOverContainer = false;
    +    // If container is still active
    +    if(oSelf._oCurItem) {
    +        oSelf._toggleHighlight(oSelf._oCurItem,"to");
    +    }
    +};
    +
    +/**
    + * Handles container scroll events.
    + *
    + * @method _onContainerScroll
    + * @param v {HTMLEvent} The scroll event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) {
    +    oSelf._oTextbox.focus();
    +};
    +
    +/**
    + * Handles container resize events.
    + *
    + * @method _onContainerResize
    + * @param v {HTMLEvent} The resize event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) {
    +    oSelf._toggleContainerHelpers(oSelf._bContainerOpen);
    +};
    +
    +/**
    + * Handles textbox keydown events of functional keys, mainly for UI behavior.
    + *
    + * @method _onTextboxKeyDown
    + * @param v {HTMLEvent} The keydown event.
    + * @param oSelf {object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) {
    +    var nKeyCode = v.keyCode;
    +
    +    switch (nKeyCode) {
    +        case 9: // tab
    +            if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) {
    +                if(oSelf._bContainerOpen) {
    +                    YAHOO.util.Event.stopEvent(v);
    +                }
    +            }
    +            // select an item or clear out
    +            if(oSelf._oCurItem) {
    +                oSelf._selectItem(oSelf._oCurItem);
    +            }
    +            else {
    +                oSelf._toggleContainer(false);
    +            }
    +            break;
    +        case 13: // enter
    +            if(oSelf._nKeyCode != nKeyCode) {
    +                if(oSelf._bContainerOpen) {
    +                    YAHOO.util.Event.stopEvent(v);
    +                }
    +            }
    +            if(oSelf._oCurItem) {
    +                oSelf._selectItem(oSelf._oCurItem);
    +            }
    +            else {
    +                oSelf._toggleContainer(false);
    +            }
    +            break;
    +        case 27: // esc
    +            oSelf._toggleContainer(false);
    +            return;
    +        case 39: // right
    +            oSelf._jumpSelection();
    +            break;
    +        case 38: // up
    +            YAHOO.util.Event.stopEvent(v);
    +            oSelf._moveSelection(nKeyCode);
    +            break;
    +        case 40: // down
    +            YAHOO.util.Event.stopEvent(v);
    +            oSelf._moveSelection(nKeyCode);
    +            break;
    +        default:
    +            break;
    +    }
    +};
    +
    +/**
    + * Handles textbox keypress events.
    + * @method _onTextboxKeyPress
    + * @param v {HTMLEvent} The keypress event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) {
    +    var nKeyCode = v.keyCode;
    +
    +        //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337)
    +        var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1);
    +        if(isMac) {
    +            switch (nKeyCode) {
    +            case 9: // tab
    +                if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) {
    +                    if(oSelf._bContainerOpen) {
    +                        YAHOO.util.Event.stopEvent(v);
    +                    }
    +                }
    +                break;
    +            case 13: // enter
    +                    if(oSelf._nKeyCode != nKeyCode) {
    +                        if(oSelf._bContainerOpen) {
    +                            YAHOO.util.Event.stopEvent(v);
    +                        }
    +                    }
    +                break;
    +            case 38: // up
    +            case 40: // down
    +                YAHOO.util.Event.stopEvent(v);
    +                break;
    +            default:
    +                break;
    +            }
    +        }
    +
    +        //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948)
    +        // Korean IME detected
    +        else if(nKeyCode == 229) {
    +            oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500);
    +        }
    +};
    +
    +/**
    + * Handles textbox keyup events that trigger queries.
    + *
    + * @method _onTextboxKeyUp
    + * @param v {HTMLEvent} The keyup event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) {
    +    // Check to see if any of the public properties have been updated
    +    oSelf._initProps();
    +
    +    var nKeyCode = v.keyCode;
    +    oSelf._nKeyCode = nKeyCode;
    +    var sText = this.value; //string in textbox
    +
    +    // Filter out chars that don't trigger queries
    +    if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) {
    +        return;
    +    }
    +    else {
    +        oSelf.textboxKeyEvent.fire(oSelf, nKeyCode);
    +    }
    +
    +    // Set timeout on the request
    +    if (oSelf.queryDelay > 0) {
    +        var nDelayID =
    +            setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000));
    +
    +        if (oSelf._nDelayID != -1) {
    +            clearTimeout(oSelf._nDelayID);
    +        }
    +
    +        oSelf._nDelayID = nDelayID;
    +    }
    +    else {
    +        // No delay so send request immediately
    +        oSelf._sendQuery(sText);
    +    }
    +};
    +
    +/**
    + * Handles text input box receiving focus.
    + *
    + * @method _onTextboxFocus
    + * @param v {HTMLEvent} The focus event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) {
    +    oSelf._oTextbox.setAttribute("autocomplete","off");
    +    oSelf._bFocused = true;
    +    oSelf.textboxFocusEvent.fire(oSelf);
    +};
    +
    +/**
    + * Handles text input box losing focus.
    + *
    + * @method _onTextboxBlur
    + * @param v {HTMLEvent} The focus event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) {
    +    // Don't treat as a blur if it was a selection via mouse click
    +    if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) {
    +        // Current query needs to be validated
    +        if(!oSelf._bItemSelected) {
    +            if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) {
    +                if(oSelf.forceSelection) {
    +                    oSelf._clearSelection();
    +                }
    +                else {
    +                    oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery);
    +                }
    +            }
    +        }
    +
    +        if(oSelf._bContainerOpen) {
    +            oSelf._toggleContainer(false);
    +        }
    +        oSelf._cancelIntervalDetection(oSelf);
    +        oSelf._bFocused = false;
    +        oSelf.textboxBlurEvent.fire(oSelf);
    +    }
    +};
    +
    +/**
    + * Handles form submission event.
    + *
    + * @method _onFormSubmit
    + * @param v {HTMLEvent} The submit event.
    + * @param oSelf {Object} The AutoComplete instance.
    + * @private
    + */
    +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) {
    +    if(oSelf.allowBrowserAutocomplete) {
    +        oSelf._oTextbox.setAttribute("autocomplete","on");
    +    }
    +    else {
    +        oSelf._oTextbox.setAttribute("autocomplete","off");
    +    }
    +};
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * The DataSource classes manages sending a request and returning response from a live
    
    + * database. Supported data include local JavaScript arrays and objects and databases
    
    + * accessible via XHR connections. Supported response formats include JavaScript arrays,
    
    + * JSON, XML, and flat-file textual data.
    
    + *  
    
    + * @class DataSource
    
    + * @constructor
    
    + */
    
    +YAHOO.widget.DataSource = function() { 
    
    +    /* abstract class */
    
    +};
    
    +
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public constants
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Error message for null data responses.
    
    + *
    
    + * @property ERROR_DATANULL
    
    + * @type String
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null";
    
    +
    
    +/**
    
    + * Error message for data responses with parsing errors.
    
    + *
    
    + * @property ERROR_DATAPARSE
    
    + * @type String
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed";
    
    +
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Max size of the local cache.  Set to 0 to turn off caching.  Caching is
    
    + * useful to reduce the number of server connections.  Recommended only for data
    
    + * sources that return comprehensive results for queries or when stale data is
    
    + * not an issue.
    
    + *
    
    + * @property maxCacheEntries
    
    + * @type Number
    
    + * @default 15
    
    + */
    
    +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15;
    
    +
    
    +/**
    
    + * Use this to equate cache matching with the type of matching done by your live
    
    + * data source. If caching is on and queryMatchContains is true, the cache
    
    + * returns results that "contain" the query string. By default,
    
    + * queryMatchContains is set to false, meaning the cache only returns results
    
    + * that "start with" the query string.
    
    + *
    
    + * @property queryMatchContains
    
    + * @type Boolean
    
    + * @default false
    
    + */
    
    +YAHOO.widget.DataSource.prototype.queryMatchContains = false;
    
    +
    
    +/**
    
    + * Enables query subset matching. If caching is on and queryMatchSubset is
    
    + * true, substrings of queries will return matching cached results. For
    
    + * instance, if the first query is for "abc" susequent queries that start with
    
    + * "abc", like "abcd", will be queried against the cache, and not the live data
    
    + * source. Recommended only for DataSources that return comprehensive results
    
    + * for queries with very few characters.
    
    + *
    
    + * @property queryMatchSubset
    
    + * @type Boolean
    
    + * @default false
    
    + *
    
    + */
    
    +YAHOO.widget.DataSource.prototype.queryMatchSubset = false;
    
    +
    
    +/**
    
    + * Enables query case-sensitivity matching. If caching is on and
    
    + * queryMatchCase is true, queries will only return results for case-sensitive
    
    + * matches.
    
    + *
    
    + * @property queryMatchCase
    
    + * @type Boolean
    
    + * @default false
    
    + */
    
    +YAHOO.widget.DataSource.prototype.queryMatchCase = false;
    
    +
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    + /**
    
    + * Public accessor to the unique name of the DataSource instance.
    
    + *
    
    + * @method toString
    
    + * @return {String} Unique name of the DataSource instance
    
    + */
    
    +YAHOO.widget.DataSource.prototype.toString = function() {
    
    +    return "DataSource " + this._sName;
    
    +};
    
    +
    
    +/**
    
    + * Retrieves query results, first checking the local cache, then making the
    
    + * query request to the live data source as defined by the function doQuery.
    
    + *
    
    + * @method getResults
    
    + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) {
    
    +    
    
    +    // First look in cache
    
    +    var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent);
    
    +    
    
    +    // Not in cache, so get results from server
    
    +    if(aResults.length === 0) {
    
    +        this.queryEvent.fire(this, oParent, sQuery);
    
    +        this.doQuery(oCallbackFn, sQuery, oParent);
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Abstract method implemented by subclasses to make a query to the live data
    
    + * source. Must call the callback function with the response returned from the
    
    + * query. Populates cache (if enabled).
    
    + *
    
    + * @method doQuery
    
    + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) {
    
    +    /* override this */ 
    
    +};
    
    +
    
    +/**
    
    + * Flushes cache.
    
    + *
    
    + * @method flushCache
    
    + */
    
    +YAHOO.widget.DataSource.prototype.flushCache = function() {
    
    +    if(this._aCache) {
    
    +        this._aCache = [];
    
    +    }
    
    +    if(this._aCacheHelper) {
    
    +        this._aCacheHelper = [];
    
    +    }
    
    +    this.cacheFlushEvent.fire(this);
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public events
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Fired when a query is made to the live data source.
    
    + *
    
    + * @event queryEvent
    
    + * @param oSelf {Object} The DataSource instance.
    
    + * @param oParent {Object} The requesting object.
    
    + * @param sQuery {String} The query string.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.queryEvent = null;
    
    +
    
    +/**
    
    + * Fired when a query is made to the local cache.
    
    + *
    
    + * @event cacheQueryEvent
    
    + * @param oSelf {Object} The DataSource instance.
    
    + * @param oParent {Object} The requesting object.
    
    + * @param sQuery {String} The query string.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null;
    
    +
    
    +/**
    
    + * Fired when data is retrieved from the live data source.
    
    + *
    
    + * @event getResultsEvent
    
    + * @param oSelf {Object} The DataSource instance.
    
    + * @param oParent {Object} The requesting object.
    
    + * @param sQuery {String} The query string.
    
    + * @param aResults {Object[]} Array of result objects.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.getResultsEvent = null;
    
    +    
    
    +/**
    
    + * Fired when data is retrieved from the local cache.
    
    + *
    
    + * @event getCachedResultsEvent
    
    + * @param oSelf {Object} The DataSource instance.
    
    + * @param oParent {Object} The requesting object.
    
    + * @param sQuery {String} The query string.
    
    + * @param aResults {Object[]} Array of result objects.
    
    + */
    
    +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null;
    
    +
    
    +/**
    
    + * Fired when an error is encountered with the live data source.
    
    + *
    
    + * @event dataErrorEvent
    
    + * @param oSelf {Object} The DataSource instance.
    
    + * @param oParent {Object} The requesting object.
    
    + * @param sQuery {String} The query string.
    
    + * @param sMsg {String} Error message string
    
    + */
    
    +YAHOO.widget.DataSource.prototype.dataErrorEvent = null;
    
    +
    
    +/**
    
    + * Fired when the local cache is flushed.
    
    + *
    
    + * @event cacheFlushEvent
    
    + * @param oSelf {Object} The DataSource instance
    
    + */
    
    +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Internal class variable to index multiple DataSource instances.
    
    + *
    
    + * @property _nIndex
    
    + * @type Number
    
    + * @private
    
    + * @static
    
    + */
    
    +YAHOO.widget.DataSource._nIndex = 0;
    
    +
    
    +/**
    
    + * Name of DataSource instance.
    
    + *
    
    + * @property _sName
    
    + * @type String
    
    + * @private
    
    + */
    
    +YAHOO.widget.DataSource.prototype._sName = null;
    
    +
    
    +/**
    
    + * Local cache of data result objects indexed chronologically.
    
    + *
    
    + * @property _aCache
    
    + * @type Object[]
    
    + * @private
    
    + */
    
    +YAHOO.widget.DataSource.prototype._aCache = null;
    
    +
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Initializes DataSource instance.
    
    + *  
    
    + * @method _init
    
    + * @private
    
    + */
    
    +YAHOO.widget.DataSource.prototype._init = function() {
    
    +    // Validate and initialize public configs
    
    +    var maxCacheEntries = this.maxCacheEntries;
    
    +    if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) {
    
    +        maxCacheEntries = 0;
    
    +    }
    
    +    // Initialize local cache
    
    +    if(maxCacheEntries > 0 && !this._aCache) {
    
    +        this._aCache = [];
    
    +    }
    
    +    
    
    +    this._sName = "instance" + YAHOO.widget.DataSource._nIndex;
    
    +    YAHOO.widget.DataSource._nIndex++;
    
    +    
    
    +    this.queryEvent = new YAHOO.util.CustomEvent("query", this);
    
    +    this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this);
    
    +    this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this);
    
    +    this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this);
    
    +    this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this);
    
    +    this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this);
    
    +};
    
    +
    
    +/**
    
    + * Adds a result object to the local cache, evicting the oldest element if the 
    
    + * cache is full. Newer items will have higher indexes, the oldest item will have
    
    + * index of 0. 
    
    + *
    
    + * @method _addCacheElem
    
    + * @param oResult {Object} Data result object, including array of results.
    
    + * @private
    
    + */
    
    +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) {
    
    +    var aCache = this._aCache;
    
    +    // Don't add if anything important is missing.
    
    +    if(!aCache || !oResult || !oResult.query || !oResult.results) {
    
    +        return;
    
    +    }
    
    +    
    
    +    // If the cache is full, make room by removing from index=0
    
    +    if(aCache.length >= this.maxCacheEntries) {
    
    +        aCache.shift();
    
    +    }
    
    +        
    
    +    // Add to cache, at the end of the array
    
    +    aCache.push(oResult);
    
    +};
    
    +
    
    +/**
    
    + * Queries the local cache for results. If query has been cached, the callback
    
    + * function is called with the results, and the cached is refreshed so that it
    
    + * is now the newest element.  
    
    + *
    
    + * @method _doQueryCache
    
    + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + * @return aResults {Object[]} Array of results from local cache if found, otherwise null.
    
    + * @private 
    
    + */
    
    +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) {
    
    +    var aResults = [];
    
    +    var bMatchFound = false;
    
    +    var aCache = this._aCache;
    
    +    var nCacheLength = (aCache) ? aCache.length : 0;
    
    +    var bMatchContains = this.queryMatchContains;
    
    +    
    
    +    // If cache is enabled...
    
    +    if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) {
    
    +        this.cacheQueryEvent.fire(this, oParent, sQuery);
    
    +        // If case is unimportant, normalize query now instead of in loops
    
    +        if(!this.queryMatchCase) {
    
    +            var sOrigQuery = sQuery;
    
    +            sQuery = sQuery.toLowerCase();
    
    +        }
    
    +
    
    +        // Loop through each cached element's query property...
    
    +        for(var i = nCacheLength-1; i >= 0; i--) {
    
    +            var resultObj = aCache[i];
    
    +            var aAllResultItems = resultObj.results;
    
    +            // If case is unimportant, normalize match key for comparison
    
    +            var matchKey = (!this.queryMatchCase) ?
    
    +                encodeURIComponent(resultObj.query).toLowerCase():
    
    +                encodeURIComponent(resultObj.query);
    
    +            
    
    +            // If a cached match key exactly matches the query...
    
    +            if(matchKey == sQuery) {
    
    +                    // Stash all result objects into aResult[] and stop looping through the cache.
    
    +                    bMatchFound = true;
    
    +                    aResults = aAllResultItems;
    
    +                    
    
    +                    // The matching cache element was not the most recent,
    
    +                    // so now we need to refresh the cache.
    
    +                    if(i != nCacheLength-1) {                        
    
    +                        // Remove element from its original location
    
    +                        aCache.splice(i,1);
    
    +                        // Add element as newest
    
    +                        this._addCacheElem(resultObj);
    
    +                    }
    
    +                    break;
    
    +            }
    
    +            // Else if this query is not an exact match and subset matching is enabled...
    
    +            else if(this.queryMatchSubset) {
    
    +                // Loop through substrings of each cached element's query property...
    
    +                for(var j = sQuery.length-1; j >= 0 ; j--) {
    
    +                    var subQuery = sQuery.substr(0,j);
    
    +                    
    
    +                    // If a substring of a cached sQuery exactly matches the query...
    
    +                    if(matchKey == subQuery) {                    
    
    +                        bMatchFound = true;
    
    +                        
    
    +                        // Go through each cached result object to match against the query...
    
    +                        for(var k = aAllResultItems.length-1; k >= 0; k--) {
    
    +                            var aRecord = aAllResultItems[k];
    
    +                            var sKeyIndex = (this.queryMatchCase) ?
    
    +                                encodeURIComponent(aRecord[0]).indexOf(sQuery):
    
    +                                encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery);
    
    +                            
    
    +                            // A STARTSWITH match is when the query is found at the beginning of the key string...
    
    +                            if((!bMatchContains && (sKeyIndex === 0)) ||
    
    +                            // A CONTAINS match is when the query is found anywhere within the key string...
    
    +                            (bMatchContains && (sKeyIndex > -1))) {
    
    +                                // Stash a match into aResults[].
    
    +                                aResults.unshift(aRecord);
    
    +                            }
    
    +                        }
    
    +                        
    
    +                        // Add the subset match result set object as the newest element to cache,
    
    +                        // and stop looping through the cache.
    
    +                        resultObj = {};
    
    +                        resultObj.query = sQuery;
    
    +                        resultObj.results = aResults;
    
    +                        this._addCacheElem(resultObj);
    
    +                        break;
    
    +                    }
    
    +                }
    
    +                if(bMatchFound) {
    
    +                    break;
    
    +                }
    
    +            }
    
    +        }
    
    +        
    
    +        // If there was a match, send along the results.
    
    +        if(bMatchFound) {
    
    +            this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults);
    
    +            oCallbackFn(sOrigQuery, aResults, oParent);
    
    +        }
    
    +    }
    
    +    return aResults;
    
    +};
    
    +
    
    +
    
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return
    
    + * query results.
    
    + *  
    
    + * @class DS_XHR
    
    + * @extends YAHOO.widget.DataSource
    
    + * @requires connection
    
    + * @constructor
    
    + * @param sScriptURI {String} Absolute or relative URI to script that returns query
    
    + * results as JSON, XML, or delimited flat-file data.
    
    + * @param aSchema {String[]} Data schema definition of results.
    
    + * @param oConfigs {Object} (optional) Object literal of config params.
    
    + */
    
    +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) {
    
    +    // Set any config params passed in to override defaults
    
    +    if(typeof oConfigs == "object") {
    
    +        for(var sConfig in oConfigs) {
    
    +            this[sConfig] = oConfigs[sConfig];
    
    +        }
    
    +    }
    
    +    
    
    +    // Initialization sequence
    
    +    if(!aSchema || (aSchema.constructor != Array)) {
    
    +        return;
    
    +    }
    
    +    else {
    
    +        this.schema = aSchema;
    
    +    }
    
    +    this.scriptURI = sScriptURI;
    
    +    this._init();
    
    +};
    
    +
    
    +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource();
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public constants
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * JSON data type.
    
    + *
    
    + * @property TYPE_JSON
    
    + * @type Number
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DS_XHR.TYPE_JSON = 0;
    
    +
    
    +/**
    
    + * XML data type.
    
    + *
    
    + * @property TYPE_XML
    
    + * @type Number
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DS_XHR.TYPE_XML = 1;
    
    +
    
    +/**
    
    + * Flat-file data type.
    
    + *
    
    + * @property TYPE_FLAT
    
    + * @type Number
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DS_XHR.TYPE_FLAT = 2;
    
    +
    
    +/**
    
    + * Error message for XHR failure.
    
    + *
    
    + * @property ERROR_DATAXHR
    
    + * @type String
    
    + * @static
    
    + * @final
    
    + */
    
    +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed";
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Alias to YUI Connection Manager. Allows implementers to specify their own
    
    + * subclasses of the YUI Connection Manager utility.
    
    + *
    
    + * @property connMgr
    
    + * @type Object
    
    + * @default YAHOO.util.Connect
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect;
    
    +
    
    +/**
    
    + * Number of milliseconds the XHR connection will wait for a server response. A
    
    + * a value of zero indicates the XHR connection will wait forever. Any value
    
    + * greater than zero will use the Connection utility's Auto-Abort feature.
    
    + *
    
    + * @property connTimeout
    
    + * @type Number
    
    + * @default 0
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.connTimeout = 0;
    
    +
    
    +/**
    
    + * Absolute or relative URI to script that returns query results. For instance,
    
    + * queries will be sent to &#60;scriptURI&#62;?&#60;scriptQueryParam&#62;=userinput
    
    + *
    
    + * @property scriptURI
    
    + * @type String
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.scriptURI = null;
    
    +
    
    +/**
    
    + * Query string parameter name sent to scriptURI. For instance, queries will be
    
    + * sent to &#60;scriptURI&#62;?&#60;scriptQueryParam&#62;=userinput
    
    + *
    
    + * @property scriptQueryParam
    
    + * @type String
    
    + * @default "query"
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query";
    
    +
    
    +/**
    
    + * String of key/value pairs to append to requests made to scriptURI. Define
    
    + * this string when you want to send additional query parameters to your script.
    
    + * When defined, queries will be sent to
    
    + * &#60;scriptURI&#62;?&#60;scriptQueryParam&#62;=userinput&#38;&#60;scriptQueryAppend&#62;
    
    + *
    
    + * @property scriptQueryAppend
    
    + * @type String
    
    + * @default ""
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = "";
    
    +
    
    +/**
    
    + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML
    
    + * and YAHOO.widget.DS_XHR.TYPE_FLAT.
    
    + *
    
    + * @property responseType
    
    + * @type String
    
    + * @default YAHOO.widget.DS_XHR.TYPE_JSON
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON;
    
    +
    
    +/**
    
    + * String after which to strip results. If the results from the XHR are sent
    
    + * back as HTML, the gzip HTML comment appears at the end of the data and should
    
    + * be ignored.
    
    + *
    
    + * @property responseStripAfter
    
    + * @type String
    
    + * @default "\n&#60;!-"
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n<!-";
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Queries the live data source defined by scriptURI for results. Results are
    
    + * passed back to a callback function.
    
    + *  
    
    + * @method doQuery
    
    + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.doQuery = function(oCallbackFn, sQuery, oParent) {
    
    +    var isXML = (this.responseType == YAHOO.widget.DS_XHR.TYPE_XML);
    
    +    var sUri = this.scriptURI+"?"+this.scriptQueryParam+"="+sQuery;
    
    +    if(this.scriptQueryAppend.length > 0) {
    
    +        sUri += "&" + this.scriptQueryAppend;
    
    +    }
    
    +    var oResponse = null;
    
    +    
    
    +    var oSelf = this;
    
    +    /*
    
    +     * Sets up ajax request callback
    
    +     *
    
    +     * @param {object} oReq          HTTPXMLRequest object
    
    +     * @private
    
    +     */
    
    +    var responseSuccess = function(oResp) {
    
    +        // Response ID does not match last made request ID.
    
    +        if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) {
    
    +            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
    
    +            return;
    
    +        }
    
    +//DEBUG
    
    +for(var foo in oResp) {
    
    +}
    
    +        if(!isXML) {
    
    +            oResp = oResp.responseText;
    
    +        }
    
    +        else { 
    
    +            oResp = oResp.responseXML;
    
    +        }
    
    +        if(oResp === null) {
    
    +            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
    
    +            return;
    
    +        }
    
    +
    
    +        var aResults = oSelf.parseResponse(sQuery, oResp, oParent);
    
    +        var resultObj = {};
    
    +        resultObj.query = decodeURIComponent(sQuery);
    
    +        resultObj.results = aResults;
    
    +        if(aResults === null) {
    
    +            oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE);
    
    +            aResults = [];
    
    +        }
    
    +        else {
    
    +            oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults);
    
    +            oSelf._addCacheElem(resultObj);
    
    +        }
    
    +        oCallbackFn(sQuery, aResults, oParent);
    
    +    };
    
    +
    
    +    var responseFailure = function(oResp) {
    
    +        oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR);
    
    +        return;
    
    +    };
    
    +    
    
    +    var oCallback = {
    
    +        success:responseSuccess,
    
    +        failure:responseFailure
    
    +    };
    
    +    
    
    +    if(!isNaN(this.connTimeout) && this.connTimeout > 0) {
    
    +        oCallback.timeout = this.connTimeout;
    
    +    }
    
    +    
    
    +    if(this._oConn) {
    
    +        this.connMgr.abort(this._oConn);
    
    +    }
    
    +    
    
    +    oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null);
    
    +};
    
    +
    
    +/**
    
    + * Parses raw response data into an array of result objects. The result data key
    
    + * is always stashed in the [0] element of each result object. 
    
    + *
    
    + * @method parseResponse
    
    + * @param sQuery {String} Query string.
    
    + * @param oResponse {Object} The raw response data to parse.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + * @returns {Object[]} Array of result objects.
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) {
    
    +    var aSchema = this.schema;
    
    +    var aResults = [];
    
    +    var bError = false;
    
    +
    
    +    // Strip out comment at the end of results
    
    +    var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ?
    
    +        oResponse.indexOf(this.responseStripAfter) : -1;
    
    +    if(nEnd != -1) {
    
    +        oResponse = oResponse.substring(0,nEnd);
    
    +    }
    
    +
    
    +    switch (this.responseType) {
    
    +        case YAHOO.widget.DS_XHR.TYPE_JSON:
    
    +            var jsonList;
    
    +            // Divert KHTML clients from JSON lib
    
    +            if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) {
    
    +                // Use the JSON utility if available
    
    +                var jsonObjParsed = JSON.parse(oResponse);
    
    +                if(!jsonObjParsed) {
    
    +                    bError = true;
    
    +                    break;
    
    +                }
    
    +                else {
    
    +                    try {
    
    +                        // eval is necessary here since aSchema[0] is of unknown depth
    
    +                        jsonList = eval("jsonObjParsed." + aSchema[0]);
    
    +                    }
    
    +                    catch(e) {
    
    +                        bError = true;
    
    +                        break;
    
    +                   }
    
    +                }
    
    +            }
    
    +            else {
    
    +                // Parse the JSON response as a string
    
    +                try {
    
    +                    // Trim leading spaces
    
    +                    while (oResponse.substring(0,1) == " ") {
    
    +                        oResponse = oResponse.substring(1, oResponse.length);
    
    +                    }
    
    +
    
    +                    // Invalid JSON response
    
    +                    if(oResponse.indexOf("{") < 0) {
    
    +                        bError = true;
    
    +                        break;
    
    +                    }
    
    +
    
    +                    // Empty (but not invalid) JSON response
    
    +                    if(oResponse.indexOf("{}") === 0) {
    
    +                        break;
    
    +                    }
    
    +
    
    +                    // Turn the string into an object literal...
    
    +                    // ...eval is necessary here
    
    +                    var jsonObjRaw = eval("(" + oResponse + ")");
    
    +                    if(!jsonObjRaw) {
    
    +                        bError = true;
    
    +                        break;
    
    +                    }
    
    +
    
    +                    // Grab the object member that contains an array of all reponses...
    
    +                    // ...eval is necessary here since aSchema[0] is of unknown depth
    
    +                    jsonList = eval("(jsonObjRaw." + aSchema[0]+")");
    
    +                }
    
    +                catch(e) {
    
    +                    bError = true;
    
    +                    break;
    
    +               }
    
    +            }
    
    +
    
    +            if(!jsonList) {
    
    +                bError = true;
    
    +                break;
    
    +            }
    
    +
    
    +            if(jsonList.constructor != Array) {
    
    +                jsonList = [jsonList];
    
    +            }
    
    +            
    
    +            // Loop through the array of all responses...
    
    +            for(var i = jsonList.length-1; i >= 0 ; i--) {
    
    +                var aResultItem = [];
    
    +                var jsonResult = jsonList[i];
    
    +                // ...and loop through each data field value of each response
    
    +                for(var j = aSchema.length-1; j >= 1 ; j--) {
    
    +                    // ...and capture data into an array mapped according to the schema...
    
    +                    var dataFieldValue = jsonResult[aSchema[j]];
    
    +                    if(!dataFieldValue) {
    
    +                        dataFieldValue = "";
    
    +                    }
    
    +                    aResultItem.unshift(dataFieldValue);
    
    +                }
    
    +                // If schema isn't well defined, pass along the entire result object
    
    +                if(aResultItem.length == 1) {
    
    +                    aResultItem.push(jsonResult);
    
    +                }
    
    +                // Capture the array of data field values in an array of results
    
    +                aResults.unshift(aResultItem);
    
    +            }
    
    +            break;
    
    +        case YAHOO.widget.DS_XHR.TYPE_XML:
    
    +            // Get the collection of results
    
    +            var xmlList = oResponse.getElementsByTagName(aSchema[0]);
    
    +            if(!xmlList) {
    
    +                bError = true;
    
    +                break;
    
    +            }
    
    +            // Loop through each result
    
    +            for(var k = xmlList.length-1; k >= 0 ; k--) {
    
    +                var result = xmlList.item(k);
    
    +                var aFieldSet = [];
    
    +                // Loop through each data field in each result using the schema
    
    +                for(var m = aSchema.length-1; m >= 1 ; m--) {
    
    +                    var sValue = null;
    
    +                    // Values may be held in an attribute...
    
    +                    var xmlAttr = result.attributes.getNamedItem(aSchema[m]);
    
    +                    if(xmlAttr) {
    
    +                        sValue = xmlAttr.value;
    
    +                    }
    
    +                    // ...or in a node
    
    +                    else{
    
    +                        var xmlNode = result.getElementsByTagName(aSchema[m]);
    
    +                        if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) {
    
    +                            sValue = xmlNode.item(0).firstChild.nodeValue;
    
    +                        }
    
    +                        else {
    
    +                            sValue = "";
    
    +                        }
    
    +                    }
    
    +                    // Capture the schema-mapped data field values into an array
    
    +                    aFieldSet.unshift(sValue);
    
    +                }
    
    +                // Capture each array of values into an array of results
    
    +                aResults.unshift(aFieldSet);
    
    +            }
    
    +            break;
    
    +        case YAHOO.widget.DS_XHR.TYPE_FLAT:
    
    +            if(oResponse.length > 0) {
    
    +                // Delete the last line delimiter at the end of the data if it exists
    
    +                var newLength = oResponse.length-aSchema[0].length;
    
    +                if(oResponse.substr(newLength) == aSchema[0]) {
    
    +                    oResponse = oResponse.substr(0, newLength);
    
    +                }
    
    +                var aRecords = oResponse.split(aSchema[0]);
    
    +                for(var n = aRecords.length-1; n >= 0; n--) {
    
    +                    aResults[n] = aRecords[n].split(aSchema[1]);
    
    +                }
    
    +            }
    
    +            break;
    
    +        default:
    
    +            break;
    
    +    }
    
    +    sQuery = null;
    
    +    oResponse = null;
    
    +    oParent = null;
    
    +    if(bError) {
    
    +        return null;
    
    +    }
    
    +    else {
    
    +        return aResults;
    
    +    }
    
    +};            
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * XHR connection object.
    
    + *
    
    + * @property _oConn
    
    + * @type Object
    
    + * @private
    
    + */
    
    +YAHOO.widget.DS_XHR.prototype._oConn = null;
    
    +
    
    +
    
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * Implementation of YAHOO.widget.DataSource using a native Javascript function as
    
    + * its live data source.
    
    + *  
    
    + * @class DS_JSFunction
    
    + * @constructor
    
    + * @extends YAHOO.widget.DataSource
    
    + * @param oFunction {String} In-memory Javascript function that returns query results as an array of objects.
    
    + * @param oConfigs {Object} (optional) Object literal of config params.
    
    + */
    
    +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) {
    
    +    // Set any config params passed in to override defaults
    
    +    if(typeof oConfigs == "object") {
    
    +        for(var sConfig in oConfigs) {
    
    +            this[sConfig] = oConfigs[sConfig];
    
    +        }
    
    +    }
    
    +
    
    +    // Initialization sequence
    
    +    if(!oFunction  || (oFunction.constructor != Function)) {
    
    +        return;
    
    +    }
    
    +    else {
    
    +        this.dataFunction = oFunction;
    
    +        this._init();
    
    +    }
    
    +};
    
    +
    
    +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource();
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * In-memory Javascript function that returns query results.
    
    + *
    
    + * @property dataFunction
    
    + * @type HTMLFunction
    
    + */
    
    +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Queries the live data source defined by function for results. Results are
    
    + * passed back to a callback function.
    
    + *  
    
    + * @method doQuery
    
    + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + */
    
    +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) {
    
    +    var oFunction = this.dataFunction;
    
    +    var aResults = [];
    
    +    
    
    +    aResults = oFunction(sQuery);
    
    +    if(aResults === null) {
    
    +        this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL);
    
    +        return;
    
    +    }
    
    +    
    
    +    var resultObj = {};
    
    +    resultObj.query = decodeURIComponent(sQuery);
    
    +    resultObj.results = aResults;
    
    +    this._addCacheElem(resultObj);
    
    +    
    
    +    this.getResultsEvent.fire(this, oParent, sQuery, aResults);
    
    +    oCallbackFn(sQuery, aResults, oParent);
    
    +    return;
    
    +};
    
    +
    
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * Implementation of YAHOO.widget.DataSource using a native Javascript array as
    
    + * its live data source.
    
    + *
    
    + * @class DS_JSArray
    
    + * @constructor
    
    + * @extends YAHOO.widget.DataSource
    
    + * @param aData {String[]} In-memory Javascript array of simple string data.
    
    + * @param oConfigs {Object} (optional) Object literal of config params.
    
    + */
    
    +YAHOO.widget.DS_JSArray = function(aData, oConfigs) {
    
    +    // Set any config params passed in to override defaults
    
    +    if(typeof oConfigs == "object") {
    
    +        for(var sConfig in oConfigs) {
    
    +            this[sConfig] = oConfigs[sConfig];
    
    +        }
    
    +    }
    
    +
    
    +    // Initialization sequence
    
    +    if(!aData || (aData.constructor != Array)) {
    
    +        return;
    
    +    }
    
    +    else {
    
    +        this.data = aData;
    
    +        this._init();
    
    +    }
    
    +};
    
    +
    
    +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource();
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * In-memory Javascript array of strings.
    
    + *
    
    + * @property data
    
    + * @type Array
    
    + */
    
    +YAHOO.widget.DS_JSArray.prototype.data = null;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Queries the live data source defined by data for results. Results are passed
    
    + * back to a callback function.
    
    + *
    
    + * @method doQuery
    
    + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results.
    
    + * @param sQuery {String} Query string.
    
    + * @param oParent {Object} The object instance that has requested data.
    
    + */
    
    +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) {
    
    +    var aData = this.data; // the array
    
    +    var aResults = []; // container for results
    
    +    var bMatchFound = false;
    
    +    var bMatchContains = this.queryMatchContains;
    
    +    if(sQuery) {
    
    +        if(!this.queryMatchCase) {
    
    +            sQuery = sQuery.toLowerCase();
    
    +        }
    
    +
    
    +        // Loop through each element of the array...
    
    +        // which can be a string or an array of strings
    
    +        for(var i = aData.length-1; i >= 0; i--) {
    
    +            var aDataset = [];
    
    +
    
    +            if(aData[i]) {
    
    +                if(aData[i].constructor == String) {
    
    +                    aDataset[0] = aData[i];
    
    +                }
    
    +                else if(aData[i].constructor == Array) {
    
    +                    aDataset = aData[i];
    
    +                }
    
    +            }
    
    +
    
    +            if(aDataset[0] && (aDataset[0].constructor == String)) {
    
    +                var sKeyIndex = (this.queryMatchCase) ?
    
    +                encodeURIComponent(aDataset[0]).indexOf(sQuery):
    
    +                encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery);
    
    +
    
    +                // A STARTSWITH match is when the query is found at the beginning of the key string...
    
    +                if((!bMatchContains && (sKeyIndex === 0)) ||
    
    +                // A CONTAINS match is when the query is found anywhere within the key string...
    
    +                (bMatchContains && (sKeyIndex > -1))) {
    
    +                    // Stash a match into aResults[].
    
    +                    aResults.unshift(aDataset);
    
    +                }
    
    +            }
    
    +        }
    
    +    }
    
    +
    
    +    this.getResultsEvent.fire(this, oParent, sQuery, aResults);
    
    +    oCallbackFn(sQuery, aResults, oParent);
    
    +};
    
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/calendar.js.html b/www/extras/yui-ext/docs/output/calendar.js.html new file mode 100644 index 000000000..f559df5c8 --- /dev/null +++ b/www/extras/yui-ext/docs/output/calendar.js.html @@ -0,0 +1,4239 @@ +calendar.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version 0.12.0
    +*/
    +// holder
    +/**
    +* Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state.
    +* @class YAHOO.util.Config
    +* @constructor
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config = function(owner) {
    +	if (owner) {
    +		this.init(owner);
    +	}
    +};
    +
    +YAHOO.util.Config.prototype = {
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @property owner
    +	* @type Object
    +	*/
    +	owner : null,
    +
    +	/**
    +	* Boolean flag that specifies whether a queue is currently being executed
    +	* @property queueInProgress
    +	* @type Boolean
    +	*/
    +	queueInProgress : false,
    +
    +
    +	/**
    +	* Validates that the value passed in is a Boolean.
    +	* @method checkBoolean
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkBoolean: function(val) {
    +		if (typeof val == 'boolean') {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Validates that the value passed in is a number.
    +	* @method checkNumber
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkNumber: function(val) {
    +		if (isNaN(val)) {
    +			return false;
    +		} else {
    +			return true;
    +		}
    +	}
    +};
    +
    +
    +/**
    +* Initializes the configuration Object and all of its local members.
    +* @method init
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config.prototype.init = function(owner) {
    +
    +	this.owner = owner;
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @event configChangedEvent
    +	*/
    +	this.configChangedEvent = new YAHOO.util.CustomEvent("configChanged");
    +
    +	this.queueInProgress = false;
    +
    +	/* Private Members */
    +// holder
    +/**
    +	* Maintains the local collection of configuration property objects and their specified values
    +	* @property config
    +	* @private
    +	* @type Object
    +	*/
    +	var config = {};
    +
    +	/**
    +	* Maintains the local collection of configuration property objects as they were initially applied.
    +	* This object is used when resetting a property.
    +	* @property initialConfig
    +	* @private
    +	* @type Object
    +	*/
    +	var initialConfig = {};
    +
    +	/**
    +	* Maintains the local, normalized CustomEvent queue
    +	* @property eventQueue
    +	* @private
    +	* @type Object
    +	*/
    +	var eventQueue = [];
    +
    +	/**
    +	* Fires a configuration property event using the specified value.
    +	* @method fireEvent
    +	* @private
    +	* @param {String}	key			The configuration property's name
    +	* @param {value}	Object		The value of the correct type for the property
    +	*/
    +	var fireEvent = function( key, value ) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			property.event.fire(value);
    +		}
    +	};
    +	/* End Private Members */
    +// holder
    +/**
    +	* Adds a property to the Config Object's private config hash.
    +	* @method addProperty
    +	* @param {String}	key	The configuration property's name
    +	* @param {Object}	propertyObject	The Object containing all of this property's arguments
    +	*/
    +	this.addProperty = function( key, propertyObject ) {
    +		key = key.toLowerCase();
    +
    +		config[key] = propertyObject;
    +
    +		propertyObject.event = new YAHOO.util.CustomEvent(key);
    +		propertyObject.key = key;
    +
    +		if (propertyObject.handler) {
    +			propertyObject.event.subscribe(propertyObject.handler, this.owner, true);
    +		}
    +
    +		this.setProperty(key, propertyObject.value, true);
    +
    +		if (! propertyObject.suppressEvent) {
    +			this.queueProperty(key, propertyObject.value);
    +		}
    +	};
    +
    +	/**
    +	* Returns a key-value configuration map of the values currently set in the Config Object.
    +	* @method getConfig
    +	* @return {Object} The current config, represented in a key-value map
    +	*/
    +	this.getConfig = function() {
    +		var cfg = {};
    +
    +		for (var prop in config) {
    +			var property = config[prop];
    +			if (typeof property != 'undefined' && property.event) {
    +				cfg[prop] = property.value;
    +			}
    +		}
    +
    +		return cfg;
    +	};
    +
    +	/**
    +	* Returns the value of specified property.
    +	* @method getProperty
    +	* @param {String} key	The name of the property
    +	* @return {Object}		The value of the specified property
    +	*/
    +	this.getProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.value;
    +		} else {
    +			return undefined;
    +		}
    +	};
    +
    +	/**
    +	* Resets the specified property's value to its initial value.
    +	* @method resetProperty
    +	* @param {String} key	The name of the property
    +	* @return {Boolean} True is the property was reset, false if not
    +	*/
    +	this.resetProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (initialConfig[key] && initialConfig[key] != 'undefined')	{
    +				this.setProperty(key, initialConfig[key]);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property. If the silent property is passed as true, the property's event will not be fired.
    +	* @method setProperty
    +	* @param {String} key		The name of the property
    +	* @param {String} value		The value to set the property to
    +	* @param {Boolean} silent	Whether the value should be set silently, without firing the property event.
    +	* @return {Boolean}			True, if the set was successful, false if it failed.
    +	*/
    +	this.setProperty = function(key, value, silent) {
    +		key = key.toLowerCase();
    +
    +		if (this.queueInProgress && ! silent) {
    +			this.queueProperty(key,value); // Currently running through a queue...
    +			return true;
    +		} else {
    +			var property = config[key];
    +			if (typeof property != 'undefined' && property.event) {
    +				if (property.validator && ! property.validator(value)) { // validator
    +					return false;
    +				} else {
    +					property.value = value;
    +					if (! silent) {
    +						fireEvent(key, value);
    +						this.configChangedEvent.fire([key, value]);
    +					}
    +					return true;
    +				}
    +			} else {
    +				return false;
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is
    +	* moved from its current position to the end of the queue.
    +	* @method queueProperty
    +	* @param {String} key	The name of the property
    +	* @param {String} value	The value to set the property to
    +	* @return {Boolean}		true, if the set was successful, false if it failed.
    +	*/
    +	this.queueProperty = function(key, value) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			if (typeof value != 'undefined' && property.validator && ! property.validator(value)) { // validator
    +				return false;
    +			} else {
    +
    +				if (typeof value != 'undefined') {
    +					property.value = value;
    +				} else {
    +					value = property.value;
    +				}
    +
    +				var foundDuplicate = false;
    +
    +				for (var i=0;i<eventQueue.length;i++) {
    +					var queueItem = eventQueue[i];
    +
    +					if (queueItem) {
    +						var queueItemKey = queueItem[0];
    +						var queueItemValue = queueItem[1];
    +
    +						if (queueItemKey.toLowerCase() == key) {
    +							// found a dupe... push to end of queue, null current item, and break
    +							eventQueue[i] = null;
    +							eventQueue.push([key, (typeof value != 'undefined' ? value : queueItemValue)]);
    +							foundDuplicate = true;
    +							break;
    +						}
    +					}
    +				}
    +
    +				if (! foundDuplicate && typeof value != 'undefined') { // this is a refire, or a new property in the queue
    +					eventQueue.push([key, value]);
    +				}
    +			}
    +
    +			if (property.supercedes) {
    +				for (var s=0;s<property.supercedes.length;s++) {
    +					var supercedesCheck = property.supercedes[s];
    +
    +					for (var q=0;q<eventQueue.length;q++) {
    +						var queueItemCheck = eventQueue[q];
    +
    +						if (queueItemCheck) {
    +							var queueItemCheckKey = queueItemCheck[0];
    +							var queueItemCheckValue = queueItemCheck[1];
    +
    +							if ( queueItemCheckKey.toLowerCase() == supercedesCheck.toLowerCase() ) {
    +								eventQueue.push([queueItemCheckKey, queueItemCheckValue]);
    +								eventQueue[q] = null;
    +								break;
    +							}
    +						}
    +					}
    +				}
    +			}
    +
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Fires the event for a property using the property's current value.
    +	* @method refireEvent
    +	* @param {String} key	The name of the property
    +	*/
    +	this.refireEvent = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event && typeof property.value != 'undefined') {
    +			if (this.queueInProgress) {
    +				this.queueProperty(key);
    +			} else {
    +				fireEvent(key, property.value);
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property events.
    +	* Although the values will be set, fireQueue() must be called for their associated events to execute.
    +	* @method applyConfig
    +	* @param {Object}	userConfig	The configuration Object literal
    +	* @param {Boolean}	init		When set to true, the initialConfig will be set to the userConfig passed in, so that calling a reset will reset the properties to the passed values.
    +	*/
    +	this.applyConfig = function(userConfig, init) {
    +		if (init) {
    +			initialConfig = userConfig;
    +		}
    +		for (var prop in userConfig) {
    +			this.queueProperty(prop, userConfig[prop]);
    +		}
    +	};
    +
    +	/**
    +	* Refires the events for all configuration properties using their current values.
    +	* @method refresh
    +	*/
    +	this.refresh = function() {
    +		for (var prop in config) {
    +			this.refireEvent(prop);
    +		}
    +	};
    +
    +	/**
    +	* Fires the normalized list of queued property change events
    +	* @method fireQueue
    +	*/
    +	this.fireQueue = function() {
    +		this.queueInProgress = true;
    +		for (var i=0;i<eventQueue.length;i++) {
    +			var queueItem = eventQueue[i];
    +			if (queueItem) {
    +				var key = queueItem[0];
    +				var value = queueItem[1];
    +
    +				var property = config[key];
    +				property.value = value;
    +
    +				fireEvent(key,value);
    +			}
    +		}
    +
    +		this.queueInProgress = false;
    +		eventQueue = [];
    +	};
    +
    +	/**
    +	* Subscribes an external handler to the change event for any given property.
    +	* @method subscribeToConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @param {Boolean}	override	Optional. If true, will override "this" within the handler to map to the scope Object passed into the method.
    +	* @return {Boolean}				True, if the subscription was successful, otherwise false.
    +	*/
    +	this.subscribeToConfigEvent = function(key, handler, obj, override) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (! YAHOO.util.Config.alreadySubscribed(property.event, handler, obj)) {
    +				property.event.subscribe(handler, obj, override);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Unsubscribes an external handler from the change event for any given property.
    +	* @method unsubscribeFromConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @return {Boolean}				True, if the unsubscription was successful, otherwise false.
    +	*/
    +	this.unsubscribeFromConfigEvent = function(key, handler, obj) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.event.unsubscribe(handler, obj);
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object
    +	* @method toString
    +	* @return {String}	The Config object in string format.
    +	*/
    +	this.toString = function() {
    +		var output = "Config";
    +		if (this.owner) {
    +			output += " [" + this.owner.toString() + "]";
    +		}
    +		return output;
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object's current CustomEvent queue
    +	* @method outputEventQueue
    +	* @return {String}	The string list of CustomEvents currently queued for execution
    +	*/
    +	this.outputEventQueue = function() {
    +		var output = "";
    +		for (var q=0;q<eventQueue.length;q++) {
    +			var queueItem = eventQueue[q];
    +			if (queueItem) {
    +				output += queueItem[0] + "=" + queueItem[1] + ", ";
    +			}
    +		}
    +		return output;
    +	};
    +};
    +
    +/**
    +* Checks to determine if a particular function/Object pair are already subscribed to the specified CustomEvent
    +* @method YAHOO.util.Config.alreadySubscribed
    +* @static
    +* @param {YAHOO.util.CustomEvent} evt	The CustomEvent for which to check the subscriptions
    +* @param {Function}	fn	The function to look for in the subscribers list
    +* @param {Object}	obj	The execution scope Object for the subscription
    +* @return {Boolean}	true, if the function/Object pair is already subscribed to the CustomEvent passed in
    +*/
    +YAHOO.util.Config.alreadySubscribed = function(evt, fn, obj) {
    +	for (var e=0;e<evt.subscribers.length;e++) {
    +		var subsc = evt.subscribers[e];
    +		if (subsc && subsc.obj == obj && subsc.fn == fn) {
    +			return true;
    +		}
    +	}
    +	return false;
    +};
    +
    +/**
    +* YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility
    +* used for adding, subtracting, and comparing dates.
    +* @class YAHOO.widget.DateMath
    +*/
    +YAHOO.widget.DateMath = {
    +	/**
    +	* Constant field representing Day
    +	* @property DAY
    +	* @static
    +	* @final
    +	* @type String
    +	*/
    +	DAY : "D",
    +
    +	/**
    +	* Constant field representing Week
    +	* @property WEEK
    +	* @static
    +	* @final
    +	* @type String
    +	*/
    +	WEEK : "W",
    +
    +	/**
    +	* Constant field representing Year
    +	* @property YEAR
    +	* @static
    +	* @final
    +	* @type String
    +	*/
    +	YEAR : "Y",
    +
    +	/**
    +	* Constant field representing Month
    +	* @property MONTH
    +	* @static
    +	* @final
    +	* @type String
    +	*/
    +	MONTH : "M",
    +
    +	/**
    +	* Constant field representing one day, in milliseconds
    +	* @property ONE_DAY_MS
    +	* @static
    +	* @final
    +	* @type Number
    +	*/
    +	ONE_DAY_MS : 1000*60*60*24,
    +
    +	/**
    +	* Adds the specified amount of time to the this instance.
    +	* @method add
    +	* @param {Date} date	The JavaScript Date object to perform addition on
    +	* @param {String} field	The field constant to be used for performing addition.
    +	* @param {Number} amount	The number of units (measured in the field constant) to add to the date.
    +	* @return {Date} The resulting Date object
    +	*/
    +	add : function(date, field, amount) {
    +		var d = new Date(date.getTime());
    +		switch (field) {
    +			case this.MONTH:
    +				var newMonth = date.getMonth() + amount;
    +				var years = 0;
    +
    +
    +				if (newMonth < 0) {
    +					while (newMonth < 0) {
    +						newMonth += 12;
    +						years -= 1;
    +					}
    +				} else if (newMonth > 11) {
    +					while (newMonth > 11) {
    +						newMonth -= 12;
    +						years += 1;
    +					}
    +				}
    +
    +				d.setMonth(newMonth);
    +				d.setFullYear(date.getFullYear() + years);
    +				break;
    +			case this.DAY:
    +				d.setDate(date.getDate() + amount);
    +				break;
    +			case this.YEAR:
    +				d.setFullYear(date.getFullYear() + amount);
    +				break;
    +			case this.WEEK:
    +				d.setDate(date.getDate() + (amount * 7));
    +				break;
    +		}
    +		return d;
    +	},
    +
    +	/**
    +	* Subtracts the specified amount of time from the this instance.
    +	* @method subtract
    +	* @param {Date} date	The JavaScript Date object to perform subtraction on
    +	* @param {Number} field	The this field constant to be used for performing subtraction.
    +	* @param {Number} amount	The number of units (measured in the field constant) to subtract from the date.
    +	* @return {Date} The resulting Date object
    +	*/
    +	subtract : function(date, field, amount) {
    +		return this.add(date, field, (amount*-1));
    +	},
    +
    +	/**
    +	* Determines whether a given date is before another date on the calendar.
    +	* @method before
    +	* @param {Date} date		The Date object to compare with the compare argument
    +	* @param {Date} compareTo	The Date object to use for the comparison
    +	* @return {Boolean} true if the date occurs before the compared date; false if not.
    +	*/
    +	before : function(date, compareTo) {
    +		var ms = compareTo.getTime();
    +		if (date.getTime() < ms) {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Determines whether a given date is after another date on the calendar.
    +	* @method after
    +	* @param {Date} date		The Date object to compare with the compare argument
    +	* @param {Date} compareTo	The Date object to use for the comparison
    +	* @return {Boolean} true if the date occurs after the compared date; false if not.
    +	*/
    +	after : function(date, compareTo) {
    +		var ms = compareTo.getTime();
    +		if (date.getTime() > ms) {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Determines whether a given date is between two other dates on the calendar.
    +	* @method between
    +	* @param {Date} date		The date to check for
    +	* @param {Date} dateBegin	The start of the range
    +	* @param {Date} dateEnd		The end of the range
    +	* @return {Boolean} true if the date occurs between the compared dates; false if not.
    +	*/
    +	between : function(date, dateBegin, dateEnd) {
    +		if (this.after(date, dateBegin) && this.before(date, dateEnd)) {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Retrieves a JavaScript Date object representing January 1 of any given year.
    +	* @method getJan1
    +	* @param {Number} calendarYear		The calendar year for which to retrieve January 1
    +	* @return {Date}	January 1 of the calendar year specified.
    +	*/
    +	getJan1 : function(calendarYear) {
    +		return new Date(calendarYear,0,1);
    +	},
    +
    +	/**
    +	* Calculates the number of days the specified date is from January 1 of the specified calendar year.
    +	* Passing January 1 to this function would return an offset value of zero.
    +	* @method getDayOffset
    +	* @param {Date}	date	The JavaScript date for which to find the offset
    +	* @param {Number} calendarYear	The calendar year to use for determining the offset
    +	* @return {Number}	The number of days since January 1 of the given year
    +	*/
    +	getDayOffset : function(date, calendarYear) {
    +		var beginYear = this.getJan1(calendarYear); // Find the start of the year. This will be in week 1.
    +
    +		// Find the number of days the passed in date is away from the calendar year start
    +		var dayOffset = Math.ceil((date.getTime()-beginYear.getTime()) / this.ONE_DAY_MS);
    +		return dayOffset;
    +	},
    +
    +	/**
    +	* Calculates the week number for the given date. This function assumes that week 1 is the
    +	* week in which January 1 appears, regardless of whether the week consists of a full 7 days.
    +	* The calendar year can be specified to help find what a the week number would be for a given
    +	* date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or
    +	* week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction
    +	* easily.
    +	* @method getWeekNumber
    +	* @param {Date}	date	The JavaScript date for which to find the week number
    +	* @param {Number} calendarYear	OPTIONAL - The calendar year to use for determining the week number. Default is
    +	*											the calendar year of parameter "date".
    +	* @param {Number} weekStartsOn	OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday).
    +	* @return {Number}	The week number of the given date.
    +	*/
    +	getWeekNumber : function(date, calendarYear) {
    +		date = this.clearTime(date);
    +		var nearestThurs = new Date(date.getTime() + (4 * this.ONE_DAY_MS) - ((date.getDay()) * this.ONE_DAY_MS));
    +
    +		var jan1 = new Date(nearestThurs.getFullYear(),0,1);
    +		var dayOfYear = ((nearestThurs.getTime() - jan1.getTime()) / this.ONE_DAY_MS) - 1;
    +
    +		var weekNum = Math.ceil((dayOfYear)/ 7);
    +		return weekNum;
    +	},
    +
    +	/**
    +	* Determines if a given week overlaps two different years.
    +	* @method isYearOverlapWeek
    +	* @param {Date}	weekBeginDate	The JavaScript Date representing the first day of the week.
    +	* @return {Boolean}	true if the date overlaps two different years.
    +	*/
    +	isYearOverlapWeek : function(weekBeginDate) {
    +		var overlaps = false;
    +		var nextWeek = this.add(weekBeginDate, this.DAY, 6);
    +		if (nextWeek.getFullYear() != weekBeginDate.getFullYear()) {
    +			overlaps = true;
    +		}
    +		return overlaps;
    +	},
    +
    +	/**
    +	* Determines if a given week overlaps two different months.
    +	* @method isMonthOverlapWeek
    +	* @param {Date}	weekBeginDate	The JavaScript Date representing the first day of the week.
    +	* @return {Boolean}	true if the date overlaps two different months.
    +	*/
    +	isMonthOverlapWeek : function(weekBeginDate) {
    +		var overlaps = false;
    +		var nextWeek = this.add(weekBeginDate, this.DAY, 6);
    +		if (nextWeek.getMonth() != weekBeginDate.getMonth()) {
    +			overlaps = true;
    +		}
    +		return overlaps;
    +	},
    +
    +	/**
    +	* Gets the first day of a month containing a given date.
    +	* @method findMonthStart
    +	* @param {Date}	date	The JavaScript Date used to calculate the month start
    +	* @return {Date}		The JavaScript Date representing the first day of the month
    +	*/
    +	findMonthStart : function(date) {
    +		var start = new Date(date.getFullYear(), date.getMonth(), 1);
    +		return start;
    +	},
    +
    +	/**
    +	* Gets the last day of a month containing a given date.
    +	* @method findMonthEnd
    +	* @param {Date}	date	The JavaScript Date used to calculate the month end
    +	* @return {Date}		The JavaScript Date representing the last day of the month
    +	*/
    +	findMonthEnd : function(date) {
    +		var start = this.findMonthStart(date);
    +		var nextMonth = this.add(start, this.MONTH, 1);
    +		var end = this.subtract(nextMonth, this.DAY, 1);
    +		return end;
    +	},
    +
    +	/**
    +	* Clears the time fields from a given date, effectively setting the time to midnight.
    +	* @method clearTime
    +	* @param {Date}	date	The JavaScript Date for which the time fields will be cleared
    +	* @return {Date}		The JavaScript Date cleared of all time fields
    +	*/
    +	clearTime : function(date) {
    +		date.setHours(12,0,0,0);
    +		return date;
    +	}
    +};
    +
    +/**
    +* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month ("one-up") or two-month ("two-up") interface. Calendars are generated entirely via script and can be navigated without any page refreshes.
    +* @module    Calendar
    +* @title     Calendar Widget
    +* @namespace YAHOO.widget
    +* @requires  yahoo,dom,event
    +*/
    +// holder
    +/**
    +* Calendar is the base class for the Calendar widget. In its most basic
    +* implementation, it has the ability to render a calendar widget on the page
    +* that can be manipulated to select a single date, move back and forth between
    +* months and years.
    +* <p>To construct the placeholder for the calendar widget, the code is as
    +* follows:
    +*	<xmp>
    +*		<div id="cal1Container"></div>
    +*	</xmp>
    +* Note that the table can be replaced with any kind of element.
    +* </p>
    +* @namespace YAHOO.widget
    +* @class Calendar
    +* @constructor
    +* @param {String}	id			The id of the table element that will represent the calendar widget
    +* @param {String}	containerId	The id of the container div element that will wrap the calendar table
    +* @param {Object}	config		The configuration object containing the Calendar's arguments
    +*/
    +YAHOO.widget.Calendar = function(id, containerId, config) {
    +	this.init(id, containerId, config);
    +};
    +
    +/**
    +* The path to be used for images loaded for the Calendar
    +* @property YAHOO.widget.Calendar.IMG_ROOT
    +* @static
    +* @type String
    +*/
    +YAHOO.widget.Calendar.IMG_ROOT = (window.location.href.toLowerCase().indexOf("https") === 0 ? "https://a248.e.akamai.net/sec.yimg.com/i/" : "http://us.i1.yimg.com/us.yimg.com/i/");
    +
    +/**
    +* Type constant used for renderers to represent an individual date (M/D/Y)
    +* @property YAHOO.widget.Calendar.DATE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.DATE = "D";
    +
    +/**
    +* Type constant used for renderers to represent an individual date across any year (M/D)
    +* @property YAHOO.widget.Calendar.MONTH_DAY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.MONTH_DAY = "MD";
    +
    +/**
    +* Type constant used for renderers to represent a weekday
    +* @property YAHOO.widget.Calendar.WEEKDAY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.WEEKDAY = "WD";
    +
    +/**
    +* Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
    +* @property YAHOO.widget.Calendar.RANGE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.RANGE = "R";
    +
    +/**
    +* Type constant used for renderers to represent a month across any year
    +* @property YAHOO.widget.Calendar.MONTH
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.MONTH = "M";
    +
    +/**
    +* Constant that represents the total number of date cells that are displayed in a given month
    +* @property YAHOO.widget.Calendar.DISPLAY_DAYS
    +* @static
    +* @final
    +* @type Number
    +*/
    +YAHOO.widget.Calendar.DISPLAY_DAYS = 42;
    +
    +/**
    +* Constant used for halting the execution of the remainder of the render stack
    +* @property YAHOO.widget.Calendar.STOP_RENDER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Calendar.STOP_RENDER = "S";
    +
    +YAHOO.widget.Calendar.prototype = {
    +
    +	/**
    +	* The configuration object used to set up the calendars various locale and style options.
    +	* @property Config
    +	* @private
    +	* @deprecated Configuration properties should be set by calling Calendar.cfg.setProperty.
    +	* @type Object
    +	*/
    +	Config : null,
    +
    +	/**
    +	* The parent CalendarGroup, only to be set explicitly by the parent group
    +	* @property parent
    +	* @type CalendarGroup
    +	*/
    +	parent : null,
    +
    +	/**
    +	* The index of this item in the parent group
    +	* @property index
    +	* @type Number
    +	*/
    +	index : -1,
    +
    +	/**
    +	* The collection of calendar table cells
    +	* @property cells
    +	* @type HTMLTableCellElement[]
    +	*/
    +	cells : null,
    +
    +	/**
    +	* The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
    +	* @property cellDates
    +	* @type Array[](Number[])
    +	*/
    +	cellDates : null,
    +
    +	/**
    +	* The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
    +	* @property id
    +	* @type String
    +	*/
    +	id : null,
    +
    +	/**
    +	* The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
    +	* @property oDomContainer
    +	* @type HTMLElement
    +	*/
    +	oDomContainer : null,
    +
    +	/**
    +	* A Date object representing today's date.
    +	* @property today
    +	* @type Date
    +	*/
    +	today : null,
    +
    +	/**
    +	* The list of render functions, along with required parameters, used to render cells.
    +	* @property renderStack
    +	* @type Array[]
    +	*/
    +	renderStack : null,
    +
    +	/**
    +	* A copy of the initial render functions created before rendering.
    +	* @property _renderStack
    +	* @private
    +	* @type Array
    +	*/
    +	_renderStack : null,
    +
    +	/**
    +	* A Date object representing the month/year that the calendar is initially set to
    +	* @property _pageDate
    +	* @private
    +	* @type Date
    +	*/
    +	_pageDate : null,
    +
    +	/**
    +	* The private list of initially selected dates.
    +	* @property _selectedDates
    +	* @private
    +	* @type Array
    +	*/
    +	_selectedDates : null,
    +
    +	/**
    +	* A map of DOM event handlers to attach to cells associated with specific CSS class names
    +	* @property domEventMap
    +	* @type Object
    +	*/
    +	domEventMap : null
    +};
    +
    +
    +
    +/**
    +* Initializes the Calendar widget.
    +* @method init
    +* @param {String}	id			The id of the table element that will represent the calendar widget
    +* @param {String}	containerId	The id of the container div element that will wrap the calendar table
    +* @param {Object}	config		The configuration object containing the Calendar's arguments
    +*/
    +YAHOO.widget.Calendar.prototype.init = function(id, containerId, config) {
    +	this.initEvents();
    +	this.today = new Date();
    +	YAHOO.widget.DateMath.clearTime(this.today);
    +
    +	this.id = id;
    +	this.oDomContainer = document.getElementById(containerId);
    +
    +	/**
    +	* The Config object used to hold the configuration variables for the Calendar
    +	* @property cfg
    +	* @type YAHOO.util.Config
    +	*/
    +	this.cfg = new YAHOO.util.Config(this);
    +
    +	/**
    +	* The local object which contains the Calendar's options
    +	* @property Options
    +	* @type Object
    +	*/
    +	this.Options = {};
    +
    +	/**
    +	* The local object which contains the Calendar's locale settings
    +	* @property Locale
    +	* @type Object
    +	*/
    +	this.Locale = {};
    +
    +	this.initStyles();
    +
    +	YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER);
    +	YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE);
    +
    +	this.cellDates = [];
    +	this.cells = [];
    +	this.renderStack = [];
    +	this._renderStack = [];
    +
    +	this.setupConfig();
    +
    +	if (config) {
    +		this.cfg.applyConfig(config, true);
    +	}
    +
    +	this.cfg.fireQueue();
    +};
    +
    +/**
    +* Renders the built-in IFRAME shim for the IE6 and below
    +* @method configIframe
    +*/
    +YAHOO.widget.Calendar.prototype.configIframe = function(type, args, obj) {
    +	var useIframe = args[0];
    +
    +	if (YAHOO.util.Dom.inDocument(this.oDomContainer)) {
    +		if (useIframe) {
    +			var pos = YAHOO.util.Dom.getStyle(this.oDomContainer, "position");
    +
    +			if (this.browser == "ie" && (pos == "absolute" || pos == "relative")) {
    +				if (! YAHOO.util.Dom.inDocument(this.iframe)) {
    +					this.iframe = document.createElement("iframe");
    +					this.iframe.src = "javascript:false;";
    +					YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
    +					this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild);
    +				}
    +			}
    +		} else {
    +			if (this.iframe) {
    +				if (this.iframe.parentNode) {
    +					this.iframe.parentNode.removeChild(this.iframe);
    +				}
    +				this.iframe = null;
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* Default handler for the "title" property
    +* @method configTitle
    +*/
    +YAHOO.widget.Calendar.prototype.configTitle = function(type, args, obj) {
    +	var title = args[0];
    +	var close = this.cfg.getProperty("close");
    +
    +	var titleDiv;
    +
    +	if (title && title !== "") {
    +		titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div");
    +		titleDiv.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE;
    +		titleDiv.innerHTML = title;
    +		this.oDomContainer.insertBefore(titleDiv, this.oDomContainer.firstChild);
    +		YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle");
    +	} else {
    +		titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null;
    +
    +		if (titleDiv) {
    +			YAHOO.util.Event.purgeElement(titleDiv);
    +			this.oDomContainer.removeChild(titleDiv);
    +		}
    +		if (! close) {
    +			YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle");
    +		}
    +	}
    +};
    +
    +/**
    +* Default handler for the "close" property
    +* @method configClose
    +*/
    +YAHOO.widget.Calendar.prototype.configClose = function(type, args, obj) {
    +	var close = args[0];
    +	var title = this.cfg.getProperty("title");
    +
    +	var linkClose;
    +
    +	if (close === true) {
    +		linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a");
    +		linkClose.href = "javascript:void(null);";
    +		linkClose.className = "link-close";
    +		YAHOO.util.Event.addListener(linkClose, "click", this.hide, this, true);
    +		var imgClose = document.createElement("img");
    +		imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + "us/my/bn/x_d.gif";
    +		imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE;
    +		linkClose.appendChild(imgClose);
    +		this.oDomContainer.appendChild(linkClose);
    +		YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle");
    +	} else {
    +		linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null;
    +
    +		if (linkClose) {
    +			YAHOO.util.Event.purgeElement(linkClose);
    +			this.oDomContainer.removeChild(linkClose);
    +		}
    +		if (! title || title === "") {
    +			YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle");
    +		}
    +	}
    +};
    +
    +/**
    +* Initializes Calendar's built-in CustomEvents
    +* @method initEvents
    +*/
    +YAHOO.widget.Calendar.prototype.initEvents = function() {
    +
    +	/**
    +	* Fired before a selection is made
    +	* @event beforeSelectEvent
    +	*/
    +	this.beforeSelectEvent = new YAHOO.util.CustomEvent("beforeSelect");
    +
    +	/**
    +	* Fired when a selection is made
    +	* @event selectEvent
    +	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
    +	*/
    +	this.selectEvent = new YAHOO.util.CustomEvent("select");
    +
    +	/**
    +	* Fired before a selection is made
    +	* @event beforeDeselectEvent
    +	*/
    +	this.beforeDeselectEvent = new YAHOO.util.CustomEvent("beforeDeselect");
    +
    +	/**
    +	* Fired when a selection is made
    +	* @event deselectEvent
    +	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
    +	*/
    +	this.deselectEvent = new YAHOO.util.CustomEvent("deselect");
    +
    +	/**
    +	* Fired when the Calendar page is changed
    +	* @event changePageEvent
    +	*/
    +	this.changePageEvent = new YAHOO.util.CustomEvent("changePage");
    +
    +	/**
    +	* Fired before the Calendar is rendered
    +	* @event beforeRenderEvent
    +	*/
    +	this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender");
    +
    +	/**
    +	* Fired when the Calendar is rendered
    +	* @event renderEvent
    +	*/
    +	this.renderEvent = new YAHOO.util.CustomEvent("render");
    +
    +	/**
    +	* Fired when the Calendar is reset
    +	* @event resetEvent
    +	*/
    +	this.resetEvent = new YAHOO.util.CustomEvent("reset");
    +
    +	/**
    +	* Fired when the Calendar is cleared
    +	* @event clearEvent
    +	*/
    +	this.clearEvent = new YAHOO.util.CustomEvent("clear");
    +
    +	this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true);
    +	this.selectEvent.subscribe(this.onSelect, this, true);
    +	this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true);
    +	this.deselectEvent.subscribe(this.onDeselect, this, true);
    +	this.changePageEvent.subscribe(this.onChangePage, this, true);
    +	this.renderEvent.subscribe(this.onRender, this, true);
    +	this.resetEvent.subscribe(this.onReset, this, true);
    +	this.clearEvent.subscribe(this.onClear, this, true);
    +};
    +
    +
    +/**
    +* The default event function that is attached to a date link within a calendar cell
    +* when the calendar is rendered.
    +* @method doSelectCell
    +* @param {DOMEvent} e	The event
    +* @param {Calendar} cal	A reference to the calendar passed by the Event utility
    +*/
    +YAHOO.widget.Calendar.prototype.doSelectCell = function(e, cal) {
    +	var target = YAHOO.util.Event.getTarget(e);
    +
    +	var cell,index,d,date;
    +
    +	while (target.tagName.toLowerCase() != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
    +		target = target.parentNode;
    +		if (target.tagName.toLowerCase() == "html") {
    +			return;
    +		}
    +	}
    +
    +	cell = target;
    +
    +	if (YAHOO.util.Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) {
    +		index = cell.id.split("cell")[1];
    +		d = cal.cellDates[index];
    +		date = new Date(d[0],d[1]-1,d[2]);
    +
    +		var link;
    +
    +		if (cal.Options.MULTI_SELECT) {
    +			link = cell.getElementsByTagName("a")[0];
    +			if (link) {
    +				link.blur();
    +			}
    +
    +			var cellDate = cal.cellDates[index];
    +			var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate);
    +
    +			if (cellDateIndex > -1) {
    +				cal.deselectCell(index);
    +			} else {
    +				cal.selectCell(index);
    +			}
    +
    +		} else {
    +			link = cell.getElementsByTagName("a")[0];
    +			if (link) {
    +				link.blur();
    +			}
    +			cal.selectCell(index);
    +		}
    +	}
    +};
    +
    +/**
    +* The event that is executed when the user hovers over a cell
    +* @method doCellMouseOver
    +* @param {DOMEvent} e	The event
    +* @param {Calendar} cal	A reference to the calendar passed by the Event utility
    +*/
    +YAHOO.widget.Calendar.prototype.doCellMouseOver = function(e, cal) {
    +	var target;
    +	if (e) {
    +		target = YAHOO.util.Event.getTarget(e);
    +	} else {
    +		target = this;
    +	}
    +
    +	while (target.tagName.toLowerCase() != "td") {
    +		target = target.parentNode;
    +		if (target.tagName.toLowerCase() == "html") {
    +			return;
    +		}
    +	}
    +
    +	if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
    +		YAHOO.util.Dom.addClass(target, cal.Style.CSS_CELL_HOVER);
    +	}
    +};
    +
    +/**
    +* The event that is executed when the user moves the mouse out of a cell
    +* @method doCellMouseOut
    +* @param {DOMEvent} e	The event
    +* @param {Calendar} cal	A reference to the calendar passed by the Event utility
    +*/
    +YAHOO.widget.Calendar.prototype.doCellMouseOut = function(e, cal) {
    +	var target;
    +	if (e) {
    +		target = YAHOO.util.Event.getTarget(e);
    +	} else {
    +		target = this;
    +	}
    +
    +	while (target.tagName.toLowerCase() != "td") {
    +		target = target.parentNode;
    +		if (target.tagName.toLowerCase() == "html") {
    +			return;
    +		}
    +	}
    +
    +	if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) {
    +		YAHOO.util.Dom.removeClass(target, cal.Style.CSS_CELL_HOVER);
    +	}
    +};
    +
    +YAHOO.widget.Calendar.prototype.setupConfig = function() {
    +
    +	/**
    +	* The month/year representing the current visible Calendar date (mm/yyyy)
    +	* @config pagedate
    +	* @type String
    +	* @default today's date
    +	*/
    +	this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } );
    +
    +	/**
    +	* The date or range of dates representing the current Calendar selection
    +	* @config selected
    +	* @type String
    +	* @default []
    +	*/
    +	this.cfg.addProperty("selected", { value:[], handler:this.configSelected } );
    +
    +	/**
    +	* The title to display above the Calendar's month header
    +	* @config title
    +	* @type String
    +	* @default ""
    +	*/
    +	this.cfg.addProperty("title", { value:"", handler:this.configTitle } );
    +
    +	/**
    +	* Whether or not a close button should be displayed for this Calendar
    +	* @config close
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("close", { value:false, handler:this.configClose } );
    +
    +	/**
    +	* Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below.
    +	* @config iframe
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("iframe", { value:true, handler:this.configIframe, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The minimum selectable date in the current Calendar (mm/dd/yyyy)
    +	* @config mindate
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("mindate", { value:null, handler:this.configMinDate } );
    +
    +	/**
    +	* The maximum selectable date in the current Calendar (mm/dd/yyyy)
    +	* @config maxdate
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("maxdate", { value:null, handler:this.configMaxDate } );
    +
    +
    +	// Options properties
    +
    +	/**
    +	* True if the Calendar should allow multiple selections. False by default.
    +	* @config MULTI_SELECT
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("MULTI_SELECT",	{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The weekday the week begins on. Default is 0 (Sunday).
    +	* @config START_WEEKDAY
    +	* @type number
    +	* @default 0
    +	*/
    +	this.cfg.addProperty("START_WEEKDAY",	{ value:0, handler:this.configOptions, validator:this.cfg.checkNumber  } );
    +
    +	/**
    +	* True if the Calendar should show weekday labels. True by default.
    +	* @config SHOW_WEEKDAYS
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("SHOW_WEEKDAYS",	{ value:true, handler:this.configOptions, validator:this.cfg.checkBoolean  } );
    +
    +	/**
    +	* True if the Calendar should show week row headers. False by default.
    +	* @config SHOW_WEEK_HEADER
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* True if the Calendar should show week row footers. False by default.
    +	* @config SHOW_WEEK_FOOTER
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* True if the Calendar should suppress weeks that are not a part of the current month. False by default.
    +	* @config HIDE_BLANK_WEEKS
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The image that should be used for the left navigation arrow.
    +	* @config NAV_ARROW_LEFT
    +	* @type String
    +	* @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif"
    +	*/
    +	this.cfg.addProperty("NAV_ARROW_LEFT",	{ value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.configOptions } );
    +
    +	/**
    +	* The image that should be used for the left navigation arrow.
    +	* @config NAV_ARROW_RIGHT
    +	* @type String
    +	* @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif"
    +	*/
    +	this.cfg.addProperty("NAV_ARROW_RIGHT",	{ value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.configOptions } );
    +
    +	// Locale properties
    +
    +	/**
    +	* The short month labels for the current locale.
    +	* @config MONTHS_SHORT
    +	* @type String[]
    +	* @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    +	*/
    +	this.cfg.addProperty("MONTHS_SHORT",	{ value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.configLocale } );
    +
    +	/**
    +	* The long month labels for the current locale.
    +	* @config MONTHS_LONG
    +	* @type String[]
    +	* @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    +	*/
    +	this.cfg.addProperty("MONTHS_LONG",		{ value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.configLocale } );
    +
    +	/**
    +	* The 1-character weekday labels for the current locale.
    +	* @config WEEKDAYS_1CHAR
    +	* @type String[]
    +	* @default ["S", "M", "T", "W", "T", "F", "S"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_1CHAR",	{ value:["S", "M", "T", "W", "T", "F", "S"], handler:this.configLocale } );
    +
    +	/**
    +	* The short weekday labels for the current locale.
    +	* @config WEEKDAYS_SHORT
    +	* @type String[]
    +	* @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_SHORT",	{ value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.configLocale } );
    +
    +	/**
    +	* The medium weekday labels for the current locale.
    +	* @config WEEKDAYS_MEDIUM
    +	* @type String[]
    +	* @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_MEDIUM",	{ value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.configLocale } );
    +
    +	/**
    +	* The long weekday labels for the current locale.
    +	* @config WEEKDAYS_LONG
    +	* @type String[]
    +	* @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_LONG",	{ value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.configLocale } );
    +
    +	/**
    +	* Refreshes the locale values used to build the Calendar.
    +	* @method refreshLocale
    +	* @private
    +	*/
    +	var refreshLocale = function() {
    +		this.cfg.refireEvent("LOCALE_MONTHS");
    +		this.cfg.refireEvent("LOCALE_WEEKDAYS");
    +	};
    +
    +	this.cfg.subscribeToConfigEvent("START_WEEKDAY", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("MONTHS_SHORT", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("MONTHS_LONG", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("WEEKDAYS_1CHAR", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("WEEKDAYS_SHORT", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("WEEKDAYS_MEDIUM", refreshLocale, this, true);
    +	this.cfg.subscribeToConfigEvent("WEEKDAYS_LONG", refreshLocale, this, true);
    +
    +	/**
    +	* The setting that determines which length of month labels should be used. Possible values are "short" and "long".
    +	* @config LOCALE_MONTHS
    +	* @type String
    +	* @default "long"
    +	*/
    +	this.cfg.addProperty("LOCALE_MONTHS",	{ value:"long", handler:this.configLocaleValues } );
    +
    +	/**
    +	* The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long".
    +	* @config LOCALE_WEEKDAYS
    +	* @type String
    +	* @default "short"
    +	*/
    +	this.cfg.addProperty("LOCALE_WEEKDAYS",	{ value:"short", handler:this.configLocaleValues } );
    +
    +	/**
    +	* The value used to delimit individual dates in a date string passed to various Calendar functions.
    +	* @config DATE_DELIMITER
    +	* @type String
    +	* @default ","
    +	*/
    +	this.cfg.addProperty("DATE_DELIMITER",		{ value:",", handler:this.configLocale } );
    +
    +	/**
    +	* The value used to delimit date fields in a date string passed to various Calendar functions.
    +	* @config DATE_FIELD_DELIMITER
    +	* @type String
    +	* @default "/"
    +	*/
    +	this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.configLocale } );
    +
    +	/**
    +	* The value used to delimit date ranges in a date string passed to various Calendar functions.
    +	* @config DATE_RANGE_DELIMITER
    +	* @type String
    +	* @default "-"
    +	*/
    +	this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.configLocale } );
    +
    +	/**
    +	* The position of the month in a month/year date string
    +	* @config MY_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MY_MONTH_POSITION",	{ value:1, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the year in a month/year date string
    +	* @config MY_YEAR_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MY_YEAR_POSITION",	{ value:2, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the month in a month/day date string
    +	* @config MD_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MD_MONTH_POSITION",	{ value:1, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the day in a month/year date string
    +	* @config MD_DAY_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MD_DAY_POSITION",		{ value:2, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the month in a month/day/year date string
    +	* @config MDY_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MDY_MONTH_POSITION",	{ value:1, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the day in a month/day/year date string
    +	* @config MDY_DAY_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MDY_DAY_POSITION",	{ value:2, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the year in a month/day/year date string
    +	* @config MDY_YEAR_POSITION
    +	* @type Number
    +	* @default 3
    +	*/
    +	this.cfg.addProperty("MDY_YEAR_POSITION",	{ value:3, handler:this.configLocale, validator:this.cfg.checkNumber } );
    +};
    +
    +/**
    +* The default handler for the "pagedate" property
    +* @method configPageDate
    +*/
    +YAHOO.widget.Calendar.prototype.configPageDate = function(type, args, obj) {
    +	var val = args[0];
    +	var month, year, aMonthYear;
    +
    +	if (val) {
    +		if (val instanceof Date) {
    +			val = YAHOO.widget.DateMath.findMonthStart(val);
    +			this.cfg.setProperty("pagedate", val, true);
    +			if (! this._pageDate) {
    +				this._pageDate = this.cfg.getProperty("pagedate");
    +			}
    +			return;
    +		} else {
    +			aMonthYear = val.split(this.cfg.getProperty("DATE_FIELD_DELIMITER"));
    +			month = parseInt(aMonthYear[this.cfg.getProperty("MY_MONTH_POSITION")-1], 10)-1;
    +			year = parseInt(aMonthYear[this.cfg.getProperty("MY_YEAR_POSITION")-1], 10);
    +		}
    +	} else {
    +		month = this.today.getMonth();
    +		year = this.today.getFullYear();
    +	}
    +
    +	this.cfg.setProperty("pagedate", new Date(year, month, 1), true);
    +	if (! this._pageDate) {
    +		this._pageDate = this.cfg.getProperty("pagedate");
    +	}
    +};
    +
    +/**
    +* The default handler for the "mindate" property
    +* @method configMinDate
    +*/
    +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) {
    +	var val = args[0];
    +	if (typeof val == 'string') {
    +		val = this._parseDate(val);
    +		this.cfg.setProperty("mindate", new Date(val[0],(val[1]-1),val[2]));
    +	}
    +};
    +
    +/**
    +* The default handler for the "maxdate" property
    +* @method configMaxDate
    +*/
    +YAHOO.widget.Calendar.prototype.configMaxDate = function(type, args, obj) {
    +	var val = args[0];
    +	if (typeof val == 'string') {
    +		val = this._parseDate(val);
    +		this.cfg.setProperty("maxdate", new Date(val[0],(val[1]-1),val[2]));
    +	}
    +};
    +
    +/**
    +* The default handler for the "selected" property
    +* @method configSelected
    +*/
    +YAHOO.widget.Calendar.prototype.configSelected = function(type, args, obj) {
    +	var selected = args[0];
    +
    +	if (selected) {
    +		if (typeof selected == 'string') {
    +			this.cfg.setProperty("selected", this._parseDates(selected), true);
    +		}
    +	}
    +	if (! this._selectedDates) {
    +		this._selectedDates = this.cfg.getProperty("selected");
    +	}
    +};
    +
    +/**
    +* The default handler for all configuration options properties
    +* @method configOptions
    +*/
    +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) {
    +	type = type.toUpperCase();
    +	var val = args[0];
    +	this.Options[type] = val;
    +};
    +
    +/**
    +* The default handler for all configuration locale properties
    +* @method configLocale
    +*/
    +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) {
    +	type = type.toUpperCase();
    +	var val = args[0];
    +	this.Locale[type] = val;
    +
    +	this.cfg.refireEvent("LOCALE_MONTHS");
    +	this.cfg.refireEvent("LOCALE_WEEKDAYS");
    +
    +};
    +
    +/**
    +* The default handler for all configuration locale field length properties
    +* @method configLocaleValues
    +*/
    +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) {
    +	type = type.toUpperCase();
    +	var val = args[0];
    +
    +	switch (type) {
    +		case "LOCALE_MONTHS":
    +			switch (val) {
    +				case "short":
    +					this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_SHORT").concat();
    +					break;
    +				case "long":
    +					this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_LONG").concat();
    +					break;
    +			}
    +			break;
    +		case "LOCALE_WEEKDAYS":
    +			switch (val) {
    +				case "1char":
    +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_1CHAR").concat();
    +					break;
    +				case "short":
    +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_SHORT").concat();
    +					break;
    +				case "medium":
    +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_MEDIUM").concat();
    +					break;
    +				case "long":
    +					this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_LONG").concat();
    +					break;
    +			}
    +
    +			var START_WEEKDAY = this.cfg.getProperty("START_WEEKDAY");
    +
    +			if (START_WEEKDAY > 0) {
    +				for (var w=0;w<START_WEEKDAY;++w) {
    +					this.Locale.LOCALE_WEEKDAYS.push(this.Locale.LOCALE_WEEKDAYS.shift());
    +				}
    +			}
    +			break;
    +	}
    +};
    +
    +/**
    +* Defines the style constants for the Calendar
    +* @method initStyles
    +*/
    +YAHOO.widget.Calendar.prototype.initStyles = function() {
    +
    +	/**
    +	* Collection of Style constants for the Calendar
    +	* @property Style
    +	*/
    +	this.Style = {
    +		/**
    +		* @property Style.CSS_ROW_HEADER
    +		*/
    +		CSS_ROW_HEADER: "calrowhead",
    +		/**
    +		* @property Style.CSS_ROW_FOOTER
    +		*/
    +		CSS_ROW_FOOTER: "calrowfoot",
    +		/**
    +		* @property Style.CSS_CELL
    +		*/
    +		CSS_CELL : "calcell",
    +		/**
    +		* @property Style.CSS_CELL_SELECTED
    +		*/
    +		CSS_CELL_SELECTED : "selected",
    +		/**
    +		* @property Style.CSS_CELL_SELECTABLE
    +		*/
    +		CSS_CELL_SELECTABLE : "selectable",
    +		/**
    +		* @property Style.CSS_CELL_RESTRICTED
    +		*/
    +		CSS_CELL_RESTRICTED : "restricted",
    +		/**
    +		* @property Style.CSS_CELL_TODAY
    +		*/
    +		CSS_CELL_TODAY : "today",
    +		/**
    +		* @property Style.CSS_CELL_OOM
    +		*/
    +		CSS_CELL_OOM : "oom",
    +		/**
    +		* @property Style.CSS_CELL_OOB
    +		*/
    +		CSS_CELL_OOB : "previous",
    +		/**
    +		* @property Style.CSS_HEADER
    +		*/
    +		CSS_HEADER : "calheader",
    +		/**
    +		* @property Style.CSS_HEADER_TEXT
    +		*/
    +		CSS_HEADER_TEXT : "calhead",
    +		/**
    +		* @property Style.CSS_WEEKDAY_CELL
    +		*/
    +		CSS_WEEKDAY_CELL : "calweekdaycell",
    +		/**
    +		* @property Style.CSS_WEEKDAY_ROW
    +		*/
    +		CSS_WEEKDAY_ROW : "calweekdayrow",
    +		/**
    +		* @property Style.CSS_FOOTER
    +		*/
    +		CSS_FOOTER : "calfoot",
    +		/**
    +		* @property Style.CSS_CALENDAR
    +		*/
    +		CSS_CALENDAR : "yui-calendar",
    +		/**
    +		* @property Style.CSS_SINGLE
    +		*/
    +		CSS_SINGLE : "single",
    +		/**
    +		* @property Style.CSS_CONTAINER
    +		*/
    +		CSS_CONTAINER : "yui-calcontainer",
    +		/**
    +		* @property Style.CSS_NAV_LEFT
    +		*/
    +		CSS_NAV_LEFT : "calnavleft",
    +		/**
    +		* @property Style.CSS_NAV_RIGHT
    +		*/
    +		CSS_NAV_RIGHT : "calnavright",
    +		/**
    +		* @property Style.CSS_CELL_TOP
    +		*/
    +		CSS_CELL_TOP : "calcelltop",
    +		/**
    +		* @property Style.CSS_CELL_LEFT
    +		*/
    +		CSS_CELL_LEFT : "calcellleft",
    +		/**
    +		* @property Style.CSS_CELL_RIGHT
    +		*/
    +		CSS_CELL_RIGHT : "calcellright",
    +		/**
    +		* @property Style.CSS_CELL_BOTTOM
    +		*/
    +		CSS_CELL_BOTTOM : "calcellbottom",
    +		/**
    +		* @property Style.CSS_CELL_HOVER
    +		*/
    +		CSS_CELL_HOVER : "calcellhover",
    +		/**
    +		* @property Style.CSS_CELL_HIGHLIGHT1
    +		*/
    +		CSS_CELL_HIGHLIGHT1 : "highlight1",
    +		/**
    +		* @property Style.CSS_CELL_HIGHLIGHT2
    +		*/
    +		CSS_CELL_HIGHLIGHT2 : "highlight2",
    +		/**
    +		* @property Style.CSS_CELL_HIGHLIGHT3
    +		*/
    +		CSS_CELL_HIGHLIGHT3 : "highlight3",
    +		/**
    +		* @property Style.CSS_CELL_HIGHLIGHT4
    +		*/
    +		CSS_CELL_HIGHLIGHT4 : "highlight4"
    +	};
    +};
    +
    +/**
    +* Builds the date label that will be displayed in the calendar header or
    +* footer, depending on configuration.
    +* @method buildMonthLabel
    +* @return	{String}	The formatted calendar month label
    +*/
    +YAHOO.widget.Calendar.prototype.buildMonthLabel = function() {
    +	var text = this.Locale.LOCALE_MONTHS[this.cfg.getProperty("pagedate").getMonth()] + " " + this.cfg.getProperty("pagedate").getFullYear();
    +	return text;
    +};
    +
    +/**
    +* Builds the date digit that will be displayed in calendar cells
    +* @method buildDayLabel
    +* @param {Date}	workingDate	The current working date
    +* @return	{String}	The formatted day label
    +*/
    +YAHOO.widget.Calendar.prototype.buildDayLabel = function(workingDate) {
    +	var day = workingDate.getDate();
    +	return day;
    +};
    +
    +/**
    +* Renders the calendar header.
    +* @method renderHeader
    +* @param {Array}	html	The current working HTML array
    +* @return {Array} The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.renderHeader = function(html) {
    +	var colSpan = 7;
    +
    +	if (this.cfg.getProperty("SHOW_WEEK_HEADER")) {
    +		colSpan += 1;
    +	}
    +
    +	if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) {
    +		colSpan += 1;
    +	}
    +
    +	html[html.length] = "<thead>";
    +	html[html.length] =		"<tr>";
    +	html[html.length] =			'<th colspan="' + colSpan + '" class="' + this.Style.CSS_HEADER_TEXT + '">';
    +	html[html.length] =				'<div class="' + this.Style.CSS_HEADER + '">';
    +
    +		var renderLeft, renderRight = false;
    +
    +		if (this.parent) {
    +			if (this.index === 0) {
    +				renderLeft = true;
    +			}
    +			if (this.index == (this.parent.cfg.getProperty("pages") -1)) {
    +				renderRight = true;
    +			}
    +		} else {
    +			renderLeft = true;
    +			renderRight = true;
    +		}
    +
    +		var cal = this.parent || this;
    +
    +		if (renderLeft) {
    +			html[html.length] = '<a class="' + this.Style.CSS_NAV_LEFT + '" style="background-image:url(' + this.cfg.getProperty("NAV_ARROW_LEFT") + ')">&#160;</a>';
    +		}
    +
    +		html[html.length] = this.buildMonthLabel();
    +
    +		if (renderRight) {
    +			html[html.length] = '<a class="' + this.Style.CSS_NAV_RIGHT + '" style="background-image:url(' + this.cfg.getProperty("NAV_ARROW_RIGHT") + ')">&#160;</a>';
    +		}
    +
    +
    +	html[html.length] =				'</div>';
    +	html[html.length] =			'</th>';
    +	html[html.length] =		'</tr>';
    +
    +	if (this.cfg.getProperty("SHOW_WEEKDAYS")) {
    +		html = this.buildWeekdays(html);
    +	}
    +
    +	html[html.length] = '</thead>';
    +
    +	return html;
    +};
    +
    +/**
    +* Renders the Calendar's weekday headers.
    +* @method buildWeekdays
    +* @param {Array}	html	The current working HTML array
    +* @return {Array} The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.buildWeekdays = function(html) {
    +
    +	html[html.length] = '<tr class="' + this.Style.CSS_WEEKDAY_ROW + '">';
    +
    +	if (this.cfg.getProperty("SHOW_WEEK_HEADER")) {
    +		html[html.length] = '<th>&#160;</th>';
    +	}
    +
    +	for(var i=0;i<this.Locale.LOCALE_WEEKDAYS.length;++i) {
    +		html[html.length] = '<th class="calweekdaycell">' + this.Locale.LOCALE_WEEKDAYS[i] + '</th>';
    +	}
    +
    +	if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) {
    +		html[html.length] = '<th>&#160;</th>';
    +	}
    +
    +	html[html.length] = '</tr>';
    +
    +	return html;
    +};
    +
    +/**
    +* Renders the calendar body.
    +* @method renderBody
    +* @param {Date}	workingDate	The current working Date being used for the render process
    +* @param {Array}	html	The current working HTML array
    +* @return {Array} The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.renderBody = function(workingDate, html) {
    +
    +	var startDay = this.cfg.getProperty("START_WEEKDAY");
    +
    +	this.preMonthDays = workingDate.getDay();
    +	if (startDay > 0) {
    +		this.preMonthDays -= startDay;
    +	}
    +	if (this.preMonthDays < 0) {
    +		this.preMonthDays += 7;
    +	}
    +
    +	this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate();
    +	this.postMonthDays = YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays;
    +
    +	workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays);
    +
    +	var useDate,weekNum,weekClass;
    +	useDate = this.cfg.getProperty("pagedate");
    +
    +	html[html.length] = '<tbody class="m' + (useDate.getMonth()+1) + '">';
    +
    +	var i = 0;
    +
    +	var tempDiv = document.createElement("div");
    +	var cell = document.createElement("td");
    +	tempDiv.appendChild(cell);
    +
    +	var jan1 = new Date(useDate.getFullYear(),0,1);
    +
    +	var cal = this.parent || this;
    +
    +	for (var r=0;r<6;r++) {
    +
    +		weekNum = YAHOO.widget.DateMath.getWeekNumber(workingDate, useDate.getFullYear(), startDay);
    +
    +		weekClass = "w" + weekNum;
    +
    +		if (r !== 0 && this.isDateOOM(workingDate) && this.cfg.getProperty("HIDE_BLANK_WEEKS") === true) {
    +			break;
    +		} else {
    +
    +			html[html.length] = '<tr class="' + weekClass + '">';
    +
    +			if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { html = this.renderRowHeader(weekNum, html); }
    +
    +			for (var d=0;d<7;d++){ // Render actual days
    +
    +				var cellRenderers = [];
    +
    +				this.clearElement(cell);
    +
    +				YAHOO.util.Dom.addClass(cell, "calcell");
    +
    +				cell.id = this.id + "_cell" + i;
    +
    +				cell.innerHTML = i;
    +
    +				var renderer = null;
    +
    +				if (workingDate.getFullYear()	== this.today.getFullYear() &&
    +					workingDate.getMonth()		== this.today.getMonth() &&
    +					workingDate.getDate()		== this.today.getDate()) {
    +					cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;
    +				}
    +
    +				this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates
    +
    +				if (this.isDateOOM(workingDate)) {
    +					cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;
    +				} else {
    +
    +					YAHOO.util.Dom.addClass(cell, "wd" + workingDate.getDay());
    +					YAHOO.util.Dom.addClass(cell, "d" + workingDate.getDate());
    +
    +					for (var s=0;s<this.renderStack.length;++s) {
    +
    +						var rArray = this.renderStack[s];
    +						var type = rArray[0];
    +
    +						var month;
    +						var day;
    +						var year;
    +
    +						switch (type) {
    +							case YAHOO.widget.Calendar.DATE:
    +								month = rArray[1][1];
    +								day = rArray[1][2];
    +								year = rArray[1][0];
    +
    +								if (workingDate.getMonth()+1 == month && workingDate.getDate() == day && workingDate.getFullYear() == year) {
    +									renderer = rArray[2];
    +									this.renderStack.splice(s,1);
    +								}
    +								break;
    +							case YAHOO.widget.Calendar.MONTH_DAY:
    +								month = rArray[1][0];
    +								day = rArray[1][1];
    +
    +								if (workingDate.getMonth()+1 == month && workingDate.getDate() == day) {
    +									renderer = rArray[2];
    +									this.renderStack.splice(s,1);
    +								}
    +								break;
    +							case YAHOO.widget.Calendar.RANGE:
    +								var date1 = rArray[1][0];
    +								var date2 = rArray[1][1];
    +
    +								var d1month = date1[1];
    +								var d1day = date1[2];
    +								var d1year = date1[0];
    +
    +								var d1 = new Date(d1year, d1month-1, d1day);
    +
    +								var d2month = date2[1];
    +								var d2day = date2[2];
    +								var d2year = date2[0];
    +
    +								var d2 = new Date(d2year, d2month-1, d2day);
    +
    +								if (workingDate.getTime() >= d1.getTime() && workingDate.getTime() <= d2.getTime()) {
    +									renderer = rArray[2];
    +
    +									if (workingDate.getTime()==d2.getTime()) {
    +										this.renderStack.splice(s,1);
    +									}
    +								}
    +								break;
    +							case YAHOO.widget.Calendar.WEEKDAY:
    +
    +								var weekday = rArray[1][0];
    +								if (workingDate.getDay()+1 == weekday) {
    +									renderer = rArray[2];
    +								}
    +								break;
    +							case YAHOO.widget.Calendar.MONTH:
    +
    +								month = rArray[1][0];
    +								if (workingDate.getMonth()+1 == month) {
    +									renderer = rArray[2];
    +								}
    +								break;
    +						}
    +
    +						if (renderer) {
    +							cellRenderers[cellRenderers.length]=renderer;
    +						}
    +					}
    +
    +				}
    +
    +				if (this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]) > -1) {
    +					cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected;
    +				}
    +
    +				var mindate = this.cfg.getProperty("mindate");
    +				var maxdate = this.cfg.getProperty("maxdate");
    +
    +				if (mindate) {
    +					mindate = YAHOO.widget.DateMath.clearTime(mindate);
    +				}
    +				if (maxdate) {
    +					maxdate = YAHOO.widget.DateMath.clearTime(maxdate);
    +				}
    +
    +				if (
    +					(mindate && (workingDate.getTime() < mindate.getTime())) ||
    +					(maxdate && (workingDate.getTime() > maxdate.getTime()))
    +				) {
    +					cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate;
    +				} else {
    +					cellRenderers[cellRenderers.length]=cal.styleCellDefault;
    +					cellRenderers[cellRenderers.length]=cal.renderCellDefault;
    +				}
    +
    +
    +
    +				for (var x=0;x<cellRenderers.length;++x) {
    +					var ren = cellRenderers[x];
    +					if (ren.call((this.parent || this),workingDate,cell) == YAHOO.widget.Calendar.STOP_RENDER) {
    +						break;
    +					}
    +				}
    +
    +				workingDate.setTime(workingDate.getTime() + YAHOO.widget.DateMath.ONE_DAY_MS);
    +
    +				if (i >= 0 && i <= 6) {
    +					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TOP);
    +				}
    +				if ((i % 7) === 0) {
    +					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_LEFT);
    +				}
    +				if (((i+1) % 7) === 0) {
    +					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RIGHT);
    +				}
    +
    +				var postDays = this.postMonthDays;
    +				if (postDays >= 7 && this.cfg.getProperty("HIDE_BLANK_WEEKS")) {
    +					var blankWeeks = Math.floor(postDays/7);
    +					for (var p=0;p<blankWeeks;++p) {
    +						postDays -= 7;
    +					}
    +				}
    +
    +				if (i >= ((this.preMonthDays+postDays+this.monthDays)-7)) {
    +					YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM);
    +				}
    +
    +				html[html.length] = tempDiv.innerHTML;
    +
    +				i++;
    +			}
    +
    +			if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { html = this.renderRowFooter(weekNum, html); }
    +
    +			html[html.length] = '</tr>';
    +		}
    +	}
    +
    +	html[html.length] = '</tbody>';
    +
    +	return html;
    +};
    +
    +/**
    +* Renders the calendar footer. In the default implementation, there is
    +* no footer.
    +* @method renderFooter
    +* @param {Array}	html	The current working HTML array
    +* @return {Array} The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.renderFooter = function(html) { return html; };
    +
    +/**
    +* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute
    +* when the method is called: renderHeader, renderBody, renderFooter.
    +* Refer to the documentation for those methods for information on
    +* individual render tasks.
    +* @method render
    +*/
    +YAHOO.widget.Calendar.prototype.render = function() {
    +	this.beforeRenderEvent.fire();
    +
    +	// Find starting day of the current month
    +	var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty("pagedate"));
    +
    +	this.resetRenderers();
    +	this.cellDates.length = 0;
    +
    +	YAHOO.util.Event.purgeElement(this.oDomContainer, true);
    +
    +	var html = [];
    +
    +	html[html.length] = '<table cellSpacing="0" class="' + this.Style.CSS_CALENDAR + ' y' + workingDate.getFullYear() + '" id="' + this.id + '">';
    +	html = this.renderHeader(html);
    +	html = this.renderBody(workingDate, html);
    +	html = this.renderFooter(html);
    +	html[html.length] = '</table>';
    +
    +	this.oDomContainer.innerHTML = html.join("\n");
    +
    +	this.applyListeners();
    +	this.cells = this.oDomContainer.getElementsByTagName("td");
    +
    +	this.cfg.refireEvent("title");
    +	this.cfg.refireEvent("close");
    +	this.cfg.refireEvent("iframe");
    +
    +	this.renderEvent.fire();
    +};
    +
    +/**
    +* Applies the Calendar's DOM listeners to applicable elements.
    +* @method applyListeners
    +*/
    +YAHOO.widget.Calendar.prototype.applyListeners = function() {
    +
    +	var root = this.oDomContainer;
    +	var cal = this.parent || this;
    +
    +	var linkLeft, linkRight;
    +
    +	linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, "a", root);
    +	linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, "a", root);
    +
    +	if (linkLeft) {
    +		this.linkLeft = linkLeft[0];
    +		YAHOO.util.Event.addListener(this.linkLeft, "mousedown", cal.previousMonth, cal, true);
    +	}
    +
    +	if (linkRight) {
    +		this.linkRight = linkRight[0];
    +		YAHOO.util.Event.addListener(this.linkRight, "mousedown", cal.nextMonth, cal, true);
    +	}
    +
    +	if (this.domEventMap) {
    +		var el,elements;
    +		for (var cls in this.domEventMap) {
    +			if (this.domEventMap.hasOwnProperty(cls)) {
    +				var items = this.domEventMap[cls];
    +
    +				if (! (items instanceof Array)) {
    +					items = [items];
    +				}
    +
    +				for (var i=0;i<items.length;i++)	{
    +					var item = items[i];
    +					elements = YAHOO.util.Dom.getElementsByClassName(cls, item.tag, this.oDomContainer);
    +
    +					for (var c=0;c<elements.length;c++) {
    +						el = elements[c];
    +						 YAHOO.util.Event.addListener(el, item.event, item.handler, item.scope, item.correct );
    +					}
    +				}
    +			}
    +		}
    +	}
    +
    +	YAHOO.util.Event.addListener(this.oDomContainer, "click", this.doSelectCell, this);
    +	YAHOO.util.Event.addListener(this.oDomContainer, "mouseover", this.doCellMouseOver, this);
    +	YAHOO.util.Event.addListener(this.oDomContainer, "mouseout", this.doCellMouseOut, this);
    +};
    +
    +/**
    +* Retrieves the Date object for the specified Calendar cell
    +* @method getDateByCellId
    +* @param {String}	id	The id of the cell
    +* @return {Date} The Date object for the specified Calendar cell
    +*/
    +YAHOO.widget.Calendar.prototype.getDateByCellId = function(id) {
    +	var date = this.getDateFieldsByCellId(id);
    +	return new Date(date[0],date[1]-1,date[2]);
    +};
    +
    +/**
    +* Retrieves the Date object for the specified Calendar cell
    +* @method getDateFieldsByCellId
    +* @param {String}	id	The id of the cell
    +* @return {Array}	The array of Date fields for the specified Calendar cell
    +*/
    +YAHOO.widget.Calendar.prototype.getDateFieldsByCellId = function(id) {
    +	id = id.toLowerCase().split("_cell")[1];
    +	id = parseInt(id, 10);
    +	return this.cellDates[id];
    +};
    +
    +// BEGIN BUILT-IN TABLE CELL RENDERERS
    +
    +/**
    +* Renders a cell that falls before the minimum date or after the maximum date.
    +* widget class.
    +* @method renderOutOfBoundsDate
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
    +*			should not be terminated
    +*/
    +YAHOO.widget.Calendar.prototype.renderOutOfBoundsDate = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOB);
    +	cell.innerHTML = workingDate.getDate();
    +	return YAHOO.widget.Calendar.STOP_RENDER;
    +};
    +
    +/**
    +* Renders the row header for a week.
    +* @method renderRowHeader
    +* @param {Number}	weekNum	The week number of the current row
    +* @param {Array}	cell	The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.renderRowHeader = function(weekNum, html) {
    +	html[html.length] = '<th class="calrowhead">' + weekNum + '</th>';
    +	return html;
    +};
    +
    +/**
    +* Renders the row footer for a week.
    +* @method renderRowFooter
    +* @param {Number}	weekNum	The week number of the current row
    +* @param {Array}	cell	The current working HTML array
    +*/
    +YAHOO.widget.Calendar.prototype.renderRowFooter = function(weekNum, html) {
    +	html[html.length] = '<th class="calrowfoot">' + weekNum + '</th>';
    +	return html;
    +};
    +
    +/**
    +* Renders a single standard calendar cell in the calendar widget table.
    +* All logic for determining how a standard default cell will be rendered is
    +* encapsulated in this method, and must be accounted for when extending the
    +* widget class.
    +* @method renderCellDefault
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellDefault = function(workingDate, cell) {
    +	cell.innerHTML = '<a href="javascript:void(null);" >' + this.buildDayLabel(workingDate) + "</a>";
    +};
    +
    +/**
    +* Styles a selectable cell.
    +* @method styleCellDefault
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.styleCellDefault = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTABLE);
    +};
    +
    +
    +/**
    +* Renders a single standard calendar cell using the CSS hightlight1 style
    +* @method renderCellStyleHighlight1
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight1 = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT1);
    +};
    +
    +/**
    +* Renders a single standard calendar cell using the CSS hightlight2 style
    +* @method renderCellStyleHighlight2
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight2 = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT2);
    +};
    +
    +/**
    +* Renders a single standard calendar cell using the CSS hightlight3 style
    +* @method renderCellStyleHighlight3
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight3 = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT3);
    +};
    +
    +/**
    +* Renders a single standard calendar cell using the CSS hightlight4 style
    +* @method renderCellStyleHighlight4
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight4 = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT4);
    +};
    +
    +/**
    +* Applies the default style used for rendering today's date to the current calendar cell
    +* @method renderCellStyleToday
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleToday = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TODAY);
    +};
    +
    +/**
    +* Applies the default style used for rendering selected dates to the current calendar cell
    +* @method renderCellStyleSelected
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
    +*			should not be terminated
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellStyleSelected = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTED);
    +};
    +
    +/**
    +* Applies the default style used for rendering dates that are not a part of the current
    +* month (preceding or trailing the cells for the current month)
    +* @method renderCellNotThisMonth
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
    +*			should not be terminated
    +*/
    +YAHOO.widget.Calendar.prototype.renderCellNotThisMonth = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOM);
    +	cell.innerHTML=workingDate.getDate();
    +	return YAHOO.widget.Calendar.STOP_RENDER;
    +};
    +
    +/**
    +* Renders the current calendar cell as a non-selectable "black-out" date using the default
    +* restricted style.
    +* @method renderBodyCellRestricted
    +* @param {Date}					workingDate		The current working Date object being used to generate the calendar
    +* @param {HTMLTableCellElement}	cell			The current working cell in the calendar
    +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering
    +*			should not be terminated
    +*/
    +YAHOO.widget.Calendar.prototype.renderBodyCellRestricted = function(workingDate, cell) {
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL);
    +	YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RESTRICTED);
    +	cell.innerHTML=workingDate.getDate();
    +	return YAHOO.widget.Calendar.STOP_RENDER;
    +};
    +
    +// END BUILT-IN TABLE CELL RENDERERS
    +
    +// BEGIN MONTH NAVIGATION METHODS
    +
    +/**
    +* Adds the designated number of months to the current calendar month, and sets the current
    +* calendar page date to the new month.
    +* @method addMonths
    +* @param {Number}	count	The number of months to add to the current calendar
    +*/
    +YAHOO.widget.Calendar.prototype.addMonths = function(count) {
    +	this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count));
    +	this.resetRenderers();
    +	this.changePageEvent.fire();
    +};
    +
    +/**
    +* Subtracts the designated number of months from the current calendar month, and sets the current
    +* calendar page date to the new month.
    +* @method subtractMonths
    +* @param {Number}	count	The number of months to subtract from the current calendar
    +*/
    +YAHOO.widget.Calendar.prototype.subtractMonths = function(count) {
    +	this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count));
    +	this.resetRenderers();
    +	this.changePageEvent.fire();
    +};
    +
    +/**
    +* Adds the designated number of years to the current calendar, and sets the current
    +* calendar page date to the new month.
    +* @method addYears
    +* @param {Number}	count	The number of years to add to the current calendar
    +*/
    +YAHOO.widget.Calendar.prototype.addYears = function(count) {
    +	this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count));
    +	this.resetRenderers();
    +	this.changePageEvent.fire();
    +};
    +
    +/**
    +* Subtcats the designated number of years from the current calendar, and sets the current
    +* calendar page date to the new month.
    +* @method subtractYears
    +* @param {Number}	count	The number of years to subtract from the current calendar
    +*/
    +YAHOO.widget.Calendar.prototype.subtractYears = function(count) {
    +	this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count));
    +	this.resetRenderers();
    +	this.changePageEvent.fire();
    +};
    +
    +/**
    +* Navigates to the next month page in the calendar widget.
    +* @method nextMonth
    +*/
    +YAHOO.widget.Calendar.prototype.nextMonth = function() {
    +	this.addMonths(1);
    +};
    +
    +/**
    +* Navigates to the previous month page in the calendar widget.
    +* @method previousMonth
    +*/
    +YAHOO.widget.Calendar.prototype.previousMonth = function() {
    +	this.subtractMonths(1);
    +};
    +
    +/**
    +* Navigates to the next year in the currently selected month in the calendar widget.
    +* @method nextYear
    +*/
    +YAHOO.widget.Calendar.prototype.nextYear = function() {
    +	this.addYears(1);
    +};
    +
    +/**
    +* Navigates to the previous year in the currently selected month in the calendar widget.
    +* @method previousYear
    +*/
    +YAHOO.widget.Calendar.prototype.previousYear = function() {
    +	this.subtractYears(1);
    +};
    +
    +// END MONTH NAVIGATION METHODS
    +
    +// BEGIN SELECTION METHODS
    +
    +/**
    +* Resets the calendar widget to the originally selected month and year, and
    +* sets the calendar to the initial selection(s).
    +* @method reset
    +*/
    +YAHOO.widget.Calendar.prototype.reset = function() {
    +	this.cfg.resetProperty("selected");
    +	this.cfg.resetProperty("pagedate");
    +	this.resetEvent.fire();
    +};
    +
    +/**
    +* Clears the selected dates in the current calendar widget and sets the calendar
    +* to the current month and year.
    +* @method clear
    +*/
    +YAHOO.widget.Calendar.prototype.clear = function() {
    +	this.cfg.setProperty("selected", []);
    +	this.cfg.setProperty("pagedate", new Date(this.today.getTime()));
    +	this.clearEvent.fire();
    +};
    +
    +/**
    +* Selects a date or a collection of dates on the current calendar. This method, by default,
    +* does not call the render method explicitly. Once selection has completed, render must be
    +* called for the changes to be reflected visually.
    +* @method select
    +* @param	{String/Date/Date[]}	date	The date string of dates to select in the current calendar. Valid formats are
    +*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
    +*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
    +*								This method can also take a JavaScript Date object or an array of Date objects.
    +* @return	{Date[]}			Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.Calendar.prototype.select = function(date) {
    +	this.beforeSelectEvent.fire();
    +
    +	var selected = this.cfg.getProperty("selected");
    +	var aToBeSelected = this._toFieldArray(date);
    +
    +	for (var a=0;a<aToBeSelected.length;++a) {
    +		var toSelect = aToBeSelected[a]; // For each date item in the list of dates we're trying to select
    +		if (this._indexOfSelectedFieldArray(toSelect) == -1) { // not already selected?
    +			selected[selected.length]=toSelect;
    +		}
    +	}
    +
    +	if (this.parent) {
    +		this.parent.cfg.setProperty("selected", selected);
    +	} else {
    +		this.cfg.setProperty("selected", selected);
    +	}
    +
    +	this.selectEvent.fire(aToBeSelected);
    +
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Selects a date on the current calendar by referencing the index of the cell that should be selected.
    +* This method is used to easily select a single cell (usually with a mouse click) without having to do
    +* a full render. The selected style is applied to the cell directly.
    +* @method selectCell
    +* @param	{Number}	cellIndex	The index of the cell to select in the current calendar.
    +* @return	{Date[]}	Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.Calendar.prototype.selectCell = function(cellIndex) {
    +	this.beforeSelectEvent.fire();
    +
    +	var selected = this.cfg.getProperty("selected");
    +
    +	var cell = this.cells[cellIndex];
    +	var cellDate = this.cellDates[cellIndex];
    +
    +	var dCellDate = this._toDate(cellDate);
    +
    +	var selectDate = cellDate.concat();
    +
    +	selected[selected.length] = selectDate;
    +
    +	if (this.parent) {
    +		this.parent.cfg.setProperty("selected", selected);
    +	} else {
    +		this.cfg.setProperty("selected", selected);
    +	}
    +
    +	this.renderCellStyleSelected(dCellDate,cell);
    +
    +	this.selectEvent.fire([selectDate]);
    +
    +	this.doCellMouseOut.call(cell, null, this);
    +
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects a date or a collection of dates on the current calendar. This method, by default,
    +* does not call the render method explicitly. Once deselection has completed, render must be
    +* called for the changes to be reflected visually.
    +* @method deselect
    +* @param	{String/Date/Date[]}	date	The date string of dates to deselect in the current calendar. Valid formats are
    +*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
    +*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
    +*								This method can also take a JavaScript Date object or an array of Date objects.
    +* @return	{Date[]}			Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.Calendar.prototype.deselect = function(date) {
    +	this.beforeDeselectEvent.fire();
    +
    +	var selected = this.cfg.getProperty("selected");
    +
    +	var aToBeSelected = this._toFieldArray(date);
    +
    +	for (var a=0;a<aToBeSelected.length;++a) {
    +		var toSelect = aToBeSelected[a]; // For each date item in the list of dates we're trying to select
    +		var index = this._indexOfSelectedFieldArray(toSelect);
    +
    +		if (index != -1) {
    +			selected.splice(index,1);
    +		}
    +	}
    +
    +	if (this.parent) {
    +		this.parent.cfg.setProperty("selected", selected);
    +	} else {
    +		this.cfg.setProperty("selected", selected);
    +	}
    +
    +	this.deselectEvent.fire(aToBeSelected);
    +
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects a date on the current calendar by referencing the index of the cell that should be deselected.
    +* This method is used to easily deselect a single cell (usually with a mouse click) without having to do
    +* a full render. The selected style is removed from the cell directly.
    +* @method deselectCell
    +* @param	{Number}	cellIndex	The index of the cell to deselect in the current calendar.
    +* @return	{Date[]}	Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.Calendar.prototype.deselectCell = function(i) {
    +	this.beforeDeselectEvent.fire();
    +
    +	var selected = this.cfg.getProperty("selected");
    +
    +	var cell = this.cells[i];
    +	var cellDate = this.cellDates[i];
    +	var cellDateIndex = this._indexOfSelectedFieldArray(cellDate);
    +
    +	var dCellDate = this._toDate(cellDate);
    +
    +	var selectDate = cellDate.concat();
    +
    +	if (cellDateIndex > -1) {
    +		if (this.cfg.getProperty("pagedate").getMonth() == dCellDate.getMonth() &&
    +			this.cfg.getProperty("pagedate").getFullYear() == dCellDate.getFullYear()) {
    +			YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED);
    +		}
    +
    +		selected.splice(cellDateIndex, 1);
    +	}
    +
    +
    +	if (this.parent) {
    +		this.parent.cfg.setProperty("selected", selected);
    +	} else {
    +		this.cfg.setProperty("selected", selected);
    +	}
    +
    +	this.deselectEvent.fire(selectDate);
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects all dates on the current calendar.
    +* @method deselectAll
    +* @return {Date[]}		Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*						Assuming that this function executes properly, the return value should be an empty array.
    +*						However, the empty array is returned for the sake of being able to check the selection status
    +*						of the calendar.
    +*/
    +YAHOO.widget.Calendar.prototype.deselectAll = function() {
    +	this.beforeDeselectEvent.fire();
    +
    +	var selected = this.cfg.getProperty("selected");
    +	var count = selected.length;
    +	var sel = selected.concat();
    +
    +	if (this.parent) {
    +		this.parent.cfg.setProperty("selected", []);
    +	} else {
    +		this.cfg.setProperty("selected", []);
    +	}
    +
    +	if (count > 0) {
    +		this.deselectEvent.fire(sel);
    +	}
    +
    +	return this.getSelectedDates();
    +};
    +
    +// END SELECTION METHODS
    +
    +// BEGIN TYPE CONVERSION METHODS
    +
    +/**
    +* Converts a date (either a JavaScript Date object, or a date string) to the internal data structure
    +* used to represent dates: [[yyyy,mm,dd],[yyyy,mm,dd]].
    +* @method _toFieldArray
    +* @private
    +* @param	{String/Date/Date[]}	date	The date string of dates to deselect in the current calendar. Valid formats are
    +*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
    +*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
    +*								This method can also take a JavaScript Date object or an array of Date objects.
    +* @return {Array[](Number[])}	Array of date field arrays
    +*/
    +YAHOO.widget.Calendar.prototype._toFieldArray = function(date) {
    +	var returnDate = [];
    +
    +	if (date instanceof Date) {
    +		returnDate = [[date.getFullYear(), date.getMonth()+1, date.getDate()]];
    +	} else if (typeof date == 'string') {
    +		returnDate = this._parseDates(date);
    +	} else if (date instanceof Array) {
    +		for (var i=0;i<date.length;++i) {
    +			var d = date[i];
    +			returnDate[returnDate.length] = [d.getFullYear(),d.getMonth()+1,d.getDate()];
    +		}
    +	}
    +
    +	return returnDate;
    +};
    +
    +/**
    +* Converts a date field array [yyyy,mm,dd] to a JavaScript Date object.
    +* @method _toDate
    +* @private
    +* @param	{Number[]}		dateFieldArray	The date field array to convert to a JavaScript Date.
    +* @return	{Date}	JavaScript Date object representing the date field array
    +*/
    +YAHOO.widget.Calendar.prototype._toDate = function(dateFieldArray) {
    +	if (dateFieldArray instanceof Date) {
    +		return dateFieldArray;
    +	} else {
    +		return new Date(dateFieldArray[0],dateFieldArray[1]-1,dateFieldArray[2]);
    +	}
    +};
    +
    +// END TYPE CONVERSION METHODS
    +
    +// BEGIN UTILITY METHODS
    +
    +/**
    +* Converts a date field array [yyyy,mm,dd] to a JavaScript Date object.
    +* @method _fieldArraysAreEqual
    +* @private
    +* @param	{Number[]}	array1	The first date field array to compare
    +* @param	{Number[]}	array2	The first date field array to compare
    +* @return	{Boolean}	The boolean that represents the equality of the two arrays
    +*/
    +YAHOO.widget.Calendar.prototype._fieldArraysAreEqual = function(array1, array2) {
    +	var match = false;
    +
    +	if (array1[0]==array2[0]&&array1[1]==array2[1]&&array1[2]==array2[2]) {
    +		match=true;
    +	}
    +
    +	return match;
    +};
    +
    +/**
    +* Gets the index of a date field array [yyyy,mm,dd] in the current list of selected dates.
    +* @method	_indexOfSelectedFieldArray
    +* @private
    +* @param	{Number[]}		find	The date field array to search for
    +* @return	{Number}			The index of the date field array within the collection of selected dates.
    +*								-1 will be returned if the date is not found.
    +*/
    +YAHOO.widget.Calendar.prototype._indexOfSelectedFieldArray = function(find) {
    +	var selected = -1;
    +	var seldates = this.cfg.getProperty("selected");
    +
    +	for (var s=0;s<seldates.length;++s) {
    +		var sArray = seldates[s];
    +		if (find[0]==sArray[0]&&find[1]==sArray[1]&&find[2]==sArray[2]) {
    +			selected = s;
    +			break;
    +		}
    +	}
    +
    +	return selected;
    +};
    +
    +/**
    +* Determines whether a given date is OOM (out of month).
    +* @method	isDateOOM
    +* @param	{Date}	date	The JavaScript Date object for which to check the OOM status
    +* @return	{Boolean}	true if the date is OOM
    +*/
    +YAHOO.widget.Calendar.prototype.isDateOOM = function(date) {
    +	var isOOM = false;
    +	if (date.getMonth() != this.cfg.getProperty("pagedate").getMonth()) {
    +		isOOM = true;
    +	}
    +	return isOOM;
    +};
    +
    +// END UTILITY METHODS
    +
    +// BEGIN EVENT HANDLERS
    +
    +/**
    +* Event executed before a date is selected in the calendar widget.
    +* @deprecated Event handlers for this event should be susbcribed to beforeSelectEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onBeforeSelect = function() {
    +	if (this.cfg.getProperty("MULTI_SELECT") === false) {
    +		if (this.parent) {
    +			this.parent.callChildFunction("clearAllBodyCellStyles", this.Style.CSS_CELL_SELECTED);
    +			this.parent.deselectAll();
    +		} else {
    +			this.clearAllBodyCellStyles(this.Style.CSS_CELL_SELECTED);
    +			this.deselectAll();
    +		}
    +	}
    +};
    +
    +/**
    +* Event executed when a date is selected in the calendar widget.
    +* @param	{Array}	selected	An array of date field arrays representing which date or dates were selected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
    +* @deprecated Event handlers for this event should be susbcribed to selectEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onSelect = function(selected) { };
    +
    +/**
    +* Event executed before a date is deselected in the calendar widget.
    +* @deprecated Event handlers for this event should be susbcribed to beforeDeselectEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onBeforeDeselect = function() { };
    +
    +/**
    +* Event executed when a date is deselected in the calendar widget.
    +* @param	{Array}	selected	An array of date field arrays representing which date or dates were deselected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
    +* @deprecated Event handlers for this event should be susbcribed to deselectEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onDeselect = function(deselected) { };
    +
    +/**
    +* Event executed when the user navigates to a different calendar page.
    +* @deprecated Event handlers for this event should be susbcribed to changePageEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onChangePage = function() {
    +	this.render();
    +};
    +
    +/**
    +* Event executed when the calendar widget is rendered.
    +* @deprecated Event handlers for this event should be susbcribed to renderEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onRender = function() { };
    +
    +/**
    +* Event executed when the calendar widget is reset to its original state.
    +* @deprecated Event handlers for this event should be susbcribed to resetEvemt.
    +*/
    +YAHOO.widget.Calendar.prototype.onReset = function() { this.render(); };
    +
    +/**
    +* Event executed when the calendar widget is completely cleared to the current month with no selections.
    +* @deprecated Event handlers for this event should be susbcribed to clearEvent.
    +*/
    +YAHOO.widget.Calendar.prototype.onClear = function() { this.render(); };
    +
    +/**
    +* Validates the calendar widget. This method has no default implementation
    +* and must be extended by subclassing the widget.
    +* @return	Should return true if the widget validates, and false if
    +* it doesn't.
    +* @type Boolean
    +*/
    +YAHOO.widget.Calendar.prototype.validate = function() { return true; };
    +
    +// END EVENT HANDLERS
    +
    +// BEGIN DATE PARSE METHODS
    +
    +/**
    +* Converts a date string to a date field array
    +* @private
    +* @param	{String}	sDate			Date string. Valid formats are mm/dd and mm/dd/yyyy.
    +* @return				A date field array representing the string passed to the method
    +* @type Array[](Number[])
    +*/
    +YAHOO.widget.Calendar.prototype._parseDate = function(sDate) {
    +	var aDate = sDate.split(this.Locale.DATE_FIELD_DELIMITER);
    +	var rArray;
    +
    +	if (aDate.length == 2) {
    +		rArray = [aDate[this.Locale.MD_MONTH_POSITION-1],aDate[this.Locale.MD_DAY_POSITION-1]];
    +		rArray.type = YAHOO.widget.Calendar.MONTH_DAY;
    +	} else {
    +		rArray = [aDate[this.Locale.MDY_YEAR_POSITION-1],aDate[this.Locale.MDY_MONTH_POSITION-1],aDate[this.Locale.MDY_DAY_POSITION-1]];
    +		rArray.type = YAHOO.widget.Calendar.DATE;
    +	}
    +
    +	for (var i=0;i<rArray.length;i++) {
    +		rArray[i] = parseInt(rArray[i], 10);
    +	}
    +
    +	return rArray;
    +};
    +
    +/**
    +* Converts a multi or single-date string to an array of date field arrays
    +* @private
    +* @param	{String}	sDates		Date string with one or more comma-delimited dates. Valid formats are mm/dd, mm/dd/yyyy, mm/dd/yyyy-mm/dd/yyyy
    +* @return							An array of date field arrays
    +* @type Array[](Number[])
    +*/
    +YAHOO.widget.Calendar.prototype._parseDates = function(sDates) {
    +	var aReturn = [];
    +
    +	var aDates = sDates.split(this.Locale.DATE_DELIMITER);
    +
    +	for (var d=0;d<aDates.length;++d) {
    +		var sDate = aDates[d];
    +
    +		if (sDate.indexOf(this.Locale.DATE_RANGE_DELIMITER) != -1) {
    +			// This is a range
    +			var aRange = sDate.split(this.Locale.DATE_RANGE_DELIMITER);
    +
    +			var dateStart = this._parseDate(aRange[0]);
    +			var dateEnd = this._parseDate(aRange[1]);
    +
    +			var fullRange = this._parseRange(dateStart, dateEnd);
    +			aReturn = aReturn.concat(fullRange);
    +		} else {
    +			// This is not a range
    +			var aDate = this._parseDate(sDate);
    +			aReturn.push(aDate);
    +		}
    +	}
    +	return aReturn;
    +};
    +
    +/**
    +* Converts a date range to the full list of included dates
    +* @private
    +* @param	{Number[]}	startDate	Date field array representing the first date in the range
    +* @param	{Number[]}	endDate		Date field array representing the last date in the range
    +* @return							An array of date field arrays
    +* @type Array[](Number[])
    +*/
    +YAHOO.widget.Calendar.prototype._parseRange = function(startDate, endDate) {
    +	var dStart   = new Date(startDate[0],startDate[1]-1,startDate[2]);
    +	var dCurrent = YAHOO.widget.DateMath.add(new Date(startDate[0],startDate[1]-1,startDate[2]),YAHOO.widget.DateMath.DAY,1);
    +	var dEnd     = new Date(endDate[0],  endDate[1]-1,  endDate[2]);
    +
    +	var results = [];
    +	results.push(startDate);
    +	while (dCurrent.getTime() <= dEnd.getTime()) {
    +		results.push([dCurrent.getFullYear(),dCurrent.getMonth()+1,dCurrent.getDate()]);
    +		dCurrent = YAHOO.widget.DateMath.add(dCurrent,YAHOO.widget.DateMath.DAY,1);
    +	}
    +	return results;
    +};
    +
    +// END DATE PARSE METHODS
    +
    +// BEGIN RENDERER METHODS
    +
    +/**
    +* Resets the render stack of the current calendar to its original pre-render value.
    +*/
    +YAHOO.widget.Calendar.prototype.resetRenderers = function() {
    +	this.renderStack = this._renderStack.concat();
    +};
    +
    +/**
    +* Clears the inner HTML, CSS class and style information from the specified cell.
    +* @method clearElement
    +* @param	{HTMLTableCellElement}	The cell to clear
    +*/
    +YAHOO.widget.Calendar.prototype.clearElement = function(cell) {
    +	cell.innerHTML = "&#160;";
    +	cell.className="";
    +};
    +
    +/**
    +* Adds a renderer to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the conditions specified in the date string for this renderer.
    +* @method addRenderer
    +* @param	{String}	sDates		A date string to associate with the specified renderer. Valid formats
    +*									include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.Calendar.prototype.addRenderer = function(sDates, fnRender) {
    +	var aDates = this._parseDates(sDates);
    +	for (var i=0;i<aDates.length;++i) {
    +		var aDate = aDates[i];
    +
    +		if (aDate.length == 2) { // this is either a range or a month/day combo
    +			if (aDate[0] instanceof Array) { // this is a range
    +				this._addRenderer(YAHOO.widget.Calendar.RANGE,aDate,fnRender);
    +			} else { // this is a month/day combo
    +				this._addRenderer(YAHOO.widget.Calendar.MONTH_DAY,aDate,fnRender);
    +			}
    +		} else if (aDate.length == 3) {
    +			this._addRenderer(YAHOO.widget.Calendar.DATE,aDate,fnRender);
    +		}
    +	}
    +};
    +
    +/**
    +* The private method used for adding cell renderers to the local render stack.
    +* This method is called by other methods that set the renderer type prior to the method call.
    +* @method _addRenderer
    +* @private
    +* @param	{String}	type		The type string that indicates the type of date renderer being added.
    +*									Values are YAHOO.widget.Calendar.DATE, YAHOO.widget.Calendar.MONTH_DAY, YAHOO.widget.Calendar.WEEKDAY,
    +*									YAHOO.widget.Calendar.RANGE, YAHOO.widget.Calendar.MONTH
    +* @param	{Array}		aDates		An array of dates used to construct the renderer. The format varies based
    +*									on the renderer type
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.Calendar.prototype._addRenderer = function(type, aDates, fnRender) {
    +	var add = [type,aDates,fnRender];
    +	this.renderStack.unshift(add);
    +	this._renderStack = this.renderStack.concat();
    +};
    +
    +/**
    +* Adds a month to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the month passed to this method.
    +* @method addMonthRenderer
    +* @param	{Number}	month		The month (1-12) to associate with this renderer
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.Calendar.prototype.addMonthRenderer = function(month, fnRender) {
    +	this._addRenderer(YAHOO.widget.Calendar.MONTH,[month],fnRender);
    +};
    +
    +/**
    +* Adds a weekday to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the weekday passed to this method.
    +* @method addWeekdayRenderer
    +* @param	{Number}	weekday		The weekday (0-6) to associate with this renderer
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.Calendar.prototype.addWeekdayRenderer = function(weekday, fnRender) {
    +	this._addRenderer(YAHOO.widget.Calendar.WEEKDAY,[weekday],fnRender);
    +};
    +
    +// END RENDERER METHODS
    +
    +// BEGIN CSS METHODS
    +
    +/**
    +* Removes all styles from all body cells in the current calendar table.
    +* @method clearAllBodyCellStyles
    +* @param	{style}		The CSS class name to remove from all calendar body cells
    +*/
    +YAHOO.widget.Calendar.prototype.clearAllBodyCellStyles = function(style) {
    +	for (var c=0;c<this.cells.length;++c) {
    +		YAHOO.util.Dom.removeClass(this.cells[c],style);
    +	}
    +};
    +
    +// END CSS METHODS
    +
    +// BEGIN GETTER/SETTER METHODS
    +/**
    +* Sets the calendar's month explicitly
    +* @method setMonth
    +* @param {Number}	month		The numeric month, from 0 (January) to 11 (December)
    +*/
    +YAHOO.widget.Calendar.prototype.setMonth = function(month) {
    +	var current = this.cfg.getProperty("pagedate");
    +	current.setMonth(month);
    +	this.cfg.setProperty("pagedate", current);
    +};
    +
    +/**
    +* Sets the calendar's year explicitly.
    +* @method setYear
    +* @param {Number}	year		The numeric 4-digit year
    +*/
    +YAHOO.widget.Calendar.prototype.setYear = function(year) {
    +	var current = this.cfg.getProperty("pagedate");
    +	current.setFullYear(year);
    +	this.cfg.setProperty("pagedate", current);
    +};
    +
    +/**
    +* Gets the list of currently selected dates from the calendar.
    +* @method getSelectedDates
    +* @return {Date[]} An array of currently selected JavaScript Date objects.
    +*/
    +YAHOO.widget.Calendar.prototype.getSelectedDates = function() {
    +	var returnDates = [];
    +	var selected = this.cfg.getProperty("selected");
    +
    +	for (var d=0;d<selected.length;++d) {
    +		var dateArray = selected[d];
    +
    +		var date = new Date(dateArray[0],dateArray[1]-1,dateArray[2]);
    +		returnDates.push(date);
    +	}
    +
    +	returnDates.sort( function(a,b) { return a-b; } );
    +	return returnDates;
    +};
    +
    +/// END GETTER/SETTER METHODS ///
    +
    +/**
    +* Hides the Calendar's outer container from view.
    +* @method hide
    +*/
    +YAHOO.widget.Calendar.prototype.hide = function() {
    +	this.oDomContainer.style.display = "none";
    +};
    +
    +/**
    +* Shows the Calendar's outer container.
    +* @method show
    +*/
    +YAHOO.widget.Calendar.prototype.show = function() {
    +	this.oDomContainer.style.display = "block";
    +};
    +
    +/**
    +* Returns a string representing the current browser.
    +* @property browser
    +* @type String
    +*/
    +YAHOO.widget.Calendar.prototype.browser = function() {
    +			var ua = navigator.userAgent.toLowerCase();
    +				  if (ua.indexOf('opera')!=-1) { // Opera (check first in case of spoof)
    +					 return 'opera';
    +				  } else if (ua.indexOf('msie 7')!=-1) { // IE7
    +					 return 'ie7';
    +				  } else if (ua.indexOf('msie') !=-1) { // IE
    +					 return 'ie';
    +				  } else if (ua.indexOf('safari')!=-1) { // Safari (check before Gecko because it includes "like Gecko")
    +					 return 'safari';
    +				  } else if (ua.indexOf('gecko') != -1) { // Gecko
    +					 return 'gecko';
    +				  } else {
    +					 return false;
    +				  }
    +			}();
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	A string representation of the Calendar object.
    +*/
    +YAHOO.widget.Calendar.prototype.toString = function() {
    +	return "Calendar " + this.id;
    +};
    +
    +/**
    +* @namespace YAHOO.widget
    +* @class Calendar_Core
    +* @extends YAHOO.widget.Calendar
    +* @deprecated The old Calendar_Core class is no longer necessary.
    +*/
    +YAHOO.widget.Calendar_Core = YAHOO.widget.Calendar;
    +
    +YAHOO.widget.Cal_Core = YAHOO.widget.Calendar;
    +
    +/**
    +* YAHOO.widget.CalendarGroup is a special container class for YAHOO.widget.Calendar. This class facilitates
    +* the ability to have multi-page calendar views that share a single dataset and are
    +* dependent on each other.
    +*
    +* The calendar group instance will refer to each of its elements using a 0-based index.
    +* For example, to construct the placeholder for a calendar group widget with id "cal1" and
    +* containerId of "cal1Container", the markup would be as follows:
    +*	<xmp>
    +*		<div id="cal1Container_0"></div>
    +*		<div id="cal1Container_1"></div>
    +*	</xmp>
    +* The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers.
    +* @namespace YAHOO.widget
    +* @class CalendarGroup
    +* @constructor
    +* @param {String}	id			The id of the table element that will represent the calendar widget
    +* @param {String}	containerId	The id of the container div element that will wrap the calendar table
    +* @param {Object}	config		The configuration object containing the Calendar's arguments
    +*/
    +YAHOO.widget.CalendarGroup = function(id, containerId, config) {
    +	if (arguments.length > 0) {
    +		this.init(id, containerId, config);
    +	}
    +};
    +
    +/**
    +* Initializes the calendar group. All subclasses must call this method in order for the
    +* group to be initialized properly.
    +* @method init
    +* @param {String}	id			The id of the table element that will represent the calendar widget
    +* @param {String}	containerId	The id of the container div element that will wrap the calendar table
    +* @param {Object}	config		The configuration object containing the Calendar's arguments
    +*/
    +YAHOO.widget.CalendarGroup.prototype.init = function(id, containerId, config) {
    +	this.initEvents();
    +	this.initStyles();
    +
    +	/**
    +	* The collection of Calendar pages contained within the CalendarGroup
    +	* @property pages
    +	* @type YAHOO.widget.Calendar[]
    +	*/
    +	this.pages = [];
    +
    +	/**
    +	* The unique id associated with the CalendarGroup
    +	* @property id
    +	* @type String
    +	*/
    +	this.id = id;
    +
    +	/**
    +	* The unique id associated with the CalendarGroup container
    +	* @property containerId
    +	* @type String
    +	*/
    +	this.containerId = containerId;
    +
    +	/**
    +	* The outer containing element for the CalendarGroup
    +	* @property oDomContainer
    +	* @type HTMLElement
    +	*/
    +	this.oDomContainer = document.getElementById(containerId);
    +
    +	YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_CONTAINER);
    +	YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_MULTI_UP);
    +
    +	/**
    +	* The Config object used to hold the configuration variables for the CalendarGroup
    +	* @property cfg
    +	* @type YAHOO.util.Config
    +	*/
    +	this.cfg = new YAHOO.util.Config(this);
    +
    +	/**
    +	* The local object which contains the CalendarGroup's options
    +	* @property Options
    +	* @type Object
    +	*/
    +	this.Options = {};
    +
    +	/**
    +	* The local object which contains the CalendarGroup's locale settings
    +	* @property Locale
    +	* @type Object
    +	*/
    +	this.Locale = {};
    +
    +	this.setupConfig();
    +
    +	if (config) {
    +		this.cfg.applyConfig(config, true);
    +	}
    +
    +	this.cfg.fireQueue();
    +
    +	// OPERA HACK FOR MISWRAPPED FLOATS
    +	if (this.browser == "opera"){
    +		var fixWidth = function() {
    +			var startW = this.oDomContainer.offsetWidth;
    +			var w = 0;
    +			for (var p=0;p<this.pages.length;++p) {
    +				var cal = this.pages[p];
    +				w += cal.oDomContainer.offsetWidth;
    +			}
    +			if (w > 0) {
    +				this.oDomContainer.style.width = w + "px";
    +			}
    +		};
    +		this.renderEvent.subscribe(fixWidth,this,true);
    +	}
    +};
    +
    +
    +YAHOO.widget.CalendarGroup.prototype.setupConfig = function() {
    +	/**
    +	* The number of pages to include in the CalendarGroup. This value can only be set once, in the CalendarGroup's constructor arguments.
    +	* @config pages
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("pages", { value:2, validator:this.cfg.checkNumber, handler:this.configPages } );
    +
    +	/**
    +	* The month/year representing the current visible Calendar date (mm/yyyy)
    +	* @config pagedate
    +	* @type String
    +	* @default today's date
    +	*/
    +	this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } );
    +
    +	/**
    +	* The date or range of dates representing the current Calendar selection
    +	* @config selected
    +	* @type String
    +	* @default []
    +	*/
    +	this.cfg.addProperty("selected", { value:[], handler:this.delegateConfig } );
    +
    +	/**
    +	* The title to display above the CalendarGroup's month header
    +	* @config title
    +	* @type String
    +	* @default ""
    +	*/
    +	this.cfg.addProperty("title", { value:"", handler:this.configTitle } );
    +
    +	/**
    +	* Whether or not a close button should be displayed for this CalendarGroup
    +	* @config close
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("close", { value:false, handler:this.configClose } );
    +
    +	/**
    +	* Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below.
    +	* @config iframe
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("iframe", { value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The minimum selectable date in the current Calendar (mm/dd/yyyy)
    +	* @config mindate
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("mindate", { value:null, handler:this.delegateConfig } );
    +
    +	/**
    +	* The maximum selectable date in the current Calendar (mm/dd/yyyy)
    +	* @config maxdate
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("maxdate", { value:null, handler:this.delegateConfig  } );
    +
    +	// Options properties
    +
    +	/**
    +	* True if the Calendar should allow multiple selections. False by default.
    +	* @config MULTI_SELECT
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("MULTI_SELECT",	{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The weekday the week begins on. Default is 0 (Sunday).
    +	* @config START_WEEKDAY
    +	* @type number
    +	* @default 0
    +	*/
    +	this.cfg.addProperty("START_WEEKDAY",	{ value:0, handler:this.delegateConfig, validator:this.cfg.checkNumber  } );
    +
    +	/**
    +	* True if the Calendar should show weekday labels. True by default.
    +	* @config SHOW_WEEKDAYS
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("SHOW_WEEKDAYS",	{ value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* True if the Calendar should show week row headers. False by default.
    +	* @config SHOW_WEEK_HEADER
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* True if the Calendar should show week row footers. False by default.
    +	* @config SHOW_WEEK_FOOTER
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* True if the Calendar should suppress weeks that are not a part of the current month. False by default.
    +	* @config HIDE_BLANK_WEEKS
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } );
    +
    +	/**
    +	* The image that should be used for the left navigation arrow.
    +	* @config NAV_ARROW_LEFT
    +	* @type String
    +	* @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif"
    +	*/
    +	this.cfg.addProperty("NAV_ARROW_LEFT",	{ value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.delegateConfig } );
    +
    +	/**
    +	* The image that should be used for the left navigation arrow.
    +	* @config NAV_ARROW_RIGHT
    +	* @type String
    +	* @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif"
    +	*/
    +	this.cfg.addProperty("NAV_ARROW_RIGHT",	{ value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.delegateConfig } );
    +
    +	// Locale properties
    +
    +	/**
    +	* The short month labels for the current locale.
    +	* @config MONTHS_SHORT
    +	* @type String[]
    +	* @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
    +	*/
    +	this.cfg.addProperty("MONTHS_SHORT",	{ value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The long month labels for the current locale.
    +	* @config MONTHS_LONG
    +	* @type String[]
    +	* @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    +	*/
    +	this.cfg.addProperty("MONTHS_LONG",		{ value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The 1-character weekday labels for the current locale.
    +	* @config WEEKDAYS_1CHAR
    +	* @type String[]
    +	* @default ["S", "M", "T", "W", "T", "F", "S"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_1CHAR",	{ value:["S", "M", "T", "W", "T", "F", "S"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The short weekday labels for the current locale.
    +	* @config WEEKDAYS_SHORT
    +	* @type String[]
    +	* @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_SHORT",	{ value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The medium weekday labels for the current locale.
    +	* @config WEEKDAYS_MEDIUM
    +	* @type String[]
    +	* @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_MEDIUM",	{ value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The long weekday labels for the current locale.
    +	* @config WEEKDAYS_LONG
    +	* @type String[]
    +	* @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
    +	*/
    +	this.cfg.addProperty("WEEKDAYS_LONG",	{ value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.delegateConfig } );
    +
    +	/**
    +	* The setting that determines which length of month labels should be used. Possible values are "short" and "long".
    +	* @config LOCALE_MONTHS
    +	* @type String
    +	* @default "long"
    +	*/
    +	this.cfg.addProperty("LOCALE_MONTHS",	{ value:"long", handler:this.delegateConfig } );
    +
    +	/**
    +	* The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long".
    +	* @config LOCALE_WEEKDAYS
    +	* @type String
    +	* @default "short"
    +	*/
    +	this.cfg.addProperty("LOCALE_WEEKDAYS",	{ value:"short", handler:this.delegateConfig } );
    +
    +	/**
    +	* The value used to delimit individual dates in a date string passed to various Calendar functions.
    +	* @config DATE_DELIMITER
    +	* @type String
    +	* @default ","
    +	*/
    +	this.cfg.addProperty("DATE_DELIMITER",		{ value:",", handler:this.delegateConfig } );
    +
    +	/**
    +	* The value used to delimit date fields in a date string passed to various Calendar functions.
    +	* @config DATE_FIELD_DELIMITER
    +	* @type String
    +	* @default "/"
    +	*/
    +	this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.delegateConfig } );
    +
    +	/**
    +	* The value used to delimit date ranges in a date string passed to various Calendar functions.
    +	* @config DATE_RANGE_DELIMITER
    +	* @type String
    +	* @default "-"
    +	*/
    +	this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.delegateConfig } );
    +
    +	/**
    +	* The position of the month in a month/year date string
    +	* @config MY_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MY_MONTH_POSITION",	{ value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the year in a month/year date string
    +	* @config MY_YEAR_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MY_YEAR_POSITION",	{ value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the month in a month/day date string
    +	* @config MD_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MD_MONTH_POSITION",	{ value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the day in a month/year date string
    +	* @config MD_DAY_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MD_DAY_POSITION",		{ value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the month in a month/day/year date string
    +	* @config MDY_MONTH_POSITION
    +	* @type Number
    +	* @default 1
    +	*/
    +	this.cfg.addProperty("MDY_MONTH_POSITION",	{ value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the day in a month/day/year date string
    +	* @config MDY_DAY_POSITION
    +	* @type Number
    +	* @default 2
    +	*/
    +	this.cfg.addProperty("MDY_DAY_POSITION",	{ value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The position of the year in a month/day/year date string
    +	* @config MDY_YEAR_POSITION
    +	* @type Number
    +	* @default 3
    +	*/
    +	this.cfg.addProperty("MDY_YEAR_POSITION",	{ value:3, handler:this.delegateConfig, validator:this.cfg.checkNumber } );
    +
    +};
    +
    +/**
    +* Initializes CalendarGroup's built-in CustomEvents
    +* @method initEvents
    +*/
    +YAHOO.widget.CalendarGroup.prototype.initEvents = function() {
    +	var me = this;
    +
    +	/**
    +	* Proxy subscriber to subscribe to the CalendarGroup's child Calendars' CustomEvents
    +	* @method sub
    +	* @private
    +	* @param {Function} fn	The function to subscribe to this CustomEvent
    +	* @param {Object}	obj	The CustomEvent's scope object
    +	* @param {Boolean}	bOverride	Whether or not to apply scope correction
    +	*/
    +	var sub = function(fn, obj, bOverride) {
    +		for (var p=0;p<me.pages.length;++p) {
    +			var cal = me.pages[p];
    +			cal[this.type + "Event"].subscribe(fn, obj, bOverride);
    +		}
    +	};
    +
    +	/**
    +	* Proxy unsubscriber to unsubscribe from the CalendarGroup's child Calendars' CustomEvents
    +	* @method unsub
    +	* @private
    +	* @param {Function} fn	The function to subscribe to this CustomEvent
    +	* @param {Object}	obj	The CustomEvent's scope object
    +	*/
    +	var unsub = function(fn, obj) {
    +		for (var p=0;p<me.pages.length;++p) {
    +			var cal = me.pages[p];
    +			cal[this.type + "Event"].unsubscribe(fn, obj);
    +		}
    +	};
    +
    +	/**
    +	* Fired before a selection is made
    +	* @event beforeSelectEvent
    +	*/
    +	this.beforeSelectEvent = new YAHOO.util.CustomEvent("beforeSelect");
    +	this.beforeSelectEvent.subscribe = sub; this.beforeSelectEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when a selection is made
    +	* @event selectEvent
    +	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
    +	*/
    +	this.selectEvent = new YAHOO.util.CustomEvent("select");
    +	this.selectEvent.subscribe = sub; this.selectEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired before a selection is made
    +	* @event beforeDeselectEvent
    +	*/
    +	this.beforeDeselectEvent = new YAHOO.util.CustomEvent("beforeDeselect");
    +	this.beforeDeselectEvent.subscribe = sub; this.beforeDeselectEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when a selection is made
    +	* @event deselectEvent
    +	* @param {Array}	Array of Date field arrays in the format [YYYY, MM, DD].
    +	*/
    +	this.deselectEvent = new YAHOO.util.CustomEvent("deselect");
    +	this.deselectEvent.subscribe = sub; this.deselectEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when the Calendar page is changed
    +	* @event changePageEvent
    +	*/
    +	this.changePageEvent = new YAHOO.util.CustomEvent("changePage");
    +	this.changePageEvent.subscribe = sub; this.changePageEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired before the Calendar is rendered
    +	* @event beforeRenderEvent
    +	*/
    +	this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender");
    +	this.beforeRenderEvent.subscribe = sub; this.beforeRenderEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when the Calendar is rendered
    +	* @event renderEvent
    +	*/
    +	this.renderEvent = new YAHOO.util.CustomEvent("render");
    +	this.renderEvent.subscribe = sub; this.renderEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when the Calendar is reset
    +	* @event resetEvent
    +	*/
    +	this.resetEvent = new YAHOO.util.CustomEvent("reset");
    +	this.resetEvent.subscribe = sub; this.resetEvent.unsubscribe = unsub;
    +
    +	/**
    +	* Fired when the Calendar is cleared
    +	* @event clearEvent
    +	*/
    +	this.clearEvent = new YAHOO.util.CustomEvent("clear");
    +	this.clearEvent.subscribe = sub; this.clearEvent.unsubscribe = unsub;
    +
    +};
    +
    +/**
    +* The default Config handler for the "pages" property
    +* @method configPages
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.configPages = function(type, args, obj) {
    +	var pageCount = args[0];
    +
    +	for (var p=0;p<pageCount;++p) {
    +		var calId = this.id + "_" + p;
    +		var calContainerId = this.containerId + "_" + p;
    +
    +		var childConfig = this.cfg.getConfig();
    +		childConfig.close = false;
    +		childConfig.title = false;
    +
    +		var cal = this.constructChild(calId, calContainerId, childConfig);
    +		var caldate = cal.cfg.getProperty("pagedate");
    +		caldate.setMonth(caldate.getMonth()+p);
    +		cal.cfg.setProperty("pagedate", caldate);
    +
    +		YAHOO.util.Dom.removeClass(cal.oDomContainer, this.Style.CSS_SINGLE);
    +		YAHOO.util.Dom.addClass(cal.oDomContainer, "groupcal");
    +
    +		if (p===0) {
    +			YAHOO.util.Dom.addClass(cal.oDomContainer, "first");
    +		}
    +
    +		if (p==(pageCount-1)) {
    +			YAHOO.util.Dom.addClass(cal.oDomContainer, "last");
    +		}
    +
    +		cal.parent = this;
    +		cal.index = p;
    +
    +		this.pages[this.pages.length] = cal;
    +	}
    +};
    +
    +/**
    +* The default Config handler for the "pagedate" property
    +* @method configPageDate
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.configPageDate = function(type, args, obj) {
    +	var val = args[0];
    +
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.cfg.setProperty("pagedate", val);
    +		var calDate = cal.cfg.getProperty("pagedate");
    +		calDate.setMonth(calDate.getMonth()+p);
    +	}
    +};
    +
    +/**
    +* Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
    +* @method delegateConfig
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.delegateConfig = function(type, args, obj) {
    +	var val = args[0];
    +	var cal;
    +
    +	for (var p=0;p<this.pages.length;p++) {
    +		cal = this.pages[p];
    +		cal.cfg.setProperty(type, val);
    +	}
    +};
    +
    +
    +/**
    +* Adds a function to all child Calendars within this CalendarGroup.
    +* @method setChildFunction
    +* @param {String}		fnName		The name of the function
    +* @param {Function}		fn			The function to apply to each Calendar page object
    +*/
    +YAHOO.widget.CalendarGroup.prototype.setChildFunction = function(fnName, fn) {
    +	var pageCount = this.cfg.getProperty("pages");
    +
    +	for (var p=0;p<pageCount;++p) {
    +		this.pages[p][fnName] = fn;
    +	}
    +};
    +
    +/**
    +* Calls a function within all child Calendars within this CalendarGroup.
    +* @method callChildFunction
    +* @param {String}		fnName		The name of the function
    +* @param {Array}		args		The arguments to pass to the function
    +*/
    +YAHOO.widget.CalendarGroup.prototype.callChildFunction = function(fnName, args) {
    +	var pageCount = this.cfg.getProperty("pages");
    +
    +	for (var p=0;p<pageCount;++p) {
    +		var page = this.pages[p];
    +		if (page[fnName]) {
    +			var fn = page[fnName];
    +			fn.call(page, args);
    +		}
    +	}
    +};
    +
    +/**
    +* Constructs a child calendar. This method can be overridden if a subclassed version of the default
    +* calendar is to be used.
    +* @method constructChild
    +* @param {String}	id			The id of the table element that will represent the calendar widget
    +* @param {String}	containerId	The id of the container div element that will wrap the calendar table
    +* @param {Object}	config		The configuration object containing the Calendar's arguments
    +* @return {YAHOO.widget.Calendar}	The YAHOO.widget.Calendar instance that is constructed
    +*/
    +YAHOO.widget.CalendarGroup.prototype.constructChild = function(id,containerId,config) {
    +	var container = document.getElementById(containerId);
    +	if (! container) {
    +		container = document.createElement("div");
    +		container.id = containerId;
    +		this.oDomContainer.appendChild(container);
    +	}
    +	return new YAHOO.widget.Calendar(id,containerId,config);
    +};
    +
    +
    +/**
    +* Sets the calendar group's month explicitly. This month will be set into the first
    +* @method setMonth
    +* page of the multi-page calendar, and all other months will be iterated appropriately.
    +* @param {Number}	month		The numeric month, from 0 (January) to 11 (December)
    +*/
    +YAHOO.widget.CalendarGroup.prototype.setMonth = function(month) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.setMonth(month+p);
    +	}
    +};
    +
    +/**
    +* Sets the calendar group's year explicitly. This year will be set into the first
    +* @method setYear
    +* page of the multi-page calendar, and all other months will be iterated appropriately.
    +* @param {Number}	year		The numeric 4-digit year
    +*/
    +YAHOO.widget.CalendarGroup.prototype.setYear = function(year) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		var pageDate = cal.cfg.getProperty("pageDate");
    +
    +		if ((pageDate.getMonth()+1) == 1 && p>0) {
    +			year+=1;
    +		}
    +		cal.setYear(year);
    +	}
    +};
    +/**
    +* Calls the render function of all child calendars within the group.
    +* @method render
    +*/
    +YAHOO.widget.CalendarGroup.prototype.render = function() {
    +	this.renderHeader();
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.render();
    +	}
    +	this.renderFooter();
    +};
    +
    +/**
    +* Selects a date or a collection of dates on the current calendar. This method, by default,
    +* does not call the render method explicitly. Once selection has completed, render must be
    +* called for the changes to be reflected visually.
    +* @method select
    +* @param	{String/Date/Date[]}	date	The date string of dates to select in the current calendar. Valid formats are
    +*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
    +*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
    +*								This method can also take a JavaScript Date object or an array of Date objects.
    +* @return	{Date[]}			Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.select = function(date) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.select(date);
    +	}
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Selects a date on the current calendar by referencing the index of the cell that should be selected.
    +* This method is used to easily select a single cell (usually with a mouse click) without having to do
    +* a full render. The selected style is applied to the cell directly.
    +* @method selectCell
    +* @param	{Number}	cellIndex	The index of the cell to select in the current calendar.
    +* @return	{Date[]}	Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.selectCell = function(cellIndex) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.selectCell(cellIndex);
    +	}
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects a date or a collection of dates on the current calendar. This method, by default,
    +* does not call the render method explicitly. Once deselection has completed, render must be
    +* called for the changes to be reflected visually.
    +* @method deselect
    +* @param	{String/Date/Date[]}	date	The date string of dates to deselect in the current calendar. Valid formats are
    +*								individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006).
    +*								Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005).
    +*								This method can also take a JavaScript Date object or an array of Date objects.
    +* @return	{Date[]}			Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.deselect = function(date) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.deselect(date);
    +	}
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects all dates on the current calendar.
    +* @method deselectAll
    +* @return {Date[]}		Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*						Assuming that this function executes properly, the return value should be an empty array.
    +*						However, the empty array is returned for the sake of being able to check the selection status
    +*						of the calendar.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.deselectAll = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.deselectAll();
    +	}
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Deselects a date on the current calendar by referencing the index of the cell that should be deselected.
    +* This method is used to easily deselect a single cell (usually with a mouse click) without having to do
    +* a full render. The selected style is removed from the cell directly.
    +* @method deselectCell
    +* @param	{Number}	cellIndex	The index of the cell to deselect in the current calendar.
    +* @return	{Date[]}	Array of JavaScript Date objects representing all individual dates that are currently selected.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.deselectCell = function(cellIndex) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.deselectCell(cellIndex);
    +	}
    +	return this.getSelectedDates();
    +};
    +
    +/**
    +* Resets the calendar widget to the originally selected month and year, and
    +* sets the calendar to the initial selection(s).
    +* @method reset
    +*/
    +YAHOO.widget.CalendarGroup.prototype.reset = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.reset();
    +	}
    +};
    +
    +/**
    +* Clears the selected dates in the current calendar widget and sets the calendar
    +* to the current month and year.
    +* @method clear
    +*/
    +YAHOO.widget.CalendarGroup.prototype.clear = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.clear();
    +	}
    +};
    +
    +/**
    +* Navigates to the next month page in the calendar widget.
    +* @method nextMonth
    +*/
    +YAHOO.widget.CalendarGroup.prototype.nextMonth = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.nextMonth();
    +	}
    +};
    +
    +/**
    +* Navigates to the previous month page in the calendar widget.
    +* @method previousMonth
    +*/
    +YAHOO.widget.CalendarGroup.prototype.previousMonth = function() {
    +	for (var p=this.pages.length-1;p>=0;--p) {
    +		var cal = this.pages[p];
    +		cal.previousMonth();
    +	}
    +};
    +
    +/**
    +* Navigates to the next year in the currently selected month in the calendar widget.
    +* @method nextYear
    +*/
    +YAHOO.widget.CalendarGroup.prototype.nextYear = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.nextYear();
    +	}
    +};
    +
    +/**
    +* Navigates to the previous year in the currently selected month in the calendar widget.
    +* @method previousYear
    +*/
    +YAHOO.widget.CalendarGroup.prototype.previousYear = function() {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.previousYear();
    +	}
    +};
    +
    +
    +/**
    +* Gets the list of currently selected dates from the calendar.
    +* @return			An array of currently selected JavaScript Date objects.
    +* @type Date[]
    +*/
    +YAHOO.widget.CalendarGroup.prototype.getSelectedDates = function() {
    +	var returnDates = [];
    +	var selected = this.cfg.getProperty("selected");
    +
    +	for (var d=0;d<selected.length;++d) {
    +		var dateArray = selected[d];
    +
    +		var date = new Date(dateArray[0],dateArray[1]-1,dateArray[2]);
    +		returnDates.push(date);
    +	}
    +
    +	returnDates.sort( function(a,b) { return a-b; } );
    +	return returnDates;
    +};
    +
    +/**
    +* Adds a renderer to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the conditions specified in the date string for this renderer.
    +* @method addRenderer
    +* @param	{String}	sDates		A date string to associate with the specified renderer. Valid formats
    +*									include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.addRenderer = function(sDates, fnRender) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.addRenderer(sDates, fnRender);
    +	}
    +};
    +
    +/**
    +* Adds a month to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the month passed to this method.
    +* @method addMonthRenderer
    +* @param	{Number}	month		The month (1-12) to associate with this renderer
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.addMonthRenderer = function(month, fnRender) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.addMonthRenderer(month, fnRender);
    +	}
    +};
    +
    +/**
    +* Adds a weekday to the render stack. The function reference passed to this method will be executed
    +* when a date cell matches the weekday passed to this method.
    +* @method addWeekdayRenderer
    +* @param	{Number}	weekday		The weekday (0-6) to associate with this renderer
    +* @param	{Function}	fnRender	The function executed to render cells that match the render rules for this renderer.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.addWeekdayRenderer = function(weekday, fnRender) {
    +	for (var p=0;p<this.pages.length;++p) {
    +		var cal = this.pages[p];
    +		cal.addWeekdayRenderer(weekday, fnRender);
    +	}
    +};
    +
    +/**
    +* Renders the header for the CalendarGroup.
    +* @method renderHeader
    +*/
    +YAHOO.widget.CalendarGroup.prototype.renderHeader = function() {};
    +
    +/**
    +* Renders a footer for the 2-up calendar container. By default, this method is
    +* unimplemented.
    +* @method renderFooter
    +*/
    +YAHOO.widget.CalendarGroup.prototype.renderFooter = function() {};
    +
    +/**
    +* Adds the designated number of months to the current calendar month, and sets the current
    +* calendar page date to the new month.
    +* @method addMonths
    +* @param {Number}	count	The number of months to add to the current calendar
    +*/
    +YAHOO.widget.CalendarGroup.prototype.addMonths = function(count) {
    +	this.callChildFunction("addMonths", count);
    +};
    +
    +
    +/**
    +* Subtracts the designated number of months from the current calendar month, and sets the current
    +* calendar page date to the new month.
    +* @method subtractMonths
    +* @param {Number}	count	The number of months to subtract from the current calendar
    +*/
    +YAHOO.widget.CalendarGroup.prototype.subtractMonths = function(count) {
    +	this.callChildFunction("subtractMonths", count);
    +};
    +
    +/**
    +* Adds the designated number of years to the current calendar, and sets the current
    +* calendar page date to the new month.
    +* @method addYears
    +* @param {Number}	count	The number of years to add to the current calendar
    +*/
    +YAHOO.widget.CalendarGroup.prototype.addYears = function(count) {
    +	this.callChildFunction("addYears", count);
    +};
    +
    +/**
    +* Subtcats the designated number of years from the current calendar, and sets the current
    +* calendar page date to the new month.
    +* @method subtractYears
    +* @param {Number}	count	The number of years to subtract from the current calendar
    +*/
    +YAHOO.widget.CalendarGroup.prototype.subtractYears = function(count) {
    +	this.callChildFunction("subtractYears", count);
    +};
    +
    +/**
    +* CSS class representing the container for the calendar
    +* @property YAHOO.widget.CalendarGroup.CSS_CONTAINER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.CalendarGroup.CSS_CONTAINER = "yui-calcontainer";
    +
    +/**
    +* CSS class representing the container for the calendar
    +* @property YAHOO.widget.CalendarGroup.CSS_MULTI_UP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.CalendarGroup.CSS_MULTI_UP = "multi";
    +
    +/**
    +* CSS class representing the title for the 2-up calendar
    +* @property YAHOO.widget.CalendarGroup.CSS_2UPTITLE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.CalendarGroup.CSS_2UPTITLE = "title";
    +
    +/**
    +* CSS class representing the close icon for the 2-up calendar
    +* @property YAHOO.widget.CalendarGroup.CSS_2UPCLOSE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.CalendarGroup.CSS_2UPCLOSE = "close-icon";
    +
    +YAHOO.augment(YAHOO.widget.CalendarGroup, YAHOO.widget.Calendar, "buildDayLabel",
    +																 "buildMonthLabel",
    +																 "renderOutOfBoundsDate",
    +																 "renderRowHeader",
    +																 "renderRowFooter",
    +																 "renderCellDefault",
    +																 "styleCellDefault",
    +																 "renderCellStyleHighlight1",
    +																 "renderCellStyleHighlight2",
    +																 "renderCellStyleHighlight3",
    +																 "renderCellStyleHighlight4",
    +																 "renderCellStyleToday",
    +																 "renderCellStyleSelected",
    +																 "renderCellNotThisMonth",
    +																 "renderBodyCellRestricted",
    +																 "initStyles",
    +																 "configTitle",
    +																 "configClose",
    +																 "hide",
    +																 "show",
    +																 "browser");
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	A string representation of the CalendarGroup object.
    +*/
    +YAHOO.widget.CalendarGroup.prototype.toString = function() {
    +	return "CalendarGroup " + this.id;
    +};
    +
    +YAHOO.widget.CalGrp = YAHOO.widget.CalendarGroup;
    +
    +/**
    +* @class YAHOO.widget.Calendar2up
    +* @extends YAHOO.widget.CalendarGroup
    +* @deprecated The old Calendar2up class is no longer necessary, since CalendarGroup renders in a 2up view by default.
    +*/
    +YAHOO.widget.Calendar2up = function(id, containerId, config) {
    +	this.init(id, containerId, config);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Calendar2up, YAHOO.widget.CalendarGroup);
    +
    +/**
    +* @deprecated The old Calendar2up class is no longer necessary, since CalendarGroup renders in a 2up view by default.
    +*/
    +YAHOO.widget.Cal2up = YAHOO.widget.Calendar2up;

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/connection.js.html b/www/extras/yui-ext/docs/output/connection.js.html new file mode 100644 index 000000000..c57f2aafa --- /dev/null +++ b/www/extras/yui-ext/docs/output/connection.js.html @@ -0,0 +1,960 @@ +connection.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * @description
    + * The Connection Manager provides a simplified interface to the XMLHttpRequest
    + * object.  It handles cross-browser instantiantion of XMLHttpRequest, negotiates the
    + * interactive states and server response, returning the results to a pre-defined
    + * callback you create.
    + *
    + * @namespace YAHOO.util
    + * @module Connection
    + * @Class Connect
    + */
    +YAHOO.util.Connect =
    +{
    +  /**
    +   * @description Array of MSFT ActiveX ids for XMLHttpRequest.
    +   * @property _msxml_progid
    +   * @private
    +   * @static
    +   * @type array
    +   */
    +	_msxml_progid:[
    +		'MSXML2.XMLHTTP.3.0',
    +		'MSXML2.XMLHTTP',
    +		'Microsoft.XMLHTTP'
    +		],
    +
    +  /**
    +   * @description Object literal of HTTP header(s)
    +   * @property _http_header
    +   * @private
    +   * @static
    +   * @type object
    +   */
    +	_http_header:{},
    +
    +  /**
    +   * @description Determines if HTTP headers are set.
    +   * @property _has_http_headers
    +   * @private
    +   * @static
    +   * @type boolean
    +   */
    +	_has_http_headers:false,
    +
    + /**
    +  * @description Determines if a default header of
    +  * Content-Type of 'application/x-www-form-urlencoded'
    +  * will be added to any client HTTP headers sent for POST
    +  * transactions.
    +  * @property _use_default_post_header
    +  * @private
    +  * @static
    +  * @type boolean
    +  */
    +    _use_default_post_header:true,
    +
    + /**
    +  * @description Determines if a default header of
    +  * Content-Type of 'application/x-www-form-urlencoded'
    +  * will be added to any client HTTP headers sent for POST
    +  * transactions.
    +  * @property _default_post_header
    +  * @private
    +  * @static
    +  * @type boolean
    +  */
    +    _default_post_header:'application/x-www-form-urlencoded',
    +
    + /**
    +  * @description Property modified by setForm() to determine if the data
    +  * should be submitted as an HTML form.
    +  * @property _isFormSubmit
    +  * @private
    +  * @static
    +  * @type boolean
    +  */
    +    _isFormSubmit:false,
    +
    + /**
    +  * @description Property modified by setForm() to determine if a file(s)
    +  * upload is expected.
    +  * @property _isFileUpload
    +  * @private
    +  * @static
    +  * @type boolean
    +  */
    +    _isFileUpload:false,
    +
    + /**
    +  * @description Property modified by setForm() to set a reference to the HTML
    +  * form node if the desired action is file upload.
    +  * @property _formNode
    +  * @private
    +  * @static
    +  * @type object
    +  */
    +    _formNode:null,
    +
    + /**
    +  * @description Property modified by setForm() to set the HTML form data
    +  * for each transaction.
    +  * @property _sFormData
    +  * @private
    +  * @static
    +  * @type string
    +  */
    +    _sFormData:null,
    +
    + /**
    +  * @description Collection of polling references to the polling mechanism in handleReadyState.
    +  * @property _poll
    +  * @private
    +  * @static
    +  * @type object
    +  */
    +    _poll:{},
    +
    + /**
    +  * @description Queue of timeout values for each transaction callback with a defined timeout value.
    +  * @property _timeOut
    +  * @private
    +  * @static
    +  * @type object
    +  */
    +    _timeOut:{},
    +
    +  /**
    +   * @description The polling frequency, in milliseconds, for HandleReadyState.
    +   * when attempting to determine a transaction's XHR readyState.
    +   * The default is 50 milliseconds.
    +   * @property _polling_interval
    +   * @private
    +   * @static
    +   * @type int
    +   */
    +     _polling_interval:50,
    +
    +  /**
    +   * @description A transaction counter that increments the transaction id for each transaction.
    +   * @property _transaction_id
    +   * @private
    +   * @static
    +   * @type int
    +   */
    +     _transaction_id:0,
    +
    +  /**
    +   * @description Member to add an ActiveX id to the existing xml_progid array.
    +   * In the event(unlikely) a new ActiveX id is introduced, it can be added
    +   * without internal code modifications.
    +   * @method setProgId
    +   * @public
    +   * @static
    +   * @param {string} id The ActiveX id to be added to initialize the XHR object.
    +   * @return void
    +   */
    +	setProgId:function(id)
    +	{
    +		this._msxml_progid.unshift(id);
    +	},
    +
    +  /**
    +   * @description Member to enable or disable the default POST header.
    +   * @method setDefaultPostHeader
    +   * @public
    +   * @static
    +   * @param {boolean} b Set and use default header - true or false .
    +   * @return void
    +   */
    +	setDefaultPostHeader:function(b)
    +	{
    +		this._use_default_post_header = b;
    +	},
    +
    +  /**
    +   * @description Member to modify the default polling interval.
    +   * @method setPollingInterval
    +   * @public
    +   * @static
    +   * @param {int} i The polling interval in milliseconds.
    +   * @return void
    +   */
    +	setPollingInterval:function(i)
    +	{
    +		if(typeof i == 'number' && isFinite(i)){
    +			this._polling_interval = i;
    +		}
    +	},
    +
    +  /**
    +   * @description Instantiates a XMLHttpRequest object and returns an object with two properties:
    +   * the XMLHttpRequest instance and the transaction id.
    +   * @method createXhrObject
    +   * @private
    +   * @static
    +   * @param {int} transactionId Property containing the transaction id for this transaction.
    +   * @return object
    +   */
    +	createXhrObject:function(transactionId)
    +	{
    +		var obj,http;
    +		try
    +		{
    +			// Instantiates XMLHttpRequest in non-IE browsers and assigns to http.
    +			http = new XMLHttpRequest();
    +			//  Object literal with http and tId properties
    +			obj = { conn:http, tId:transactionId };
    +		}
    +		catch(e)
    +		{
    +			for(var i=0; i<this._msxml_progid.length; ++i){
    +				try
    +				{
    +					// Instantiates XMLHttpRequest for IE and assign to http.
    +					http = new ActiveXObject(this._msxml_progid[i]);
    +					//  Object literal with conn and tId properties
    +					obj = { conn:http, tId:transactionId };
    +					break;
    +				}
    +				catch(e){}
    +			}
    +		}
    +		finally
    +		{
    +			return obj;
    +		}
    +	},
    +
    +  /**
    +   * @description This method is called by asyncRequest to create a
    +   * valid connection object for the transaction.  It also passes a
    +   * transaction id and increments the transaction id counter.
    +   * @method getConnectionObject
    +   * @private
    +   * @static
    +   * @return {object}
    +   */
    +	getConnectionObject:function()
    +	{
    +		var o;
    +		var tId = this._transaction_id;
    +
    +		try
    +		{
    +			o = this.createXhrObject(tId);
    +			if(o){
    +				this._transaction_id++;
    +			}
    +		}
    +		catch(e){}
    +		finally
    +		{
    +			return o;
    +		}
    +	},
    +
    +  /**
    +   * @description Method for initiating an asynchronous request via the XHR object.
    +   * @method asyncRequest
    +   * @public
    +   * @static
    +   * @param {string} method HTTP transaction method
    +   * @param {string} uri Fully qualified path of resource
    +   * @param {callback} callback User-defined callback function or object
    +   * @param {string} postData POST body
    +   * @return {object} Returns the connection object
    +   */
    +	asyncRequest:function(method, uri, callback, postData)
    +	{
    +		var o = this.getConnectionObject();
    +
    +		if(!o){
    +			return null;
    +		}
    +		else{
    +			if(this._isFormSubmit){
    +				if(this._isFileUpload){
    +					this.uploadFile(o.tId, callback, uri, postData);
    +					this.releaseObject(o);
    +
    +					return;
    +				}
    +
    +				//If the specified HTTP method is GET, setForm() will return an
    +				//encoded string that is concatenated to the uri to
    +				//create a querystring.
    +				if(method == 'GET'){
    +					if(this._sFormData.length != 0){
    +						// If the URI already contains a querystring, append an ampersand
    +						// and then concatenate _sFormData to the URI.
    +						uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData;
    +					}
    +					else{
    +						uri += "?" + this._sFormData;
    +					}
    +				}
    +				else if(method == 'POST'){
    +					//If POST data exist in addition to the HTML form data,
    +					//it will be concatenated to the form data.
    +					postData = postData?this._sFormData + "&" + postData:this._sFormData;
    +				}
    +			}
    +
    +			o.conn.open(method, uri, true);
    +
    +			if(this._isFormSubmit || (postData && this._use_default_post_header)){
    +				this.initHeader('Content-Type', this._default_post_header);
    +				if(this._isFormSubmit){
    +					this.resetFormState();
    +				}
    +			}
    +
    +			if(this._has_http_headers){
    +				this.setHeader(o);
    +			}
    +
    +			this.handleReadyState(o, callback);
    +			o.conn.send(postData || null);
    +
    +			return o;
    +		}
    +	},
    +
    +  /**
    +   * @description This method serves as a timer that polls the XHR object's readyState
    +   * property during a transaction, instead of binding a callback to the
    +   * onreadystatechange event.  Upon readyState 4, handleTransactionResponse
    +   * will process the response, and the timer will be cleared.
    +   * @method handleReadyState
    +   * @private
    +   * @static
    +   * @param {object} o The connection object
    +   * @param {callback} callback The user-defined callback object
    +   * @return {void}
    +   */
    +    handleReadyState:function(o, callback)
    +    {
    +		var oConn = this;
    +
    +		if(callback && callback.timeout){
    +			this._timeOut[o.tId] = window.setTimeout(function(){ oConn.abort(o, callback, true); }, callback.timeout);
    +		}
    +
    +		this._poll[o.tId] = window.setInterval(
    +			function(){
    +				if(o.conn && o.conn.readyState == 4){
    +					window.clearInterval(oConn._poll[o.tId]);
    +					delete oConn._poll[o.tId];
    +
    +					if(callback && callback.timeout){
    +						delete oConn._timeOut[o.tId];
    +					}
    +
    +					oConn.handleTransactionResponse(o, callback);
    +				}
    +			}
    +		,this._polling_interval);
    +    },
    +
    +  /**
    +   * @description This method attempts to interpret the server response and
    +   * determine whether the transaction was successful, or if an error or
    +   * exception was encountered.
    +   * @method handleTransactionResponse
    +   * @private
    +   * @static
    +   * @param {object} o The connection object
    +   * @param {object} callback The sser-defined callback object
    +   * @param {boolean} isAbort Determines if the transaction was aborted.
    +   * @return {void}
    +   */
    +    handleTransactionResponse:function(o, callback, isAbort)
    +    {
    +		// If no valid callback is provided, then do not process any callback handling.
    +		if(!callback){
    +			this.releaseObject(o);
    +			return;
    +		}
    +
    +		var httpStatus, responseObject;
    +
    +		try
    +		{
    +			if(o.conn.status !== undefined && o.conn.status != 0){
    +				httpStatus = o.conn.status;
    +			}
    +			else{
    +				httpStatus = 13030;
    +			}
    +		}
    +		catch(e){
    +			// 13030 is the custom code to indicate the condition -- in Mozilla/FF --
    +			// when the o object's status and statusText properties are
    +			// unavailable, and a query attempt throws an exception.
    +			httpStatus = 13030;
    +		}
    +
    +		if(httpStatus >= 200 && httpStatus < 300){
    +			try
    +			{
    +				responseObject = this.createResponseObject(o, callback.argument);
    +				if(callback.success){
    +					if(!callback.scope){
    +						callback.success(responseObject);
    +					}
    +					else{
    +						// If a scope property is defined, the callback will be fired from
    +						// the context of the object.
    +						callback.success.apply(callback.scope, [responseObject]);
    +					}
    +				}
    +			}
    +			catch(e){}
    +		}
    +		else{
    +			try
    +			{
    +				switch(httpStatus){
    +					// The following cases are wininet.dll error codes that may be encountered.
    +					case 12002: // Server timeout
    +					case 12029: // 12029 to 12031 correspond to dropped connections.
    +					case 12030:
    +					case 12031:
    +					case 12152: // Connection closed by server.
    +					case 13030: // See above comments for variable status.
    +						responseObject = this.createExceptionObject(o.tId, callback.argument, (isAbort?isAbort:false));
    +						if(callback.failure){
    +							if(!callback.scope){
    +								callback.failure(responseObject);
    +							}
    +							else{
    +								callback.failure.apply(callback.scope, [responseObject]);
    +							}
    +						}
    +						break;
    +					default:
    +						responseObject = this.createResponseObject(o, callback.argument);
    +						if(callback.failure){
    +							if(!callback.scope){
    +								callback.failure(responseObject);
    +							}
    +							else{
    +								callback.failure.apply(callback.scope, [responseObject]);
    +							}
    +						}
    +				}
    +			}
    +			catch(e){}
    +		}
    +
    +		this.releaseObject(o);
    +		responseObject = null;
    +    },
    +
    +  /**
    +   * @description This method evaluates the server response, creates and returns the results via
    +   * its properties.  Success and failure cases will differ in the response
    +   * object's property values.
    +   * @method createResponseObject
    +   * @private
    +   * @static
    +   * @param {object} o The connection object
    +   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
    +   * @return {object}
    +   */
    +    createResponseObject:function(o, callbackArg)
    +    {
    +		var obj = {};
    +		var headerObj = {};
    +
    +		try
    +		{
    +			var headerStr = o.conn.getAllResponseHeaders();
    +			var header = headerStr.split('\n');
    +			for(var i=0; i<header.length; i++){
    +				var delimitPos = header[i].indexOf(':');
    +				if(delimitPos != -1){
    +					headerObj[header[i].substring(0,delimitPos)] = header[i].substring(delimitPos+2);
    +				}
    +			}
    +		}
    +		catch(e){}
    +
    +		obj.tId = o.tId;
    +		obj.status = o.conn.status;
    +		obj.statusText = o.conn.statusText;
    +		obj.getResponseHeader = headerObj;
    +		obj.getAllResponseHeaders = headerStr;
    +		obj.responseText = o.conn.responseText;
    +		obj.responseXML = o.conn.responseXML;
    +
    +		if(typeof callbackArg !== undefined){
    +			obj.argument = callbackArg;
    +		}
    +
    +		return obj;
    +    },
    +
    +  /**
    +   * @description If a transaction cannot be completed due to dropped or closed connections,
    +   * there may be not be enough information to build a full response object.
    +   * The failure callback will be fired and this specific condition can be identified
    +   * by a status property value of 0.
    +   *
    +   * If an abort was successful, the status property will report a value of -1.
    +   *
    +   * @method createExceptionObject
    +   * @private
    +   * @static
    +   * @param {int} tId The Transaction Id
    +   * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback
    +   * @param {boolean} isAbort Determines if the exception case is caused by a transaction abort
    +   * @return {object}
    +   */
    +    createExceptionObject:function(tId, callbackArg, isAbort)
    +    {
    +		var COMM_CODE = 0;
    +		var COMM_ERROR = 'communication failure';
    +		var ABORT_CODE = -1;
    +		var ABORT_ERROR = 'transaction aborted';
    +
    +		var obj = {};
    +
    +		obj.tId = tId;
    +		if(isAbort){
    +			obj.status = ABORT_CODE;
    +			obj.statusText = ABORT_ERROR;
    +		}
    +		else{
    +			obj.status = COMM_CODE;
    +			obj.statusText = COMM_ERROR;
    +		}
    +
    +		if(callbackArg){
    +			obj.argument = callbackArg;
    +		}
    +
    +		return obj;
    +    },
    +
    +  /**
    +   * @description Public method that stores the custom HTTP headers for each transaction.
    +   * @method initHeader
    +   * @public
    +   * @static
    +   * @param {string} label The HTTP header label
    +   * @param {string} value The HTTP header value
    +   * @return {void}
    +   */
    +	initHeader:function(label,value)
    +	{
    +		if(this._http_header[label] === undefined){
    +			this._http_header[label] = value;
    +		}
    +		else{
    +			// Concatenate multiple values, comma-delimited,
    +			// for the same header label,
    +			this._http_header[label] =  value + "," + this._http_header[label];
    +		}
    +
    +		this._has_http_headers = true;
    +	},
    +
    +  /**
    +   * @description Accessor that sets the HTTP headers for each transaction.
    +   * @method setHeader
    +   * @private
    +   * @static
    +   * @param {object} o The connection object for the transaction.
    +   * @return {void}
    +   */
    +	setHeader:function(o)
    +	{
    +		for(var prop in this._http_header){
    +			if(this._http_header.hasOwnProperty(prop)){
    +				o.conn.setRequestHeader(prop, this._http_header[prop]);
    +			}
    +		}
    +		delete this._http_header;
    +
    +		this._http_header = {};
    +		this._has_http_headers = false;
    +	},
    +
    +  /**
    +   * @description This method assembles the form label and value pairs and
    +   * constructs an encoded string.
    +   * asyncRequest() will automatically initialize the
    +   * transaction with a HTTP header Content-Type of
    +   * application/x-www-form-urlencoded.
    +   * @method setForm
    +   * @public
    +   * @static
    +   * @param {string || object} form id or name attribute, or form object.
    +   * @param {string} optional boolean to indicate SSL environment.
    +   * @param {string || boolean} optional qualified path of iframe resource for SSL in IE.
    +   * @return {string} string of the HTML form field name and value pairs..
    +   */
    +	setForm:function(formId, isUpload, secureUri)
    +	{
    +		this.resetFormState();
    +		var oForm;
    +		if(typeof formId == 'string'){
    +			// Determine if the argument is a form id or a form name.
    +			// Note form name usage is deprecated by supported
    +			// here for legacy reasons.
    +			oForm = (document.getElementById(formId) || document.forms[formId]);
    +		}
    +		else if(typeof formId == 'object'){
    +			// Treat argument as an HTML form object.
    +			oForm = formId;
    +		}
    +		else{
    +			return;
    +		}
    +
    +		// If the isUpload argument is true, setForm will call createFrame to initialize
    +		// an iframe as the form target.
    +		//
    +		// The argument secureURI is also required by IE in SSL environments
    +		// where the secureURI string is a fully qualified HTTP path, used to set the source
    +		// of the iframe, to a stub resource in the same domain.
    +		if(isUpload){
    +
    +			// Create iframe in preparation for file upload.
    +			this.createFrame(secureUri?secureUri:null);
    +
    +			// Set form reference and file upload properties to true.
    +			this._isFormSubmit = true;
    +			this._isFileUpload = true;
    +			this._formNode = oForm;
    +
    +			return;
    +		}
    +
    +		var oElement, oName, oValue, oDisabled;
    +		var hasSubmit = false;
    +
    +		// Iterate over the form elements collection to construct the
    +		// label-value pairs.
    +		for (var i=0; i<oForm.elements.length; i++){
    +			oElement = oForm.elements[i];
    +			oDisabled = oForm.elements[i].disabled;
    +			oName = oForm.elements[i].name;
    +			oValue = oForm.elements[i].value;
    +
    +			// Do not submit fields that are disabled or
    +			// do not have a name attribute value.
    +			if(!oDisabled && oName)
    +			{
    +				switch (oElement.type)
    +				{
    +					case 'select-one':
    +					case 'select-multiple':
    +						for(var j=0; j<oElement.options.length; j++){
    +							if(oElement.options[j].selected){
    +								if(window.ActiveXObject){
    +									this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oElement.options[j].attributes['value'].specified?oElement.options[j].value:oElement.options[j].text) + '&';
    +								}
    +								else{
    +									this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oElement.options[j].hasAttribute('value')?oElement.options[j].value:oElement.options[j].text) + '&';
    +								}
    +
    +							}
    +						}
    +						break;
    +					case 'radio':
    +					case 'checkbox':
    +						if(oElement.checked){
    +							this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
    +						}
    +						break;
    +					case 'file':
    +						// stub case as XMLHttpRequest will only send the file path as a string.
    +					case undefined:
    +						// stub case for fieldset element which returns undefined.
    +					case 'reset':
    +						// stub case for input type reset button.
    +					case 'button':
    +						// stub case for input type button elements.
    +						break;
    +					case 'submit':
    +						if(hasSubmit == false){
    +							this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
    +							hasSubmit = true;
    +						}
    +						break;
    +					default:
    +						this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&';
    +						break;
    +				}
    +			}
    +		}
    +
    +		this._isFormSubmit = true;
    +		this._sFormData = this._sFormData.substr(0, this._sFormData.length - 1);
    +
    +		return this._sFormData;
    +	},
    +
    +  /**
    +   * @description Resets HTML form properties when an HTML form or HTML form
    +   * with file upload transaction is sent.
    +   * @method resetFormState
    +   * @private
    +   * @static
    +   * @return {void}
    +   */
    +	resetFormState:function(){
    +		this._isFormSubmit = false;
    +		this._isFileUpload = false;
    +		this._formNode = null;
    +		this._sFormData = "";
    +	},
    +
    +  /**
    +   * @description Creates an iframe to be used for form file uploads.  It is remove from the
    +   * document upon completion of the upload transaction.
    +   * @method createFrame
    +   * @private
    +   * @static
    +   * @param {string} secureUri Optional qualified path of iframe resource for SSL in IE.
    +   * @return {void}
    +   */
    +	createFrame:function(secureUri){
    +
    +		// IE does not allow the setting of id and name attributes as object
    +		// properties via createElement().  A different iframe creation
    +		// pattern is required for IE.
    +		var frameId = 'yuiIO' + this._transaction_id;
    +		if(window.ActiveXObject){
    +			var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
    +
    +			// IE will throw a security exception in an SSL environment if the
    +			// iframe source is undefined.
    +			if(typeof secureUri == 'boolean'){
    +				io.src = 'javascript:false';
    +			}
    +			else if(typeof secureURI == 'string'){
    +				// Deprecated
    +				io.src = secureUri;
    +			}
    +		}
    +		else{
    +			var io = document.createElement('iframe');
    +			io.id = frameId;
    +			io.name = frameId;
    +		}
    +
    +		io.style.position = 'absolute';
    +		io.style.top = '-1000px';
    +		io.style.left = '-1000px';
    +
    +		document.body.appendChild(io);
    +	},
    +
    +  /**
    +   * @description Parses the POST data and creates hidden form elements
    +   * for each key-value, and appends them to the HTML form object.
    +   * @method appendPostData
    +   * @private
    +   * @static
    +   * @param {string} postData The HTTP POST data
    +   * @return {array} formElements Collection of hidden fields.
    +   */
    +	appendPostData:function(postData)
    +	{
    +		var formElements = new Array();
    +		var postMessage = postData.split('&');
    +		for(var i=0; i < postMessage.length; i++){
    +			var delimitPos = postMessage[i].indexOf('=');
    +			if(delimitPos != -1){
    +				formElements[i] = document.createElement('input');
    +				formElements[i].type = 'hidden';
    +				formElements[i].name = postMessage[i].substring(0,delimitPos);
    +				formElements[i].value = postMessage[i].substring(delimitPos+1);
    +				this._formNode.appendChild(formElements[i]);
    +			}
    +		}
    +
    +		return formElements;
    +	},
    +
    +  /**
    +   * @description Uploads HTML form, including files/attachments, to the
    +   * iframe created in createFrame.
    +   * @method uploadFile
    +   * @private
    +   * @static
    +   * @param {int} id The transaction id.
    +   * @param {object} callback - User-defined callback object.
    +   * @param {string} uri Fully qualified path of resource.
    +   * @return {void}
    +   */
    +	uploadFile:function(id, callback, uri, postData){
    +
    +		// Each iframe has an id prefix of "yuiIO" followed
    +		// by the unique transaction id.
    +		var frameId = 'yuiIO' + id;
    +		var io = document.getElementById(frameId);
    +
    +		// Initialize the HTML form properties in case they are
    +		// not defined in the HTML form.
    +		this._formNode.action = uri;
    +		this._formNode.method = 'POST';
    +		this._formNode.target = frameId;
    +
    +		if(this._formNode.encoding){
    +			// IE does not respect property enctype for HTML forms.
    +			// Instead use property encoding.
    +			this._formNode.encoding = 'multipart/form-data';
    +		}
    +		else{
    +			this._formNode.enctype = 'multipart/form-data';
    +		}
    +
    +		if(postData){
    +			var oElements = this.appendPostData(postData);
    +		}
    +
    +		this._formNode.submit();
    +
    +		if(oElements && oElements.length > 0){
    +			try
    +			{
    +				for(var i=0; i < oElements.length; i++){
    +					this._formNode.removeChild(oElements[i]);
    +				}
    +			}
    +			catch(e){}
    +		}
    +
    +		// Reset HTML form status properties.
    +		this.resetFormState();
    +
    +		// Create the upload callback handler that fires when the iframe
    +		// receives the load event.  Subsequently, the event handler is detached
    +		// and the iframe removed from the document.
    +
    +		var uploadCallback = function()
    +		{
    +			var obj = {};
    +			obj.tId = id;
    +			obj.argument = callback.argument;
    +
    +			try
    +			{
    +				obj.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
    +				obj.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
    +			}
    +			catch(e){}
    +
    +			if(callback.upload){
    +				if(!callback.scope){
    +					callback.upload(obj);
    +				}
    +				else{
    +					callback.upload.apply(callback.scope, [obj]);
    +				}
    +			}
    +
    +			if(YAHOO.util.Event){
    +				YAHOO.util.Event.removeListener(io, "load", uploadCallback);
    +			}
    +			else if(window.detachEvent){
    +				io.detachEvent('onload', uploadCallback);
    +			}
    +			else{
    +				io.removeEventListener('load', uploadCallback, false);
    +			}
    +			setTimeout(function(){ document.body.removeChild(io); }, 100);
    +		};
    +
    +
    +		// Bind the onload handler to the iframe to detect the file upload response.
    +		if(YAHOO.util.Event){
    +			YAHOO.util.Event.addListener(io, "load", uploadCallback);
    +		}
    +		else if(window.attachEvent){
    +			io.attachEvent('onload', uploadCallback);
    +		}
    +		else{
    +			io.addEventListener('load', uploadCallback, false);
    +		}
    +	},
    +
    +  /**
    +   * @description Method to terminate a transaction, if it has not reached readyState 4.
    +   * @method abort
    +   * @public
    +   * @static
    +   * @param {object} o The connection object returned by asyncRequest.
    +   * @param {object} callback  User-defined callback object.
    +   * @param {string} isTimeout boolean to indicate if abort was a timeout.
    +   * @return {boolean}
    +   */
    +	abort:function(o, callback, isTimeout)
    +	{
    +		if(this.isCallInProgress(o)){
    +			o.conn.abort();
    +			window.clearInterval(this._poll[o.tId]);
    +			delete this._poll[o.tId];
    +			if(isTimeout){
    +				delete this._timeOut[o.tId];
    +			}
    +
    +			this.handleTransactionResponse(o, callback, true);
    +
    +			return true;
    +		}
    +		else{
    +			return false;
    +		}
    +	},
    +
    +  /**
    +   * Public method to check if the transaction is still being processed.
    +   *
    +   * @method isCallInProgress
    +   * @public
    +   * @static
    +   * @param {object} o The connection object returned by asyncRequest
    +   * @return {boolean}
    +   */
    +	isCallInProgress:function(o)
    +	{
    +		// if the XHR object assigned to the transaction has not been dereferenced,
    +		// then check its readyState status.  Otherwise, return false.
    +		if(o.conn){
    +			return o.conn.readyState != 4 && o.conn.readyState != 0;
    +		}
    +		else{
    +			//The XHR object has been destroyed.
    +			return false;
    +		}
    +	},
    +
    +  /**
    +   * @description Dereference the XHR instance and the connection object after the transaction is completed.
    +   * @method releaseObject
    +   * @private
    +   * @static
    +   * @param {object} o The connection object
    +   * @return {void}
    +   */
    +	releaseObject:function(o)
    +	{
    +		//dereference the XHR instance.
    +		o.conn = null;
    +		//dereference the connection object.
    +		o = null;
    +	}
    +};

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/container.js.html b/www/extras/yui-ext/docs/output/container.js.html new file mode 100644 index 000000000..ab8686ce4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/container.js.html @@ -0,0 +1,4561 @@ +container.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version 0.12.0
    +*/
    +// holder
    +/**
    +* Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state.
    +* @class YAHOO.util.Config
    +* @constructor
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config = function(owner) {
    +	if (owner) {
    +		this.init(owner);
    +	}
    +};
    +
    +YAHOO.util.Config.prototype = {
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @property owner
    +	* @type Object
    +	*/
    +	owner : null,
    +
    +	/**
    +	* Boolean flag that specifies whether a queue is currently being executed
    +	* @property queueInProgress
    +	* @type Boolean
    +	*/
    +	queueInProgress : false,
    +
    +
    +	/**
    +	* Validates that the value passed in is a Boolean.
    +	* @method checkBoolean
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkBoolean: function(val) {
    +		if (typeof val == 'boolean') {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Validates that the value passed in is a number.
    +	* @method checkNumber
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkNumber: function(val) {
    +		if (isNaN(val)) {
    +			return false;
    +		} else {
    +			return true;
    +		}
    +	}
    +};
    +
    +
    +/**
    +* Initializes the configuration Object and all of its local members.
    +* @method init
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config.prototype.init = function(owner) {
    +
    +	this.owner = owner;
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @event configChangedEvent
    +	*/
    +	this.configChangedEvent = new YAHOO.util.CustomEvent("configChanged");
    +
    +	this.queueInProgress = false;
    +
    +	/* Private Members */
    +// holder
    +/**
    +	* Maintains the local collection of configuration property objects and their specified values
    +	* @property config
    +	* @private
    +	* @type Object
    +	*/
    +	var config = {};
    +
    +	/**
    +	* Maintains the local collection of configuration property objects as they were initially applied.
    +	* This object is used when resetting a property.
    +	* @property initialConfig
    +	* @private
    +	* @type Object
    +	*/
    +	var initialConfig = {};
    +
    +	/**
    +	* Maintains the local, normalized CustomEvent queue
    +	* @property eventQueue
    +	* @private
    +	* @type Object
    +	*/
    +	var eventQueue = [];
    +
    +	/**
    +	* Fires a configuration property event using the specified value.
    +	* @method fireEvent
    +	* @private
    +	* @param {String}	key			The configuration property's name
    +	* @param {value}	Object		The value of the correct type for the property
    +	*/
    +	var fireEvent = function( key, value ) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			property.event.fire(value);
    +		}
    +	};
    +	/* End Private Members */
    +// holder
    +/**
    +	* Adds a property to the Config Object's private config hash.
    +	* @method addProperty
    +	* @param {String}	key	The configuration property's name
    +	* @param {Object}	propertyObject	The Object containing all of this property's arguments
    +	*/
    +	this.addProperty = function( key, propertyObject ) {
    +		key = key.toLowerCase();
    +
    +		config[key] = propertyObject;
    +
    +		propertyObject.event = new YAHOO.util.CustomEvent(key);
    +		propertyObject.key = key;
    +
    +		if (propertyObject.handler) {
    +			propertyObject.event.subscribe(propertyObject.handler, this.owner, true);
    +		}
    +
    +		this.setProperty(key, propertyObject.value, true);
    +
    +		if (! propertyObject.suppressEvent) {
    +			this.queueProperty(key, propertyObject.value);
    +		}
    +	};
    +
    +	/**
    +	* Returns a key-value configuration map of the values currently set in the Config Object.
    +	* @method getConfig
    +	* @return {Object} The current config, represented in a key-value map
    +	*/
    +	this.getConfig = function() {
    +		var cfg = {};
    +
    +		for (var prop in config) {
    +			var property = config[prop];
    +			if (typeof property != 'undefined' && property.event) {
    +				cfg[prop] = property.value;
    +			}
    +		}
    +
    +		return cfg;
    +	};
    +
    +	/**
    +	* Returns the value of specified property.
    +	* @method getProperty
    +	* @param {String} key	The name of the property
    +	* @return {Object}		The value of the specified property
    +	*/
    +	this.getProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.value;
    +		} else {
    +			return undefined;
    +		}
    +	};
    +
    +	/**
    +	* Resets the specified property's value to its initial value.
    +	* @method resetProperty
    +	* @param {String} key	The name of the property
    +	* @return {Boolean} True is the property was reset, false if not
    +	*/
    +	this.resetProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (initialConfig[key] && initialConfig[key] != 'undefined')	{
    +				this.setProperty(key, initialConfig[key]);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property. If the silent property is passed as true, the property's event will not be fired.
    +	* @method setProperty
    +	* @param {String} key		The name of the property
    +	* @param {String} value		The value to set the property to
    +	* @param {Boolean} silent	Whether the value should be set silently, without firing the property event.
    +	* @return {Boolean}			True, if the set was successful, false if it failed.
    +	*/
    +	this.setProperty = function(key, value, silent) {
    +		key = key.toLowerCase();
    +
    +		if (this.queueInProgress && ! silent) {
    +			this.queueProperty(key,value); // Currently running through a queue...
    +			return true;
    +		} else {
    +			var property = config[key];
    +			if (typeof property != 'undefined' && property.event) {
    +				if (property.validator && ! property.validator(value)) { // validator
    +					return false;
    +				} else {
    +					property.value = value;
    +					if (! silent) {
    +						fireEvent(key, value);
    +						this.configChangedEvent.fire([key, value]);
    +					}
    +					return true;
    +				}
    +			} else {
    +				return false;
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is
    +	* moved from its current position to the end of the queue.
    +	* @method queueProperty
    +	* @param {String} key	The name of the property
    +	* @param {String} value	The value to set the property to
    +	* @return {Boolean}		true, if the set was successful, false if it failed.
    +	*/
    +	this.queueProperty = function(key, value) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			if (typeof value != 'undefined' && property.validator && ! property.validator(value)) { // validator
    +				return false;
    +			} else {
    +
    +				if (typeof value != 'undefined') {
    +					property.value = value;
    +				} else {
    +					value = property.value;
    +				}
    +
    +				var foundDuplicate = false;
    +
    +				for (var i=0;i<eventQueue.length;i++) {
    +					var queueItem = eventQueue[i];
    +
    +					if (queueItem) {
    +						var queueItemKey = queueItem[0];
    +						var queueItemValue = queueItem[1];
    +
    +						if (queueItemKey.toLowerCase() == key) {
    +							// found a dupe... push to end of queue, null current item, and break
    +							eventQueue[i] = null;
    +							eventQueue.push([key, (typeof value != 'undefined' ? value : queueItemValue)]);
    +							foundDuplicate = true;
    +							break;
    +						}
    +					}
    +				}
    +
    +				if (! foundDuplicate && typeof value != 'undefined') { // this is a refire, or a new property in the queue
    +					eventQueue.push([key, value]);
    +				}
    +			}
    +
    +			if (property.supercedes) {
    +				for (var s=0;s<property.supercedes.length;s++) {
    +					var supercedesCheck = property.supercedes[s];
    +
    +					for (var q=0;q<eventQueue.length;q++) {
    +						var queueItemCheck = eventQueue[q];
    +
    +						if (queueItemCheck) {
    +							var queueItemCheckKey = queueItemCheck[0];
    +							var queueItemCheckValue = queueItemCheck[1];
    +
    +							if ( queueItemCheckKey.toLowerCase() == supercedesCheck.toLowerCase() ) {
    +								eventQueue.push([queueItemCheckKey, queueItemCheckValue]);
    +								eventQueue[q] = null;
    +								break;
    +							}
    +						}
    +					}
    +				}
    +			}
    +
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Fires the event for a property using the property's current value.
    +	* @method refireEvent
    +	* @param {String} key	The name of the property
    +	*/
    +	this.refireEvent = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event && typeof property.value != 'undefined') {
    +			if (this.queueInProgress) {
    +				this.queueProperty(key);
    +			} else {
    +				fireEvent(key, property.value);
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property events.
    +	* Although the values will be set, fireQueue() must be called for their associated events to execute.
    +	* @method applyConfig
    +	* @param {Object}	userConfig	The configuration Object literal
    +	* @param {Boolean}	init		When set to true, the initialConfig will be set to the userConfig passed in, so that calling a reset will reset the properties to the passed values.
    +	*/
    +	this.applyConfig = function(userConfig, init) {
    +		if (init) {
    +			initialConfig = userConfig;
    +		}
    +		for (var prop in userConfig) {
    +			this.queueProperty(prop, userConfig[prop]);
    +		}
    +	};
    +
    +	/**
    +	* Refires the events for all configuration properties using their current values.
    +	* @method refresh
    +	*/
    +	this.refresh = function() {
    +		for (var prop in config) {
    +			this.refireEvent(prop);
    +		}
    +	};
    +
    +	/**
    +	* Fires the normalized list of queued property change events
    +	* @method fireQueue
    +	*/
    +	this.fireQueue = function() {
    +		this.queueInProgress = true;
    +		for (var i=0;i<eventQueue.length;i++) {
    +			var queueItem = eventQueue[i];
    +			if (queueItem) {
    +				var key = queueItem[0];
    +				var value = queueItem[1];
    +
    +				var property = config[key];
    +				property.value = value;
    +
    +				fireEvent(key,value);
    +			}
    +		}
    +
    +		this.queueInProgress = false;
    +		eventQueue = [];
    +	};
    +
    +	/**
    +	* Subscribes an external handler to the change event for any given property.
    +	* @method subscribeToConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @param {Boolean}	override	Optional. If true, will override "this" within the handler to map to the scope Object passed into the method.
    +	* @return {Boolean}				True, if the subscription was successful, otherwise false.
    +	*/
    +	this.subscribeToConfigEvent = function(key, handler, obj, override) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (! YAHOO.util.Config.alreadySubscribed(property.event, handler, obj)) {
    +				property.event.subscribe(handler, obj, override);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Unsubscribes an external handler from the change event for any given property.
    +	* @method unsubscribeFromConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @return {Boolean}				True, if the unsubscription was successful, otherwise false.
    +	*/
    +	this.unsubscribeFromConfigEvent = function(key, handler, obj) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.event.unsubscribe(handler, obj);
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object
    +	* @method toString
    +	* @return {String}	The Config object in string format.
    +	*/
    +	this.toString = function() {
    +		var output = "Config";
    +		if (this.owner) {
    +			output += " [" + this.owner.toString() + "]";
    +		}
    +		return output;
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object's current CustomEvent queue
    +	* @method outputEventQueue
    +	* @return {String}	The string list of CustomEvents currently queued for execution
    +	*/
    +	this.outputEventQueue = function() {
    +		var output = "";
    +		for (var q=0;q<eventQueue.length;q++) {
    +			var queueItem = eventQueue[q];
    +			if (queueItem) {
    +				output += queueItem[0] + "=" + queueItem[1] + ", ";
    +			}
    +		}
    +		return output;
    +	};
    +};
    +
    +/**
    +* Checks to determine if a particular function/Object pair are already subscribed to the specified CustomEvent
    +* @method YAHOO.util.Config.alreadySubscribed
    +* @static
    +* @param {YAHOO.util.CustomEvent} evt	The CustomEvent for which to check the subscriptions
    +* @param {Function}	fn	The function to look for in the subscribers list
    +* @param {Object}	obj	The execution scope Object for the subscription
    +* @return {Boolean}	true, if the function/Object pair is already subscribed to the CustomEvent passed in
    +*/
    +YAHOO.util.Config.alreadySubscribed = function(evt, fn, obj) {
    +	for (var e=0;e<evt.subscribers.length;e++) {
    +		var subsc = evt.subscribers[e];
    +		if (subsc && subsc.obj == obj && subsc.fn == fn) {
    +			return true;
    +		}
    +	}
    +	return false;
    +};
    +
    +/**
    +*  The Container family of components is designed to enable developers to create different kinds of content-containing modules on the web. Module and Overlay are the most basic containers, and they can be used directly or extended to build custom containers. Also part of the Container family are four UI controls that extend Module and Overlay: Tooltip, Panel, Dialog, and SimpleDialog.
    +* @module Container
    +* @requires yahoo,dom,event,dragdrop,animation
    +*/
    +// holder
    +/**
    +* Module is a JavaScript representation of the Standard Module Format. Standard Module Format is a simple standard for markup containers where child nodes representing the header, body, and footer of the content are denoted using the CSS classes "hd", "bd", and "ft" respectively. Module is the base class for all other classes in the YUI Container package.
    +* @class Module
    +* @namespace YAHOO.widget
    +* @constructor
    +* @param {String} el			The element ID representing the Module <em>OR</em>
    +* @param {HTMLElement} el		The element representing the Module
    +* @param {Object} userConfig	The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Module = function(el, userConfig) {
    +	if (el) {
    +		this.init(el, userConfig);
    +	}
    +};
    +
    +/**
    +* Constant representing the prefix path to use for non-secure images
    +* @property YAHOO.widget.Module.IMG_ROOT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.IMG_ROOT = "http://us.i1.yimg.com/us.yimg.com/i/";
    +
    +/**
    +* Constant representing the prefix path to use for securely served images
    +* @property YAHOO.widget.Module.IMG_ROOT_SSL
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.IMG_ROOT_SSL = "https://a248.e.akamai.net/sec.yimg.com/i/";
    +
    +/**
    +* Constant for the default CSS class name that represents a Module
    +* @property YAHOO.widget.Module.CSS_MODULE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_MODULE = "module";
    +
    +/**
    +* Constant representing the module header
    +* @property YAHOO.widget.Module.CSS_HEADER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_HEADER = "hd";
    +
    +/**
    +* Constant representing the module body
    +* @property YAHOO.widget.Module.CSS_BODY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_BODY = "bd";
    +
    +/**
    +* Constant representing the module footer
    +* @property YAHOO.widget.Module.CSS_FOOTER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_FOOTER = "ft";
    +
    +/**
    +* Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +* @property YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL = "javascript:false;";
    +
    +YAHOO.widget.Module.prototype = {
    +	/**
    +	* The class's constructor function
    +	* @property contructor
    +	* @type Function
    +	*/
    +	constructor : YAHOO.widget.Module,
    +
    +	/**
    +	* The main module element that contains the header, body, and footer
    +	* @property element
    +	* @type HTMLElement
    +	*/
    +	element : null,
    +
    +	/**
    +	* The header element, denoted with CSS class "hd"
    +	* @property header
    +	* @type HTMLElement
    +	*/
    +	header : null,
    +
    +	/**
    +	* The body element, denoted with CSS class "bd"
    +	* @property body
    +	* @type HTMLElement
    +	*/
    +	body : null,
    +
    +	/**
    +	* The footer element, denoted with CSS class "ft"
    +	* @property footer
    +	* @type HTMLElement
    +	*/
    +	footer : null,
    +
    +	/**
    +	* The id of the element
    +	* @property id
    +	* @type String
    +	*/
    +	id : null,
    +
    +	/**
    +	* The String representing the image root
    +	* @property imageRoot
    +	* @type String
    +	*/
    +	imageRoot : YAHOO.widget.Module.IMG_ROOT,
    +
    +	/**
    +	* Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
    +	* @method initEvents
    +	*/
    +	initEvents : function() {
    +
    +		/**
    +		* CustomEvent fired prior to class initalization.
    +		* @event beforeInitEvent
    +		* @param {class} classRef	class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +		*/
    +		this.beforeInitEvent = new YAHOO.util.CustomEvent("beforeInit");
    +
    +		/**
    +		* CustomEvent fired after class initalization.
    +		* @event initEvent
    +		* @param {class} classRef	class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +		*/
    +		this.initEvent = new YAHOO.util.CustomEvent("init");
    +
    +		/**
    +		* CustomEvent fired when the Module is appended to the DOM
    +		* @event appendEvent
    +		*/
    +		this.appendEvent = new YAHOO.util.CustomEvent("append");
    +
    +		/**
    +		* CustomEvent fired before the Module is rendered
    +		* @event beforeRenderEvent
    +		*/
    +		this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender");
    +
    +		/**
    +		* CustomEvent fired after the Module is rendered
    +		* @event renderEvent
    +		*/
    +		this.renderEvent = new YAHOO.util.CustomEvent("render");
    +
    +		/**
    +		* CustomEvent fired when the header content of the Module is modified
    +		* @event changeHeaderEvent
    +		* @param {String/HTMLElement} content	String/element representing the new header content
    +		*/
    +		this.changeHeaderEvent = new YAHOO.util.CustomEvent("changeHeader");
    +
    +		/**
    +		* CustomEvent fired when the body content of the Module is modified
    +		* @event changeBodyEvent
    +		* @param {String/HTMLElement} content	String/element representing the new body content
    +		*/
    +		this.changeBodyEvent = new YAHOO.util.CustomEvent("changeBody");
    +
    +		/**
    +		* CustomEvent fired when the footer content of the Module is modified
    +		* @event changeFooterEvent
    +		* @param {String/HTMLElement} content	String/element representing the new footer content
    +		*/
    +		this.changeFooterEvent = new YAHOO.util.CustomEvent("changeFooter");
    +
    +		/**
    +		* CustomEvent fired when the content of the Module is modified
    +		* @event changeContentEvent
    +		*/
    +		this.changeContentEvent = new YAHOO.util.CustomEvent("changeContent");
    +
    +		/**
    +		* CustomEvent fired when the Module is destroyed
    +		* @event destroyEvent
    +		*/
    +		this.destroyEvent = new YAHOO.util.CustomEvent("destroy");
    +
    +		/**
    +		* CustomEvent fired before the Module is shown
    +		* @event beforeShowEvent
    +		*/
    +		this.beforeShowEvent = new YAHOO.util.CustomEvent("beforeShow");
    +
    +		/**
    +		* CustomEvent fired after the Module is shown
    +		* @event showEvent
    +		*/
    +		this.showEvent = new YAHOO.util.CustomEvent("show");
    +
    +		/**
    +		* CustomEvent fired before the Module is hidden
    +		* @event beforeHideEvent
    +		*/
    +		this.beforeHideEvent = new YAHOO.util.CustomEvent("beforeHide");
    +
    +		/**
    +		* CustomEvent fired after the Module is hidden
    +		* @event hideEvent
    +		*/
    +		this.hideEvent = new YAHOO.util.CustomEvent("hide");
    +	},
    +
    +	/**
    +	* String representing the current user-agent platform
    +	* @property platform
    +	* @type String
    +	*/
    +	platform : function() {
    +					var ua = navigator.userAgent.toLowerCase();
    +					if (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1) {
    +						return "windows";
    +					} else if (ua.indexOf("macintosh") != -1) {
    +						return "mac";
    +					} else {
    +						return false;
    +					}
    +				}(),
    +
    +	/**
    +	* String representing the current user-agent browser
    +	* @property browser
    +	* @type String
    +	*/
    +	browser : function() {
    +			var ua = navigator.userAgent.toLowerCase();
    +				  if (ua.indexOf('opera')!=-1) { // Opera (check first in case of spoof)
    +					 return 'opera';
    +				  } else if (ua.indexOf('msie 7')!=-1) { // IE7
    +					 return 'ie7';
    +				  } else if (ua.indexOf('msie') !=-1) { // IE
    +					 return 'ie';
    +				  } else if (ua.indexOf('safari')!=-1) { // Safari (check before Gecko because it includes "like Gecko")
    +					 return 'safari';
    +				  } else if (ua.indexOf('gecko') != -1) { // Gecko
    +					 return 'gecko';
    +				  } else {
    +					 return false;
    +				  }
    +			}(),
    +
    +	/**
    +	* Boolean representing whether or not the current browsing context is secure (https)
    +	* @property isSecure
    +	* @type Boolean
    +	*/
    +	isSecure : function() {
    +		if (window.location.href.toLowerCase().indexOf("https") === 0) {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	}(),
    +
    +	/**
    +	* Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
    +	*/
    +	initDefaultConfig : function() {
    +		// Add properties //
    +
    +		/**
    +		* Specifies whether the Module is visible on the page.
    +		* @config visible
    +		* @type Boolean
    +		* @default true
    +		*/
    +		this.cfg.addProperty("visible", { value:true, handler:this.configVisible, validator:this.cfg.checkBoolean } );
    +
    +		/**
    +		* Object or array of objects representing the ContainerEffect classes that are active for animating the container.
    +		* @config effect
    +		* @type Object
    +		* @default null
    +		*/
    +		this.cfg.addProperty("effect", { suppressEvent:true, supercedes:["visible"] } );
    +
    +		/**
    +		* Specifies whether to create a special proxy iframe to monitor for user font resizing in the document
    +		* @config monitorresize
    +		* @type Boolean
    +		* @default true
    +		*/
    +		this.cfg.addProperty("monitorresize", { value:true, handler:this.configMonitorResize } );
    +	},
    +
    +	/**
    +	* The Module class's initialization method, which is executed for Module and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +	* @method init
    +	* @param {String}	el	The element ID representing the Module <em>OR</em>
    +	* @param {HTMLElement}	el	The element representing the Module
    +	* @param {Object}	userConfig	The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    +	*/
    +	init : function(el, userConfig) {
    +
    +		this.initEvents();
    +
    +		this.beforeInitEvent.fire(YAHOO.widget.Module);
    +
    +		/**
    +		* The Module's Config object used for monitoring configuration properties.
    +		* @property cfg
    +		* @type YAHOO.util.Config
    +		*/
    +		this.cfg = new YAHOO.util.Config(this);
    +
    +		if (this.isSecure) {
    +			this.imageRoot = YAHOO.widget.Module.IMG_ROOT_SSL;
    +		}
    +
    +		if (typeof el == "string") {
    +			var elId = el;
    +
    +			el = document.getElementById(el);
    +			if (! el) {
    +				el = document.createElement("DIV");
    +				el.id = elId;
    +			}
    +		}
    +
    +		this.element = el;
    +
    +		if (el.id) {
    +			this.id = el.id;
    +		}
    +
    +		var childNodes = this.element.childNodes;
    +
    +		if (childNodes) {
    +			for (var i=0;i<childNodes.length;i++) {
    +				var child = childNodes[i];
    +				switch (child.className) {
    +					case YAHOO.widget.Module.CSS_HEADER:
    +						this.header = child;
    +						break;
    +					case YAHOO.widget.Module.CSS_BODY:
    +						this.body = child;
    +						break;
    +					case YAHOO.widget.Module.CSS_FOOTER:
    +						this.footer = child;
    +						break;
    +				}
    +			}
    +		}
    +
    +		this.initDefaultConfig();
    +
    +		YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Module.CSS_MODULE);
    +
    +		if (userConfig) {
    +			this.cfg.applyConfig(userConfig, true);
    +		}
    +
    +		// Subscribe to the fireQueue() method of Config so that any queued configuration changes are
    +		// excecuted upon render of the Module
    +		if (! YAHOO.util.Config.alreadySubscribed(this.renderEvent, this.cfg.fireQueue, this.cfg)) {
    +			this.renderEvent.subscribe(this.cfg.fireQueue, this.cfg, true);
    +		}
    +
    +		this.initEvent.fire(YAHOO.widget.Module);
    +	},
    +
    +	/**
    +	* Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
    +	* @method initResizeMonitor
    +	*/
    +	initResizeMonitor : function() {
    +
    +        if(this.browser != "opera") {
    +
    +            var resizeMonitor = document.getElementById("_yuiResizeMonitor");
    +
    +            if (! resizeMonitor) {
    +
    +                resizeMonitor = document.createElement("iframe");
    +
    +                var bIE = (this.browser.indexOf("ie") === 0);
    +
    +                if(this.isSecure &&
    +                   YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL &&
    +                   bIE) {
    +
    +                  resizeMonitor.src =
    +                       YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL;
    +
    +                }
    +
    +                resizeMonitor.id = "_yuiResizeMonitor";
    +                resizeMonitor.style.visibility = "hidden";
    +
    +                document.body.appendChild(resizeMonitor);
    +
    +                resizeMonitor.style.width = "10em";
    +                resizeMonitor.style.height = "10em";
    +                resizeMonitor.style.position = "absolute";
    +
    +                var nLeft = -1 * resizeMonitor.offsetWidth,
    +                    nTop = -1 * resizeMonitor.offsetHeight;
    +
    +                resizeMonitor.style.top = nTop + "px";
    +                resizeMonitor.style.left =  nLeft + "px";
    +                resizeMonitor.style.borderStyle = "none";
    +                resizeMonitor.style.borderWidth = "0";
    +                YAHOO.util.Dom.setStyle(resizeMonitor, "opacity", "0");
    +
    +                resizeMonitor.style.visibility = "visible";
    +
    +                if(!bIE) {
    +
    +                    var doc = resizeMonitor.contentWindow.document;
    +
    +                    doc.open();
    +                    doc.close();
    +
    +                }
    +
    +            }
    +
    +            if(resizeMonitor && resizeMonitor.contentWindow) {
    +
    +                this.resizeMonitor = resizeMonitor;
    +
    +                YAHOO.util.Event.addListener(this.resizeMonitor.contentWindow, "resize", this.onDomResize, this, true);
    +
    +            }
    +
    +        }
    +
    +	},
    +
    +	/**
    +	* Event handler fired when the resize monitor element is resized.
    +	* @method onDomResize
    +	* @param {DOMEvent} e	The DOM resize event
    +	* @param {Object} obj	The scope object passed to the handler
    +	*/
    +	onDomResize : function(e, obj) {
    +
    +        var nLeft = -1 * this.resizeMonitor.offsetWidth,
    +            nTop = -1 * this.resizeMonitor.offsetHeight;
    +
    +        this.resizeMonitor.style.top = nTop + "px";
    +        this.resizeMonitor.style.left =  nLeft + "px";
    +
    +	},
    +
    +	/**
    +	* Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created.
    +	* @method setHeader
    +	* @param {String}	headerContent	The HTML used to set the header <em>OR</em>
    +	* @param {HTMLElement}	headerContent	The HTMLElement to append to the header
    +	*/
    +	setHeader : function(headerContent) {
    +		if (! this.header) {
    +			this.header = document.createElement("DIV");
    +			this.header.className = YAHOO.widget.Module.CSS_HEADER;
    +		}
    +
    +		if (typeof headerContent == "string") {
    +			this.header.innerHTML = headerContent;
    +		} else {
    +			this.header.innerHTML = "";
    +			this.header.appendChild(headerContent);
    +		}
    +
    +		this.changeHeaderEvent.fire(headerContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the header. If no header is present, one will be automatically created.
    +	* @method appendToHeader
    +	* @param {HTMLElement}	element	The element to append to the header
    +	*/
    +	appendToHeader : function(element) {
    +		if (! this.header) {
    +			this.header = document.createElement("DIV");
    +			this.header.className = YAHOO.widget.Module.CSS_HEADER;
    +		}
    +
    +		this.header.appendChild(element);
    +		this.changeHeaderEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created.
    +	* @method setBody
    +	* @param {String}	bodyContent	The HTML used to set the body <em>OR</em>
    +	* @param {HTMLElement}	bodyContent	The HTMLElement to append to the body
    +	*/
    +	setBody : function(bodyContent) {
    +		if (! this.body) {
    +			this.body = document.createElement("DIV");
    +			this.body.className = YAHOO.widget.Module.CSS_BODY;
    +		}
    +
    +		if (typeof bodyContent == "string")
    +		{
    +			this.body.innerHTML = bodyContent;
    +		} else {
    +			this.body.innerHTML = "";
    +			this.body.appendChild(bodyContent);
    +		}
    +
    +		this.changeBodyEvent.fire(bodyContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the body. If no body is present, one will be automatically created.
    +	* @method appendToBody
    +	* @param {HTMLElement}	element	The element to append to the body
    +	*/
    +	appendToBody : function(element) {
    +		if (! this.body) {
    +			this.body = document.createElement("DIV");
    +			this.body.className = YAHOO.widget.Module.CSS_BODY;
    +		}
    +
    +		this.body.appendChild(element);
    +		this.changeBodyEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created.
    +	* @method setFooter
    +	* @param {String}	footerContent	The HTML used to set the footer <em>OR</em>
    +	* @param {HTMLElement}	footerContent	The HTMLElement to append to the footer
    +	*/
    +	setFooter : function(footerContent) {
    +		if (! this.footer) {
    +			this.footer = document.createElement("DIV");
    +			this.footer.className = YAHOO.widget.Module.CSS_FOOTER;
    +		}
    +
    +		if (typeof footerContent == "string") {
    +			this.footer.innerHTML = footerContent;
    +		} else {
    +			this.footer.innerHTML = "";
    +			this.footer.appendChild(footerContent);
    +		}
    +
    +		this.changeFooterEvent.fire(footerContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the footer. If no footer is present, one will be automatically created.
    +	* @method appendToFooter
    +	* @param {HTMLElement}	element	The element to append to the footer
    +	*/
    +	appendToFooter : function(element) {
    +		if (! this.footer) {
    +			this.footer = document.createElement("DIV");
    +			this.footer.className = YAHOO.widget.Module.CSS_FOOTER;
    +		}
    +
    +		this.footer.appendChild(element);
    +		this.changeFooterEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure.
    +	* @method render
    +	* @param {String}	appendToNode	The element id to which the Module should be appended to prior to rendering <em>OR</em>
    +	* @param {HTMLElement}	appendToNode	The element to which the Module should be appended to prior to rendering
    +	* @param {HTMLElement}	moduleElement	OPTIONAL. The element that represents the actual Standard Module container.
    +	* @return {Boolean} Success or failure of the render
    +	*/
    +	render : function(appendToNode, moduleElement) {
    +		this.beforeRenderEvent.fire();
    +
    +		if (! moduleElement) {
    +			moduleElement = this.element;
    +		}
    +
    +		var me = this;
    +		var appendTo = function(element) {
    +			if (typeof element == "string") {
    +				element = document.getElementById(element);
    +			}
    +
    +			if (element) {
    +				element.appendChild(me.element);
    +				me.appendEvent.fire();
    +			}
    +		};
    +
    +		if (appendToNode) {
    +			appendTo(appendToNode);
    +		} else { // No node was passed in. If the element is not pre-marked up, this fails
    +			if (! YAHOO.util.Dom.inDocument(this.element)) {
    +				return false;
    +			}
    +		}
    +
    +		// Need to get everything into the DOM if it isn't already
    +
    +		if (this.header && ! YAHOO.util.Dom.inDocument(this.header)) {
    +			// There is a header, but it's not in the DOM yet... need to add it
    +			var firstChild = moduleElement.firstChild;
    +			if (firstChild) { // Insert before first child if exists
    +				moduleElement.insertBefore(this.header, firstChild);
    +			} else { // Append to empty body because there are no children
    +				moduleElement.appendChild(this.header);
    +			}
    +		}
    +
    +		if (this.body && ! YAHOO.util.Dom.inDocument(this.body)) {
    +			// There is a body, but it's not in the DOM yet... need to add it
    +			if (this.footer && YAHOO.util.Dom.isAncestor(this.moduleElement, this.footer)) { // Insert before footer if exists in DOM
    +				moduleElement.insertBefore(this.body, this.footer);
    +			} else { // Append to element because there is no footer
    +				moduleElement.appendChild(this.body);
    +			}
    +		}
    +
    +		if (this.footer && ! YAHOO.util.Dom.inDocument(this.footer)) {
    +			// There is a footer, but it's not in the DOM yet... need to add it
    +			moduleElement.appendChild(this.footer);
    +		}
    +
    +		this.renderEvent.fire();
    +		return true;
    +	},
    +
    +	/**
    +	* Removes the Module element from the DOM and sets all child elements to null.
    +	* @method destroy
    +	*/
    +	destroy : function() {
    +		if (this.element) {
    +			var parent = this.element.parentNode;
    +		}
    +		if (parent) {
    +			parent.removeChild(this.element);
    +		}
    +
    +		this.element = null;
    +		this.header = null;
    +		this.body = null;
    +		this.footer = null;
    +
    +		this.destroyEvent.fire();
    +	},
    +
    +	/**
    +	* Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after.
    +	* @method show
    +	*/
    +	show : function() {
    +		this.cfg.setProperty("visible", true);
    +	},
    +
    +	/**
    +	* Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after.
    +	* @method hide
    +	*/
    +	hide : function() {
    +		this.cfg.setProperty("visible", false);
    +	},
    +
    +	// BUILT-IN EVENT HANDLERS FOR MODULE //
    +
    +	/**
    +	* Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none".
    +	* This method is responsible for firing showEvent and hideEvent.
    +	* @param {String} type	The CustomEvent type (usually the property name)
    +	* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +	* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +	* @method configVisible
    +	*/
    +	configVisible : function(type, args, obj) {
    +		var visible = args[0];
    +		if (visible) {
    +			this.beforeShowEvent.fire();
    +			YAHOO.util.Dom.setStyle(this.element, "display", "block");
    +			this.showEvent.fire();
    +		} else {
    +			this.beforeHideEvent.fire();
    +			YAHOO.util.Dom.setStyle(this.element, "display", "none");
    +			this.hideEvent.fire();
    +		}
    +	},
    +
    +	/**
    +	* Default event handler for the "monitorresize" configuration property
    +	* @param {String} type	The CustomEvent type (usually the property name)
    +	* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +	* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +	* @method configMonitorResize
    +	*/
    +	configMonitorResize : function(type, args, obj) {
    +		var monitor = args[0];
    +		if (monitor) {
    +			this.initResizeMonitor();
    +		} else {
    +			YAHOO.util.Event.removeListener(this.resizeMonitor, "resize", this.onDomResize);
    +			this.resizeMonitor = null;
    +		}
    +	}
    +};
    +
    +/**
    +* Returns a String representation of the Object.
    +* @method toString
    +* @return {String}	The string representation of the Module
    +*/
    +YAHOO.widget.Module.prototype.toString = function() {
    +	return "Module " + this.id;
    +};
    +
    +/**
    +* Overlay is a Module that is absolutely positioned above the page flow. It has convenience methods for positioning and sizing, as well as options for controlling zIndex and constraining the Overlay's position to the current visible viewport. Overlay also contains a dynamicly generated IFRAME which is placed beneath it for Internet Explorer 6 and 5.x so that it will be properly rendered above SELECT elements.
    +* @class Overlay
    +* @namespace YAHOO.widget
    +* @extends YAHOO.widget.Module
    +* @param {String}	el	The element ID representing the Overlay <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Overlay
    +* @param {Object}	userConfig	The configuration object literal containing 10/23/2006the configuration that should be set for this Overlay. See configuration documentation for more details.
    +* @constructor
    +*/
    +YAHOO.widget.Overlay = function(el, userConfig) {
    +	YAHOO.widget.Overlay.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Overlay, YAHOO.widget.Module);
    +
    +/**
    +* The URL that will be placed in the iframe
    +* @property YAHOO.widget.Overlay.IFRAME_SRC
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.IFRAME_SRC = "javascript:false;"
    +
    +/**
    +* Constant representing the top left corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.TOP_LEFT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.TOP_LEFT = "tl";
    +
    +/**
    +* Constant representing the top right corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.TOP_RIGHT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.TOP_RIGHT = "tr";
    +
    +/**
    +* Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.BOTTOM_LEFT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.BOTTOM_LEFT = "bl";
    +
    +/**
    +* Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.BOTTOM_RIGHT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.BOTTOM_RIGHT = "br";
    +
    +/**
    +* Constant representing the default CSS class used for an Overlay
    +* @property YAHOO.widget.Overlay.CSS_OVERLAY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.CSS_OVERLAY = "overlay";
    +
    +/**
    +* The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +* @method init
    +* @param {String}	el	The element ID representing the Overlay <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Overlay
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Overlay.prototype.init = function(el, userConfig) {
    +	YAHOO.widget.Overlay.superclass.init.call(this, el/*, userConfig*/);  // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level
    +
    +	this.beforeInitEvent.fire(YAHOO.widget.Overlay);
    +
    +	YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Overlay.CSS_OVERLAY);
    +
    +	if (userConfig) {
    +		this.cfg.applyConfig(userConfig, true);
    +	}
    +
    +	if (this.platform == "mac" && this.browser == "gecko") {
    +		if (! YAHOO.util.Config.alreadySubscribed(this.showEvent,this.showMacGeckoScrollbars,this)) {
    +			this.showEvent.subscribe(this.showMacGeckoScrollbars,this,true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent,this.hideMacGeckoScrollbars,this)) {
    +			this.hideEvent.subscribe(this.hideMacGeckoScrollbars,this,true);
    +		}
    +	}
    +
    +	this.initEvent.fire(YAHOO.widget.Overlay);
    +};
    +
    +/**
    +* Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
    +* @method initEvents
    +*/
    +YAHOO.widget.Overlay.prototype.initEvents = function() {
    +	YAHOO.widget.Overlay.superclass.initEvents.call(this);
    +
    +	/**
    +	* CustomEvent fired before the Overlay is moved.
    +	* @event beforeMoveEvent
    +	* @param {Number} x	x coordinate
    +	* @param {Number} y	y coordinate
    +	*/
    +	this.beforeMoveEvent = new YAHOO.util.CustomEvent("beforeMove", this);
    +
    +	/**
    +	* CustomEvent fired after the Overlay is moved.
    +	* @event moveEvent
    +	* @param {Number} x	x coordinate
    +	* @param {Number} y	y coordinate
    +	*/
    +	this.moveEvent = new YAHOO.util.CustomEvent("move", this);
    +};
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.Overlay.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.Overlay.superclass.initDefaultConfig.call(this);
    +
    +	// Add overlay config properties //
    +
    +	/**
    +	* The absolute x-coordinate position of the Overlay
    +	* @config x
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("x", { handler:this.configX, validator:this.cfg.checkNumber, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* The absolute y-coordinate position of the Overlay
    +	* @config y
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("y", { handler:this.configY, validator:this.cfg.checkNumber, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* An array with the absolute x and y positions of the Overlay
    +	* @config xy
    +	* @type Number[]
    +	* @default null
    +	*/
    +	this.cfg.addProperty("xy",{ handler:this.configXY, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* The array of context arguments for context-sensitive positioning. The format is: [id or element, element corner, context corner]. For example, setting this property to ["img1", "tl", "bl"] would align the Overlay's top left corner to the context element's bottom left corner.
    +	* @config context
    +	* @type Array
    +	* @default null
    +	*/
    +	this.cfg.addProperty("context",	{ handler:this.configContext, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* True if the Overlay should be anchored to the center of the viewport.
    +	* @config fixedcenter
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("fixedcenter", { value:false, handler:this.configFixedCenter, validator:this.cfg.checkBoolean, supercedes:["iframe","visible"] } );
    +
    +	/**
    +	* CSS width of the Overlay.
    +	* @config width
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("width", { handler:this.configWidth, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* CSS height of the Overlay.
    +	* @config height
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("height", { handler:this.configHeight, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* CSS z-index of the Overlay.
    +	* @config zIndex
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("zIndex", { value:null, handler:this.configzIndex } );
    +
    +	/**
    +	* True if the Overlay should be prevented from being positioned out of the viewport.
    +	* @config constraintoviewport
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("constraintoviewport", { value:false, handler:this.configConstrainToViewport, validator:this.cfg.checkBoolean, supercedes:["iframe","x","y","xy"] } );
    +
    +	/**
    +	* True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below).
    +	* @config iframe
    +	* @type Boolean
    +	* @default true for IE6 and below, false for all others
    +	*/
    +	this.cfg.addProperty("iframe", { value:(this.browser == "ie" ? true : false), handler:this.configIframe, validator:this.cfg.checkBoolean, supercedes:["zIndex"] } );
    +};
    +
    +/**
    +* Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
    +* @method moveTo
    +* @param {Number}	x	The Overlay's new x position
    +* @param {Number}	y	The Overlay's new y position
    +*/
    +YAHOO.widget.Overlay.prototype.moveTo = function(x, y) {
    +	this.cfg.setProperty("xy",[x,y]);
    +};
    +
    +/**
    +* Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where
    +* scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435
    +* @method hideMacGeckoScrollbars
    +*/
    +YAHOO.widget.Overlay.prototype.hideMacGeckoScrollbars = function() {
    +	YAHOO.util.Dom.removeClass(this.element, "show-scrollbars");
    +	YAHOO.util.Dom.addClass(this.element, "hide-scrollbars");
    +};
    +
    +/**
    +* Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where
    +* scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435
    +* @method showMacGeckoScrollbars
    +*/
    +YAHOO.widget.Overlay.prototype.showMacGeckoScrollbars = function() {
    +	YAHOO.util.Dom.removeClass(this.element, "hide-scrollbars");
    +	YAHOO.util.Dom.addClass(this.element, "show-scrollbars");
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent.
    +* @method configVisible
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configVisible = function(type, args, obj) {
    +	var visible = args[0];
    +
    +	var currentVis = YAHOO.util.Dom.getStyle(this.element, "visibility");
    +
    +	if (currentVis == "inherit") {
    +		var e = this.element.parentNode;
    +		while (e.nodeType != 9 && e.nodeType != 11) {
    +			currentVis = YAHOO.util.Dom.getStyle(e, "visibility");
    +			if (currentVis != "inherit") { break; }
    +			e = e.parentNode;
    +		}
    +		if (currentVis == "inherit") {
    +			currentVis = "visible";
    +		}
    +	}
    +
    +	var effect = this.cfg.getProperty("effect");
    +
    +	var effectInstances = [];
    +	if (effect) {
    +		if (effect instanceof Array) {
    +			for (var i=0;i<effect.length;i++) {
    +				var eff = effect[i];
    +				effectInstances[effectInstances.length] = eff.effect(this, eff.duration);
    +			}
    +		} else {
    +			effectInstances[effectInstances.length] = effect.effect(this, effect.duration);
    +		}
    +	}
    +
    +	var isMacGecko = (this.platform == "mac" && this.browser == "gecko");
    +
    +	if (visible) { // Show
    +		if (isMacGecko) {
    +			this.showMacGeckoScrollbars();
    +		}
    +
    +		if (effect) { // Animate in
    +			if (visible) { // Animate in if not showing
    +				if (currentVis != "visible" || currentVis === "") {
    +					this.beforeShowEvent.fire();
    +					for (var j=0;j<effectInstances.length;j++) {
    +						var ei = effectInstances[j];
    +						if (j === 0 && ! YAHOO.util.Config.alreadySubscribed(ei.animateInCompleteEvent,this.showEvent.fire,this.showEvent)) {
    +							ei.animateInCompleteEvent.subscribe(this.showEvent.fire,this.showEvent,true); // Delegate showEvent until end of animateInComplete
    +						}
    +						ei.animateIn();
    +					}
    +				}
    +			}
    +		} else { // Show
    +			if (currentVis != "visible" || currentVis === "") {
    +				this.beforeShowEvent.fire();
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "visible");
    +				this.cfg.refireEvent("iframe");
    +				this.showEvent.fire();
    +			}
    +		}
    +
    +	} else { // Hide
    +		if (isMacGecko) {
    +			this.hideMacGeckoScrollbars();
    +		}
    +
    +		if (effect) { // Animate out if showing
    +			if (currentVis == "visible") {
    +				this.beforeHideEvent.fire();
    +				for (var k=0;k<effectInstances.length;k++) {
    +					var h = effectInstances[k];
    +					if (k === 0 && ! YAHOO.util.Config.alreadySubscribed(h.animateOutCompleteEvent,this.hideEvent.fire,this.hideEvent)) {
    +						h.animateOutCompleteEvent.subscribe(this.hideEvent.fire,this.hideEvent,true); // Delegate hideEvent until end of animateOutComplete
    +					}
    +					h.animateOut();
    +				}
    +			} else if (currentVis === "") {
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");
    +			}
    +		} else { // Simple hide
    +			if (currentVis == "visible" || currentVis === "") {
    +				this.beforeHideEvent.fire();
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");
    +				this.cfg.refireEvent("iframe");
    +				this.hideEvent.fire();
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* Center event handler used for centering on scroll/resize, but only if the Overlay is visible
    +* @method doCenterOnDOMEvent
    +*/
    +YAHOO.widget.Overlay.prototype.doCenterOnDOMEvent = function() {
    +	if (this.cfg.getProperty("visible")) {
    +		this.center();
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "fixedcenter" property is changed.
    +* @method configFixedCenter
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configFixedCenter = function(type, args, obj) {
    +	var val = args[0];
    +
    +	if (val) {
    +		this.center();
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(this.beforeShowEvent, this.center, this)) {
    +			this.beforeShowEvent.subscribe(this.center, this, true);
    +		}
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowResizeEvent, this.doCenterOnDOMEvent, this)) {
    +			YAHOO.widget.Overlay.windowResizeEvent.subscribe(this.doCenterOnDOMEvent, this, true);
    +		}
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowScrollEvent, this.doCenterOnDOMEvent, this)) {
    +			YAHOO.widget.Overlay.windowScrollEvent.subscribe( this.doCenterOnDOMEvent, this, true);
    +		}
    +	} else {
    +		YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this);
    +		YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "height" property is changed.
    +* @method configHeight
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configHeight = function(type, args, obj) {
    +	var height = args[0];
    +	var el = this.element;
    +	YAHOO.util.Dom.setStyle(el, "height", height);
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "width" property is changed.
    +* @method configWidth
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configWidth = function(type, args, obj) {
    +	var width = args[0];
    +	var el = this.element;
    +	YAHOO.util.Dom.setStyle(el, "width", width);
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "zIndex" property is changed.
    +* @method configzIndex
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configzIndex = function(type, args, obj) {
    +	var zIndex = args[0];
    +
    +	var el = this.element;
    +
    +	if (! zIndex) {
    +		zIndex = YAHOO.util.Dom.getStyle(el, "zIndex");
    +		if (! zIndex || isNaN(zIndex)) {
    +			zIndex = 0;
    +		}
    +	}
    +
    +	if (this.iframe) {
    +		if (zIndex <= 0) {
    +			zIndex = 1;
    +		}
    +		YAHOO.util.Dom.setStyle(this.iframe, "zIndex", (zIndex-1));
    +	}
    +
    +	YAHOO.util.Dom.setStyle(el, "zIndex", zIndex);
    +	this.cfg.setProperty("zIndex", zIndex, true);
    +};
    +
    +/**
    +* The default event handler fired when the "xy" property is changed.
    +* @method configXY
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configXY = function(type, args, obj) {
    +	var pos = args[0];
    +	var x = pos[0];
    +	var y = pos[1];
    +
    +	this.cfg.setProperty("x", x);
    +	this.cfg.setProperty("y", y);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x,y]);
    +};
    +
    +/**
    +* The default event handler fired when the "x" property is changed.
    +* @method configX
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configX = function(type, args, obj) {
    +	var x = args[0];
    +	var y = this.cfg.getProperty("y");
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	YAHOO.util.Dom.setX(this.element, x, true);
    +
    +	this.cfg.setProperty("xy", [x, y], true);
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x, y]);
    +};
    +
    +/**
    +* The default event handler fired when the "y" property is changed.
    +* @method configY
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configY = function(type, args, obj) {
    +	var x = this.cfg.getProperty("x");
    +	var y = args[0];
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	YAHOO.util.Dom.setY(this.element, y, true);
    +
    +	this.cfg.setProperty("xy", [x, y], true);
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x, y]);
    +};
    +
    +/**
    +* Shows the iframe shim, if it has been enabled
    +* @method showIframe
    +*/
    +YAHOO.widget.Overlay.prototype.showIframe = function() {
    +	if (this.iframe) {
    +		this.iframe.style.display = "block";
    +	}
    +};
    +
    +/**
    +* Hides the iframe shim, if it has been enabled
    +* @method hideIframe
    +*/
    +YAHOO.widget.Overlay.prototype.hideIframe = function() {
    +	if (this.iframe) {
    +		this.iframe.style.display = "none";
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "iframe" property is changed.
    +* @method configIframe
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configIframe = function(type, args, obj) {
    +
    +	var val = args[0];
    +
    +	if (val) { // IFRAME shim is enabled
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(this.showEvent, this.showIframe, this)) {
    +			this.showEvent.subscribe(this.showIframe, this, true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent, this.hideIframe, this)) {
    +			this.hideEvent.subscribe(this.hideIframe, this, true);
    +		}
    +
    +		var x = this.cfg.getProperty("x");
    +		var y = this.cfg.getProperty("y");
    +
    +		if (! x || ! y) {
    +			this.syncPosition();
    +			x = this.cfg.getProperty("x");
    +			y = this.cfg.getProperty("y");
    +		}
    +
    +		if (! isNaN(x) && ! isNaN(y)) {
    +			if (! this.iframe) {
    +				this.iframe = document.createElement("iframe");
    +				if (this.isSecure) {
    +					this.iframe.src = this.imageRoot + YAHOO.widget.Overlay.IFRAME_SRC;
    +				}
    +
    +				var parent = this.element.parentNode;
    +				if (parent) {
    +					parent.appendChild(this.iframe);
    +				} else {
    +					document.body.appendChild(this.iframe);
    +				}
    +
    +				YAHOO.util.Dom.setStyle(this.iframe, "position", "absolute");
    +				YAHOO.util.Dom.setStyle(this.iframe, "border", "none");
    +				YAHOO.util.Dom.setStyle(this.iframe, "margin", "0");
    +				YAHOO.util.Dom.setStyle(this.iframe, "padding", "0");
    +				YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
    +				if (this.cfg.getProperty("visible")) {
    +					this.showIframe();
    +				} else {
    +					this.hideIframe();
    +				}
    +			}
    +
    +			var iframeDisplay = YAHOO.util.Dom.getStyle(this.iframe, "display");
    +
    +			if (iframeDisplay == "none") {
    +				this.iframe.style.display = "block";
    +			}
    +
    +			YAHOO.util.Dom.setXY(this.iframe, [x,y]);
    +
    +			var width = this.element.clientWidth;
    +			var height = this.element.clientHeight;
    +
    +			YAHOO.util.Dom.setStyle(this.iframe, "width", (width+2) + "px");
    +			YAHOO.util.Dom.setStyle(this.iframe, "height", (height+2) + "px");
    +
    +			if (iframeDisplay == "none") {
    +				this.iframe.style.display = "none";
    +			}
    +		}
    +	} else {
    +		if (this.iframe) {
    +			this.iframe.style.display = "none";
    +		}
    +		this.showEvent.unsubscribe(this.showIframe, this);
    +		this.hideEvent.unsubscribe(this.hideIframe, this);
    +	}
    +};
    +
    +
    +/**
    +* The default event handler fired when the "constraintoviewport" property is changed.
    +* @method configConstrainToViewport
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configConstrainToViewport = function(type, args, obj) {
    +	var val = args[0];
    +	if (val) {
    +		if (! YAHOO.util.Config.alreadySubscribed(this.beforeMoveEvent, this.enforceConstraints, this)) {
    +			this.beforeMoveEvent.subscribe(this.enforceConstraints, this, true);
    +		}
    +	} else {
    +		this.beforeMoveEvent.unsubscribe(this.enforceConstraints, this);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "context" property is changed.
    +* @method configContext
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configContext = function(type, args, obj) {
    +	var contextArgs = args[0];
    +
    +	if (contextArgs) {
    +		var contextEl = contextArgs[0];
    +		var elementMagnetCorner = contextArgs[1];
    +		var contextMagnetCorner = contextArgs[2];
    +
    +		if (contextEl) {
    +			if (typeof contextEl == "string") {
    +				this.cfg.setProperty("context", [document.getElementById(contextEl),elementMagnetCorner,contextMagnetCorner], true);
    +			}
    +
    +			if (elementMagnetCorner && contextMagnetCorner) {
    +				this.align(elementMagnetCorner, contextMagnetCorner);
    +			}
    +		}
    +	}
    +};
    +
    +
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT.
    +* @method align
    +* @param {String} elementAlign		The String representing the corner of the Overlay that should be aligned to the context element
    +* @param {String} contextAlign		The corner of the context element that the elementAlign corner should stick to.
    +*/
    +YAHOO.widget.Overlay.prototype.align = function(elementAlign, contextAlign) {
    +	var contextArgs = this.cfg.getProperty("context");
    +	if (contextArgs) {
    +		var context = contextArgs[0];
    +
    +		var element = this.element;
    +		var me = this;
    +
    +		if (! elementAlign) {
    +			elementAlign = contextArgs[1];
    +		}
    +
    +		if (! contextAlign) {
    +			contextAlign = contextArgs[2];
    +		}
    +
    +		if (element && context) {
    +			var elementRegion = YAHOO.util.Dom.getRegion(element);
    +			var contextRegion = YAHOO.util.Dom.getRegion(context);
    +
    +			var doAlign = function(v,h) {
    +				switch (elementAlign) {
    +					case YAHOO.widget.Overlay.TOP_LEFT:
    +						me.moveTo(h,v);
    +						break;
    +					case YAHOO.widget.Overlay.TOP_RIGHT:
    +						me.moveTo(h-element.offsetWidth,v);
    +						break;
    +					case YAHOO.widget.Overlay.BOTTOM_LEFT:
    +						me.moveTo(h,v-element.offsetHeight);
    +						break;
    +					case YAHOO.widget.Overlay.BOTTOM_RIGHT:
    +						me.moveTo(h-element.offsetWidth,v-element.offsetHeight);
    +						break;
    +				}
    +			};
    +
    +			switch (contextAlign) {
    +				case YAHOO.widget.Overlay.TOP_LEFT:
    +					doAlign(contextRegion.top, contextRegion.left);
    +					break;
    +				case YAHOO.widget.Overlay.TOP_RIGHT:
    +					doAlign(contextRegion.top, contextRegion.right);
    +					break;
    +				case YAHOO.widget.Overlay.BOTTOM_LEFT:
    +					doAlign(contextRegion.bottom, contextRegion.left);
    +					break;
    +				case YAHOO.widget.Overlay.BOTTOM_RIGHT:
    +					doAlign(contextRegion.bottom, contextRegion.right);
    +					break;
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
    +* @method enforceConstraints
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.enforceConstraints = function(type, args, obj) {
    +	var pos = args[0];
    +
    +	var x = pos[0];
    +	var y = pos[1];
    +
    +	var offsetHeight = this.element.offsetHeight;
    +	var offsetWidth = this.element.offsetWidth;
    +
    +	var viewPortWidth = YAHOO.util.Dom.getViewportWidth();
    +	var viewPortHeight = YAHOO.util.Dom.getViewportHeight();
    +
    +	var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +	var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +
    +	var topConstraint = scrollY + 10;
    +	var leftConstraint = scrollX + 10;
    +	var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10;
    +	var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10;
    +
    +	if (x < leftConstraint) {
    +		x = leftConstraint;
    +	} else if (x > rightConstraint) {
    +		x = rightConstraint;
    +	}
    +
    +	if (y < topConstraint) {
    +		y = topConstraint;
    +	} else if (y > bottomConstraint) {
    +		y = bottomConstraint;
    +	}
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +	this.cfg.setProperty("xy", [x,y], true);
    +};
    +
    +/**
    +* Centers the container in the viewport.
    +* @method center
    +*/
    +YAHOO.widget.Overlay.prototype.center = function() {
    +	var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +	var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +
    +	var viewPortWidth = YAHOO.util.Dom.getClientWidth();
    +	var viewPortHeight = YAHOO.util.Dom.getClientHeight();
    +
    +	var elementWidth = this.element.offsetWidth;
    +	var elementHeight = this.element.offsetHeight;
    +
    +	var x = (viewPortWidth / 2) - (elementWidth / 2) + scrollX;
    +	var y = (viewPortHeight / 2) - (elementHeight / 2) + scrollY;
    +
    +	this.cfg.setProperty("xy", [parseInt(x, 10), parseInt(y, 10)]);
    +
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop.
    +* @method syncPosition
    +*/
    +YAHOO.widget.Overlay.prototype.syncPosition = function() {
    +	var pos = YAHOO.util.Dom.getXY(this.element);
    +	this.cfg.setProperty("x", pos[0], true);
    +	this.cfg.setProperty("y", pos[1], true);
    +	this.cfg.setProperty("xy", pos, true);
    +};
    +
    +/**
    +* Event handler fired when the resize monitor element is resized.
    +* @method onDomResize
    +* @param {DOMEvent} e	The resize DOM event
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.Overlay.prototype.onDomResize = function(e, obj) {
    +	YAHOO.widget.Overlay.superclass.onDomResize.call(this, e, obj);
    +	var me = this;
    +	setTimeout(function() {
    +		me.syncPosition();
    +		me.cfg.refireEvent("iframe");
    +		me.cfg.refireEvent("context");
    +	}, 0);
    +};
    +
    +/**
    +* Removes the Overlay element from the DOM and sets all child elements to null.
    +* @method destroy
    +*/
    +YAHOO.widget.Overlay.prototype.destroy = function() {
    +	if (this.iframe) {
    +		this.iframe.parentNode.removeChild(this.iframe);
    +	}
    +
    +	this.iframe = null;
    +
    +	YAHOO.widget.Overlay.superclass.destroy.call(this);
    +};
    +
    +/**
    +* Returns a String representation of the object.
    +* @method toString
    +* @return {String} The string representation of the Overlay.
    +*/
    +YAHOO.widget.Overlay.prototype.toString = function() {
    +	return "Overlay " + this.id;
    +};
    +
    +/**
    +* A singleton CustomEvent used for reacting to the DOM event for window scroll
    +* @event YAHOO.widget.Overlay.windowScrollEvent
    +*/
    +YAHOO.widget.Overlay.windowScrollEvent = new YAHOO.util.CustomEvent("windowScroll");
    +
    +/**
    +* A singleton CustomEvent used for reacting to the DOM event for window resize
    +* @event YAHOO.widget.Overlay.windowResizeEvent
    +*/
    +YAHOO.widget.Overlay.windowResizeEvent = new YAHOO.util.CustomEvent("windowResize");
    +
    +/**
    +* The DOM event handler used to fire the CustomEvent for window scroll
    +* @method YAHOO.widget.Overlay.windowScrollHandler
    +* @static
    +* @param {DOMEvent} e The DOM scroll event
    +*/
    +YAHOO.widget.Overlay.windowScrollHandler = function(e) {
    +	if (YAHOO.widget.Module.prototype.browser == "ie" || YAHOO.widget.Module.prototype.browser == "ie7") {
    +		if (! window.scrollEnd) {
    +			window.scrollEnd = -1;
    +		}
    +		clearTimeout(window.scrollEnd);
    +		window.scrollEnd = setTimeout(function() { YAHOO.widget.Overlay.windowScrollEvent.fire(); }, 1);
    +	} else {
    +		YAHOO.widget.Overlay.windowScrollEvent.fire();
    +	}
    +};
    +
    +/**
    +* The DOM event handler used to fire the CustomEvent for window resize
    +* @method YAHOO.widget.Overlay.windowResizeHandler
    +* @static
    +* @param {DOMEvent} e The DOM resize event
    +*/
    +YAHOO.widget.Overlay.windowResizeHandler = function(e) {
    +	if (YAHOO.widget.Module.prototype.browser == "ie" || YAHOO.widget.Module.prototype.browser == "ie7") {
    +		if (! window.resizeEnd) {
    +			window.resizeEnd = -1;
    +		}
    +		clearTimeout(window.resizeEnd);
    +		window.resizeEnd = setTimeout(function() { YAHOO.widget.Overlay.windowResizeEvent.fire(); }, 100);
    +	} else {
    +		YAHOO.widget.Overlay.windowResizeEvent.fire();
    +	}
    +};
    +
    +/**
    +* A boolean that indicated whether the window resize and scroll events have already been subscribed to.
    +* @property YAHOO.widget.Overlay._initialized
    +* @private
    +* @type Boolean
    +*/
    +YAHOO.widget.Overlay._initialized = null;
    +
    +if (YAHOO.widget.Overlay._initialized === null) {
    +	YAHOO.util.Event.addListener(window, "scroll", YAHOO.widget.Overlay.windowScrollHandler);
    +	YAHOO.util.Event.addListener(window, "resize", YAHOO.widget.Overlay.windowResizeHandler);
    +
    +	YAHOO.widget.Overlay._initialized = true;
    +}
    +
    +/**
    +* OverlayManager is used for maintaining the focus status of multiple Overlays.* @namespace YAHOO.widget
    +* @namespace YAHOO.widget
    +* @class OverlayManager
    +* @constructor
    +* @param {Array}	overlays	Optional. A collection of Overlays to register with the manager.
    +* @param {Object}	userConfig		The object literal representing the user configuration of the OverlayManager
    +*/
    +YAHOO.widget.OverlayManager = function(userConfig) {
    +	this.init(userConfig);
    +};
    +
    +/**
    +* The CSS class representing a focused Overlay
    +* @property YAHOO.widget.OverlayManager.CSS_FOCUSED
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.OverlayManager.CSS_FOCUSED = "focused";
    +
    +YAHOO.widget.OverlayManager.prototype = {
    +	/**
    +	* The class's constructor function
    +	* @property contructor
    +	* @type Function
    +	*/
    +	constructor : YAHOO.widget.OverlayManager,
    +
    +	/**
    +	* The array of Overlays that are currently registered
    +	* @property overlays
    +	* @type YAHOO.widget.Overlay[]
    +	*/
    +	overlays : null,
    +
    +	/**
    +	* Initializes the default configuration of the OverlayManager
    +	* @method initDefaultConfig
    +	*/
    +	initDefaultConfig : function() {
    +		/**
    +		* The collection of registered Overlays in use by the OverlayManager
    +		* @config overlays
    +		* @type YAHOO.widget.Overlay[]
    +		* @default null
    +		*/
    +		this.cfg.addProperty("overlays", { suppressEvent:true } );
    +
    +		/**
    +		* The default DOM event that should be used to focus an Overlay
    +		* @config focusevent
    +		* @type String
    +		* @default "mousedown"
    +		*/
    +		this.cfg.addProperty("focusevent", { value:"mousedown" } );
    +	},
    +
    +	/**
    +	* Initializes the OverlayManager
    +	* @method init
    +	* @param {YAHOO.widget.Overlay[]}	overlays	Optional. A collection of Overlays to register with the manager.
    +	* @param {Object}	userConfig		The object literal representing the user configuration of the OverlayManager
    +	*/
    +	init : function(userConfig) {
    +		/**
    +		* The OverlayManager's Config object used for monitoring configuration properties.
    +		* @property cfg
    +		* @type YAHOO.util.Config
    +		*/
    +		this.cfg = new YAHOO.util.Config(this);
    +
    +		this.initDefaultConfig();
    +
    +		if (userConfig) {
    +			this.cfg.applyConfig(userConfig, true);
    +		}
    +		this.cfg.fireQueue();
    +
    +		/**
    +		* The currently activated Overlay
    +		* @property activeOverlay
    +		* @private
    +		* @type YAHOO.widget.Overlay
    +		*/
    +		var activeOverlay = null;
    +
    +		/**
    +		* Returns the currently focused Overlay
    +		* @method getActive
    +		* @return {YAHOO.widget.Overlay}	The currently focused Overlay
    +		*/
    +		this.getActive = function() {
    +			return activeOverlay;
    +		};
    +
    +		/**
    +		* Focuses the specified Overlay
    +		* @method focus
    +		* @param {YAHOO.widget.Overlay} overlay	The Overlay to focus
    +		* @param {String} overlay	The id of the Overlay to focus
    +		*/
    +		this.focus = function(overlay) {
    +			var o = this.find(overlay);
    +			if (o) {
    +				this.blurAll();
    +				activeOverlay = o;
    +				YAHOO.util.Dom.addClass(activeOverlay.element, YAHOO.widget.OverlayManager.CSS_FOCUSED);
    +				this.overlays.sort(this.compareZIndexDesc);
    +				var topZIndex = YAHOO.util.Dom.getStyle(this.overlays[0].element, "zIndex");
    +				if (! isNaN(topZIndex) && this.overlays[0] != overlay) {
    +					activeOverlay.cfg.setProperty("zIndex", (parseInt(topZIndex, 10) + 2));
    +				}
    +				this.overlays.sort(this.compareZIndexDesc);
    +			}
    +		};
    +
    +		/**
    +		* Removes the specified Overlay from the manager
    +		* @method remove
    +		* @param {YAHOO.widget.Overlay}	overlay	The Overlay to remove
    +		* @param {String} overlay	The id of the Overlay to remove
    +		*/
    +		this.remove = function(overlay) {
    +			var o = this.find(overlay);
    +			if (o) {
    +				var originalZ = YAHOO.util.Dom.getStyle(o.element, "zIndex");
    +				o.cfg.setProperty("zIndex", -1000, true);
    +				this.overlays.sort(this.compareZIndexDesc);
    +				this.overlays = this.overlays.slice(0, this.overlays.length-1);
    +				o.cfg.setProperty("zIndex", originalZ, true);
    +
    +				o.cfg.setProperty("manager", null);
    +				o.focusEvent = null;
    +				o.blurEvent = null;
    +				o.focus = null;
    +				o.blur = null;
    +			}
    +		};
    +
    +		/**
    +		* Removes focus from all registered Overlays in the manager
    +		* @method blurAll
    +		*/
    +		this.blurAll = function() {
    +			activeOverlay = null;
    +			for (var o=0;o<this.overlays.length;o++) {
    +				YAHOO.util.Dom.removeClass(this.overlays[o].element, YAHOO.widget.OverlayManager.CSS_FOCUSED);
    +			}
    +		};
    +
    +		var overlays = this.cfg.getProperty("overlays");
    +
    +		if (! this.overlays) {
    +			this.overlays = [];
    +		}
    +
    +		if (overlays) {
    +			this.register(overlays);
    +			this.overlays.sort(this.compareZIndexDesc);
    +		}
    +	},
    +
    +	/**
    +	* Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for focus and blur, along with CustomEvents for each.
    +	* @method register
    +	* @param {YAHOO.widget.Overlay}	overlay		An Overlay to register with the manager.
    +	* @param {YAHOO.widget.Overlay[]}	overlay		An array of Overlays to register with the manager.
    +	* @return	{Boolean}	True if any Overlays are registered.
    +	*/
    +	register : function(overlay) {
    +		if (overlay instanceof YAHOO.widget.Overlay) {
    +			overlay.cfg.addProperty("manager", { value:this } );
    +
    +			overlay.focusEvent = new YAHOO.util.CustomEvent("focus");
    +			overlay.blurEvent = new YAHOO.util.CustomEvent("blur");
    +
    +			var mgr=this;
    +
    +			overlay.focus = function() {
    +				mgr.focus(this);
    +				this.focusEvent.fire();
    +			};
    +
    +			overlay.blur = function() {
    +				mgr.blurAll();
    +				this.blurEvent.fire();
    +			};
    +
    +			var focusOnDomEvent = function(e,obj) {
    +				overlay.focus();
    +			};
    +
    +			var focusevent = this.cfg.getProperty("focusevent");
    +			YAHOO.util.Event.addListener(overlay.element,focusevent,focusOnDomEvent,this,true);
    +
    +			var zIndex = YAHOO.util.Dom.getStyle(overlay.element, "zIndex");
    +			if (! isNaN(zIndex)) {
    +				overlay.cfg.setProperty("zIndex", parseInt(zIndex, 10));
    +			} else {
    +				overlay.cfg.setProperty("zIndex", 0);
    +			}
    +
    +			this.overlays.push(overlay);
    +			return true;
    +		} else if (overlay instanceof Array) {
    +			var regcount = 0;
    +			for (var i=0;i<overlay.length;i++) {
    +				if (this.register(overlay[i])) {
    +					regcount++;
    +				}
    +			}
    +			if (regcount > 0) {
    +				return true;
    +			}
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Attempts to locate an Overlay by instance or ID.
    +	* @method find
    +	* @param {YAHOO.widget.Overlay}	overlay		An Overlay to locate within the manager
    +	* @param {String}	overlay		An Overlay id to locate within the manager
    +	* @return	{YAHOO.widget.Overlay}	The requested Overlay, if found, or null if it cannot be located.
    +	*/
    +	find : function(overlay) {
    +		if (overlay instanceof YAHOO.widget.Overlay) {
    +			for (var o=0;o<this.overlays.length;o++) {
    +				if (this.overlays[o] == overlay) {
    +					return this.overlays[o];
    +				}
    +			}
    +		} else if (typeof overlay == "string") {
    +			for (var p=0;p<this.overlays.length;p++) {
    +				if (this.overlays[p].id == overlay) {
    +					return this.overlays[p];
    +				}
    +			}
    +		}
    +		return null;
    +	},
    +
    +	/**
    +	* Used for sorting the manager's Overlays by z-index.
    +	* @method compareZIndexDesc
    +	* @private
    +	* @return {Number}	0, 1, or -1, depending on where the Overlay should fall in the stacking order.
    +	*/
    +	compareZIndexDesc : function(o1, o2) {
    +		var zIndex1 = o1.cfg.getProperty("zIndex");
    +		var zIndex2 = o2.cfg.getProperty("zIndex");
    +
    +		if (zIndex1 > zIndex2) {
    +			return -1;
    +		} else if (zIndex1 < zIndex2) {
    +			return 1;
    +		} else {
    +			return 0;
    +		}
    +	},
    +
    +	/**
    +	* Shows all Overlays in the manager.
    +	* @method showAll
    +	*/
    +	showAll : function() {
    +		for (var o=0;o<this.overlays.length;o++) {
    +			this.overlays[o].show();
    +		}
    +	},
    +
    +	/**
    +	* Hides all Overlays in the manager.
    +	* @method hideAll
    +	*/
    +	hideAll : function() {
    +		for (var o=0;o<this.overlays.length;o++) {
    +			this.overlays[o].hide();
    +		}
    +	},
    +
    +
    +	/**
    +	* Returns a string representation of the object.
    +	* @method toString
    +	* @return {String}	The string representation of the OverlayManager
    +	*/
    +	toString : function() {
    +		return "OverlayManager";
    +	}
    +
    +};
    +
    +/**
    +* KeyListener is a utility that provides an easy interface for listening for keydown/keyup events fired against DOM elements.
    +* @namespace YAHOO.util
    +* @class KeyListener
    +* @constructor
    +* @param {HTMLElement}	attachTo	The element or element ID to which the key event should be attached
    +* @param {String}	attachTo	The element or element ID to which the key event should be attached
    +* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +* @param {Function}	handler		The CustomEvent handler to fire when the key event is detected
    +* @param {Object}	handler		An object literal representing the handler.
    +* @param {String}	event		Optional. The event (keydown or keyup) to listen for. Defaults automatically to keydown.
    +*/
    +YAHOO.util.KeyListener = function(attachTo, keyData, handler, event) {
    +	if (! event) {
    +		event = YAHOO.util.KeyListener.KEYDOWN;
    +	}
    +
    +	/**
    +	* The CustomEvent fired internally when a key is pressed
    +	* @event keyEvent
    +	* @private
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	var keyEvent = new YAHOO.util.CustomEvent("keyPressed");
    +
    +	/**
    +	* The CustomEvent fired when the KeyListener is enabled via the enable() function
    +	* @event enabledEvent
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	this.enabledEvent = new YAHOO.util.CustomEvent("enabled");
    +
    +	/**
    +	* The CustomEvent fired when the KeyListener is disabled via the disable() function
    +	* @event disabledEvent
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	this.disabledEvent = new YAHOO.util.CustomEvent("disabled");
    +
    +	if (typeof attachTo == 'string') {
    +		attachTo = document.getElementById(attachTo);
    +	}
    +
    +	if (typeof handler == 'function') {
    +		keyEvent.subscribe(handler);
    +	} else {
    +		keyEvent.subscribe(handler.fn, handler.scope, handler.correctScope);
    +	}
    +
    +	/**
    +	* Handles the key event when a key is pressed.
    +	* @method handleKeyPress
    +	* @param {DOMEvent} e	The keypress DOM event
    +	* @param {Object}	obj	The DOM event scope object
    +	* @private
    +	*/
    +	function handleKeyPress(e, obj) {
    +		if (! keyData.shift) {
    +			keyData.shift = false;
    +		}
    +		if (! keyData.alt) {
    +			keyData.alt = false;
    +		}
    +		if (! keyData.ctrl) {
    +			keyData.ctrl = false;
    +		}
    +
    +		// check held down modifying keys first
    +		if (e.shiftKey == keyData.shift &&
    +			e.altKey   == keyData.alt &&
    +			e.ctrlKey  == keyData.ctrl) { // if we pass this, all modifiers match
    +
    +			var dataItem;
    +			var keyPressed;
    +
    +			if (keyData.keys instanceof Array) {
    +				for (var i=0;i<keyData.keys.length;i++) {
    +					dataItem = keyData.keys[i];
    +
    +					if (dataItem == e.charCode ) {
    +						keyEvent.fire(e.charCode, e);
    +						break;
    +					} else if (dataItem == e.keyCode) {
    +						keyEvent.fire(e.keyCode, e);
    +						break;
    +					}
    +				}
    +			} else {
    +				dataItem = keyData.keys;
    +
    +				if (dataItem == e.charCode ) {
    +					keyEvent.fire(e.charCode, e);
    +				} else if (dataItem == e.keyCode) {
    +					keyEvent.fire(e.keyCode, e);
    +				}
    +			}
    +		}
    +	}
    +
    +	/**
    +	* Enables the KeyListener by attaching the DOM event listeners to the target DOM element
    +	* @method enable
    +	*/
    +	this.enable = function() {
    +		if (! this.enabled) {
    +			YAHOO.util.Event.addListener(attachTo, event, handleKeyPress);
    +			this.enabledEvent.fire(keyData);
    +		}
    +		/**
    +		* Boolean indicating the enabled/disabled state of the Tooltip
    +		* @property enabled
    +		* @type Boolean
    +		*/
    +		this.enabled = true;
    +	};
    +
    +	/**
    +	* Disables the KeyListener by removing the DOM event listeners from the target DOM element
    +	* @method disable
    +	*/
    +	this.disable = function() {
    +		if (this.enabled) {
    +			YAHOO.util.Event.removeListener(attachTo, event, handleKeyPress);
    +			this.disabledEvent.fire(keyData);
    +		}
    +		this.enabled = false;
    +	};
    +
    +	/**
    +	* Returns a String representation of the object.
    +	* @method toString
    +	* @return {String}	The string representation of the KeyListener
    +	*/
    +	this.toString = function() {
    +		return "KeyListener [" + keyData.keys + "] " + attachTo.tagName + (attachTo.id ? "[" + attachTo.id + "]" : "");
    +	};
    +
    +};
    +
    +/**
    +* Constant representing the DOM "keydown" event.
    +* @property YAHOO.util.KeyListener.KEYDOWN
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.util.KeyListener.KEYDOWN = "keydown";
    +
    +/**
    +* Constant representing the DOM "keyup" event.
    +* @property YAHOO.util.KeyListener.KEYUP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.util.KeyListener.KEYUP = "keyup";
    +
    +/**
    +* Tooltip is an implementation of Overlay that behaves like an OS tooltip, displaying when the user mouses over a particular element, and disappearing on mouse out.
    +* @namespace YAHOO.widget
    +* @class Tooltip
    +* @extends YAHOO.widget.Overlay
    +* @constructor
    +* @param {String}	el	The element ID representing the Tooltip <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Tooltip
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Tooltip = function(el, userConfig) {
    +	YAHOO.widget.Tooltip.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Tooltip, YAHOO.widget.Overlay);
    +
    +/**
    +* Constant representing the Tooltip CSS class
    +* @property YAHOO.widget.Tooltip.CSS_TOOLTIP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Tooltip.CSS_TOOLTIP = "tt";
    +
    +/**
    +* The Tooltip initialization method. This method is automatically called by the constructor. A Tooltip is automatically rendered by the init method, and it also is set to be invisible by default, and constrained to viewport by default as well.
    +* @method init
    +* @param {String}	el	The element ID representing the Tooltip <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Tooltip
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Tooltip. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Tooltip.prototype.init = function(el, userConfig) {
    +	if (document.readyState && document.readyState != "complete") {
    +		var deferredInit = function() {
    +			this.init(el, userConfig);
    +		};
    +		YAHOO.util.Event.addListener(window, "load", deferredInit, this, true);
    +	} else {
    +		YAHOO.widget.Tooltip.superclass.init.call(this, el);
    +
    +		this.beforeInitEvent.fire(YAHOO.widget.Tooltip);
    +
    +		YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Tooltip.CSS_TOOLTIP);
    +
    +		if (userConfig) {
    +			this.cfg.applyConfig(userConfig, true);
    +		}
    +
    +		this.cfg.queueProperty("visible",false);
    +		this.cfg.queueProperty("constraintoviewport",true);
    +
    +		this.setBody("");
    +		this.render(this.cfg.getProperty("container"));
    +
    +		this.initEvent.fire(YAHOO.widget.Tooltip);
    +	}
    +};
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.Tooltip.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.Tooltip.superclass.initDefaultConfig.call(this);
    +
    +	/**
    +	* Specifies whether the Tooltip should be kept from overlapping its context element.
    +	* @config preventoverlap
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("preventoverlap",		{ value:true, validator:this.cfg.checkBoolean, supercedes:["x","y","xy"] } );
    +
    +	/**
    +	* The number of milliseconds to wait before showing a Tooltip on mouseover.
    +	* @config showdelay
    +	* @type Number
    +	* @default 200
    +	*/
    +	this.cfg.addProperty("showdelay",			{ value:200, handler:this.configShowDelay, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The number of milliseconds to wait before automatically dismissing a Tooltip after the mouse has been resting on the context element.
    +	* @config autodismissdelay
    +	* @type Number
    +	* @default 5000
    +	*/
    +	this.cfg.addProperty("autodismissdelay",	{ value:5000, handler:this.configAutoDismissDelay, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* The number of milliseconds to wait before hiding a Tooltip on mouseover.
    +	* @config hidedelay
    +	* @type Number
    +	* @default 250
    +	*/
    +	this.cfg.addProperty("hidedelay",			{ value:250, handler:this.configHideDelay, validator:this.cfg.checkNumber } );
    +
    +	/**
    +	* Specifies the Tooltip's text.
    +	* @config text
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("text",				{ handler:this.configText, suppressEvent:true } );
    +
    +	/**
    +	* Specifies the container element that the Tooltip's markup should be rendered into.
    +	* @config container
    +	* @type HTMLElement/String
    +	* @default document.body
    +	*/
    +	this.cfg.addProperty("container",			{ value:document.body, handler:this.configContainer } );
    +
    +	/**
    +	* Specifies the element or elements that the Tooltip should be anchored to on mouseover.
    +	* @config context
    +	* @type HTMLElement[]/String[]
    +	* @default null
    +	*/
    +
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* The default event handler fired when the "text" property is changed.
    +* @method configText
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Tooltip.prototype.configText = function(type, args, obj) {
    +	var text = args[0];
    +	if (text) {
    +		this.setBody(text);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "container" property is changed.
    +* @method configContainer
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Tooltip.prototype.configContainer = function(type, args, obj) {
    +	var container = args[0];
    +	if (typeof container == 'string') {
    +		this.cfg.setProperty("container", document.getElementById(container), true);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "context" property is changed.
    +* @method configContext
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Tooltip.prototype.configContext = function(type, args, obj) {
    +	var context = args[0];
    +	if (context) {
    +
    +		// Normalize parameter into an array
    +		if (! (context instanceof Array)) {
    +			if (typeof context == "string") {
    +				this.cfg.setProperty("context", [document.getElementById(context)], true);
    +			} else { // Assuming this is an element
    +				this.cfg.setProperty("context", [context], true);
    +			}
    +			context = this.cfg.getProperty("context");
    +		}
    +
    +
    +		// Remove any existing mouseover/mouseout listeners
    +		if (this._context) {
    +			for (var c=0;c<this._context.length;++c) {
    +				var el = this._context[c];
    +				YAHOO.util.Event.removeListener(el, "mouseover", this.onContextMouseOver);
    +				YAHOO.util.Event.removeListener(el, "mousemove", this.onContextMouseMove);
    +				YAHOO.util.Event.removeListener(el, "mouseout", this.onContextMouseOut);
    +			}
    +		}
    +
    +		// Add mouseover/mouseout listeners to context elements
    +		this._context = context;
    +		for (var d=0;d<this._context.length;++d) {
    +			var el2 = this._context[d];
    +			YAHOO.util.Event.addListener(el2, "mouseover", this.onContextMouseOver, this);
    +			YAHOO.util.Event.addListener(el2, "mousemove", this.onContextMouseMove, this);
    +			YAHOO.util.Event.addListener(el2, "mouseout", this.onContextMouseOut, this);
    +		}
    +	}
    +};
    +
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +// BEGIN BUILT-IN DOM EVENT HANDLERS //
    +
    +/**
    +* The default event handler fired when the user moves the mouse while over the context element.
    +* @method onContextMouseMove
    +* @param {DOMEvent} e	The current DOM event
    +* @param {Object}	obj	The object argument
    +*/
    +YAHOO.widget.Tooltip.prototype.onContextMouseMove = function(e, obj) {
    +	obj.pageX = YAHOO.util.Event.getPageX(e);
    +	obj.pageY = YAHOO.util.Event.getPageY(e);
    +
    +};
    +
    +/**
    +* The default event handler fired when the user mouses over the context element.
    +* @method onContextMouseOver
    +* @param {DOMEvent} e	The current DOM event
    +* @param {Object}	obj	The object argument
    +*/
    +YAHOO.widget.Tooltip.prototype.onContextMouseOver = function(e, obj) {
    +
    +	if (obj.hideProcId) {
    +		clearTimeout(obj.hideProcId);
    +		obj.hideProcId = null;
    +	}
    +
    +	var context = this;
    +	YAHOO.util.Event.addListener(context, "mousemove", obj.onContextMouseMove, obj);
    +
    +	if (context.title) {
    +		obj._tempTitle = context.title;
    +		context.title = "";
    +	}
    +
    +	/**
    +	* The unique process ID associated with the thread responsible for showing the Tooltip.
    +	* @type int
    +	*/
    +	obj.showProcId = obj.doShow(e, context);
    +};
    +
    +/**
    +* The default event handler fired when the user mouses out of the context element.
    +* @method onContextMouseOut
    +* @param {DOMEvent} e	The current DOM event
    +* @param {Object}	obj	The object argument
    +*/
    +YAHOO.widget.Tooltip.prototype.onContextMouseOut = function(e, obj) {
    +	var el = this;
    +
    +	if (obj._tempTitle) {
    +		el.title = obj._tempTitle;
    +		obj._tempTitle = null;
    +	}
    +
    +	if (obj.showProcId) {
    +		clearTimeout(obj.showProcId);
    +		obj.showProcId = null;
    +	}
    +
    +	if (obj.hideProcId) {
    +		clearTimeout(obj.hideProcId);
    +		obj.hideProcId = null;
    +	}
    +
    +
    +	obj.hideProcId = setTimeout(function() {
    +				obj.hide();
    +				}, obj.cfg.getProperty("hidedelay"));
    +};
    +
    +// END BUILT-IN DOM EVENT HANDLERS //
    +
    +/**
    +* Processes the showing of the Tooltip by setting the timeout delay and offset of the Tooltip.
    +* @method doShow
    +* @param {DOMEvent} e	The current DOM event
    +* @return {Number}	The process ID of the timeout function associated with doShow
    +*/
    +YAHOO.widget.Tooltip.prototype.doShow = function(e, context) {
    +
    +	var yOffset = 25;
    +	if (this.browser == "opera" && context.tagName == "A") {
    +		yOffset += 12;
    +	}
    +
    +	var me = this;
    +	return setTimeout(
    +		function() {
    +			if (me._tempTitle) {
    +				me.setBody(me._tempTitle);
    +			} else {
    +				me.cfg.refireEvent("text");
    +			}
    +
    +			me.moveTo(me.pageX, me.pageY + yOffset);
    +			if (me.cfg.getProperty("preventoverlap")) {
    +				me.preventOverlap(me.pageX, me.pageY);
    +			}
    +
    +			YAHOO.util.Event.removeListener(context, "mousemove", me.onContextMouseMove);
    +
    +			me.show();
    +			me.hideProcId = me.doHide();
    +		},
    +	this.cfg.getProperty("showdelay"));
    +};
    +
    +/**
    +* Sets the timeout for the auto-dismiss delay, which by default is 5 seconds, meaning that a tooltip will automatically dismiss itself after 5 seconds of being displayed.
    +* @method doHide
    +*/
    +YAHOO.widget.Tooltip.prototype.doHide = function() {
    +	var me = this;
    +	return setTimeout(
    +		function() {
    +			me.hide();
    +		},
    +		this.cfg.getProperty("autodismissdelay"));
    +};
    +
    +/**
    +* Fired when the Tooltip is moved, this event handler is used to prevent the Tooltip from overlapping with its context element.
    +* @method preventOverlay
    +* @param {Number} pageX	The x coordinate position of the mouse pointer
    +* @param {Number} pageY	The y coordinate position of the mouse pointer
    +*/
    +YAHOO.widget.Tooltip.prototype.preventOverlap = function(pageX, pageY) {
    +
    +	var height = this.element.offsetHeight;
    +
    +	var elementRegion = YAHOO.util.Dom.getRegion(this.element);
    +
    +	elementRegion.top -= 5;
    +	elementRegion.left -= 5;
    +	elementRegion.right += 5;
    +	elementRegion.bottom += 5;
    +
    +	var mousePoint = new YAHOO.util.Point(pageX, pageY);
    +
    +	if (elementRegion.contains(mousePoint)) {
    +		this.cfg.setProperty("y", (pageY-height-5));
    +	}
    +};
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	The string representation of the Tooltip
    +*/
    +YAHOO.widget.Tooltip.prototype.toString = function() {
    +	return "Tooltip " + this.id;
    +};
    +
    +/**
    +* Panel is an implementation of Overlay that behaves like an OS window, with a draggable header and an optional close icon at the top right.
    +* @namespace YAHOO.widget
    +* @class Panel
    +* @extends YAHOO.widget.Overlay
    +* @constructor
    +* @param {String}	el	The element ID representing the Panel <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Panel
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Panel. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Panel = function(el, userConfig) {
    +	YAHOO.widget.Panel.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Panel, YAHOO.widget.Overlay);
    +
    +/**
    +* Constant representing the default CSS class used for a Panel
    +* @property YAHOO.widget.Panel.CSS_PANEL
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Panel.CSS_PANEL = "panel";
    +
    +/**
    +* Constant representing the default CSS class used for a Panel's wrapping container
    +* @property YAHOO.widget.Panel.CSS_PANEL_CONTAINER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Panel.CSS_PANEL_CONTAINER = "panel-container";
    +
    +/**
    +* The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +* @method init
    +* @param {String}	el	The element ID representing the Overlay <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Overlay
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Panel.prototype.init = function(el, userConfig) {
    +	YAHOO.widget.Panel.superclass.init.call(this, el/*, userConfig*/);  // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level
    +
    +	this.beforeInitEvent.fire(YAHOO.widget.Panel);
    +
    +	YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Panel.CSS_PANEL);
    +
    +	this.buildWrapper();
    +
    +	if (userConfig) {
    +		this.cfg.applyConfig(userConfig, true);
    +	}
    +
    +	this.beforeRenderEvent.subscribe(function() {
    +		var draggable = this.cfg.getProperty("draggable");
    +		if (draggable) {
    +			if (! this.header) {
    +				this.setHeader("&nbsp;");
    +			}
    +		}
    +	}, this, true);
    +
    +	var me = this;
    +
    +	this.showMaskEvent.subscribe(function() {
    +		var checkFocusable = function(el) {
    +			if (el.tagName == "A" || el.tagName == "BUTTON" || el.tagName == "SELECT" || el.tagName == "INPUT" || el.tagName == "TEXTAREA" || el.tagName == "FORM") {
    +				if (! YAHOO.util.Dom.isAncestor(me.element, el)) {
    +					YAHOO.util.Event.addListener(el, "focus", el.blur);
    +					return true;
    +				}
    +			} else {
    +				return false;
    +			}
    +		};
    +
    +		this.focusableElements = YAHOO.util.Dom.getElementsBy(checkFocusable);
    +	}, this, true);
    +
    +	this.hideMaskEvent.subscribe(function() {
    +		for (var i=0;i<this.focusableElements.length;i++) {
    +			var el2 = this.focusableElements[i];
    +			YAHOO.util.Event.removeListener(el2, "focus", el2.blur);
    +		}
    +	}, this, true);
    +
    +	this.beforeShowEvent.subscribe(function() {
    +		this.cfg.refireEvent("underlay");
    +	}, this, true);
    +
    +	this.initEvent.fire(YAHOO.widget.Panel);
    +};
    +
    +/**
    +* Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
    +*/
    +YAHOO.widget.Panel.prototype.initEvents = function() {
    +	YAHOO.widget.Panel.superclass.initEvents.call(this);
    +
    +	/**
    +	* CustomEvent fired after the modality mask is shown
    +	* @event showMaskEvent
    +	*/
    +	this.showMaskEvent = new YAHOO.util.CustomEvent("showMask");
    +
    +	/**
    +	* CustomEvent fired after the modality mask is hidden
    +	* @event hideMaskEvent
    +	*/
    +	this.hideMaskEvent = new YAHOO.util.CustomEvent("hideMask");
    +
    +	/**
    +	* CustomEvent when the Panel is dragged
    +	* @event dragEvent
    +	*/
    +	this.dragEvent = new YAHOO.util.CustomEvent("drag");
    +};
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.Panel.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.Panel.superclass.initDefaultConfig.call(this);
    +
    +	// Add panel config properties //
    +
    +	/**
    +	* True if the Panel should display a "close" button
    +	* @config close
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("close", { value:true, handler:this.configClose, validator:this.cfg.checkBoolean, supercedes:["visible"] } );
    +
    +	/**
    +	* True if the Panel should be draggable
    +	* @config draggable
    +	* @type Boolean
    +	* @default true
    +	*/
    +	this.cfg.addProperty("draggable", { value:true,	handler:this.configDraggable, validator:this.cfg.checkBoolean, supercedes:["visible"] } );
    +
    +	/**
    +	* Sets the type of underlay to display for the Panel. Valid values are "shadow", "matte", and "none".
    +	* @config underlay
    +	* @type String
    +	* @default shadow
    +	*/
    +	this.cfg.addProperty("underlay", { value:"shadow", handler:this.configUnderlay, supercedes:["visible"] } );
    +
    +	/**
    +	* True if the Panel should be displayed in a modal fashion, automatically creating a transparent mask over the document that will not be removed until the Panel is dismissed.
    +	* @config modal
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("modal",	{ value:false, handler:this.configModal, validator:this.cfg.checkBoolean, supercedes:["visible"] } );
    +
    +	/**
    +	* A KeyListener (or array of KeyListeners) that will be enabled when the Panel is shown, and disabled when the Panel is hidden.
    +	* @config keylisteners
    +	* @type YAHOO.util.KeyListener[]
    +	* @default null
    +	*/
    +	this.cfg.addProperty("keylisteners", { handler:this.configKeyListeners, suppressEvent:true, supercedes:["visible"] } );
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel.
    +* @method configClose
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configClose = function(type, args, obj) {
    +	var val = args[0];
    +
    +	var doHide = function(e, obj) {
    +		obj.hide();
    +	};
    +
    +	if (val) {
    +		if (! this.close) {
    +			this.close = document.createElement("DIV");
    +			YAHOO.util.Dom.addClass(this.close, "close");
    +
    +			if (this.isSecure) {
    +				YAHOO.util.Dom.addClass(this.close, "secure");
    +			} else {
    +				YAHOO.util.Dom.addClass(this.close, "nonsecure");
    +			}
    +
    +			this.close.innerHTML = "&nbsp;";
    +			this.innerElement.appendChild(this.close);
    +			YAHOO.util.Event.addListener(this.close, "click", doHide, this);
    +		} else {
    +			this.close.style.display = "block";
    +		}
    +	} else {
    +		if (this.close) {
    +			this.close.style.display = "none";
    +		}
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "draggable" property is changed.
    +* @method configDraggable
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configDraggable = function(type, args, obj) {
    +	var val = args[0];
    +	if (val) {
    +		if (this.header) {
    +			YAHOO.util.Dom.setStyle(this.header,"cursor","move");
    +			this.registerDragDrop();
    +		}
    +	} else {
    +		if (this.dd) {
    +			this.dd.unreg();
    +		}
    +		if (this.header) {
    +			YAHOO.util.Dom.setStyle(this.header,"cursor","auto");
    +		}
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "underlay" property is changed.
    +* @method configUnderlay
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configUnderlay = function(type, args, obj) {
    +	var val = args[0];
    +
    +	switch (val.toLowerCase()) {
    +		case "shadow":
    +			YAHOO.util.Dom.removeClass(this.element, "matte");
    +			YAHOO.util.Dom.addClass(this.element, "shadow");
    +
    +			if (! this.underlay) { // create if not already in DOM
    +				this.underlay = document.createElement("DIV");
    +				this.underlay.className = "underlay";
    +				this.underlay.innerHTML = "&nbsp;";
    +				this.element.appendChild(this.underlay);
    +			}
    +
    +			this.sizeUnderlay();
    +			break;
    +		case "matte":
    +			YAHOO.util.Dom.removeClass(this.element, "shadow");
    +			YAHOO.util.Dom.addClass(this.element, "matte");
    +			break;
    +		default:
    +			YAHOO.util.Dom.removeClass(this.element, "shadow");
    +			YAHOO.util.Dom.removeClass(this.element, "matte");
    +			break;
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask.
    +* @method configModal
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configModal = function(type, args, obj) {
    +	var modal = args[0];
    +
    +	if (modal) {
    +		this.buildMask();
    +
    +		if (! YAHOO.util.Config.alreadySubscribed( this.beforeShowEvent, this.showMask, this ) ) {
    +			this.beforeShowEvent.subscribe(this.showMask, this, true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed( this.hideEvent, this.hideMask, this) ) {
    +			this.hideEvent.subscribe(this.hideMask, this, true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed( YAHOO.widget.Overlay.windowResizeEvent, this.sizeMask, this ) ) {
    +			YAHOO.widget.Overlay.windowResizeEvent.subscribe(this.sizeMask, this, true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed( this.destroyEvent, this.removeMask, this) ) {
    +			this.destroyEvent.subscribe(this.removeMask, this, true);
    +		}
    +
    +		this.cfg.refireEvent("zIndex");
    +	} else {
    +		this.beforeShowEvent.unsubscribe(this.showMask, this);
    +		this.hideEvent.unsubscribe(this.hideMask, this);
    +		YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.sizeMask, this);
    +		this.destroyEvent.unsubscribe(this.removeMask, this);
    +	}
    +};
    +
    +/**
    +* Removes the modality mask.
    +* @method removeMask
    +*/
    +YAHOO.widget.Panel.prototype.removeMask = function() {
    +	if (this.mask) {
    +		if (this.mask.parentNode) {
    +			this.mask.parentNode.removeChild(this.mask);
    +		}
    +		this.mask = null;
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "keylisteners" property is changed.
    +* @method configKeyListeners
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configKeyListeners = function(type, args, obj) {
    +	var listeners = args[0];
    +
    +	if (listeners) {
    +		if (listeners instanceof Array) {
    +			for (var i=0;i<listeners.length;i++) {
    +				var listener = listeners[i];
    +
    +				if (! YAHOO.util.Config.alreadySubscribed(this.showEvent, listener.enable, listener)) {
    +					this.showEvent.subscribe(listener.enable, listener, true);
    +				}
    +				if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent, listener.disable, listener)) {
    +					this.hideEvent.subscribe(listener.disable, listener, true);
    +					this.destroyEvent.subscribe(listener.disable, listener, true);
    +				}
    +			}
    +		} else {
    +			if (! YAHOO.util.Config.alreadySubscribed(this.showEvent, listeners.enable, listeners)) {
    +				this.showEvent.subscribe(listeners.enable, listeners, true);
    +			}
    +			if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent, listeners.disable, listeners)) {
    +				this.hideEvent.subscribe(listeners.disable, listeners, true);
    +				this.destroyEvent.subscribe(listeners.disable, listeners, true);
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "height" property is changed.
    +* @method configHeight
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configHeight = function(type, args, obj) {
    +	var height = args[0];
    +	var el = this.innerElement;
    +	YAHOO.util.Dom.setStyle(el, "height", height);
    +	this.cfg.refireEvent("underlay");
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "width" property is changed.
    +* @method configWidth
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configWidth = function(type, args, obj) {
    +	var width = args[0];
    +	var el = this.innerElement;
    +	YAHOO.util.Dom.setStyle(el, "width", width);
    +	this.cfg.refireEvent("underlay");
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "zIndex" property is changed.
    +* @method configzIndex
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Panel.prototype.configzIndex = function(type, args, obj) {
    +	YAHOO.widget.Panel.superclass.configzIndex.call(this, type, args, obj);
    +
    +	var maskZ = 0;
    +	var currentZ = YAHOO.util.Dom.getStyle(this.element, "zIndex");
    +
    +	if (this.mask) {
    +		if (! currentZ || isNaN(currentZ)) {
    +			currentZ = 0;
    +		}
    +
    +		if (currentZ === 0) {
    +			this.cfg.setProperty("zIndex", 1);
    +		} else {
    +			maskZ = currentZ - 1;
    +			YAHOO.util.Dom.setStyle(this.mask, "zIndex", maskZ);
    +		}
    +
    +	}
    +};
    +
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a  local instance variable called container, and the element is reinserted inside of it.
    +* @method buildWrapper
    +*/
    +YAHOO.widget.Panel.prototype.buildWrapper = function() {
    +	var elementParent = this.element.parentNode;
    +	var originalElement = this.element;
    +
    +	var wrapper = document.createElement("DIV");
    +	wrapper.className = YAHOO.widget.Panel.CSS_PANEL_CONTAINER;
    +	wrapper.id = originalElement.id + "_c";
    +
    +	if (elementParent) {
    +		elementParent.insertBefore(wrapper, originalElement);
    +	}
    +
    +	wrapper.appendChild(originalElement);
    +
    +	this.element = wrapper;
    +	this.innerElement = originalElement;
    +
    +	YAHOO.util.Dom.setStyle(this.innerElement, "visibility", "inherit");
    +};
    +
    +/**
    +* Adjusts the size of the shadow based on the size of the element.
    +* @method sizeUnderlay
    +*/
    +YAHOO.widget.Panel.prototype.sizeUnderlay = function() {
    +	if (this.underlay && this.browser != "gecko" && this.browser != "safari") {
    +		this.underlay.style.width = this.innerElement.offsetWidth + "px";
    +		this.underlay.style.height = this.innerElement.offsetHeight + "px";
    +	}
    +};
    +
    +/**
    +* Event handler fired when the resize monitor element is resized.
    +* @method onDomResize
    +* @param {DOMEvent} e	The resize DOM event
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.Panel.prototype.onDomResize = function(e, obj) {
    +	YAHOO.widget.Panel.superclass.onDomResize.call(this, e, obj);
    +	var me = this;
    +	setTimeout(function() {
    +		me.sizeUnderlay();
    +	}, 0);
    +};
    +
    +/**
    +* Registers the Panel's header for drag & drop capability.
    +* @method registerDragDrop
    +*/
    +YAHOO.widget.Panel.prototype.registerDragDrop = function() {
    +	if (this.header) {
    +		this.dd = new YAHOO.util.DD(this.element.id, this.id);
    +
    +		if (! this.header.id) {
    +			this.header.id = this.id + "_h";
    +		}
    +
    +		var me = this;
    +
    +		this.dd.startDrag = function() {
    +
    +			if (me.browser == "ie") {
    +				YAHOO.util.Dom.addClass(me.element,"drag");
    +			}
    +
    +			if (me.cfg.getProperty("constraintoviewport")) {
    +				var offsetHeight = me.element.offsetHeight;
    +				var offsetWidth = me.element.offsetWidth;
    +
    +				var viewPortWidth = YAHOO.util.Dom.getViewportWidth();
    +				var viewPortHeight = YAHOO.util.Dom.getViewportHeight();
    +
    +				var scrollX = window.scrollX || document.documentElement.scrollLeft;
    +				var scrollY = window.scrollY || document.documentElement.scrollTop;
    +
    +				var topConstraint = scrollY + 10;
    +				var leftConstraint = scrollX + 10;
    +				var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10;
    +				var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10;
    +
    +				this.minX = leftConstraint;
    +				this.maxX = rightConstraint;
    +				this.constrainX = true;
    +
    +				this.minY = topConstraint;
    +				this.maxY = bottomConstraint;
    +				this.constrainY = true;
    +			} else {
    +				this.constrainX = false;
    +				this.constrainY = false;
    +			}
    +
    +			me.dragEvent.fire("startDrag", arguments);
    +		};
    +
    +		this.dd.onDrag = function() {
    +			me.syncPosition();
    +			me.cfg.refireEvent("iframe");
    +			if (this.platform == "mac" && this.browser == "gecko") {
    +				this.showMacGeckoScrollbars();
    +			}
    +
    +			me.dragEvent.fire("onDrag", arguments);
    +		};
    +
    +		this.dd.endDrag = function() {
    +			if (me.browser == "ie") {
    +				YAHOO.util.Dom.removeClass(me.element,"drag");
    +			}
    +
    +			me.dragEvent.fire("endDrag", arguments);
    +		};
    +
    +		this.dd.setHandleElId(this.header.id);
    +		this.dd.addInvalidHandleType("INPUT");
    +		this.dd.addInvalidHandleType("SELECT");
    +		this.dd.addInvalidHandleType("TEXTAREA");
    +	}
    +};
    +
    +/**
    +* Builds the mask that is laid over the document when the Panel is configured to be modal.
    +* @method buildMask
    +*/
    +YAHOO.widget.Panel.prototype.buildMask = function() {
    +	if (! this.mask) {
    +		this.mask = document.createElement("DIV");
    +		this.mask.id = this.id + "_mask";
    +		this.mask.className = "mask";
    +		this.mask.innerHTML = "&nbsp;";
    +
    +		var maskClick = function(e, obj) {
    +			YAHOO.util.Event.stopEvent(e);
    +		};
    +
    +		var firstChild = document.body.firstChild;
    +		if (firstChild)	{
    +			document.body.insertBefore(this.mask, document.body.firstChild);
    +		} else {
    +			document.body.appendChild(this.mask);
    +		}
    +	}
    +};
    +
    +/**
    +* Hides the modality mask.
    +* @method hideMask
    +*/
    +YAHOO.widget.Panel.prototype.hideMask = function() {
    +	if (this.cfg.getProperty("modal") && this.mask) {
    +		this.mask.style.display = "none";
    +		this.hideMaskEvent.fire();
    +		YAHOO.util.Dom.removeClass(document.body, "masked");
    +	}
    +};
    +
    +/**
    +* Shows the modality mask.
    +* @method showMask
    +*/
    +YAHOO.widget.Panel.prototype.showMask = function() {
    +	if (this.cfg.getProperty("modal") && this.mask) {
    +		YAHOO.util.Dom.addClass(document.body, "masked");
    +		this.sizeMask();
    +		this.mask.style.display = "block";
    +		this.showMaskEvent.fire();
    +	}
    +};
    +
    +/**
    +* Sets the size of the modality mask to cover the entire scrollable area of the document
    +* @method sizeMask
    +*/
    +YAHOO.widget.Panel.prototype.sizeMask = function() {
    +	if (this.mask) {
    +		this.mask.style.height = YAHOO.util.Dom.getDocumentHeight()+"px";
    +		this.mask.style.width = YAHOO.util.Dom.getDocumentWidth()+"px";
    +	}
    +};
    +
    +/**
    +* Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optionally appends the Panel to the specified node prior to the render's execution. NOTE: For Panels without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure.
    +* @method render
    +* @param {String}	appendToNode	The element id to which the Module should be appended to prior to rendering <em>OR</em>
    +* @param {HTMLElement}	appendToNode	The element to which the Module should be appended to prior to rendering
    +* @return {boolean} Success or failure of the render
    +*/
    +YAHOO.widget.Panel.prototype.render = function(appendToNode) {
    +	return YAHOO.widget.Panel.superclass.render.call(this, appendToNode, this.innerElement);
    +};
    +
    +/**
    +* Returns a String representation of the object.
    +* @method toString
    +* @return {String} The string representation of the Panel.
    +*/
    +YAHOO.widget.Panel.prototype.toString = function() {
    +	return "Panel " + this.id;
    +};
    +
    +/**
    +* Dialog is an implementation of Panel that can be used to submit form data. Built-in functionality for buttons with event handlers is included, and button sets can be build dynamically, or the preincluded ones for Submit/Cancel and OK/Cancel can be utilized. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +* @namespace YAHOO.widget
    +* @class Dialog
    +* @extends YAHOO.widget.Panel
    +* @constructor
    +* @param {String}	el	The element ID representing the Dialog <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Dialog
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Dialog = function(el, userConfig) {
    +	YAHOO.widget.Dialog.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Dialog, YAHOO.widget.Panel);
    +
    +/**
    +* Constant representing the default CSS class used for a Dialog
    +* @property YAHOO.widget.Dialog.CSS_DIALOG
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Dialog.CSS_DIALOG = "dialog";
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.Dialog.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.Dialog.superclass.initDefaultConfig.call(this);
    +
    +	/**
    +	* The internally maintained callback object for use with the Connection utility
    +	* @property callback
    +	* @type Object
    +	*/
    +	this.callback = {
    +		/**
    +		* The function to execute upon success of the Connection submission
    +		* @property callback.success
    +		* @type Function
    +		*/
    +		success : null,
    +		/**
    +		* The function to execute upon failure of the Connection submission
    +		* @property callback.failure
    +		* @type Function
    +		*/
    +		failure : null,
    +		/**
    +		* The arbitraty argument or arguments to pass to the Connection callback functions
    +		* @property callback.argument
    +		* @type Object
    +		*/
    +		argument: null
    +	};
    +
    +	// Add form dialog config properties //
    +
    +	/**
    +	* The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual".
    +	* @config postmethod
    +	* @type String
    +	* @default async
    +	*/
    +	this.cfg.addProperty("postmethod", { value:"async", validator:function(val) {
    +													if (val != "form" && val != "async" && val != "none" && val != "manual") {
    +														return false;
    +													} else {
    +														return true;
    +													}
    +												} });
    +
    +	/**
    +	* Object literal(s) defining the buttons for the Dialog's footer.
    +	* @config buttons
    +	* @type Object[]
    +	* @default "none"
    +	*/
    +	this.cfg.addProperty("buttons",		{ value:"none",	handler:this.configButtons } );
    +};
    +
    +/**
    +* Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class.
    +* @method initEvents
    +*/
    +YAHOO.widget.Dialog.prototype.initEvents = function() {
    +	YAHOO.widget.Dialog.superclass.initEvents.call(this);
    +
    +	/**
    +	* CustomEvent fired prior to submission
    +	* @event beforeSumitEvent
    +	*/
    +	this.beforeSubmitEvent	= new YAHOO.util.CustomEvent("beforeSubmit");
    +
    +	/**
    +	* CustomEvent fired after submission
    +	* @event submitEvent
    +	*/
    +	this.submitEvent		= new YAHOO.util.CustomEvent("submit");
    +
    +	/**
    +	* CustomEvent fired prior to manual submission
    +	* @event manualSubmitEvent
    +	*/
    +	this.manualSubmitEvent	= new YAHOO.util.CustomEvent("manualSubmit");
    +
    +	/**
    +	* CustomEvent fired prior to asynchronous submission
    +	* @event asyncSubmitEvent
    +	*/
    +	this.asyncSubmitEvent	= new YAHOO.util.CustomEvent("asyncSubmit");
    +
    +	/**
    +	* CustomEvent fired prior to form-based submission
    +	* @event formSubmitEvent
    +	*/
    +	this.formSubmitEvent	= new YAHOO.util.CustomEvent("formSubmit");
    +
    +	/**
    +	* CustomEvent fired after cancel
    +	* @event cancelEvent
    +	*/
    +	this.cancelEvent		= new YAHOO.util.CustomEvent("cancel");
    +};
    +
    +/**
    +* The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +* @method init
    +* @param {String}	el	The element ID representing the Dialog <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Dialog
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Dialog.prototype.init = function(el, userConfig) {
    +	YAHOO.widget.Dialog.superclass.init.call(this, el/*, userConfig*/);  // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level
    +
    +	this.beforeInitEvent.fire(YAHOO.widget.Dialog);
    +
    +	YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Dialog.CSS_DIALOG);
    +
    +	this.cfg.setProperty("visible", false);
    +
    +	if (userConfig) {
    +		this.cfg.applyConfig(userConfig, true);
    +	}
    +
    +	this.renderEvent.subscribe(this.registerForm, this, true);
    +
    +	this.showEvent.subscribe(this.focusFirst, this, true);
    +	this.beforeHideEvent.subscribe(this.blurButtons, this, true);
    +
    +	this.beforeRenderEvent.subscribe(function() {
    +		var buttonCfg = this.cfg.getProperty("buttons");
    +		if (buttonCfg && buttonCfg != "none") {
    +			if (! this.footer) {
    +				this.setFooter("");
    +			}
    +		}
    +	}, this, true);
    +
    +	this.initEvent.fire(YAHOO.widget.Dialog);
    +};
    +
    +/**
    +* Performs the submission of the Dialog form depending on the value of "postmethod" property.
    +* @method doSubmit
    +*/
    +YAHOO.widget.Dialog.prototype.doSubmit = function() {
    +	var pm = this.cfg.getProperty("postmethod");
    +	switch (pm) {
    +		case "async":
    +			var method = this.form.getAttribute("method") || 'POST';
    +			method = method.toUpperCase();
    +			YAHOO.util.Connect.setForm(this.form);
    +			var cObj = YAHOO.util.Connect.asyncRequest(method, this.form.getAttribute("action"), this.callback);
    +			this.asyncSubmitEvent.fire();
    +			break;
    +		case "form":
    +			this.form.submit();
    +			this.formSubmitEvent.fire();
    +			break;
    +		case "none":
    +		case "manual":
    +			this.manualSubmitEvent.fire();
    +			break;
    +	}
    +};
    +
    +/**
    +* Prepares the Dialog's internal FORM object, creating one if one is not currently present.
    +* @method registerForm
    +*/
    +YAHOO.widget.Dialog.prototype.registerForm = function() {
    +	var form = this.element.getElementsByTagName("FORM")[0];
    +
    +	if (! form) {
    +		var formHTML = "<form name=\"frm_" + this.id + "\" action=\"\"></form>";
    +		this.body.innerHTML += formHTML;
    +		form = this.element.getElementsByTagName("FORM")[0];
    +	}
    +
    +	this.firstFormElement = function() {
    +		for (var f=0;f<form.elements.length;f++ ) {
    +			var el = form.elements[f];
    +			if (el.focus) {
    +				if (el.type && el.type != "hidden") {
    +					return el;
    +				}
    +			}
    +		}
    +		return null;
    +	}();
    +
    +	this.lastFormElement = function() {
    +		for (var f=form.elements.length-1;f>=0;f-- ) {
    +			var el = form.elements[f];
    +			if (el.focus) {
    +				if (el.type && el.type != "hidden") {
    +					return el;
    +				}
    +			}
    +		}
    +		return null;
    +	}();
    +
    +	this.form = form;
    +
    +	if (this.cfg.getProperty("modal") && this.form) {
    +
    +		var me = this;
    +
    +		var firstElement = this.firstFormElement || this.firstButton;
    +		if (firstElement) {
    +			this.preventBackTab = new YAHOO.util.KeyListener(firstElement, { shift:true, keys:9 }, {fn:me.focusLast, scope:me, correctScope:true} );
    +			this.showEvent.subscribe(this.preventBackTab.enable, this.preventBackTab, true);
    +			this.hideEvent.subscribe(this.preventBackTab.disable, this.preventBackTab, true);
    +		}
    +
    +		var lastElement = this.lastButton || this.lastFormElement;
    +		if (lastElement) {
    +			this.preventTabOut = new YAHOO.util.KeyListener(lastElement, { shift:false, keys:9 }, {fn:me.focusFirst, scope:me, correctScope:true} );
    +			this.showEvent.subscribe(this.preventTabOut.enable, this.preventTabOut, true);
    +			this.hideEvent.subscribe(this.preventTabOut.disable, this.preventTabOut, true);
    +		}
    +	}
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* The default event handler for the "buttons" configuration property
    +* @method configButtons
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Dialog.prototype.configButtons = function(type, args, obj) {
    +	var buttons = args[0];
    +	if (buttons != "none") {
    +		this.buttonSpan = null;
    +		this.buttonSpan = document.createElement("SPAN");
    +		this.buttonSpan.className = "button-group";
    +
    +		for (var b=0;b<buttons.length;b++) {
    +			var button = buttons[b];
    +
    +			var htmlButton = document.createElement("BUTTON");
    +			htmlButton.setAttribute("type", "button");
    +
    +			if (button.isDefault) {
    +				htmlButton.className = "default";
    +				this.defaultHtmlButton = htmlButton;
    +			}
    +
    +			htmlButton.appendChild(document.createTextNode(button.text));
    +			YAHOO.util.Event.addListener(htmlButton, "click", button.handler, this, true);
    +
    +			this.buttonSpan.appendChild(htmlButton);
    +			button.htmlButton = htmlButton;
    +
    +			if (b === 0) {
    +				this.firstButton = button.htmlButton;
    +			}
    +
    +			if (b == (buttons.length-1)) {
    +				this.lastButton = button.htmlButton;
    +			}
    +
    +		}
    +
    +		this.setFooter(this.buttonSpan);
    +
    +		this.cfg.refireEvent("iframe");
    +		this.cfg.refireEvent("underlay");
    +	} else { // Do cleanup
    +		if (this.buttonSpan) {
    +			if (this.buttonSpan.parentNode) {
    +				this.buttonSpan.parentNode.removeChild(this.buttonSpan);
    +			}
    +
    +			this.buttonSpan = null;
    +			this.firstButton = null;
    +			this.lastButton = null;
    +			this.defaultHtmlButton = null;
    +		}
    +	}
    +};
    +
    +
    +/**
    +* The default event handler used to focus the first field of the form when the Dialog is shown.
    +* @method focusFirst
    +*/
    +YAHOO.widget.Dialog.prototype.focusFirst = function(type,args,obj) {
    +	if (args) {
    +		var e = args[1];
    +		if (e) {
    +			YAHOO.util.Event.stopEvent(e);
    +		}
    +	}
    +
    +	if (this.firstFormElement) {
    +		this.firstFormElement.focus();
    +	} else {
    +		this.focusDefaultButton();
    +	}
    +};
    +
    +/**
    +* Sets the focus to the last button in the button or form element in the Dialog
    +* @method focusLast
    +*/
    +YAHOO.widget.Dialog.prototype.focusLast = function(type,args,obj) {
    +	if (args) {
    +		var e = args[1];
    +		if (e) {
    +			YAHOO.util.Event.stopEvent(e);
    +		}
    +	}
    +
    +	var buttons = this.cfg.getProperty("buttons");
    +	if (buttons && buttons instanceof Array) {
    +		this.focusLastButton();
    +	} else {
    +		if (this.lastFormElement) {
    +			this.lastFormElement.focus();
    +		}
    +	}
    +};
    +
    +/**
    +* Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired.
    +* @method focusDefaultButton
    +*/
    +YAHOO.widget.Dialog.prototype.focusDefaultButton = function() {
    +	if (this.defaultHtmlButton) {
    +		this.defaultHtmlButton.focus();
    +	}
    +};
    +
    +/**
    +* Blurs all the html buttons
    +* @method blurButtons
    +*/
    +YAHOO.widget.Dialog.prototype.blurButtons = function() {
    +	var buttons = this.cfg.getProperty("buttons");
    +	if (buttons && buttons instanceof Array) {
    +		var html = buttons[0].htmlButton;
    +		if (html) {
    +			html.blur();
    +		}
    +	}
    +};
    +
    +/**
    +* Sets the focus to the first button in the button list
    +* @method focusFirstButton
    +*/
    +YAHOO.widget.Dialog.prototype.focusFirstButton = function() {
    +	var buttons = this.cfg.getProperty("buttons");
    +	if (buttons && buttons instanceof Array) {
    +		var html = buttons[0].htmlButton;
    +		if (html) {
    +			html.focus();
    +		}
    +	}
    +};
    +
    +/**
    +* Sets the focus to the first button in the button list
    +* @method focusLastButton
    +*/
    +YAHOO.widget.Dialog.prototype.focusLastButton = function() {
    +	var buttons = this.cfg.getProperty("buttons");
    +	if (buttons && buttons instanceof Array) {
    +		var html = buttons[buttons.length-1].htmlButton;
    +		if (html) {
    +			html.focus();
    +		}
    +	}
    +};
    +
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary.
    +* @method validate
    +*/
    +YAHOO.widget.Dialog.prototype.validate = function() {
    +	return true;
    +};
    +
    +/**
    +* Executes a submit of the Dialog followed by a hide, if validation is successful.
    +* @method submit
    +*/
    +YAHOO.widget.Dialog.prototype.submit = function() {
    +	if (this.validate()) {
    +		this.beforeSubmitEvent.fire();
    +		this.doSubmit();
    +		this.submitEvent.fire();
    +		this.hide();
    +		return true;
    +	} else {
    +		return false;
    +	}
    +};
    +
    +/**
    +* Executes the cancel of the Dialog followed by a hide.
    +* @method cancel
    +*/
    +YAHOO.widget.Dialog.prototype.cancel = function() {
    +	this.cancelEvent.fire();
    +	this.hide();
    +};
    +
    +/**
    +* Returns a JSON-compatible data structure representing the data currently contained in the form.
    +* @method getData
    +* @return {Object} A JSON object reprsenting the data of the current form.
    +*/
    +YAHOO.widget.Dialog.prototype.getData = function() {
    +	var form = this.form;
    +	var data = {};
    +
    +	if (form) {
    +		for (var i in this.form) {
    +			var formItem = form[i];
    +			if (formItem) {
    +				if (formItem.tagName) { // Got a single form item
    +					switch (formItem.tagName) {
    +						case "INPUT":
    +							switch (formItem.type) {
    +								case "checkbox":
    +									data[i] = formItem.checked;
    +									break;
    +								case "textbox":
    +								case "text":
    +								case "hidden":
    +									data[i] = formItem.value;
    +									break;
    +							}
    +							break;
    +						case "TEXTAREA":
    +							data[i] = formItem.value;
    +							break;
    +						case "SELECT":
    +							var val = [];
    +							for (var x=0;x<formItem.options.length;x++)	{
    +								var option = formItem.options[x];
    +								if (option.selected) {
    +									var selval = option.value;
    +									if (! selval || selval === "") {
    +										selval = option.text;
    +									}
    +									val[val.length] = selval;
    +								}
    +							}
    +							data[i] = val;
    +							break;
    +					}
    +				} else if (formItem[0] && formItem[0].tagName) { // this is an array of form items
    +					if (formItem[0].tagName == "INPUT") {
    +						switch (formItem[0].type) {
    +							case "radio":
    +								for (var r=0; r<formItem.length; r++) {
    +									var radio = formItem[r];
    +									if (radio.checked) {
    +										data[radio.name] = radio.value;
    +										break;
    +									}
    +								}
    +								break;
    +							case "checkbox":
    +								var cbArray = [];
    +								for (var c=0; c<formItem.length; c++) {
    +									var check = formItem[c];
    +									if (check.checked) {
    +										cbArray[cbArray.length] = check.value;
    +									}
    +								}
    +								data[formItem[0].name] = cbArray;
    +								break;
    +						}
    +					}
    +				}
    +			}
    +		}
    +	}
    +	return data;
    +};
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	The string representation of the Dialog
    +*/
    +YAHOO.widget.Dialog.prototype.toString = function() {
    +	return "Dialog " + this.id;
    +};
    +
    +/**
    +* SimpleDialog is a simple implementation of Dialog that can be used to submit a single value. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +* @namespace YAHOO.widget
    +* @class SimpleDialog
    +* @extends YAHOO.widget.Dialog
    +* @constructor
    +* @param {String}	el	The element ID representing the SimpleDialog <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the SimpleDialog
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    +*/
    +YAHOO.widget.SimpleDialog = function(el, userConfig) {
    +	YAHOO.widget.SimpleDialog.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.SimpleDialog, YAHOO.widget.Dialog);
    +
    +/**
    +* Constant for the standard network icon for a blocking action
    +* @property YAHOO.widget.SimpleDialog.ICON_BLOCK
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_BLOCK = "nt/ic/ut/bsc/blck16_1.gif";
    +
    +/**
    +* Constant for the standard network icon for alarm
    +* @property YAHOO.widget.SimpleDialog.ICON_ALARM
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_ALARM = "nt/ic/ut/bsc/alrt16_1.gif";
    +
    +/**
    +* Constant for the standard network icon for help
    +* @property YAHOO.widget.SimpleDialog.ICON_HELP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_HELP  = "nt/ic/ut/bsc/hlp16_1.gif";
    +
    +/**
    +* Constant for the standard network icon for info
    +* @property YAHOO.widget.SimpleDialog.ICON_INFO
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_INFO  = "nt/ic/ut/bsc/info16_1.gif";
    +
    +/**
    +* Constant for the standard network icon for warn
    +* @property YAHOO.widget.SimpleDialog.ICON_WARN
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_WARN  = "nt/ic/ut/bsc/warn16_1.gif";
    +
    +/**
    +* Constant for the standard network icon for a tip
    +* @property YAHOO.widget.SimpleDialog.ICON_TIP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.ICON_TIP   = "nt/ic/ut/bsc/tip16_1.gif";
    +
    +/**
    +* Constant representing the default CSS class used for a SimpleDialog
    +* @property YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG = "simple-dialog";
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.SimpleDialog.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.SimpleDialog.superclass.initDefaultConfig.call(this);
    +
    +	// Add dialog config properties //
    +
    +	/**
    +	* Sets the informational icon for the SimpleDialog
    +	* @config icon
    +	* @type String
    +	* @default "none"
    +	*/
    +	this.cfg.addProperty("icon",	{ value:"none",	handler:this.configIcon, suppressEvent:true } );
    +
    +	/**
    +	* Sets the text for the SimpleDialog
    +	* @config text
    +	* @type String
    +	* @default ""
    +	*/
    +	this.cfg.addProperty("text",	{ value:"", handler:this.configText, suppressEvent:true, supercedes:["icon"] } );
    +};
    +
    +
    +/**
    +* The SimpleDialog initialization method, which is executed for SimpleDialog and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +* @method init
    +* @param {String}	el	The element ID representing the SimpleDialog <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the SimpleDialog
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    +*/
    +YAHOO.widget.SimpleDialog.prototype.init = function(el, userConfig) {
    +	YAHOO.widget.SimpleDialog.superclass.init.call(this, el/*, userConfig*/);  // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level
    +
    +	this.beforeInitEvent.fire(YAHOO.widget.SimpleDialog);
    +
    +	YAHOO.util.Dom.addClass(this.element, YAHOO.widget.SimpleDialog.CSS_SIMPLEDIALOG);
    +
    +	this.cfg.queueProperty("postmethod", "manual");
    +
    +	if (userConfig) {
    +		this.cfg.applyConfig(userConfig, true);
    +	}
    +
    +	this.beforeRenderEvent.subscribe(function() {
    +		if (! this.body) {
    +			this.setBody("");
    +		}
    +	}, this, true);
    +
    +	this.initEvent.fire(YAHOO.widget.SimpleDialog);
    +
    +};
    +/**
    +* Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value hidden field.
    +* @method registerForm
    +*/
    +YAHOO.widget.SimpleDialog.prototype.registerForm = function() {
    +	YAHOO.widget.SimpleDialog.superclass.registerForm.call(this);
    +	this.form.innerHTML += "<input type=\"hidden\" name=\"" + this.id + "\" value=\"\"/>";
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Fired when the "icon" property is set.
    +* @method configIcon
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.SimpleDialog.prototype.configIcon = function(type,args,obj) {
    +	var icon = args[0];
    +	if (icon && icon != "none") {
    +		var iconHTML = "<img src=\"" + this.imageRoot + icon + "\" class=\"icon\" />";
    +		this.body.innerHTML = iconHTML + this.body.innerHTML;
    +	}
    +};
    +
    +/**
    +* Fired when the "text" property is set.
    +* @method configText
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.SimpleDialog.prototype.configText = function(type,args,obj) {
    +	var text = args[0];
    +	if (text) {
    +		this.setBody(text);
    +		this.cfg.refireEvent("icon");
    +	}
    +};
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	The string representation of the SimpleDialog
    +*/
    +YAHOO.widget.SimpleDialog.prototype.toString = function() {
    +	return "SimpleDialog " + this.id;
    +};
    +
    +/**
    +* ContainerEffect encapsulates animation transitions that are executed when an Overlay is shown or hidden.
    +* @namespace YAHOO.widget
    +* @class ContainerEffect
    +* @constructor
    +* @param {YAHOO.widget.Overlay}	overlay		The Overlay that the animation should be associated with
    +* @param {Object}	attrIn		The object literal representing the animation arguments to be used for the animate-in transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    +* @param {Object}	attrOut		The object literal representing the animation arguments to be used for the animate-out transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    +* @param {HTMLElement}	targetElement	Optional. The target element that should be animated during the transition. Defaults to overlay.element.
    +* @param {class}	Optional. The animation class to instantiate. Defaults to YAHOO.util.Anim. Other options include YAHOO.util.Motion.
    +*/
    +YAHOO.widget.ContainerEffect = function(overlay, attrIn, attrOut, targetElement, animClass) {
    +	if (! animClass) {
    +		animClass = YAHOO.util.Anim;
    +	}
    +
    +	/**
    +	* The overlay to animate
    +	* @property overlay
    +	* @type YAHOO.widget.Overlay
    +	*/
    +	this.overlay = overlay;
    +	/**
    +	* The animation attributes to use when transitioning into view
    +	* @property attrIn
    +	* @type Object
    +	*/
    +	this.attrIn = attrIn;
    +	/**
    +	* The animation attributes to use when transitioning out of view
    +	* @property attrOut
    +	* @type Object
    +	*/
    +	this.attrOut = attrOut;
    +	/**
    +	* The target element to be animated
    +	* @property targetElement
    +	* @type HTMLElement
    +	*/
    +	this.targetElement = targetElement || overlay.element;
    +	/**
    +	* The animation class to use for animating the overlay
    +	* @property animClass
    +	* @type class
    +	*/
    +	this.animClass = animClass;
    +};
    +
    +/**
    +* Initializes the animation classes and events.
    +* @method init
    +*/
    +YAHOO.widget.ContainerEffect.prototype.init = function() {
    +	this.beforeAnimateInEvent = new YAHOO.util.CustomEvent("beforeAnimateIn");
    +	this.beforeAnimateOutEvent = new YAHOO.util.CustomEvent("beforeAnimateOut");
    +
    +	this.animateInCompleteEvent = new YAHOO.util.CustomEvent("animateInComplete");
    +	this.animateOutCompleteEvent = new YAHOO.util.CustomEvent("animateOutComplete");
    +
    +	this.animIn = new this.animClass(this.targetElement, this.attrIn.attributes, this.attrIn.duration, this.attrIn.method);
    +	this.animIn.onStart.subscribe(this.handleStartAnimateIn, this);
    +	this.animIn.onTween.subscribe(this.handleTweenAnimateIn, this);
    +	this.animIn.onComplete.subscribe(this.handleCompleteAnimateIn, this);
    +
    +	this.animOut = new this.animClass(this.targetElement, this.attrOut.attributes, this.attrOut.duration, this.attrOut.method);
    +	this.animOut.onStart.subscribe(this.handleStartAnimateOut, this);
    +	this.animOut.onTween.subscribe(this.handleTweenAnimateOut, this);
    +	this.animOut.onComplete.subscribe(this.handleCompleteAnimateOut, this);
    +};
    +
    +/**
    +* Triggers the in-animation.
    +* @method animateIn
    +*/
    +YAHOO.widget.ContainerEffect.prototype.animateIn = function() {
    +	this.beforeAnimateInEvent.fire();
    +	this.animIn.animate();
    +};
    +
    +/**
    +* Triggers the out-animation.
    +* @method animateOut
    +*/
    +YAHOO.widget.ContainerEffect.prototype.animateOut = function() {
    +	this.beforeAnimateOutEvent.fire();
    +	this.animOut.animate();
    +};
    +
    +/**
    +* The default onStart handler for the in-animation.
    +* @method handleStartAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleStartAnimateIn = function(type, args, obj) { };
    +/**
    +* The default onTween handler for the in-animation.
    +* @method handleTweenAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateIn = function(type, args, obj) { };
    +/**
    +* The default onComplete handler for the in-animation.
    +* @method handleCompleteAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateIn = function(type, args, obj) { };
    +
    +/**
    +* The default onStart handler for the out-animation.
    +* @method handleStartAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleStartAnimateOut = function(type, args, obj) { };
    +/**
    +* The default onTween handler for the out-animation.
    +* @method handleTweenAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateOut = function(type, args, obj) { };
    +/**
    +* The default onComplete handler for the out-animation.
    +* @method handleCompleteAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateOut = function(type, args, obj) { };
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	The string representation of the ContainerEffect
    +*/
    +YAHOO.widget.ContainerEffect.prototype.toString = function() {
    +	var output = "ContainerEffect";
    +	if (this.overlay) {
    +		output += " [" + this.overlay.toString() + "]";
    +	}
    +	return output;
    +};
    +
    +/**
    +* A pre-configured ContainerEffect instance that can be used for fading an overlay in and out.
    +* @method FADE
    +* @static
    +* @param {Overlay}	The Overlay object to animate
    +* @param {Number}	The duration of the animation
    +* @return {ContainerEffect}	The configured ContainerEffect object
    +*/
    +YAHOO.widget.ContainerEffect.FADE = function(overlay, dur) {
    +	var fade = new YAHOO.widget.ContainerEffect(overlay, { attributes:{opacity: {from:0, to:1}}, duration:dur, method:YAHOO.util.Easing.easeIn }, { attributes:{opacity: {to:0}}, duration:dur, method:YAHOO.util.Easing.easeOut}, overlay.element );
    +
    +	fade.handleStartAnimateIn = function(type,args,obj) {
    +		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");
    +
    +		if (! obj.overlay.underlay) {
    +			obj.overlay.cfg.refireEvent("underlay");
    +		}
    +
    +		if (obj.overlay.underlay) {
    +			obj.initialUnderlayOpacity = YAHOO.util.Dom.getStyle(obj.overlay.underlay, "opacity");
    +			obj.overlay.underlay.style.filter = null;
    +		}
    +
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 0);
    +	};
    +
    +	fade.handleCompleteAnimateIn = function(type,args,obj) {
    +		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");
    +
    +		if (obj.overlay.element.style.filter) {
    +			obj.overlay.element.style.filter = null;
    +		}
    +
    +		if (obj.overlay.underlay) {
    +			YAHOO.util.Dom.setStyle(obj.overlay.underlay, "opacity", obj.initialUnderlayOpacity);
    +		}
    +
    +		obj.overlay.cfg.refireEvent("iframe");
    +		obj.animateInCompleteEvent.fire();
    +	};
    +
    +	fade.handleStartAnimateOut = function(type, args, obj) {
    +		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");
    +
    +		if (obj.overlay.underlay) {
    +			obj.overlay.underlay.style.filter = null;
    +		}
    +	};
    +
    +	fade.handleCompleteAnimateOut =  function(type, args, obj) {
    +		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");
    +		if (obj.overlay.element.style.filter) {
    +			obj.overlay.element.style.filter = null;
    +		}
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 1);
    +
    +		obj.overlay.cfg.refireEvent("iframe");
    +
    +		obj.animateOutCompleteEvent.fire();
    +	};
    +
    +	fade.init();
    +	return fade;
    +};
    +
    +
    +/**
    +* A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out.
    +* @method SLIDE
    +* @static
    +* @param {Overlay}	The Overlay object to animate
    +* @param {Number}	The duration of the animation
    +* @return {ContainerEffect}	The configured ContainerEffect object
    +*/
    +YAHOO.widget.ContainerEffect.SLIDE = function(overlay, dur) {
    +	var x = overlay.cfg.getProperty("x") || YAHOO.util.Dom.getX(overlay.element);
    +	var y = overlay.cfg.getProperty("y") || YAHOO.util.Dom.getY(overlay.element);
    +
    +	var clientWidth = YAHOO.util.Dom.getClientWidth();
    +	var offsetWidth = overlay.element.offsetWidth;
    +
    +	var slide = new YAHOO.widget.ContainerEffect(overlay, {
    +															attributes:{ points: { to:[x, y] } },
    +															duration:dur,
    +															method:YAHOO.util.Easing.easeIn
    +														},
    +														{
    +															attributes:{ points: { to:[(clientWidth+25), y] } },
    +															duration:dur,
    +															method:YAHOO.util.Easing.easeOut
    +														},
    +														overlay.element,
    +														YAHOO.util.Motion);
    +
    +
    +	slide.handleStartAnimateIn = function(type,args,obj) {
    +		obj.overlay.element.style.left = (-25-offsetWidth) + "px";
    +		obj.overlay.element.style.top  = y + "px";
    +	};
    +
    +	slide.handleTweenAnimateIn = function(type, args, obj) {
    +
    +
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var currentX = pos[0];
    +		var currentY = pos[1];
    +
    +		if (YAHOO.util.Dom.getStyle(obj.overlay.element, "visibility") == "hidden" && currentX < x) {
    +			YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");
    +		}
    +
    +		obj.overlay.cfg.setProperty("xy", [currentX,currentY], true);
    +		obj.overlay.cfg.refireEvent("iframe");
    +	};
    +
    +	slide.handleCompleteAnimateIn = function(type, args, obj) {
    +		obj.overlay.cfg.setProperty("xy", [x,y], true);
    +		obj.startX = x;
    +		obj.startY = y;
    +		obj.overlay.cfg.refireEvent("iframe");
    +		obj.animateInCompleteEvent.fire();
    +	};
    +
    +	slide.handleStartAnimateOut = function(type, args, obj) {
    +		var vw = YAHOO.util.Dom.getViewportWidth();
    +
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var yso = pos[1];
    +
    +		var currentTo = obj.animOut.attributes.points.to;
    +		obj.animOut.attributes.points.to = [(vw+25), yso];
    +	};
    +
    +	slide.handleTweenAnimateOut = function(type, args, obj) {
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var xto = pos[0];
    +		var yto = pos[1];
    +
    +		obj.overlay.cfg.setProperty("xy", [xto,yto], true);
    +		obj.overlay.cfg.refireEvent("iframe");
    +	};
    +
    +	slide.handleCompleteAnimateOut = function(type, args, obj) {
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");
    +
    +		obj.overlay.cfg.setProperty("xy", [x,y]);
    +		obj.animateOutCompleteEvent.fire();
    +	};
    +
    +	slide.init();
    +	return slide;
    +};

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/container_core.js.html b/www/extras/yui-ext/docs/output/container_core.js.html new file mode 100644 index 000000000..372ed7c7d --- /dev/null +++ b/www/extras/yui-ext/docs/output/container_core.js.html @@ -0,0 +1,2884 @@ +container_core.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version 0.12.0
    +*/
    +// holder
    +/**
    +* Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state.
    +* @class YAHOO.util.Config
    +* @constructor
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config = function(owner) {
    +	if (owner) {
    +		this.init(owner);
    +	}
    +};
    +
    +YAHOO.util.Config.prototype = {
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @property owner
    +	* @type Object
    +	*/
    +	owner : null,
    +
    +	/**
    +	* Boolean flag that specifies whether a queue is currently being executed
    +	* @property queueInProgress
    +	* @type Boolean
    +	*/
    +	queueInProgress : false,
    +
    +
    +	/**
    +	* Validates that the value passed in is a Boolean.
    +	* @method checkBoolean
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkBoolean: function(val) {
    +		if (typeof val == 'boolean') {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Validates that the value passed in is a number.
    +	* @method checkNumber
    +	* @param	{Object}	val	The value to validate
    +	* @return	{Boolean}	true, if the value is valid
    +	*/
    +	checkNumber: function(val) {
    +		if (isNaN(val)) {
    +			return false;
    +		} else {
    +			return true;
    +		}
    +	}
    +};
    +
    +
    +/**
    +* Initializes the configuration Object and all of its local members.
    +* @method init
    +* @param {Object}	owner	The owner Object to which this Config Object belongs
    +*/
    +YAHOO.util.Config.prototype.init = function(owner) {
    +
    +	this.owner = owner;
    +
    +	/**
    +	* Object reference to the owner of this Config Object
    +	* @event configChangedEvent
    +	*/
    +	this.configChangedEvent = new YAHOO.util.CustomEvent("configChanged");
    +
    +	this.queueInProgress = false;
    +
    +	/* Private Members */
    +// holder
    +/**
    +	* Maintains the local collection of configuration property objects and their specified values
    +	* @property config
    +	* @private
    +	* @type Object
    +	*/
    +	var config = {};
    +
    +	/**
    +	* Maintains the local collection of configuration property objects as they were initially applied.
    +	* This object is used when resetting a property.
    +	* @property initialConfig
    +	* @private
    +	* @type Object
    +	*/
    +	var initialConfig = {};
    +
    +	/**
    +	* Maintains the local, normalized CustomEvent queue
    +	* @property eventQueue
    +	* @private
    +	* @type Object
    +	*/
    +	var eventQueue = [];
    +
    +	/**
    +	* Fires a configuration property event using the specified value.
    +	* @method fireEvent
    +	* @private
    +	* @param {String}	key			The configuration property's name
    +	* @param {value}	Object		The value of the correct type for the property
    +	*/
    +	var fireEvent = function( key, value ) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			property.event.fire(value);
    +		}
    +	};
    +	/* End Private Members */
    +// holder
    +/**
    +	* Adds a property to the Config Object's private config hash.
    +	* @method addProperty
    +	* @param {String}	key	The configuration property's name
    +	* @param {Object}	propertyObject	The Object containing all of this property's arguments
    +	*/
    +	this.addProperty = function( key, propertyObject ) {
    +		key = key.toLowerCase();
    +
    +		config[key] = propertyObject;
    +
    +		propertyObject.event = new YAHOO.util.CustomEvent(key);
    +		propertyObject.key = key;
    +
    +		if (propertyObject.handler) {
    +			propertyObject.event.subscribe(propertyObject.handler, this.owner, true);
    +		}
    +
    +		this.setProperty(key, propertyObject.value, true);
    +
    +		if (! propertyObject.suppressEvent) {
    +			this.queueProperty(key, propertyObject.value);
    +		}
    +	};
    +
    +	/**
    +	* Returns a key-value configuration map of the values currently set in the Config Object.
    +	* @method getConfig
    +	* @return {Object} The current config, represented in a key-value map
    +	*/
    +	this.getConfig = function() {
    +		var cfg = {};
    +
    +		for (var prop in config) {
    +			var property = config[prop];
    +			if (typeof property != 'undefined' && property.event) {
    +				cfg[prop] = property.value;
    +			}
    +		}
    +
    +		return cfg;
    +	};
    +
    +	/**
    +	* Returns the value of specified property.
    +	* @method getProperty
    +	* @param {String} key	The name of the property
    +	* @return {Object}		The value of the specified property
    +	*/
    +	this.getProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.value;
    +		} else {
    +			return undefined;
    +		}
    +	};
    +
    +	/**
    +	* Resets the specified property's value to its initial value.
    +	* @method resetProperty
    +	* @param {String} key	The name of the property
    +	* @return {Boolean} True is the property was reset, false if not
    +	*/
    +	this.resetProperty = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (initialConfig[key] && initialConfig[key] != 'undefined')	{
    +				this.setProperty(key, initialConfig[key]);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property. If the silent property is passed as true, the property's event will not be fired.
    +	* @method setProperty
    +	* @param {String} key		The name of the property
    +	* @param {String} value		The value to set the property to
    +	* @param {Boolean} silent	Whether the value should be set silently, without firing the property event.
    +	* @return {Boolean}			True, if the set was successful, false if it failed.
    +	*/
    +	this.setProperty = function(key, value, silent) {
    +		key = key.toLowerCase();
    +
    +		if (this.queueInProgress && ! silent) {
    +			this.queueProperty(key,value); // Currently running through a queue...
    +			return true;
    +		} else {
    +			var property = config[key];
    +			if (typeof property != 'undefined' && property.event) {
    +				if (property.validator && ! property.validator(value)) { // validator
    +					return false;
    +				} else {
    +					property.value = value;
    +					if (! silent) {
    +						fireEvent(key, value);
    +						this.configChangedEvent.fire([key, value]);
    +					}
    +					return true;
    +				}
    +			} else {
    +				return false;
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is
    +	* moved from its current position to the end of the queue.
    +	* @method queueProperty
    +	* @param {String} key	The name of the property
    +	* @param {String} value	The value to set the property to
    +	* @return {Boolean}		true, if the set was successful, false if it failed.
    +	*/
    +	this.queueProperty = function(key, value) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +
    +		if (typeof property != 'undefined' && property.event) {
    +			if (typeof value != 'undefined' && property.validator && ! property.validator(value)) { // validator
    +				return false;
    +			} else {
    +
    +				if (typeof value != 'undefined') {
    +					property.value = value;
    +				} else {
    +					value = property.value;
    +				}
    +
    +				var foundDuplicate = false;
    +
    +				for (var i=0;i<eventQueue.length;i++) {
    +					var queueItem = eventQueue[i];
    +
    +					if (queueItem) {
    +						var queueItemKey = queueItem[0];
    +						var queueItemValue = queueItem[1];
    +
    +						if (queueItemKey.toLowerCase() == key) {
    +							// found a dupe... push to end of queue, null current item, and break
    +							eventQueue[i] = null;
    +							eventQueue.push([key, (typeof value != 'undefined' ? value : queueItemValue)]);
    +							foundDuplicate = true;
    +							break;
    +						}
    +					}
    +				}
    +
    +				if (! foundDuplicate && typeof value != 'undefined') { // this is a refire, or a new property in the queue
    +					eventQueue.push([key, value]);
    +				}
    +			}
    +
    +			if (property.supercedes) {
    +				for (var s=0;s<property.supercedes.length;s++) {
    +					var supercedesCheck = property.supercedes[s];
    +
    +					for (var q=0;q<eventQueue.length;q++) {
    +						var queueItemCheck = eventQueue[q];
    +
    +						if (queueItemCheck) {
    +							var queueItemCheckKey = queueItemCheck[0];
    +							var queueItemCheckValue = queueItemCheck[1];
    +
    +							if ( queueItemCheckKey.toLowerCase() == supercedesCheck.toLowerCase() ) {
    +								eventQueue.push([queueItemCheckKey, queueItemCheckValue]);
    +								eventQueue[q] = null;
    +								break;
    +							}
    +						}
    +					}
    +				}
    +			}
    +
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Fires the event for a property using the property's current value.
    +	* @method refireEvent
    +	* @param {String} key	The name of the property
    +	*/
    +	this.refireEvent = function(key) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event && typeof property.value != 'undefined') {
    +			if (this.queueInProgress) {
    +				this.queueProperty(key);
    +			} else {
    +				fireEvent(key, property.value);
    +			}
    +		}
    +	};
    +
    +	/**
    +	* Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property events.
    +	* Although the values will be set, fireQueue() must be called for their associated events to execute.
    +	* @method applyConfig
    +	* @param {Object}	userConfig	The configuration Object literal
    +	* @param {Boolean}	init		When set to true, the initialConfig will be set to the userConfig passed in, so that calling a reset will reset the properties to the passed values.
    +	*/
    +	this.applyConfig = function(userConfig, init) {
    +		if (init) {
    +			initialConfig = userConfig;
    +		}
    +		for (var prop in userConfig) {
    +			this.queueProperty(prop, userConfig[prop]);
    +		}
    +	};
    +
    +	/**
    +	* Refires the events for all configuration properties using their current values.
    +	* @method refresh
    +	*/
    +	this.refresh = function() {
    +		for (var prop in config) {
    +			this.refireEvent(prop);
    +		}
    +	};
    +
    +	/**
    +	* Fires the normalized list of queued property change events
    +	* @method fireQueue
    +	*/
    +	this.fireQueue = function() {
    +		this.queueInProgress = true;
    +		for (var i=0;i<eventQueue.length;i++) {
    +			var queueItem = eventQueue[i];
    +			if (queueItem) {
    +				var key = queueItem[0];
    +				var value = queueItem[1];
    +
    +				var property = config[key];
    +				property.value = value;
    +
    +				fireEvent(key,value);
    +			}
    +		}
    +
    +		this.queueInProgress = false;
    +		eventQueue = [];
    +	};
    +
    +	/**
    +	* Subscribes an external handler to the change event for any given property.
    +	* @method subscribeToConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @param {Boolean}	override	Optional. If true, will override "this" within the handler to map to the scope Object passed into the method.
    +	* @return {Boolean}				True, if the subscription was successful, otherwise false.
    +	*/
    +	this.subscribeToConfigEvent = function(key, handler, obj, override) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			if (! YAHOO.util.Config.alreadySubscribed(property.event, handler, obj)) {
    +				property.event.subscribe(handler, obj, override);
    +			}
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Unsubscribes an external handler from the change event for any given property.
    +	* @method unsubscribeFromConfigEvent
    +	* @param {String}	key			The property name
    +	* @param {Function}	handler		The handler function to use subscribe to the property's event
    +	* @param {Object}	obj			The Object to use for scoping the event handler (see CustomEvent documentation)
    +	* @return {Boolean}				True, if the unsubscription was successful, otherwise false.
    +	*/
    +	this.unsubscribeFromConfigEvent = function(key, handler, obj) {
    +		key = key.toLowerCase();
    +
    +		var property = config[key];
    +		if (typeof property != 'undefined' && property.event) {
    +			return property.event.unsubscribe(handler, obj);
    +		} else {
    +			return false;
    +		}
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object
    +	* @method toString
    +	* @return {String}	The Config object in string format.
    +	*/
    +	this.toString = function() {
    +		var output = "Config";
    +		if (this.owner) {
    +			output += " [" + this.owner.toString() + "]";
    +		}
    +		return output;
    +	};
    +
    +	/**
    +	* Returns a string representation of the Config object's current CustomEvent queue
    +	* @method outputEventQueue
    +	* @return {String}	The string list of CustomEvents currently queued for execution
    +	*/
    +	this.outputEventQueue = function() {
    +		var output = "";
    +		for (var q=0;q<eventQueue.length;q++) {
    +			var queueItem = eventQueue[q];
    +			if (queueItem) {
    +				output += queueItem[0] + "=" + queueItem[1] + ", ";
    +			}
    +		}
    +		return output;
    +	};
    +};
    +
    +/**
    +* Checks to determine if a particular function/Object pair are already subscribed to the specified CustomEvent
    +* @method YAHOO.util.Config.alreadySubscribed
    +* @static
    +* @param {YAHOO.util.CustomEvent} evt	The CustomEvent for which to check the subscriptions
    +* @param {Function}	fn	The function to look for in the subscribers list
    +* @param {Object}	obj	The execution scope Object for the subscription
    +* @return {Boolean}	true, if the function/Object pair is already subscribed to the CustomEvent passed in
    +*/
    +YAHOO.util.Config.alreadySubscribed = function(evt, fn, obj) {
    +	for (var e=0;e<evt.subscribers.length;e++) {
    +		var subsc = evt.subscribers[e];
    +		if (subsc && subsc.obj == obj && subsc.fn == fn) {
    +			return true;
    +		}
    +	}
    +	return false;
    +};
    +
    +/**
    +*  The Container family of components is designed to enable developers to create different kinds of content-containing modules on the web. Module and Overlay are the most basic containers, and they can be used directly or extended to build custom containers. Also part of the Container family are four UI controls that extend Module and Overlay: Tooltip, Panel, Dialog, and SimpleDialog.
    +* @module Container
    +* @requires yahoo,dom,event,dragdrop,animation
    +*/
    +// holder
    +/**
    +* Module is a JavaScript representation of the Standard Module Format. Standard Module Format is a simple standard for markup containers where child nodes representing the header, body, and footer of the content are denoted using the CSS classes "hd", "bd", and "ft" respectively. Module is the base class for all other classes in the YUI Container package.
    +* @class Module
    +* @namespace YAHOO.widget
    +* @constructor
    +* @param {String} el			The element ID representing the Module <em>OR</em>
    +* @param {HTMLElement} el		The element representing the Module
    +* @param {Object} userConfig	The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Module = function(el, userConfig) {
    +	if (el) {
    +		this.init(el, userConfig);
    +	}
    +};
    +
    +/**
    +* Constant representing the prefix path to use for non-secure images
    +* @property YAHOO.widget.Module.IMG_ROOT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.IMG_ROOT = "http://us.i1.yimg.com/us.yimg.com/i/";
    +
    +/**
    +* Constant representing the prefix path to use for securely served images
    +* @property YAHOO.widget.Module.IMG_ROOT_SSL
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.IMG_ROOT_SSL = "https://a248.e.akamai.net/sec.yimg.com/i/";
    +
    +/**
    +* Constant for the default CSS class name that represents a Module
    +* @property YAHOO.widget.Module.CSS_MODULE
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_MODULE = "module";
    +
    +/**
    +* Constant representing the module header
    +* @property YAHOO.widget.Module.CSS_HEADER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_HEADER = "hd";
    +
    +/**
    +* Constant representing the module body
    +* @property YAHOO.widget.Module.CSS_BODY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_BODY = "bd";
    +
    +/**
    +* Constant representing the module footer
    +* @property YAHOO.widget.Module.CSS_FOOTER
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.CSS_FOOTER = "ft";
    +
    +/**
    +* Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +* @property YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL = "javascript:false;";
    +
    +YAHOO.widget.Module.prototype = {
    +	/**
    +	* The class's constructor function
    +	* @property contructor
    +	* @type Function
    +	*/
    +	constructor : YAHOO.widget.Module,
    +
    +	/**
    +	* The main module element that contains the header, body, and footer
    +	* @property element
    +	* @type HTMLElement
    +	*/
    +	element : null,
    +
    +	/**
    +	* The header element, denoted with CSS class "hd"
    +	* @property header
    +	* @type HTMLElement
    +	*/
    +	header : null,
    +
    +	/**
    +	* The body element, denoted with CSS class "bd"
    +	* @property body
    +	* @type HTMLElement
    +	*/
    +	body : null,
    +
    +	/**
    +	* The footer element, denoted with CSS class "ft"
    +	* @property footer
    +	* @type HTMLElement
    +	*/
    +	footer : null,
    +
    +	/**
    +	* The id of the element
    +	* @property id
    +	* @type String
    +	*/
    +	id : null,
    +
    +	/**
    +	* The String representing the image root
    +	* @property imageRoot
    +	* @type String
    +	*/
    +	imageRoot : YAHOO.widget.Module.IMG_ROOT,
    +
    +	/**
    +	* Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
    +	* @method initEvents
    +	*/
    +	initEvents : function() {
    +
    +		/**
    +		* CustomEvent fired prior to class initalization.
    +		* @event beforeInitEvent
    +		* @param {class} classRef	class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +		*/
    +		this.beforeInitEvent = new YAHOO.util.CustomEvent("beforeInit");
    +
    +		/**
    +		* CustomEvent fired after class initalization.
    +		* @event initEvent
    +		* @param {class} classRef	class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +		*/
    +		this.initEvent = new YAHOO.util.CustomEvent("init");
    +
    +		/**
    +		* CustomEvent fired when the Module is appended to the DOM
    +		* @event appendEvent
    +		*/
    +		this.appendEvent = new YAHOO.util.CustomEvent("append");
    +
    +		/**
    +		* CustomEvent fired before the Module is rendered
    +		* @event beforeRenderEvent
    +		*/
    +		this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender");
    +
    +		/**
    +		* CustomEvent fired after the Module is rendered
    +		* @event renderEvent
    +		*/
    +		this.renderEvent = new YAHOO.util.CustomEvent("render");
    +
    +		/**
    +		* CustomEvent fired when the header content of the Module is modified
    +		* @event changeHeaderEvent
    +		* @param {String/HTMLElement} content	String/element representing the new header content
    +		*/
    +		this.changeHeaderEvent = new YAHOO.util.CustomEvent("changeHeader");
    +
    +		/**
    +		* CustomEvent fired when the body content of the Module is modified
    +		* @event changeBodyEvent
    +		* @param {String/HTMLElement} content	String/element representing the new body content
    +		*/
    +		this.changeBodyEvent = new YAHOO.util.CustomEvent("changeBody");
    +
    +		/**
    +		* CustomEvent fired when the footer content of the Module is modified
    +		* @event changeFooterEvent
    +		* @param {String/HTMLElement} content	String/element representing the new footer content
    +		*/
    +		this.changeFooterEvent = new YAHOO.util.CustomEvent("changeFooter");
    +
    +		/**
    +		* CustomEvent fired when the content of the Module is modified
    +		* @event changeContentEvent
    +		*/
    +		this.changeContentEvent = new YAHOO.util.CustomEvent("changeContent");
    +
    +		/**
    +		* CustomEvent fired when the Module is destroyed
    +		* @event destroyEvent
    +		*/
    +		this.destroyEvent = new YAHOO.util.CustomEvent("destroy");
    +
    +		/**
    +		* CustomEvent fired before the Module is shown
    +		* @event beforeShowEvent
    +		*/
    +		this.beforeShowEvent = new YAHOO.util.CustomEvent("beforeShow");
    +
    +		/**
    +		* CustomEvent fired after the Module is shown
    +		* @event showEvent
    +		*/
    +		this.showEvent = new YAHOO.util.CustomEvent("show");
    +
    +		/**
    +		* CustomEvent fired before the Module is hidden
    +		* @event beforeHideEvent
    +		*/
    +		this.beforeHideEvent = new YAHOO.util.CustomEvent("beforeHide");
    +
    +		/**
    +		* CustomEvent fired after the Module is hidden
    +		* @event hideEvent
    +		*/
    +		this.hideEvent = new YAHOO.util.CustomEvent("hide");
    +	},
    +
    +	/**
    +	* String representing the current user-agent platform
    +	* @property platform
    +	* @type String
    +	*/
    +	platform : function() {
    +					var ua = navigator.userAgent.toLowerCase();
    +					if (ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1) {
    +						return "windows";
    +					} else if (ua.indexOf("macintosh") != -1) {
    +						return "mac";
    +					} else {
    +						return false;
    +					}
    +				}(),
    +
    +	/**
    +	* String representing the current user-agent browser
    +	* @property browser
    +	* @type String
    +	*/
    +	browser : function() {
    +			var ua = navigator.userAgent.toLowerCase();
    +				  if (ua.indexOf('opera')!=-1) { // Opera (check first in case of spoof)
    +					 return 'opera';
    +				  } else if (ua.indexOf('msie 7')!=-1) { // IE7
    +					 return 'ie7';
    +				  } else if (ua.indexOf('msie') !=-1) { // IE
    +					 return 'ie';
    +				  } else if (ua.indexOf('safari')!=-1) { // Safari (check before Gecko because it includes "like Gecko")
    +					 return 'safari';
    +				  } else if (ua.indexOf('gecko') != -1) { // Gecko
    +					 return 'gecko';
    +				  } else {
    +					 return false;
    +				  }
    +			}(),
    +
    +	/**
    +	* Boolean representing whether or not the current browsing context is secure (https)
    +	* @property isSecure
    +	* @type Boolean
    +	*/
    +	isSecure : function() {
    +		if (window.location.href.toLowerCase().indexOf("https") === 0) {
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	}(),
    +
    +	/**
    +	* Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
    +	*/
    +	initDefaultConfig : function() {
    +		// Add properties //
    +
    +		/**
    +		* Specifies whether the Module is visible on the page.
    +		* @config visible
    +		* @type Boolean
    +		* @default true
    +		*/
    +		this.cfg.addProperty("visible", { value:true, handler:this.configVisible, validator:this.cfg.checkBoolean } );
    +
    +		/**
    +		* Object or array of objects representing the ContainerEffect classes that are active for animating the container.
    +		* @config effect
    +		* @type Object
    +		* @default null
    +		*/
    +		this.cfg.addProperty("effect", { suppressEvent:true, supercedes:["visible"] } );
    +
    +		/**
    +		* Specifies whether to create a special proxy iframe to monitor for user font resizing in the document
    +		* @config monitorresize
    +		* @type Boolean
    +		* @default true
    +		*/
    +		this.cfg.addProperty("monitorresize", { value:true, handler:this.configMonitorResize } );
    +	},
    +
    +	/**
    +	* The Module class's initialization method, which is executed for Module and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +	* @method init
    +	* @param {String}	el	The element ID representing the Module <em>OR</em>
    +	* @param {HTMLElement}	el	The element representing the Module
    +	* @param {Object}	userConfig	The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    +	*/
    +	init : function(el, userConfig) {
    +
    +		this.initEvents();
    +
    +		this.beforeInitEvent.fire(YAHOO.widget.Module);
    +
    +		/**
    +		* The Module's Config object used for monitoring configuration properties.
    +		* @property cfg
    +		* @type YAHOO.util.Config
    +		*/
    +		this.cfg = new YAHOO.util.Config(this);
    +
    +		if (this.isSecure) {
    +			this.imageRoot = YAHOO.widget.Module.IMG_ROOT_SSL;
    +		}
    +
    +		if (typeof el == "string") {
    +			var elId = el;
    +
    +			el = document.getElementById(el);
    +			if (! el) {
    +				el = document.createElement("DIV");
    +				el.id = elId;
    +			}
    +		}
    +
    +		this.element = el;
    +
    +		if (el.id) {
    +			this.id = el.id;
    +		}
    +
    +		var childNodes = this.element.childNodes;
    +
    +		if (childNodes) {
    +			for (var i=0;i<childNodes.length;i++) {
    +				var child = childNodes[i];
    +				switch (child.className) {
    +					case YAHOO.widget.Module.CSS_HEADER:
    +						this.header = child;
    +						break;
    +					case YAHOO.widget.Module.CSS_BODY:
    +						this.body = child;
    +						break;
    +					case YAHOO.widget.Module.CSS_FOOTER:
    +						this.footer = child;
    +						break;
    +				}
    +			}
    +		}
    +
    +		this.initDefaultConfig();
    +
    +		YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Module.CSS_MODULE);
    +
    +		if (userConfig) {
    +			this.cfg.applyConfig(userConfig, true);
    +		}
    +
    +		// Subscribe to the fireQueue() method of Config so that any queued configuration changes are
    +		// excecuted upon render of the Module
    +		if (! YAHOO.util.Config.alreadySubscribed(this.renderEvent, this.cfg.fireQueue, this.cfg)) {
    +			this.renderEvent.subscribe(this.cfg.fireQueue, this.cfg, true);
    +		}
    +
    +		this.initEvent.fire(YAHOO.widget.Module);
    +	},
    +
    +	/**
    +	* Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
    +	* @method initResizeMonitor
    +	*/
    +	initResizeMonitor : function() {
    +
    +        if(this.browser != "opera") {
    +
    +            var resizeMonitor = document.getElementById("_yuiResizeMonitor");
    +
    +            if (! resizeMonitor) {
    +
    +                resizeMonitor = document.createElement("iframe");
    +
    +                var bIE = (this.browser.indexOf("ie") === 0);
    +
    +                if(this.isSecure &&
    +                   YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL &&
    +                   bIE) {
    +
    +                  resizeMonitor.src =
    +                       YAHOO.widget.Module.RESIZE_MONITOR_SECURE_URL;
    +
    +                }
    +
    +                resizeMonitor.id = "_yuiResizeMonitor";
    +                resizeMonitor.style.visibility = "hidden";
    +
    +                document.body.appendChild(resizeMonitor);
    +
    +                resizeMonitor.style.width = "10em";
    +                resizeMonitor.style.height = "10em";
    +                resizeMonitor.style.position = "absolute";
    +
    +                var nLeft = -1 * resizeMonitor.offsetWidth,
    +                    nTop = -1 * resizeMonitor.offsetHeight;
    +
    +                resizeMonitor.style.top = nTop + "px";
    +                resizeMonitor.style.left =  nLeft + "px";
    +                resizeMonitor.style.borderStyle = "none";
    +                resizeMonitor.style.borderWidth = "0";
    +                YAHOO.util.Dom.setStyle(resizeMonitor, "opacity", "0");
    +
    +                resizeMonitor.style.visibility = "visible";
    +
    +                if(!bIE) {
    +
    +                    var doc = resizeMonitor.contentWindow.document;
    +
    +                    doc.open();
    +                    doc.close();
    +
    +                }
    +
    +            }
    +
    +            if(resizeMonitor && resizeMonitor.contentWindow) {
    +
    +                this.resizeMonitor = resizeMonitor;
    +
    +                YAHOO.util.Event.addListener(this.resizeMonitor.contentWindow, "resize", this.onDomResize, this, true);
    +
    +            }
    +
    +        }
    +
    +	},
    +
    +	/**
    +	* Event handler fired when the resize monitor element is resized.
    +	* @method onDomResize
    +	* @param {DOMEvent} e	The DOM resize event
    +	* @param {Object} obj	The scope object passed to the handler
    +	*/
    +	onDomResize : function(e, obj) {
    +
    +        var nLeft = -1 * this.resizeMonitor.offsetWidth,
    +            nTop = -1 * this.resizeMonitor.offsetHeight;
    +
    +        this.resizeMonitor.style.top = nTop + "px";
    +        this.resizeMonitor.style.left =  nLeft + "px";
    +
    +	},
    +
    +	/**
    +	* Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created.
    +	* @method setHeader
    +	* @param {String}	headerContent	The HTML used to set the header <em>OR</em>
    +	* @param {HTMLElement}	headerContent	The HTMLElement to append to the header
    +	*/
    +	setHeader : function(headerContent) {
    +		if (! this.header) {
    +			this.header = document.createElement("DIV");
    +			this.header.className = YAHOO.widget.Module.CSS_HEADER;
    +		}
    +
    +		if (typeof headerContent == "string") {
    +			this.header.innerHTML = headerContent;
    +		} else {
    +			this.header.innerHTML = "";
    +			this.header.appendChild(headerContent);
    +		}
    +
    +		this.changeHeaderEvent.fire(headerContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the header. If no header is present, one will be automatically created.
    +	* @method appendToHeader
    +	* @param {HTMLElement}	element	The element to append to the header
    +	*/
    +	appendToHeader : function(element) {
    +		if (! this.header) {
    +			this.header = document.createElement("DIV");
    +			this.header.className = YAHOO.widget.Module.CSS_HEADER;
    +		}
    +
    +		this.header.appendChild(element);
    +		this.changeHeaderEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created.
    +	* @method setBody
    +	* @param {String}	bodyContent	The HTML used to set the body <em>OR</em>
    +	* @param {HTMLElement}	bodyContent	The HTMLElement to append to the body
    +	*/
    +	setBody : function(bodyContent) {
    +		if (! this.body) {
    +			this.body = document.createElement("DIV");
    +			this.body.className = YAHOO.widget.Module.CSS_BODY;
    +		}
    +
    +		if (typeof bodyContent == "string")
    +		{
    +			this.body.innerHTML = bodyContent;
    +		} else {
    +			this.body.innerHTML = "";
    +			this.body.appendChild(bodyContent);
    +		}
    +
    +		this.changeBodyEvent.fire(bodyContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the body. If no body is present, one will be automatically created.
    +	* @method appendToBody
    +	* @param {HTMLElement}	element	The element to append to the body
    +	*/
    +	appendToBody : function(element) {
    +		if (! this.body) {
    +			this.body = document.createElement("DIV");
    +			this.body.className = YAHOO.widget.Module.CSS_BODY;
    +		}
    +
    +		this.body.appendChild(element);
    +		this.changeBodyEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created.
    +	* @method setFooter
    +	* @param {String}	footerContent	The HTML used to set the footer <em>OR</em>
    +	* @param {HTMLElement}	footerContent	The HTMLElement to append to the footer
    +	*/
    +	setFooter : function(footerContent) {
    +		if (! this.footer) {
    +			this.footer = document.createElement("DIV");
    +			this.footer.className = YAHOO.widget.Module.CSS_FOOTER;
    +		}
    +
    +		if (typeof footerContent == "string") {
    +			this.footer.innerHTML = footerContent;
    +		} else {
    +			this.footer.innerHTML = "";
    +			this.footer.appendChild(footerContent);
    +		}
    +
    +		this.changeFooterEvent.fire(footerContent);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Appends the passed element to the footer. If no footer is present, one will be automatically created.
    +	* @method appendToFooter
    +	* @param {HTMLElement}	element	The element to append to the footer
    +	*/
    +	appendToFooter : function(element) {
    +		if (! this.footer) {
    +			this.footer = document.createElement("DIV");
    +			this.footer.className = YAHOO.widget.Module.CSS_FOOTER;
    +		}
    +
    +		this.footer.appendChild(element);
    +		this.changeFooterEvent.fire(element);
    +		this.changeContentEvent.fire();
    +	},
    +
    +	/**
    +	* Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure.
    +	* @method render
    +	* @param {String}	appendToNode	The element id to which the Module should be appended to prior to rendering <em>OR</em>
    +	* @param {HTMLElement}	appendToNode	The element to which the Module should be appended to prior to rendering
    +	* @param {HTMLElement}	moduleElement	OPTIONAL. The element that represents the actual Standard Module container.
    +	* @return {Boolean} Success or failure of the render
    +	*/
    +	render : function(appendToNode, moduleElement) {
    +		this.beforeRenderEvent.fire();
    +
    +		if (! moduleElement) {
    +			moduleElement = this.element;
    +		}
    +
    +		var me = this;
    +		var appendTo = function(element) {
    +			if (typeof element == "string") {
    +				element = document.getElementById(element);
    +			}
    +
    +			if (element) {
    +				element.appendChild(me.element);
    +				me.appendEvent.fire();
    +			}
    +		};
    +
    +		if (appendToNode) {
    +			appendTo(appendToNode);
    +		} else { // No node was passed in. If the element is not pre-marked up, this fails
    +			if (! YAHOO.util.Dom.inDocument(this.element)) {
    +				return false;
    +			}
    +		}
    +
    +		// Need to get everything into the DOM if it isn't already
    +
    +		if (this.header && ! YAHOO.util.Dom.inDocument(this.header)) {
    +			// There is a header, but it's not in the DOM yet... need to add it
    +			var firstChild = moduleElement.firstChild;
    +			if (firstChild) { // Insert before first child if exists
    +				moduleElement.insertBefore(this.header, firstChild);
    +			} else { // Append to empty body because there are no children
    +				moduleElement.appendChild(this.header);
    +			}
    +		}
    +
    +		if (this.body && ! YAHOO.util.Dom.inDocument(this.body)) {
    +			// There is a body, but it's not in the DOM yet... need to add it
    +			if (this.footer && YAHOO.util.Dom.isAncestor(this.moduleElement, this.footer)) { // Insert before footer if exists in DOM
    +				moduleElement.insertBefore(this.body, this.footer);
    +			} else { // Append to element because there is no footer
    +				moduleElement.appendChild(this.body);
    +			}
    +		}
    +
    +		if (this.footer && ! YAHOO.util.Dom.inDocument(this.footer)) {
    +			// There is a footer, but it's not in the DOM yet... need to add it
    +			moduleElement.appendChild(this.footer);
    +		}
    +
    +		this.renderEvent.fire();
    +		return true;
    +	},
    +
    +	/**
    +	* Removes the Module element from the DOM and sets all child elements to null.
    +	* @method destroy
    +	*/
    +	destroy : function() {
    +		if (this.element) {
    +			var parent = this.element.parentNode;
    +		}
    +		if (parent) {
    +			parent.removeChild(this.element);
    +		}
    +
    +		this.element = null;
    +		this.header = null;
    +		this.body = null;
    +		this.footer = null;
    +
    +		this.destroyEvent.fire();
    +	},
    +
    +	/**
    +	* Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after.
    +	* @method show
    +	*/
    +	show : function() {
    +		this.cfg.setProperty("visible", true);
    +	},
    +
    +	/**
    +	* Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after.
    +	* @method hide
    +	*/
    +	hide : function() {
    +		this.cfg.setProperty("visible", false);
    +	},
    +
    +	// BUILT-IN EVENT HANDLERS FOR MODULE //
    +
    +	/**
    +	* Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none".
    +	* This method is responsible for firing showEvent and hideEvent.
    +	* @param {String} type	The CustomEvent type (usually the property name)
    +	* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +	* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +	* @method configVisible
    +	*/
    +	configVisible : function(type, args, obj) {
    +		var visible = args[0];
    +		if (visible) {
    +			this.beforeShowEvent.fire();
    +			YAHOO.util.Dom.setStyle(this.element, "display", "block");
    +			this.showEvent.fire();
    +		} else {
    +			this.beforeHideEvent.fire();
    +			YAHOO.util.Dom.setStyle(this.element, "display", "none");
    +			this.hideEvent.fire();
    +		}
    +	},
    +
    +	/**
    +	* Default event handler for the "monitorresize" configuration property
    +	* @param {String} type	The CustomEvent type (usually the property name)
    +	* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +	* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +	* @method configMonitorResize
    +	*/
    +	configMonitorResize : function(type, args, obj) {
    +		var monitor = args[0];
    +		if (monitor) {
    +			this.initResizeMonitor();
    +		} else {
    +			YAHOO.util.Event.removeListener(this.resizeMonitor, "resize", this.onDomResize);
    +			this.resizeMonitor = null;
    +		}
    +	}
    +};
    +
    +/**
    +* Returns a String representation of the Object.
    +* @method toString
    +* @return {String}	The string representation of the Module
    +*/
    +YAHOO.widget.Module.prototype.toString = function() {
    +	return "Module " + this.id;
    +};
    +
    +/**
    +* Overlay is a Module that is absolutely positioned above the page flow. It has convenience methods for positioning and sizing, as well as options for controlling zIndex and constraining the Overlay's position to the current visible viewport. Overlay also contains a dynamicly generated IFRAME which is placed beneath it for Internet Explorer 6 and 5.x so that it will be properly rendered above SELECT elements.
    +* @class Overlay
    +* @namespace YAHOO.widget
    +* @extends YAHOO.widget.Module
    +* @param {String}	el	The element ID representing the Overlay <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Overlay
    +* @param {Object}	userConfig	The configuration object literal containing 10/23/2006the configuration that should be set for this Overlay. See configuration documentation for more details.
    +* @constructor
    +*/
    +YAHOO.widget.Overlay = function(el, userConfig) {
    +	YAHOO.widget.Overlay.superclass.constructor.call(this, el, userConfig);
    +};
    +
    +YAHOO.extend(YAHOO.widget.Overlay, YAHOO.widget.Module);
    +
    +/**
    +* The URL that will be placed in the iframe
    +* @property YAHOO.widget.Overlay.IFRAME_SRC
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.IFRAME_SRC = "javascript:false;"
    +
    +/**
    +* Constant representing the top left corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.TOP_LEFT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.TOP_LEFT = "tl";
    +
    +/**
    +* Constant representing the top right corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.TOP_RIGHT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.TOP_RIGHT = "tr";
    +
    +/**
    +* Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.BOTTOM_LEFT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.BOTTOM_LEFT = "bl";
    +
    +/**
    +* Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +* @property YAHOO.widget.Overlay.BOTTOM_RIGHT
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.BOTTOM_RIGHT = "br";
    +
    +/**
    +* Constant representing the default CSS class used for an Overlay
    +* @property YAHOO.widget.Overlay.CSS_OVERLAY
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.Overlay.CSS_OVERLAY = "overlay";
    +
    +/**
    +* The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and  sets up all DOM references for pre-existing markup, and creates required markup if it is not already present.
    +* @method init
    +* @param {String}	el	The element ID representing the Overlay <em>OR</em>
    +* @param {HTMLElement}	el	The element representing the Overlay
    +* @param {Object}	userConfig	The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +*/
    +YAHOO.widget.Overlay.prototype.init = function(el, userConfig) {
    +	YAHOO.widget.Overlay.superclass.init.call(this, el/*, userConfig*/);  // Note that we don't pass the user config in here yet because we only want it executed once, at the lowest subclass level
    +
    +	this.beforeInitEvent.fire(YAHOO.widget.Overlay);
    +
    +	YAHOO.util.Dom.addClass(this.element, YAHOO.widget.Overlay.CSS_OVERLAY);
    +
    +	if (userConfig) {
    +		this.cfg.applyConfig(userConfig, true);
    +	}
    +
    +	if (this.platform == "mac" && this.browser == "gecko") {
    +		if (! YAHOO.util.Config.alreadySubscribed(this.showEvent,this.showMacGeckoScrollbars,this)) {
    +			this.showEvent.subscribe(this.showMacGeckoScrollbars,this,true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent,this.hideMacGeckoScrollbars,this)) {
    +			this.hideEvent.subscribe(this.hideMacGeckoScrollbars,this,true);
    +		}
    +	}
    +
    +	this.initEvent.fire(YAHOO.widget.Overlay);
    +};
    +
    +/**
    +* Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
    +* @method initEvents
    +*/
    +YAHOO.widget.Overlay.prototype.initEvents = function() {
    +	YAHOO.widget.Overlay.superclass.initEvents.call(this);
    +
    +	/**
    +	* CustomEvent fired before the Overlay is moved.
    +	* @event beforeMoveEvent
    +	* @param {Number} x	x coordinate
    +	* @param {Number} y	y coordinate
    +	*/
    +	this.beforeMoveEvent = new YAHOO.util.CustomEvent("beforeMove", this);
    +
    +	/**
    +	* CustomEvent fired after the Overlay is moved.
    +	* @event moveEvent
    +	* @param {Number} x	x coordinate
    +	* @param {Number} y	y coordinate
    +	*/
    +	this.moveEvent = new YAHOO.util.CustomEvent("move", this);
    +};
    +
    +/**
    +* Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
    +* @method initDefaultConfig
    +*/
    +YAHOO.widget.Overlay.prototype.initDefaultConfig = function() {
    +	YAHOO.widget.Overlay.superclass.initDefaultConfig.call(this);
    +
    +	// Add overlay config properties //
    +
    +	/**
    +	* The absolute x-coordinate position of the Overlay
    +	* @config x
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("x", { handler:this.configX, validator:this.cfg.checkNumber, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* The absolute y-coordinate position of the Overlay
    +	* @config y
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("y", { handler:this.configY, validator:this.cfg.checkNumber, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* An array with the absolute x and y positions of the Overlay
    +	* @config xy
    +	* @type Number[]
    +	* @default null
    +	*/
    +	this.cfg.addProperty("xy",{ handler:this.configXY, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* The array of context arguments for context-sensitive positioning. The format is: [id or element, element corner, context corner]. For example, setting this property to ["img1", "tl", "bl"] would align the Overlay's top left corner to the context element's bottom left corner.
    +	* @config context
    +	* @type Array
    +	* @default null
    +	*/
    +	this.cfg.addProperty("context",	{ handler:this.configContext, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* True if the Overlay should be anchored to the center of the viewport.
    +	* @config fixedcenter
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("fixedcenter", { value:false, handler:this.configFixedCenter, validator:this.cfg.checkBoolean, supercedes:["iframe","visible"] } );
    +
    +	/**
    +	* CSS width of the Overlay.
    +	* @config width
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("width", { handler:this.configWidth, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* CSS height of the Overlay.
    +	* @config height
    +	* @type String
    +	* @default null
    +	*/
    +	this.cfg.addProperty("height", { handler:this.configHeight, suppressEvent:true, supercedes:["iframe"] } );
    +
    +	/**
    +	* CSS z-index of the Overlay.
    +	* @config zIndex
    +	* @type Number
    +	* @default null
    +	*/
    +	this.cfg.addProperty("zIndex", { value:null, handler:this.configzIndex } );
    +
    +	/**
    +	* True if the Overlay should be prevented from being positioned out of the viewport.
    +	* @config constraintoviewport
    +	* @type Boolean
    +	* @default false
    +	*/
    +	this.cfg.addProperty("constraintoviewport", { value:false, handler:this.configConstrainToViewport, validator:this.cfg.checkBoolean, supercedes:["iframe","x","y","xy"] } );
    +
    +	/**
    +	* True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below).
    +	* @config iframe
    +	* @type Boolean
    +	* @default true for IE6 and below, false for all others
    +	*/
    +	this.cfg.addProperty("iframe", { value:(this.browser == "ie" ? true : false), handler:this.configIframe, validator:this.cfg.checkBoolean, supercedes:["zIndex"] } );
    +};
    +
    +/**
    +* Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
    +* @method moveTo
    +* @param {Number}	x	The Overlay's new x position
    +* @param {Number}	y	The Overlay's new y position
    +*/
    +YAHOO.widget.Overlay.prototype.moveTo = function(x, y) {
    +	this.cfg.setProperty("xy",[x,y]);
    +};
    +
    +/**
    +* Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where
    +* scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435
    +* @method hideMacGeckoScrollbars
    +*/
    +YAHOO.widget.Overlay.prototype.hideMacGeckoScrollbars = function() {
    +	YAHOO.util.Dom.removeClass(this.element, "show-scrollbars");
    +	YAHOO.util.Dom.addClass(this.element, "hide-scrollbars");
    +};
    +
    +/**
    +* Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where
    +* scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435
    +* @method showMacGeckoScrollbars
    +*/
    +YAHOO.widget.Overlay.prototype.showMacGeckoScrollbars = function() {
    +	YAHOO.util.Dom.removeClass(this.element, "hide-scrollbars");
    +	YAHOO.util.Dom.addClass(this.element, "show-scrollbars");
    +};
    +
    +// BEGIN BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent.
    +* @method configVisible
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configVisible = function(type, args, obj) {
    +	var visible = args[0];
    +
    +	var currentVis = YAHOO.util.Dom.getStyle(this.element, "visibility");
    +
    +	if (currentVis == "inherit") {
    +		var e = this.element.parentNode;
    +		while (e.nodeType != 9 && e.nodeType != 11) {
    +			currentVis = YAHOO.util.Dom.getStyle(e, "visibility");
    +			if (currentVis != "inherit") { break; }
    +			e = e.parentNode;
    +		}
    +		if (currentVis == "inherit") {
    +			currentVis = "visible";
    +		}
    +	}
    +
    +	var effect = this.cfg.getProperty("effect");
    +
    +	var effectInstances = [];
    +	if (effect) {
    +		if (effect instanceof Array) {
    +			for (var i=0;i<effect.length;i++) {
    +				var eff = effect[i];
    +				effectInstances[effectInstances.length] = eff.effect(this, eff.duration);
    +			}
    +		} else {
    +			effectInstances[effectInstances.length] = effect.effect(this, effect.duration);
    +		}
    +	}
    +
    +	var isMacGecko = (this.platform == "mac" && this.browser == "gecko");
    +
    +	if (visible) { // Show
    +		if (isMacGecko) {
    +			this.showMacGeckoScrollbars();
    +		}
    +
    +		if (effect) { // Animate in
    +			if (visible) { // Animate in if not showing
    +				if (currentVis != "visible" || currentVis === "") {
    +					this.beforeShowEvent.fire();
    +					for (var j=0;j<effectInstances.length;j++) {
    +						var ei = effectInstances[j];
    +						if (j === 0 && ! YAHOO.util.Config.alreadySubscribed(ei.animateInCompleteEvent,this.showEvent.fire,this.showEvent)) {
    +							ei.animateInCompleteEvent.subscribe(this.showEvent.fire,this.showEvent,true); // Delegate showEvent until end of animateInComplete
    +						}
    +						ei.animateIn();
    +					}
    +				}
    +			}
    +		} else { // Show
    +			if (currentVis != "visible" || currentVis === "") {
    +				this.beforeShowEvent.fire();
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "visible");
    +				this.cfg.refireEvent("iframe");
    +				this.showEvent.fire();
    +			}
    +		}
    +
    +	} else { // Hide
    +		if (isMacGecko) {
    +			this.hideMacGeckoScrollbars();
    +		}
    +
    +		if (effect) { // Animate out if showing
    +			if (currentVis == "visible") {
    +				this.beforeHideEvent.fire();
    +				for (var k=0;k<effectInstances.length;k++) {
    +					var h = effectInstances[k];
    +					if (k === 0 && ! YAHOO.util.Config.alreadySubscribed(h.animateOutCompleteEvent,this.hideEvent.fire,this.hideEvent)) {
    +						h.animateOutCompleteEvent.subscribe(this.hideEvent.fire,this.hideEvent,true); // Delegate hideEvent until end of animateOutComplete
    +					}
    +					h.animateOut();
    +				}
    +			} else if (currentVis === "") {
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");
    +			}
    +		} else { // Simple hide
    +			if (currentVis == "visible" || currentVis === "") {
    +				this.beforeHideEvent.fire();
    +				YAHOO.util.Dom.setStyle(this.element, "visibility", "hidden");
    +				this.cfg.refireEvent("iframe");
    +				this.hideEvent.fire();
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* Center event handler used for centering on scroll/resize, but only if the Overlay is visible
    +* @method doCenterOnDOMEvent
    +*/
    +YAHOO.widget.Overlay.prototype.doCenterOnDOMEvent = function() {
    +	if (this.cfg.getProperty("visible")) {
    +		this.center();
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "fixedcenter" property is changed.
    +* @method configFixedCenter
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configFixedCenter = function(type, args, obj) {
    +	var val = args[0];
    +
    +	if (val) {
    +		this.center();
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(this.beforeShowEvent, this.center, this)) {
    +			this.beforeShowEvent.subscribe(this.center, this, true);
    +		}
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowResizeEvent, this.doCenterOnDOMEvent, this)) {
    +			YAHOO.widget.Overlay.windowResizeEvent.subscribe(this.doCenterOnDOMEvent, this, true);
    +		}
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(YAHOO.widget.Overlay.windowScrollEvent, this.doCenterOnDOMEvent, this)) {
    +			YAHOO.widget.Overlay.windowScrollEvent.subscribe( this.doCenterOnDOMEvent, this, true);
    +		}
    +	} else {
    +		YAHOO.widget.Overlay.windowResizeEvent.unsubscribe(this.doCenterOnDOMEvent, this);
    +		YAHOO.widget.Overlay.windowScrollEvent.unsubscribe(this.doCenterOnDOMEvent, this);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "height" property is changed.
    +* @method configHeight
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configHeight = function(type, args, obj) {
    +	var height = args[0];
    +	var el = this.element;
    +	YAHOO.util.Dom.setStyle(el, "height", height);
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "width" property is changed.
    +* @method configWidth
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configWidth = function(type, args, obj) {
    +	var width = args[0];
    +	var el = this.element;
    +	YAHOO.util.Dom.setStyle(el, "width", width);
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* The default event handler fired when the "zIndex" property is changed.
    +* @method configzIndex
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configzIndex = function(type, args, obj) {
    +	var zIndex = args[0];
    +
    +	var el = this.element;
    +
    +	if (! zIndex) {
    +		zIndex = YAHOO.util.Dom.getStyle(el, "zIndex");
    +		if (! zIndex || isNaN(zIndex)) {
    +			zIndex = 0;
    +		}
    +	}
    +
    +	if (this.iframe) {
    +		if (zIndex <= 0) {
    +			zIndex = 1;
    +		}
    +		YAHOO.util.Dom.setStyle(this.iframe, "zIndex", (zIndex-1));
    +	}
    +
    +	YAHOO.util.Dom.setStyle(el, "zIndex", zIndex);
    +	this.cfg.setProperty("zIndex", zIndex, true);
    +};
    +
    +/**
    +* The default event handler fired when the "xy" property is changed.
    +* @method configXY
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configXY = function(type, args, obj) {
    +	var pos = args[0];
    +	var x = pos[0];
    +	var y = pos[1];
    +
    +	this.cfg.setProperty("x", x);
    +	this.cfg.setProperty("y", y);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x,y]);
    +};
    +
    +/**
    +* The default event handler fired when the "x" property is changed.
    +* @method configX
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configX = function(type, args, obj) {
    +	var x = args[0];
    +	var y = this.cfg.getProperty("y");
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	YAHOO.util.Dom.setX(this.element, x, true);
    +
    +	this.cfg.setProperty("xy", [x, y], true);
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x, y]);
    +};
    +
    +/**
    +* The default event handler fired when the "y" property is changed.
    +* @method configY
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configY = function(type, args, obj) {
    +	var x = this.cfg.getProperty("x");
    +	var y = args[0];
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +
    +	this.beforeMoveEvent.fire([x,y]);
    +
    +	x = this.cfg.getProperty("x");
    +	y = this.cfg.getProperty("y");
    +
    +	YAHOO.util.Dom.setY(this.element, y, true);
    +
    +	this.cfg.setProperty("xy", [x, y], true);
    +
    +	this.cfg.refireEvent("iframe");
    +	this.moveEvent.fire([x, y]);
    +};
    +
    +/**
    +* Shows the iframe shim, if it has been enabled
    +* @method showIframe
    +*/
    +YAHOO.widget.Overlay.prototype.showIframe = function() {
    +	if (this.iframe) {
    +		this.iframe.style.display = "block";
    +	}
    +};
    +
    +/**
    +* Hides the iframe shim, if it has been enabled
    +* @method hideIframe
    +*/
    +YAHOO.widget.Overlay.prototype.hideIframe = function() {
    +	if (this.iframe) {
    +		this.iframe.style.display = "none";
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "iframe" property is changed.
    +* @method configIframe
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configIframe = function(type, args, obj) {
    +
    +	var val = args[0];
    +
    +	if (val) { // IFRAME shim is enabled
    +
    +		if (! YAHOO.util.Config.alreadySubscribed(this.showEvent, this.showIframe, this)) {
    +			this.showEvent.subscribe(this.showIframe, this, true);
    +		}
    +		if (! YAHOO.util.Config.alreadySubscribed(this.hideEvent, this.hideIframe, this)) {
    +			this.hideEvent.subscribe(this.hideIframe, this, true);
    +		}
    +
    +		var x = this.cfg.getProperty("x");
    +		var y = this.cfg.getProperty("y");
    +
    +		if (! x || ! y) {
    +			this.syncPosition();
    +			x = this.cfg.getProperty("x");
    +			y = this.cfg.getProperty("y");
    +		}
    +
    +		if (! isNaN(x) && ! isNaN(y)) {
    +			if (! this.iframe) {
    +				this.iframe = document.createElement("iframe");
    +				if (this.isSecure) {
    +					this.iframe.src = this.imageRoot + YAHOO.widget.Overlay.IFRAME_SRC;
    +				}
    +
    +				var parent = this.element.parentNode;
    +				if (parent) {
    +					parent.appendChild(this.iframe);
    +				} else {
    +					document.body.appendChild(this.iframe);
    +				}
    +
    +				YAHOO.util.Dom.setStyle(this.iframe, "position", "absolute");
    +				YAHOO.util.Dom.setStyle(this.iframe, "border", "none");
    +				YAHOO.util.Dom.setStyle(this.iframe, "margin", "0");
    +				YAHOO.util.Dom.setStyle(this.iframe, "padding", "0");
    +				YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0");
    +				if (this.cfg.getProperty("visible")) {
    +					this.showIframe();
    +				} else {
    +					this.hideIframe();
    +				}
    +			}
    +
    +			var iframeDisplay = YAHOO.util.Dom.getStyle(this.iframe, "display");
    +
    +			if (iframeDisplay == "none") {
    +				this.iframe.style.display = "block";
    +			}
    +
    +			YAHOO.util.Dom.setXY(this.iframe, [x,y]);
    +
    +			var width = this.element.clientWidth;
    +			var height = this.element.clientHeight;
    +
    +			YAHOO.util.Dom.setStyle(this.iframe, "width", (width+2) + "px");
    +			YAHOO.util.Dom.setStyle(this.iframe, "height", (height+2) + "px");
    +
    +			if (iframeDisplay == "none") {
    +				this.iframe.style.display = "none";
    +			}
    +		}
    +	} else {
    +		if (this.iframe) {
    +			this.iframe.style.display = "none";
    +		}
    +		this.showEvent.unsubscribe(this.showIframe, this);
    +		this.hideEvent.unsubscribe(this.hideIframe, this);
    +	}
    +};
    +
    +
    +/**
    +* The default event handler fired when the "constraintoviewport" property is changed.
    +* @method configConstrainToViewport
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configConstrainToViewport = function(type, args, obj) {
    +	var val = args[0];
    +	if (val) {
    +		if (! YAHOO.util.Config.alreadySubscribed(this.beforeMoveEvent, this.enforceConstraints, this)) {
    +			this.beforeMoveEvent.subscribe(this.enforceConstraints, this, true);
    +		}
    +	} else {
    +		this.beforeMoveEvent.unsubscribe(this.enforceConstraints, this);
    +	}
    +};
    +
    +/**
    +* The default event handler fired when the "context" property is changed.
    +* @method configContext
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.configContext = function(type, args, obj) {
    +	var contextArgs = args[0];
    +
    +	if (contextArgs) {
    +		var contextEl = contextArgs[0];
    +		var elementMagnetCorner = contextArgs[1];
    +		var contextMagnetCorner = contextArgs[2];
    +
    +		if (contextEl) {
    +			if (typeof contextEl == "string") {
    +				this.cfg.setProperty("context", [document.getElementById(contextEl),elementMagnetCorner,contextMagnetCorner], true);
    +			}
    +
    +			if (elementMagnetCorner && contextMagnetCorner) {
    +				this.align(elementMagnetCorner, contextMagnetCorner);
    +			}
    +		}
    +	}
    +};
    +
    +
    +// END BUILT-IN PROPERTY EVENT HANDLERS //
    +
    +/**
    +* Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT.
    +* @method align
    +* @param {String} elementAlign		The String representing the corner of the Overlay that should be aligned to the context element
    +* @param {String} contextAlign		The corner of the context element that the elementAlign corner should stick to.
    +*/
    +YAHOO.widget.Overlay.prototype.align = function(elementAlign, contextAlign) {
    +	var contextArgs = this.cfg.getProperty("context");
    +	if (contextArgs) {
    +		var context = contextArgs[0];
    +
    +		var element = this.element;
    +		var me = this;
    +
    +		if (! elementAlign) {
    +			elementAlign = contextArgs[1];
    +		}
    +
    +		if (! contextAlign) {
    +			contextAlign = contextArgs[2];
    +		}
    +
    +		if (element && context) {
    +			var elementRegion = YAHOO.util.Dom.getRegion(element);
    +			var contextRegion = YAHOO.util.Dom.getRegion(context);
    +
    +			var doAlign = function(v,h) {
    +				switch (elementAlign) {
    +					case YAHOO.widget.Overlay.TOP_LEFT:
    +						me.moveTo(h,v);
    +						break;
    +					case YAHOO.widget.Overlay.TOP_RIGHT:
    +						me.moveTo(h-element.offsetWidth,v);
    +						break;
    +					case YAHOO.widget.Overlay.BOTTOM_LEFT:
    +						me.moveTo(h,v-element.offsetHeight);
    +						break;
    +					case YAHOO.widget.Overlay.BOTTOM_RIGHT:
    +						me.moveTo(h-element.offsetWidth,v-element.offsetHeight);
    +						break;
    +				}
    +			};
    +
    +			switch (contextAlign) {
    +				case YAHOO.widget.Overlay.TOP_LEFT:
    +					doAlign(contextRegion.top, contextRegion.left);
    +					break;
    +				case YAHOO.widget.Overlay.TOP_RIGHT:
    +					doAlign(contextRegion.top, contextRegion.right);
    +					break;
    +				case YAHOO.widget.Overlay.BOTTOM_LEFT:
    +					doAlign(contextRegion.bottom, contextRegion.left);
    +					break;
    +				case YAHOO.widget.Overlay.BOTTOM_RIGHT:
    +					doAlign(contextRegion.bottom, contextRegion.right);
    +					break;
    +			}
    +		}
    +	}
    +};
    +
    +/**
    +* The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
    +* @method enforceConstraints
    +* @param {String} type	The CustomEvent type (usually the property name)
    +* @param {Object[]}	args	The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    +* @param {Object} obj	The scope object. For configuration handlers, this will usually equal the owner.
    +*/
    +YAHOO.widget.Overlay.prototype.enforceConstraints = function(type, args, obj) {
    +	var pos = args[0];
    +
    +	var x = pos[0];
    +	var y = pos[1];
    +
    +	var offsetHeight = this.element.offsetHeight;
    +	var offsetWidth = this.element.offsetWidth;
    +
    +	var viewPortWidth = YAHOO.util.Dom.getViewportWidth();
    +	var viewPortHeight = YAHOO.util.Dom.getViewportHeight();
    +
    +	var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +	var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +
    +	var topConstraint = scrollY + 10;
    +	var leftConstraint = scrollX + 10;
    +	var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10;
    +	var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10;
    +
    +	if (x < leftConstraint) {
    +		x = leftConstraint;
    +	} else if (x > rightConstraint) {
    +		x = rightConstraint;
    +	}
    +
    +	if (y < topConstraint) {
    +		y = topConstraint;
    +	} else if (y > bottomConstraint) {
    +		y = bottomConstraint;
    +	}
    +
    +	this.cfg.setProperty("x", x, true);
    +	this.cfg.setProperty("y", y, true);
    +	this.cfg.setProperty("xy", [x,y], true);
    +};
    +
    +/**
    +* Centers the container in the viewport.
    +* @method center
    +*/
    +YAHOO.widget.Overlay.prototype.center = function() {
    +	var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
    +	var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
    +
    +	var viewPortWidth = YAHOO.util.Dom.getClientWidth();
    +	var viewPortHeight = YAHOO.util.Dom.getClientHeight();
    +
    +	var elementWidth = this.element.offsetWidth;
    +	var elementHeight = this.element.offsetHeight;
    +
    +	var x = (viewPortWidth / 2) - (elementWidth / 2) + scrollX;
    +	var y = (viewPortHeight / 2) - (elementHeight / 2) + scrollY;
    +
    +	this.cfg.setProperty("xy", [parseInt(x, 10), parseInt(y, 10)]);
    +
    +	this.cfg.refireEvent("iframe");
    +};
    +
    +/**
    +* Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop.
    +* @method syncPosition
    +*/
    +YAHOO.widget.Overlay.prototype.syncPosition = function() {
    +	var pos = YAHOO.util.Dom.getXY(this.element);
    +	this.cfg.setProperty("x", pos[0], true);
    +	this.cfg.setProperty("y", pos[1], true);
    +	this.cfg.setProperty("xy", pos, true);
    +};
    +
    +/**
    +* Event handler fired when the resize monitor element is resized.
    +* @method onDomResize
    +* @param {DOMEvent} e	The resize DOM event
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.Overlay.prototype.onDomResize = function(e, obj) {
    +	YAHOO.widget.Overlay.superclass.onDomResize.call(this, e, obj);
    +	var me = this;
    +	setTimeout(function() {
    +		me.syncPosition();
    +		me.cfg.refireEvent("iframe");
    +		me.cfg.refireEvent("context");
    +	}, 0);
    +};
    +
    +/**
    +* Removes the Overlay element from the DOM and sets all child elements to null.
    +* @method destroy
    +*/
    +YAHOO.widget.Overlay.prototype.destroy = function() {
    +	if (this.iframe) {
    +		this.iframe.parentNode.removeChild(this.iframe);
    +	}
    +
    +	this.iframe = null;
    +
    +	YAHOO.widget.Overlay.superclass.destroy.call(this);
    +};
    +
    +/**
    +* Returns a String representation of the object.
    +* @method toString
    +* @return {String} The string representation of the Overlay.
    +*/
    +YAHOO.widget.Overlay.prototype.toString = function() {
    +	return "Overlay " + this.id;
    +};
    +
    +/**
    +* A singleton CustomEvent used for reacting to the DOM event for window scroll
    +* @event YAHOO.widget.Overlay.windowScrollEvent
    +*/
    +YAHOO.widget.Overlay.windowScrollEvent = new YAHOO.util.CustomEvent("windowScroll");
    +
    +/**
    +* A singleton CustomEvent used for reacting to the DOM event for window resize
    +* @event YAHOO.widget.Overlay.windowResizeEvent
    +*/
    +YAHOO.widget.Overlay.windowResizeEvent = new YAHOO.util.CustomEvent("windowResize");
    +
    +/**
    +* The DOM event handler used to fire the CustomEvent for window scroll
    +* @method YAHOO.widget.Overlay.windowScrollHandler
    +* @static
    +* @param {DOMEvent} e The DOM scroll event
    +*/
    +YAHOO.widget.Overlay.windowScrollHandler = function(e) {
    +	if (YAHOO.widget.Module.prototype.browser == "ie" || YAHOO.widget.Module.prototype.browser == "ie7") {
    +		if (! window.scrollEnd) {
    +			window.scrollEnd = -1;
    +		}
    +		clearTimeout(window.scrollEnd);
    +		window.scrollEnd = setTimeout(function() { YAHOO.widget.Overlay.windowScrollEvent.fire(); }, 1);
    +	} else {
    +		YAHOO.widget.Overlay.windowScrollEvent.fire();
    +	}
    +};
    +
    +/**
    +* The DOM event handler used to fire the CustomEvent for window resize
    +* @method YAHOO.widget.Overlay.windowResizeHandler
    +* @static
    +* @param {DOMEvent} e The DOM resize event
    +*/
    +YAHOO.widget.Overlay.windowResizeHandler = function(e) {
    +	if (YAHOO.widget.Module.prototype.browser == "ie" || YAHOO.widget.Module.prototype.browser == "ie7") {
    +		if (! window.resizeEnd) {
    +			window.resizeEnd = -1;
    +		}
    +		clearTimeout(window.resizeEnd);
    +		window.resizeEnd = setTimeout(function() { YAHOO.widget.Overlay.windowResizeEvent.fire(); }, 100);
    +	} else {
    +		YAHOO.widget.Overlay.windowResizeEvent.fire();
    +	}
    +};
    +
    +/**
    +* A boolean that indicated whether the window resize and scroll events have already been subscribed to.
    +* @property YAHOO.widget.Overlay._initialized
    +* @private
    +* @type Boolean
    +*/
    +YAHOO.widget.Overlay._initialized = null;
    +
    +if (YAHOO.widget.Overlay._initialized === null) {
    +	YAHOO.util.Event.addListener(window, "scroll", YAHOO.widget.Overlay.windowScrollHandler);
    +	YAHOO.util.Event.addListener(window, "resize", YAHOO.widget.Overlay.windowResizeHandler);
    +
    +	YAHOO.widget.Overlay._initialized = true;
    +}
    +
    +/**
    +* OverlayManager is used for maintaining the focus status of multiple Overlays.* @namespace YAHOO.widget
    +* @namespace YAHOO.widget
    +* @class OverlayManager
    +* @constructor
    +* @param {Array}	overlays	Optional. A collection of Overlays to register with the manager.
    +* @param {Object}	userConfig		The object literal representing the user configuration of the OverlayManager
    +*/
    +YAHOO.widget.OverlayManager = function(userConfig) {
    +	this.init(userConfig);
    +};
    +
    +/**
    +* The CSS class representing a focused Overlay
    +* @property YAHOO.widget.OverlayManager.CSS_FOCUSED
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.widget.OverlayManager.CSS_FOCUSED = "focused";
    +
    +YAHOO.widget.OverlayManager.prototype = {
    +	/**
    +	* The class's constructor function
    +	* @property contructor
    +	* @type Function
    +	*/
    +	constructor : YAHOO.widget.OverlayManager,
    +
    +	/**
    +	* The array of Overlays that are currently registered
    +	* @property overlays
    +	* @type YAHOO.widget.Overlay[]
    +	*/
    +	overlays : null,
    +
    +	/**
    +	* Initializes the default configuration of the OverlayManager
    +	* @method initDefaultConfig
    +	*/
    +	initDefaultConfig : function() {
    +		/**
    +		* The collection of registered Overlays in use by the OverlayManager
    +		* @config overlays
    +		* @type YAHOO.widget.Overlay[]
    +		* @default null
    +		*/
    +		this.cfg.addProperty("overlays", { suppressEvent:true } );
    +
    +		/**
    +		* The default DOM event that should be used to focus an Overlay
    +		* @config focusevent
    +		* @type String
    +		* @default "mousedown"
    +		*/
    +		this.cfg.addProperty("focusevent", { value:"mousedown" } );
    +	},
    +
    +	/**
    +	* Initializes the OverlayManager
    +	* @method init
    +	* @param {YAHOO.widget.Overlay[]}	overlays	Optional. A collection of Overlays to register with the manager.
    +	* @param {Object}	userConfig		The object literal representing the user configuration of the OverlayManager
    +	*/
    +	init : function(userConfig) {
    +		/**
    +		* The OverlayManager's Config object used for monitoring configuration properties.
    +		* @property cfg
    +		* @type YAHOO.util.Config
    +		*/
    +		this.cfg = new YAHOO.util.Config(this);
    +
    +		this.initDefaultConfig();
    +
    +		if (userConfig) {
    +			this.cfg.applyConfig(userConfig, true);
    +		}
    +		this.cfg.fireQueue();
    +
    +		/**
    +		* The currently activated Overlay
    +		* @property activeOverlay
    +		* @private
    +		* @type YAHOO.widget.Overlay
    +		*/
    +		var activeOverlay = null;
    +
    +		/**
    +		* Returns the currently focused Overlay
    +		* @method getActive
    +		* @return {YAHOO.widget.Overlay}	The currently focused Overlay
    +		*/
    +		this.getActive = function() {
    +			return activeOverlay;
    +		};
    +
    +		/**
    +		* Focuses the specified Overlay
    +		* @method focus
    +		* @param {YAHOO.widget.Overlay} overlay	The Overlay to focus
    +		* @param {String} overlay	The id of the Overlay to focus
    +		*/
    +		this.focus = function(overlay) {
    +			var o = this.find(overlay);
    +			if (o) {
    +				this.blurAll();
    +				activeOverlay = o;
    +				YAHOO.util.Dom.addClass(activeOverlay.element, YAHOO.widget.OverlayManager.CSS_FOCUSED);
    +				this.overlays.sort(this.compareZIndexDesc);
    +				var topZIndex = YAHOO.util.Dom.getStyle(this.overlays[0].element, "zIndex");
    +				if (! isNaN(topZIndex) && this.overlays[0] != overlay) {
    +					activeOverlay.cfg.setProperty("zIndex", (parseInt(topZIndex, 10) + 2));
    +				}
    +				this.overlays.sort(this.compareZIndexDesc);
    +			}
    +		};
    +
    +		/**
    +		* Removes the specified Overlay from the manager
    +		* @method remove
    +		* @param {YAHOO.widget.Overlay}	overlay	The Overlay to remove
    +		* @param {String} overlay	The id of the Overlay to remove
    +		*/
    +		this.remove = function(overlay) {
    +			var o = this.find(overlay);
    +			if (o) {
    +				var originalZ = YAHOO.util.Dom.getStyle(o.element, "zIndex");
    +				o.cfg.setProperty("zIndex", -1000, true);
    +				this.overlays.sort(this.compareZIndexDesc);
    +				this.overlays = this.overlays.slice(0, this.overlays.length-1);
    +				o.cfg.setProperty("zIndex", originalZ, true);
    +
    +				o.cfg.setProperty("manager", null);
    +				o.focusEvent = null;
    +				o.blurEvent = null;
    +				o.focus = null;
    +				o.blur = null;
    +			}
    +		};
    +
    +		/**
    +		* Removes focus from all registered Overlays in the manager
    +		* @method blurAll
    +		*/
    +		this.blurAll = function() {
    +			activeOverlay = null;
    +			for (var o=0;o<this.overlays.length;o++) {
    +				YAHOO.util.Dom.removeClass(this.overlays[o].element, YAHOO.widget.OverlayManager.CSS_FOCUSED);
    +			}
    +		};
    +
    +		var overlays = this.cfg.getProperty("overlays");
    +
    +		if (! this.overlays) {
    +			this.overlays = [];
    +		}
    +
    +		if (overlays) {
    +			this.register(overlays);
    +			this.overlays.sort(this.compareZIndexDesc);
    +		}
    +	},
    +
    +	/**
    +	* Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for focus and blur, along with CustomEvents for each.
    +	* @method register
    +	* @param {YAHOO.widget.Overlay}	overlay		An Overlay to register with the manager.
    +	* @param {YAHOO.widget.Overlay[]}	overlay		An array of Overlays to register with the manager.
    +	* @return	{Boolean}	True if any Overlays are registered.
    +	*/
    +	register : function(overlay) {
    +		if (overlay instanceof YAHOO.widget.Overlay) {
    +			overlay.cfg.addProperty("manager", { value:this } );
    +
    +			overlay.focusEvent = new YAHOO.util.CustomEvent("focus");
    +			overlay.blurEvent = new YAHOO.util.CustomEvent("blur");
    +
    +			var mgr=this;
    +
    +			overlay.focus = function() {
    +				mgr.focus(this);
    +				this.focusEvent.fire();
    +			};
    +
    +			overlay.blur = function() {
    +				mgr.blurAll();
    +				this.blurEvent.fire();
    +			};
    +
    +			var focusOnDomEvent = function(e,obj) {
    +				overlay.focus();
    +			};
    +
    +			var focusevent = this.cfg.getProperty("focusevent");
    +			YAHOO.util.Event.addListener(overlay.element,focusevent,focusOnDomEvent,this,true);
    +
    +			var zIndex = YAHOO.util.Dom.getStyle(overlay.element, "zIndex");
    +			if (! isNaN(zIndex)) {
    +				overlay.cfg.setProperty("zIndex", parseInt(zIndex, 10));
    +			} else {
    +				overlay.cfg.setProperty("zIndex", 0);
    +			}
    +
    +			this.overlays.push(overlay);
    +			return true;
    +		} else if (overlay instanceof Array) {
    +			var regcount = 0;
    +			for (var i=0;i<overlay.length;i++) {
    +				if (this.register(overlay[i])) {
    +					regcount++;
    +				}
    +			}
    +			if (regcount > 0) {
    +				return true;
    +			}
    +		} else {
    +			return false;
    +		}
    +	},
    +
    +	/**
    +	* Attempts to locate an Overlay by instance or ID.
    +	* @method find
    +	* @param {YAHOO.widget.Overlay}	overlay		An Overlay to locate within the manager
    +	* @param {String}	overlay		An Overlay id to locate within the manager
    +	* @return	{YAHOO.widget.Overlay}	The requested Overlay, if found, or null if it cannot be located.
    +	*/
    +	find : function(overlay) {
    +		if (overlay instanceof YAHOO.widget.Overlay) {
    +			for (var o=0;o<this.overlays.length;o++) {
    +				if (this.overlays[o] == overlay) {
    +					return this.overlays[o];
    +				}
    +			}
    +		} else if (typeof overlay == "string") {
    +			for (var p=0;p<this.overlays.length;p++) {
    +				if (this.overlays[p].id == overlay) {
    +					return this.overlays[p];
    +				}
    +			}
    +		}
    +		return null;
    +	},
    +
    +	/**
    +	* Used for sorting the manager's Overlays by z-index.
    +	* @method compareZIndexDesc
    +	* @private
    +	* @return {Number}	0, 1, or -1, depending on where the Overlay should fall in the stacking order.
    +	*/
    +	compareZIndexDesc : function(o1, o2) {
    +		var zIndex1 = o1.cfg.getProperty("zIndex");
    +		var zIndex2 = o2.cfg.getProperty("zIndex");
    +
    +		if (zIndex1 > zIndex2) {
    +			return -1;
    +		} else if (zIndex1 < zIndex2) {
    +			return 1;
    +		} else {
    +			return 0;
    +		}
    +	},
    +
    +	/**
    +	* Shows all Overlays in the manager.
    +	* @method showAll
    +	*/
    +	showAll : function() {
    +		for (var o=0;o<this.overlays.length;o++) {
    +			this.overlays[o].show();
    +		}
    +	},
    +
    +	/**
    +	* Hides all Overlays in the manager.
    +	* @method hideAll
    +	*/
    +	hideAll : function() {
    +		for (var o=0;o<this.overlays.length;o++) {
    +			this.overlays[o].hide();
    +		}
    +	},
    +
    +
    +	/**
    +	* Returns a string representation of the object.
    +	* @method toString
    +	* @return {String}	The string representation of the OverlayManager
    +	*/
    +	toString : function() {
    +		return "OverlayManager";
    +	}
    +
    +};
    +
    +/**
    +* KeyListener is a utility that provides an easy interface for listening for keydown/keyup events fired against DOM elements.
    +* @namespace YAHOO.util
    +* @class KeyListener
    +* @constructor
    +* @param {HTMLElement}	attachTo	The element or element ID to which the key event should be attached
    +* @param {String}	attachTo	The element or element ID to which the key event should be attached
    +* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +* @param {Function}	handler		The CustomEvent handler to fire when the key event is detected
    +* @param {Object}	handler		An object literal representing the handler.
    +* @param {String}	event		Optional. The event (keydown or keyup) to listen for. Defaults automatically to keydown.
    +*/
    +YAHOO.util.KeyListener = function(attachTo, keyData, handler, event) {
    +	if (! event) {
    +		event = YAHOO.util.KeyListener.KEYDOWN;
    +	}
    +
    +	/**
    +	* The CustomEvent fired internally when a key is pressed
    +	* @event keyEvent
    +	* @private
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	var keyEvent = new YAHOO.util.CustomEvent("keyPressed");
    +
    +	/**
    +	* The CustomEvent fired when the KeyListener is enabled via the enable() function
    +	* @event enabledEvent
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	this.enabledEvent = new YAHOO.util.CustomEvent("enabled");
    +
    +	/**
    +	* The CustomEvent fired when the KeyListener is disabled via the disable() function
    +	* @event disabledEvent
    +	* @param {Object}	keyData		The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +	*/
    +	this.disabledEvent = new YAHOO.util.CustomEvent("disabled");
    +
    +	if (typeof attachTo == 'string') {
    +		attachTo = document.getElementById(attachTo);
    +	}
    +
    +	if (typeof handler == 'function') {
    +		keyEvent.subscribe(handler);
    +	} else {
    +		keyEvent.subscribe(handler.fn, handler.scope, handler.correctScope);
    +	}
    +
    +	/**
    +	* Handles the key event when a key is pressed.
    +	* @method handleKeyPress
    +	* @param {DOMEvent} e	The keypress DOM event
    +	* @param {Object}	obj	The DOM event scope object
    +	* @private
    +	*/
    +	function handleKeyPress(e, obj) {
    +		if (! keyData.shift) {
    +			keyData.shift = false;
    +		}
    +		if (! keyData.alt) {
    +			keyData.alt = false;
    +		}
    +		if (! keyData.ctrl) {
    +			keyData.ctrl = false;
    +		}
    +
    +		// check held down modifying keys first
    +		if (e.shiftKey == keyData.shift &&
    +			e.altKey   == keyData.alt &&
    +			e.ctrlKey  == keyData.ctrl) { // if we pass this, all modifiers match
    +
    +			var dataItem;
    +			var keyPressed;
    +
    +			if (keyData.keys instanceof Array) {
    +				for (var i=0;i<keyData.keys.length;i++) {
    +					dataItem = keyData.keys[i];
    +
    +					if (dataItem == e.charCode ) {
    +						keyEvent.fire(e.charCode, e);
    +						break;
    +					} else if (dataItem == e.keyCode) {
    +						keyEvent.fire(e.keyCode, e);
    +						break;
    +					}
    +				}
    +			} else {
    +				dataItem = keyData.keys;
    +
    +				if (dataItem == e.charCode ) {
    +					keyEvent.fire(e.charCode, e);
    +				} else if (dataItem == e.keyCode) {
    +					keyEvent.fire(e.keyCode, e);
    +				}
    +			}
    +		}
    +	}
    +
    +	/**
    +	* Enables the KeyListener by attaching the DOM event listeners to the target DOM element
    +	* @method enable
    +	*/
    +	this.enable = function() {
    +		if (! this.enabled) {
    +			YAHOO.util.Event.addListener(attachTo, event, handleKeyPress);
    +			this.enabledEvent.fire(keyData);
    +		}
    +		/**
    +		* Boolean indicating the enabled/disabled state of the Tooltip
    +		* @property enabled
    +		* @type Boolean
    +		*/
    +		this.enabled = true;
    +	};
    +
    +	/**
    +	* Disables the KeyListener by removing the DOM event listeners from the target DOM element
    +	* @method disable
    +	*/
    +	this.disable = function() {
    +		if (this.enabled) {
    +			YAHOO.util.Event.removeListener(attachTo, event, handleKeyPress);
    +			this.disabledEvent.fire(keyData);
    +		}
    +		this.enabled = false;
    +	};
    +
    +	/**
    +	* Returns a String representation of the object.
    +	* @method toString
    +	* @return {String}	The string representation of the KeyListener
    +	*/
    +	this.toString = function() {
    +		return "KeyListener [" + keyData.keys + "] " + attachTo.tagName + (attachTo.id ? "[" + attachTo.id + "]" : "");
    +	};
    +
    +};
    +
    +/**
    +* Constant representing the DOM "keydown" event.
    +* @property YAHOO.util.KeyListener.KEYDOWN
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.util.KeyListener.KEYDOWN = "keydown";
    +
    +/**
    +* Constant representing the DOM "keyup" event.
    +* @property YAHOO.util.KeyListener.KEYUP
    +* @static
    +* @final
    +* @type String
    +*/
    +YAHOO.util.KeyListener.KEYUP = "keyup";
    +
    +/**
    +* ContainerEffect encapsulates animation transitions that are executed when an Overlay is shown or hidden.
    +* @namespace YAHOO.widget
    +* @class ContainerEffect
    +* @constructor
    +* @param {YAHOO.widget.Overlay}	overlay		The Overlay that the animation should be associated with
    +* @param {Object}	attrIn		The object literal representing the animation arguments to be used for the animate-in transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    +* @param {Object}	attrOut		The object literal representing the animation arguments to be used for the animate-out transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    +* @param {HTMLElement}	targetElement	Optional. The target element that should be animated during the transition. Defaults to overlay.element.
    +* @param {class}	Optional. The animation class to instantiate. Defaults to YAHOO.util.Anim. Other options include YAHOO.util.Motion.
    +*/
    +YAHOO.widget.ContainerEffect = function(overlay, attrIn, attrOut, targetElement, animClass) {
    +	if (! animClass) {
    +		animClass = YAHOO.util.Anim;
    +	}
    +
    +	/**
    +	* The overlay to animate
    +	* @property overlay
    +	* @type YAHOO.widget.Overlay
    +	*/
    +	this.overlay = overlay;
    +	/**
    +	* The animation attributes to use when transitioning into view
    +	* @property attrIn
    +	* @type Object
    +	*/
    +	this.attrIn = attrIn;
    +	/**
    +	* The animation attributes to use when transitioning out of view
    +	* @property attrOut
    +	* @type Object
    +	*/
    +	this.attrOut = attrOut;
    +	/**
    +	* The target element to be animated
    +	* @property targetElement
    +	* @type HTMLElement
    +	*/
    +	this.targetElement = targetElement || overlay.element;
    +	/**
    +	* The animation class to use for animating the overlay
    +	* @property animClass
    +	* @type class
    +	*/
    +	this.animClass = animClass;
    +};
    +
    +/**
    +* Initializes the animation classes and events.
    +* @method init
    +*/
    +YAHOO.widget.ContainerEffect.prototype.init = function() {
    +	this.beforeAnimateInEvent = new YAHOO.util.CustomEvent("beforeAnimateIn");
    +	this.beforeAnimateOutEvent = new YAHOO.util.CustomEvent("beforeAnimateOut");
    +
    +	this.animateInCompleteEvent = new YAHOO.util.CustomEvent("animateInComplete");
    +	this.animateOutCompleteEvent = new YAHOO.util.CustomEvent("animateOutComplete");
    +
    +	this.animIn = new this.animClass(this.targetElement, this.attrIn.attributes, this.attrIn.duration, this.attrIn.method);
    +	this.animIn.onStart.subscribe(this.handleStartAnimateIn, this);
    +	this.animIn.onTween.subscribe(this.handleTweenAnimateIn, this);
    +	this.animIn.onComplete.subscribe(this.handleCompleteAnimateIn, this);
    +
    +	this.animOut = new this.animClass(this.targetElement, this.attrOut.attributes, this.attrOut.duration, this.attrOut.method);
    +	this.animOut.onStart.subscribe(this.handleStartAnimateOut, this);
    +	this.animOut.onTween.subscribe(this.handleTweenAnimateOut, this);
    +	this.animOut.onComplete.subscribe(this.handleCompleteAnimateOut, this);
    +};
    +
    +/**
    +* Triggers the in-animation.
    +* @method animateIn
    +*/
    +YAHOO.widget.ContainerEffect.prototype.animateIn = function() {
    +	this.beforeAnimateInEvent.fire();
    +	this.animIn.animate();
    +};
    +
    +/**
    +* Triggers the out-animation.
    +* @method animateOut
    +*/
    +YAHOO.widget.ContainerEffect.prototype.animateOut = function() {
    +	this.beforeAnimateOutEvent.fire();
    +	this.animOut.animate();
    +};
    +
    +/**
    +* The default onStart handler for the in-animation.
    +* @method handleStartAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleStartAnimateIn = function(type, args, obj) { };
    +/**
    +* The default onTween handler for the in-animation.
    +* @method handleTweenAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateIn = function(type, args, obj) { };
    +/**
    +* The default onComplete handler for the in-animation.
    +* @method handleCompleteAnimateIn
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateIn = function(type, args, obj) { };
    +
    +/**
    +* The default onStart handler for the out-animation.
    +* @method handleStartAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleStartAnimateOut = function(type, args, obj) { };
    +/**
    +* The default onTween handler for the out-animation.
    +* @method handleTweenAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleTweenAnimateOut = function(type, args, obj) { };
    +/**
    +* The default onComplete handler for the out-animation.
    +* @method handleCompleteAnimateOut
    +* @param {String} type	The CustomEvent type
    +* @param {Object[]}	args	The CustomEvent arguments
    +* @param {Object} obj	The scope object
    +*/
    +YAHOO.widget.ContainerEffect.prototype.handleCompleteAnimateOut = function(type, args, obj) { };
    +
    +/**
    +* Returns a string representation of the object.
    +* @method toString
    +* @return {String}	The string representation of the ContainerEffect
    +*/
    +YAHOO.widget.ContainerEffect.prototype.toString = function() {
    +	var output = "ContainerEffect";
    +	if (this.overlay) {
    +		output += " [" + this.overlay.toString() + "]";
    +	}
    +	return output;
    +};
    +
    +/**
    +* A pre-configured ContainerEffect instance that can be used for fading an overlay in and out.
    +* @method FADE
    +* @static
    +* @param {Overlay}	The Overlay object to animate
    +* @param {Number}	The duration of the animation
    +* @return {ContainerEffect}	The configured ContainerEffect object
    +*/
    +YAHOO.widget.ContainerEffect.FADE = function(overlay, dur) {
    +	var fade = new YAHOO.widget.ContainerEffect(overlay, { attributes:{opacity: {from:0, to:1}}, duration:dur, method:YAHOO.util.Easing.easeIn }, { attributes:{opacity: {to:0}}, duration:dur, method:YAHOO.util.Easing.easeOut}, overlay.element );
    +
    +	fade.handleStartAnimateIn = function(type,args,obj) {
    +		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");
    +
    +		if (! obj.overlay.underlay) {
    +			obj.overlay.cfg.refireEvent("underlay");
    +		}
    +
    +		if (obj.overlay.underlay) {
    +			obj.initialUnderlayOpacity = YAHOO.util.Dom.getStyle(obj.overlay.underlay, "opacity");
    +			obj.overlay.underlay.style.filter = null;
    +		}
    +
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 0);
    +	};
    +
    +	fade.handleCompleteAnimateIn = function(type,args,obj) {
    +		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");
    +
    +		if (obj.overlay.element.style.filter) {
    +			obj.overlay.element.style.filter = null;
    +		}
    +
    +		if (obj.overlay.underlay) {
    +			YAHOO.util.Dom.setStyle(obj.overlay.underlay, "opacity", obj.initialUnderlayOpacity);
    +		}
    +
    +		obj.overlay.cfg.refireEvent("iframe");
    +		obj.animateInCompleteEvent.fire();
    +	};
    +
    +	fade.handleStartAnimateOut = function(type, args, obj) {
    +		YAHOO.util.Dom.addClass(obj.overlay.element, "hide-select");
    +
    +		if (obj.overlay.underlay) {
    +			obj.overlay.underlay.style.filter = null;
    +		}
    +	};
    +
    +	fade.handleCompleteAnimateOut =  function(type, args, obj) {
    +		YAHOO.util.Dom.removeClass(obj.overlay.element, "hide-select");
    +		if (obj.overlay.element.style.filter) {
    +			obj.overlay.element.style.filter = null;
    +		}
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "opacity", 1);
    +
    +		obj.overlay.cfg.refireEvent("iframe");
    +
    +		obj.animateOutCompleteEvent.fire();
    +	};
    +
    +	fade.init();
    +	return fade;
    +};
    +
    +
    +/**
    +* A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out.
    +* @method SLIDE
    +* @static
    +* @param {Overlay}	The Overlay object to animate
    +* @param {Number}	The duration of the animation
    +* @return {ContainerEffect}	The configured ContainerEffect object
    +*/
    +YAHOO.widget.ContainerEffect.SLIDE = function(overlay, dur) {
    +	var x = overlay.cfg.getProperty("x") || YAHOO.util.Dom.getX(overlay.element);
    +	var y = overlay.cfg.getProperty("y") || YAHOO.util.Dom.getY(overlay.element);
    +
    +	var clientWidth = YAHOO.util.Dom.getClientWidth();
    +	var offsetWidth = overlay.element.offsetWidth;
    +
    +	var slide = new YAHOO.widget.ContainerEffect(overlay, {
    +															attributes:{ points: { to:[x, y] } },
    +															duration:dur,
    +															method:YAHOO.util.Easing.easeIn
    +														},
    +														{
    +															attributes:{ points: { to:[(clientWidth+25), y] } },
    +															duration:dur,
    +															method:YAHOO.util.Easing.easeOut
    +														},
    +														overlay.element,
    +														YAHOO.util.Motion);
    +
    +
    +	slide.handleStartAnimateIn = function(type,args,obj) {
    +		obj.overlay.element.style.left = (-25-offsetWidth) + "px";
    +		obj.overlay.element.style.top  = y + "px";
    +	};
    +
    +	slide.handleTweenAnimateIn = function(type, args, obj) {
    +
    +
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var currentX = pos[0];
    +		var currentY = pos[1];
    +
    +		if (YAHOO.util.Dom.getStyle(obj.overlay.element, "visibility") == "hidden" && currentX < x) {
    +			YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "visible");
    +		}
    +
    +		obj.overlay.cfg.setProperty("xy", [currentX,currentY], true);
    +		obj.overlay.cfg.refireEvent("iframe");
    +	};
    +
    +	slide.handleCompleteAnimateIn = function(type, args, obj) {
    +		obj.overlay.cfg.setProperty("xy", [x,y], true);
    +		obj.startX = x;
    +		obj.startY = y;
    +		obj.overlay.cfg.refireEvent("iframe");
    +		obj.animateInCompleteEvent.fire();
    +	};
    +
    +	slide.handleStartAnimateOut = function(type, args, obj) {
    +		var vw = YAHOO.util.Dom.getViewportWidth();
    +
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var yso = pos[1];
    +
    +		var currentTo = obj.animOut.attributes.points.to;
    +		obj.animOut.attributes.points.to = [(vw+25), yso];
    +	};
    +
    +	slide.handleTweenAnimateOut = function(type, args, obj) {
    +		var pos = YAHOO.util.Dom.getXY(obj.overlay.element);
    +
    +		var xto = pos[0];
    +		var yto = pos[1];
    +
    +		obj.overlay.cfg.setProperty("xy", [xto,yto], true);
    +		obj.overlay.cfg.refireEvent("iframe");
    +	};
    +
    +	slide.handleCompleteAnimateOut = function(type, args, obj) {
    +		YAHOO.util.Dom.setStyle(obj.overlay.element, "visibility", "hidden");
    +
    +		obj.overlay.cfg.setProperty("xy", [x,y]);
    +		obj.animateOutCompleteEvent.fire();
    +	};
    +
    +	slide.init();
    +	return slide;
    +};

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/dom.js.html b/www/extras/yui-ext/docs/output/dom.js.html new file mode 100644 index 000000000..8d1014fbd --- /dev/null +++ b/www/extras/yui-ext/docs/output/dom.js.html @@ -0,0 +1,882 @@ +dom.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The dom module provides helper methods for manipulating Dom elements.
    + * @module dom
    + *
    + */
    +
    +(function() {
    +    var Y = YAHOO.util,     // internal shorthand
    +        getStyle,           // for load time browser branching
    +        setStyle,           // ditto
    +        id_counter = 0,     // for use with generateId
    +        propertyCache = {}; // for faster hyphen converts
    +
    +    // brower detection
    +    var ua = navigator.userAgent.toLowerCase(),
    +        isOpera = (ua.indexOf('opera') > -1),
    +        isSafari = (ua.indexOf('safari') > -1),
    +        isGecko = (!isOpera && !isSafari && ua.indexOf('gecko') > -1),
    +        isIE = (!isOpera && ua.indexOf('msie') > -1);
    +
    +    // regex cache
    +    var patterns = {
    +        HYPHEN: /(-[a-z])/i
    +    };
    +
    +
    +    var toCamel = function(property) {
    +        if ( !patterns.HYPHEN.test(property) ) {
    +            return property; // no hyphens
    +        }
    +
    +        if (propertyCache[property]) { // already converted
    +            return propertyCache[property];
    +        }
    +
    +        while( patterns.HYPHEN.exec(property) ) {
    +            property = property.replace(RegExp.$1,
    +                    RegExp.$1.substr(1).toUpperCase());
    +        }
    +
    +        propertyCache[property] = property;
    +        return property;
    +        //return property.replace(/-([a-z])/gi, function(m0, m1) {return m1.toUpperCase()}) // cant use function as 2nd arg yet due to safari bug
    +    };
    +
    +    // branching at load instead of runtime
    +    if (document.defaultView && document.defaultView.getComputedStyle) { // W3C DOM method
    +        getStyle = function(el, property) {
    +            var value = null;
    +
    +            var computed = document.defaultView.getComputedStyle(el, '');
    +            if (computed) { // test computed before touching for safari
    +                value = computed[toCamel(property)];
    +            }
    +
    +            return el.style[property] || value;
    +        };
    +    } else if (document.documentElement.currentStyle && isIE) { // IE method
    +        getStyle = function(el, property) {
    +            switch( toCamel(property) ) {
    +                case 'opacity' :// IE opacity uses filter
    +                    var val = 100;
    +                    try { // will error if no DXImageTransform
    +                        val = el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
    +
    +                    } catch(e) {
    +                        try { // make sure its in the document
    +                            val = el.filters('alpha').opacity;
    +                        } catch(e) {
    +                        }
    +                    }
    +                    return val / 100;
    +                    break;
    +                default:
    +                    // test currentStyle before touching
    +                    var value = el.currentStyle ? el.currentStyle[property] : null;
    +                    return ( el.style[property] || value );
    +            }
    +        };
    +    } else { // default to inline only
    +        getStyle = function(el, property) { return el.style[property]; };
    +    }
    +
    +    if (isIE) {
    +        setStyle = function(el, property, val) {
    +            switch (property) {
    +                case 'opacity':
    +                    if ( typeof el.style.filter == 'string' ) { // in case not appended
    +                        el.style.filter = 'alpha(opacity=' + val * 100 + ')';
    +
    +                        if (!el.currentStyle || !el.currentStyle.hasLayout) {
    +                            el.style.zoom = 1; // when no layout or cant tell
    +                        }
    +                    }
    +                    break;
    +                default:
    +                el.style[property] = val;
    +            }
    +        };
    +    } else {
    +        setStyle = function(el, property, val) {
    +            el.style[property] = val;
    +        };
    +    }
    +
    +    /**
    +     * Provides helper methods for DOM elements.
    +     * @namespace YAHOO.util
    +     * @class Dom
    +     */
    +    YAHOO.util.Dom = {
    +        /**
    +         * Returns an HTMLElement reference.
    +         * @method get
    +         * @param {String | HTMLElement |Array} el Accepts a string to use as an ID for getting a DOM reference, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @return {HTMLElement | Array} A DOM reference to an HTML element or an array of HTMLElements.
    +         */
    +        get: function(el) {
    +            if (!el) { return null; } // nothing to work with
    +
    +            if (typeof el != 'string' && !(el instanceof Array) ) { // assuming HTMLElement or HTMLCollection, so pass back as is
    +                return el;
    +            }
    +
    +            if (typeof el == 'string') { // ID
    +                return document.getElementById(el);
    +            }
    +            else { // array of ID's and/or elements
    +                var collection = [];
    +                for (var i = 0, len = el.length; i < len; ++i) {
    +                    collection[collection.length] = Y.Dom.get(el[i]);
    +                }
    +
    +                return collection;
    +            }
    +
    +            return null; // safety, should never happen
    +        },
    +
    +        /**
    +         * Normalizes currentStyle and ComputedStyle.
    +         * @method getStyle
    +         * @param {String | HTMLElement |Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @param {String} property The style property whose value is returned.
    +         * @return {String | Array} The current value of the style property for the element(s).
    +         */
    +        getStyle: function(el, property) {
    +            property = toCamel(property);
    +
    +            var f = function(element) {
    +                return getStyle(element, property);
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Wrapper for setting style properties of HTMLElements.  Normalizes "opacity" across modern browsers.
    +         * @method setStyle
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @param {String} property The style property to be set.
    +         * @param {String} val The value to apply to the given property.
    +         */
    +        setStyle: function(el, property, val) {
    +            property = toCamel(property);
    +
    +            var f = function(element) {
    +                setStyle(element, property, val);
    +
    +            };
    +
    +            Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Gets the current position of an element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method getXY
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    +         * @return {Array} The XY position of the element(s)
    +         */
    +        getXY: function(el) {
    +            var f = function(el) {
    +
    +            // has to be part of document to have pageXY
    +                if (el.parentNode === null || el.offsetParent === null ||
    +                        this.getStyle(el, 'display') == 'none') {
    +                    return false;
    +                }
    +
    +                var parentNode = null;
    +                var pos = [];
    +                var box;
    +
    +                if (el.getBoundingClientRect) { // IE
    +                    box = el.getBoundingClientRect();
    +                    var doc = document;
    +                    if ( !this.inDocument(el) && parent.document != document) {// might be in a frame, need to get its scroll
    +                        doc = parent.document;
    +
    +                        if ( !this.isAncestor(doc.documentElement, el) ) {
    +                            return false;
    +                        }
    +
    +                    }
    +
    +                    var scrollTop = Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
    +                    var scrollLeft = Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft);
    +
    +                    return [box.left + scrollLeft, box.top + scrollTop];
    +                }
    +                else { // safari, opera, & gecko
    +                    pos = [el.offsetLeft, el.offsetTop];
    +                    parentNode = el.offsetParent;
    +                    if (parentNode != el) {
    +                        while (parentNode) {
    +                            pos[0] += parentNode.offsetLeft;
    +                            pos[1] += parentNode.offsetTop;
    +                            parentNode = parentNode.offsetParent;
    +                        }
    +                    }
    +                    if (isSafari && this.getStyle(el, 'position') == 'absolute' ) { // safari doubles in some cases
    +                        pos[0] -= document.body.offsetLeft;
    +                        pos[1] -= document.body.offsetTop;
    +                    }
    +                }
    +
    +                if (el.parentNode) { parentNode = el.parentNode; }
    +                else { parentNode = null; }
    +
    +                while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' && parentNode.tagName.toUpperCase() != 'HTML')
    +                { // account for any scrolled ancestors
    +                    if (Y.Dom.getStyle(parentNode, 'display') != 'inline') { // work around opera inline scrollLeft/Top bug
    +                        pos[0] -= parentNode.scrollLeft;
    +                        pos[1] -= parentNode.scrollTop;
    +                    }
    +
    +                    if (parentNode.parentNode) {
    +                        parentNode = parentNode.parentNode;
    +                    } else { parentNode = null; }
    +                }
    +
    +
    +                return pos;
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Gets the current X position of an element based on page coordinates.  The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method getX
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    +         * @return {String | Array} The X position of the element(s)
    +         */
    +        getX: function(el) {
    +            var f = function(el) {
    +                return Y.Dom.getXY(el)[0];
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Gets the current Y position of an element based on page coordinates.  Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method getY
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    +         * @return {String | Array} The Y position of the element(s)
    +         */
    +        getY: function(el) {
    +            var f = function(el) {
    +                return Y.Dom.getXY(el)[1];
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Set the position of an html element in page coordinates, regardless of how the element is positioned.
    +         * The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method setXY
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    +         * @param {Array} pos Contains X & Y values for new position (coordinates are page-based)
    +         * @param {Boolean} noRetry By default we try and set the position a second time if the first fails
    +         */
    +        setXY: function(el, pos, noRetry) {
    +            var f = function(el) {
    +                var style_pos = this.getStyle(el, 'position');
    +                if (style_pos == 'static') { // default to relative
    +                    this.setStyle(el, 'position', 'relative');
    +                    style_pos = 'relative';
    +                }
    +
    +                var pageXY = this.getXY(el);
    +                if (pageXY === false) { // has to be part of doc to have pageXY
    +                    return false;
    +                }
    +
    +                var delta = [ // assuming pixels; if not we will have to retry
    +                    parseInt( this.getStyle(el, 'left'), 10 ),
    +                    parseInt( this.getStyle(el, 'top'), 10 )
    +                ];
    +
    +                if ( isNaN(delta[0]) ) {// in case of 'auto'
    +                    delta[0] = (style_pos == 'relative') ? 0 : el.offsetLeft;
    +                }
    +                if ( isNaN(delta[1]) ) { // in case of 'auto'
    +                    delta[1] = (style_pos == 'relative') ? 0 : el.offsetTop;
    +                }
    +
    +                if (pos[0] !== null) { el.style.left = pos[0] - pageXY[0] + delta[0] + 'px'; }
    +                if (pos[1] !== null) { el.style.top = pos[1] - pageXY[1] + delta[1] + 'px'; }
    +
    +                var newXY = this.getXY(el);
    +
    +                // if retry is true, try one more time if we miss
    +                if (!noRetry && (newXY[0] != pos[0] || newXY[1] != pos[1]) ) {
    +                    this.setXY(el, pos, true);
    +                }
    +
    +            };
    +
    +            Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Set the X position of an html element in page coordinates, regardless of how the element is positioned.
    +         * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method setX
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @param {Int} x The value to use as the X coordinate for the element(s).
    +         */
    +        setX: function(el, x) {
    +            Y.Dom.setXY(el, [x, null]);
    +        },
    +
    +        /**
    +         * Set the Y position of an html element in page coordinates, regardless of how the element is positioned.
    +         * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false).
    +         * @method setY
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @param {Int} x To use as the Y coordinate for the element(s).
    +         */
    +        setY: function(el, y) {
    +            Y.Dom.setXY(el, [null, y]);
    +        },
    +
    +        /**
    +         * Returns the region position of the given element.
    +         * The element must be part of the DOM tree to have a region (display:none or elements not appended return false).
    +         * @method getRegion
    +         * @param {String | HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    +         * @return {Region | Array} A Region or array of Region instances containing "top, left, bottom, right" member data.
    +         */
    +        getRegion: function(el) {
    +            var f = function(el) {
    +                var region = new Y.Region.getRegion(el);
    +                return region;
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Returns the width of the client (viewport).
    +         * @method getClientWidth
    +         * @deprecated Now using getViewportWidth.  This interface left intact for back compat.
    +         * @return {Int} The width of the viewable area of the page.
    +         */
    +        getClientWidth: function() {
    +            return Y.Dom.getViewportWidth();
    +        },
    +
    +        /**
    +         * Returns the height of the client (viewport).
    +         * @method getClientHeight
    +         * @deprecated Now using getViewportHeight.  This interface left intact for back compat.
    +         * @return {Int} The height of the viewable area of the page.
    +         */
    +        getClientHeight: function() {
    +            return Y.Dom.getViewportHeight();
    +        },
    +
    +        /**
    +         * Returns a array of HTMLElements with the given class.
    +         * For optimized performance, include a tag and/or root node when possible.
    +         * @method getElementsByClassName
    +         * @param {String} className The class name to match against
    +         * @param {String} tag (optional) The tag name of the elements being collected
    +         * @param {String | HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
    +         * @return {Array} An array of elements that have the given class name
    +         */
    +        getElementsByClassName: function(className, tag, root) {
    +            var method = function(el) { return Y.Dom.hasClass(el, className); };
    +            return Y.Dom.getElementsBy(method, tag, root);
    +        },
    +
    +        /**
    +         * Determines whether an HTMLElement has the given className.
    +         * @method hasClass
    +         * @param {String | HTMLElement | Array} el The element or collection to test
    +         * @param {String} className the class name to search for
    +         * @return {Boolean | Array} A boolean value or array of boolean values
    +         */
    +        hasClass: function(el, className) {
    +            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)');
    +
    +            var f = function(el) {
    +                return re.test(el['className']);
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Adds a class name to a given element or collection of elements.
    +         * @method addClass
    +         * @param {String | HTMLElement | Array} el The element or collection to add the class to
    +         * @param {String} className the class name to add to the class attribute
    +         */
    +        addClass: function(el, className) {
    +            var f = function(el) {
    +                if (this.hasClass(el, className)) { return; } // already present
    +
    +
    +                el['className'] = [el['className'], className].join(' ');
    +            };
    +
    +            Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Removes a class name from a given element or collection of elements.
    +         * @method removeClass
    +         * @param {String | HTMLElement | Array} el The element or collection to remove the class from
    +         * @param {String} className the class name to remove from the class attribute
    +         */
    +        removeClass: function(el, className) {
    +            var re = new RegExp('(?:^|\\s+)' + className + '(?:\\s+|$)', 'g');
    +
    +            var f = function(el) {
    +                if (!this.hasClass(el, className)) { return; } // not present
    +
    +
    +                var c = el['className'];
    +                el['className'] = c.replace(re, ' ');
    +                if ( this.hasClass(el, className) ) { // in case of multiple adjacent
    +                    this.removeClass(el, className);
    +                }
    +
    +            };
    +
    +            Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Replace a class with another class for a given element or collection of elements.
    +         * If no oldClassName is present, the newClassName is simply added.
    +         * @method replaceClass
    +         * @param {String | HTMLElement | Array} el The element or collection to remove the class from
    +         * @param {String} oldClassName the class name to be replaced
    +         * @param {String} newClassName the class name that will be replacing the old class name
    +         */
    +        replaceClass: function(el, oldClassName, newClassName) {
    +            if (oldClassName === newClassName) { // avoid infinite loop
    +                return false;
    +            }
    +
    +            var re = new RegExp('(?:^|\\s+)' + oldClassName + '(?:\\s+|$)', 'g');
    +
    +            var f = function(el) {
    +
    +                if ( !this.hasClass(el, oldClassName) ) {
    +                    this.addClass(el, newClassName); // just add it if nothing to replace
    +                    return; // note return
    +                }
    +
    +                el['className'] = el['className'].replace(re, ' ' + newClassName + ' ');
    +
    +                if ( this.hasClass(el, oldClassName) ) { // in case of multiple adjacent
    +                    this.replaceClass(el, oldClassName, newClassName);
    +                }
    +            };
    +
    +            Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Generates a unique ID
    +         * @method generateId
    +         * @param {String | HTMLElement | Array} el (optional) An optional element array of elements to add an ID to (no ID is added if one is already present).
    +         * @param {String} prefix (optional) an optional prefix to use (defaults to "yui-gen").
    +         * @return {String | Array} The generated ID, or array of generated IDs (or original ID if already present on an element)
    +         */
    +        generateId: function(el, prefix) {
    +            prefix = prefix || 'yui-gen';
    +            el = el || {};
    +
    +            var f = function(el) {
    +                if (el) {
    +                    el = Y.Dom.get(el);
    +                } else {
    +                    el = {}; // just generating ID in this case
    +                }
    +
    +                if (!el.id) {
    +                    el.id = prefix + id_counter++;
    +                } // dont override existing
    +
    +
    +                return el.id;
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy.
    +         * @method isAncestor
    +         * @param {String | HTMLElement} haystack The possible ancestor
    +         * @param {String | HTMLElement} needle The possible descendent
    +         * @return {Boolean} Whether or not the haystack is an ancestor of needle
    +         */
    +        isAncestor: function(haystack, needle) {
    +            haystack = Y.Dom.get(haystack);
    +            if (!haystack || !needle) { return false; }
    +
    +            var f = function(needle) {
    +                if (haystack.contains && !isSafari) { // safari "contains" is broken
    +                    return haystack.contains(needle);
    +                }
    +                else if ( haystack.compareDocumentPosition ) {
    +                    return !!(haystack.compareDocumentPosition(needle) & 16);
    +                }
    +                else { // loop up and test each parent
    +                    var parent = needle.parentNode;
    +
    +                    while (parent) {
    +                        if (parent == haystack) {
    +                            return true;
    +                        }
    +                        else if (!parent.tagName || parent.tagName.toUpperCase() == 'HTML') {
    +                            return false;
    +                        }
    +
    +                        parent = parent.parentNode;
    +                    }
    +                    return false;
    +                }
    +            };
    +
    +            return Y.Dom.batch(needle, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Determines whether an HTMLElement is present in the current document.
    +         * @method inDocument
    +         * @param {String | HTMLElement} el The element to search for
    +         * @return {Boolean} Whether or not the element is present in the current document
    +         */
    +        inDocument: function(el) {
    +            var f = function(el) {
    +                return this.isAncestor(document.documentElement, el);
    +            };
    +
    +            return Y.Dom.batch(el, f, Y.Dom, true);
    +        },
    +
    +        /**
    +         * Returns a array of HTMLElements that pass the test applied by supplied boolean method.
    +         * For optimized performance, include a tag and/or root node when possible.
    +         * @method getElementsBy
    +         * @param {Function} method - A boolean method for testing elements which receives the element as its only argument.
    +
    +         * @param {String} tag (optional) The tag name of the elements being collected
    +         * @param {String | HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
    +         */
    +        getElementsBy: function(method, tag, root) {
    +            tag = tag || '*';
    +            root = Y.Dom.get(root) || document;
    +
    +            var nodes = [];
    +            var elements = root.getElementsByTagName(tag);
    +
    +            if ( !elements.length && (tag == '*' && root.all) ) {
    +                elements = root.all; // IE < 6
    +            }
    +
    +            for (var i = 0, len = elements.length; i < len; ++i) {
    +                if ( method(elements[i]) ) { nodes[nodes.length] = elements[i]; }
    +            }
    +
    +
    +            return nodes;
    +        },
    +
    +        /**
    +         * Returns an array of elements that have had the supplied method applied.
    +         * The method is called with the element(s) as the first arg, and the optional param as the second ( method(el, o) ).
    +         * @method batch
    +         * @param {String | HTMLElement | Array} el (optional) An element or array of elements to apply the method to
    +         * @param {Function} method The method to apply to the element(s)
    +         * @param {Any} o (optional) An optional arg that is passed to the supplied method
    +         * @param {Boolean} override (optional) Whether or not to override the scope of "method" with "o"
    +         * @return {HTMLElement | Array} The element(s) with the method applied
    +         */
    +        batch: function(el, method, o, override) {
    +            var id = el;
    +            el = Y.Dom.get(el);
    +
    +            var scope = (override) ? o : window;
    +
    +            if (!el || el.tagName || !el.length) { // is null or not a collection (tagName for SELECT and others that can be both an element and a collection)
    +                if (!el) {
    +                    return false;
    +                }
    +                return method.call(scope, el, o);
    +            }
    +
    +            var collection = [];
    +
    +            for (var i = 0, len = el.length; i < len; ++i) {
    +                if (!el[i]) {
    +                    id = el[i];
    +                }
    +                collection[collection.length] = method.call(scope, el[i], o);
    +            }
    +
    +            return collection;
    +        },
    +
    +        /**
    +         * Returns the height of the document.
    +         * @method getDocumentHeight
    +         * @return {Int} The height of the actual document (which includes the body and its margin).
    +         */
    +        getDocumentHeight: function() {
    +            var scrollHeight = (document.compatMode != 'CSS1Compat') ? document.body.scrollHeight : document.documentElement.scrollHeight;
    +
    +            var h = Math.max(scrollHeight, Y.Dom.getViewportHeight());
    +            return h;
    +        },
    +
    +        /**
    +         * Returns the width of the document.
    +         * @method getDocumentWidth
    +         * @return {Int} The width of the actual document (which includes the body and its margin).
    +         */
    +        getDocumentWidth: function() {
    +            var scrollWidth = (document.compatMode != 'CSS1Compat') ? document.body.scrollWidth : document.documentElement.scrollWidth;
    +            var w = Math.max(scrollWidth, Y.Dom.getViewportWidth());
    +            return w;
    +        },
    +
    +        /**
    +         * Returns the current height of the viewport.
    +         * @method getViewportHeight
    +         * @return {Int} The height of the viewable area of the page (excludes scrollbars).
    +         */
    +        getViewportHeight: function() {
    +            var height = self.innerHeight; // Safari, Opera
    +            var mode = document.compatMode;
    +
    +            if ( (mode || isIE) && !isOpera ) { // IE, Gecko
    +                height = (mode == 'CSS1Compat') ?
    +                        document.documentElement.clientHeight : // Standards
    +                        document.body.clientHeight; // Quirks
    +            }
    +
    +            return height;
    +        },
    +
    +        /**
    +         * Returns the current width of the viewport.
    +         * @method getViewportWidth
    +         * @return {Int} The width of the viewable area of the page (excludes scrollbars).
    +         */
    +
    +        getViewportWidth: function() {
    +            var width = self.innerWidth;  // Safari
    +            var mode = document.compatMode;
    +
    +            if (mode || isIE) { // IE, Gecko, Opera
    +                width = (mode == 'CSS1Compat') ?
    +                        document.documentElement.clientWidth : // Standards
    +                        document.body.clientWidth; // Quirks
    +            }
    +            return width;
    +        }
    +    };
    +})();
    +/**
    + * A region is a representation of an object on a grid.  It is defined
    + * by the top, right, bottom, left extents, so is rectangular by default.  If
    + * other shapes are required, this class could be extended to support it.
    + * @namespace YAHOO.util
    + * @class Region
    + * @param {Int} t the top extent
    + * @param {Int} r the right extent
    + * @param {Int} b the bottom extent
    + * @param {Int} l the left extent
    + * @constructor
    + */
    +YAHOO.util.Region = function(t, r, b, l) {
    +
    +    /**
    +     * The region's top extent
    +     * @property top
    +     * @type Int
    +     */
    +    this.top = t;
    +
    +    /**
    +     * The region's top extent as index, for symmetry with set/getXY
    +     * @property 1
    +     * @type Int
    +     */
    +    this[1] = t;
    +
    +    /**
    +     * The region's right extent
    +     * @property right
    +     * @type int
    +     */
    +    this.right = r;
    +
    +    /**
    +     * The region's bottom extent
    +     * @property bottom
    +     * @type Int
    +     */
    +    this.bottom = b;
    +
    +    /**
    +     * The region's left extent
    +     * @property left
    +     * @type Int
    +     */
    +    this.left = l;
    +
    +    /**
    +     * The region's left extent as index, for symmetry with set/getXY
    +     * @property 0
    +     * @type Int
    +     */
    +    this[0] = l;
    +};
    +
    +/**
    + * Returns true if this region contains the region passed in
    + * @method contains
    + * @param  {Region}  region The region to evaluate
    + * @return {Boolean}        True if the region is contained with this region,
    + *                          else false
    + */
    +YAHOO.util.Region.prototype.contains = function(region) {
    +    return ( region.left   >= this.left   &&
    +             region.right  <= this.right  &&
    +             region.top    >= this.top    &&
    +             region.bottom <= this.bottom    );
    +
    +};
    +
    +/**
    + * Returns the area of the region
    + * @method getArea
    + * @return {Int} the region's area
    + */
    +YAHOO.util.Region.prototype.getArea = function() {
    +    return ( (this.bottom - this.top) * (this.right - this.left) );
    +};
    +
    +/**
    + * Returns the region where the passed in region overlaps with this one
    + * @method intersect
    + * @param  {Region} region The region that intersects
    + * @return {Region}        The overlap region, or null if there is no overlap
    + */
    +YAHOO.util.Region.prototype.intersect = function(region) {
    +    var t = Math.max( this.top,    region.top    );
    +    var r = Math.min( this.right,  region.right  );
    +    var b = Math.min( this.bottom, region.bottom );
    +    var l = Math.max( this.left,   region.left   );
    +
    +    if (b >= t && r >= l) {
    +        return new YAHOO.util.Region(t, r, b, l);
    +    } else {
    +        return null;
    +    }
    +};
    +
    +/**
    + * Returns the region representing the smallest region that can contain both
    + * the passed in region and this region.
    + * @method union
    + * @param  {Region} region The region that to create the union with
    + * @return {Region}        The union region
    + */
    +YAHOO.util.Region.prototype.union = function(region) {
    +    var t = Math.min( this.top,    region.top    );
    +    var r = Math.max( this.right,  region.right  );
    +    var b = Math.max( this.bottom, region.bottom );
    +    var l = Math.min( this.left,   region.left   );
    +
    +    return new YAHOO.util.Region(t, r, b, l);
    +};
    +
    +/**
    + * toString
    + * @method toString
    + * @return string the region properties
    + */
    +YAHOO.util.Region.prototype.toString = function() {
    +    return ( "Region {"    +
    +             "top: "       + this.top    +
    +             ", right: "   + this.right  +
    +             ", bottom: "  + this.bottom +
    +             ", left: "    + this.left   +
    +             "}" );
    +};
    +
    +/**
    + * Returns a region that is occupied by the DOM element
    + * @method getRegion
    + * @param  {HTMLElement} el The element
    + * @return {Region}         The region that the element occupies
    + * @static
    + */
    +YAHOO.util.Region.getRegion = function(el) {
    +    var p = YAHOO.util.Dom.getXY(el);
    +
    +    var t = p[1];
    +    var r = p[0] + el.offsetWidth;
    +    var b = p[1] + el.offsetHeight;
    +    var l = p[0];
    +
    +    return new YAHOO.util.Region(t, r, b, l);
    +};
    +
    +/////////////////////////////////////////////////////////////////////////////
    +
    +/**
    + * A point is a region that is special in that it represents a single point on
    + * the grid.
    + * @namespace YAHOO.util
    + * @class Point
    + * @param {Int} x The X position of the point
    + * @param {Int} y The Y position of the point
    + * @constructor
    + * @extends YAHOO.util.Region
    + */
    +YAHOO.util.Point = function(x, y) {
    +   if (x instanceof Array) { // accept output from Dom.getXY
    +      y = x[1];
    +      x = x[0];
    +   }
    +
    +    /**
    +     * The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry)
    +     * @property x
    +     * @type Int
    +     */
    +
    +    this.x = this.right = this.left = this[0] = x;
    +
    +    /**
    +     * The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry)
    +     * @property y
    +     * @type Int
    +     */
    +    this.y = this.top = this.bottom = this[1] = y;
    +};
    +
    +YAHOO.util.Point.prototype = new YAHOO.util.Region();
    +
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/dragdrop.js.html b/www/extras/yui-ext/docs/output/dragdrop.js.html new file mode 100644 index 000000000..ddf227dbe --- /dev/null +++ b/www/extras/yui-ext/docs/output/dragdrop.js.html @@ -0,0 +1,2941 @@ +dragdrop.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +
    +(function() {
    +
    +var Event=YAHOO.util.Event;
    +var Dom=YAHOO.util.Dom;
    +
    +/**
    + * Defines the interface and base operation of items that that can be
    + * dragged or can be drop targets.  It was designed to be extended, overriding
    + * the event handlers for startDrag, onDrag, onDragOver, onDragOut.
    + * Up to three html elements can be associated with a DragDrop instance:
    + * <ul>
    + * <li>linked element: the element that is passed into the constructor.
    + * This is the element which defines the boundaries for interaction with
    + * other DragDrop objects.</li>
    + * <li>handle element(s): The drag operation only occurs if the element that
    + * was clicked matches a handle element.  By default this is the linked
    + * element, but there are times that you will want only a portion of the
    + * linked element to initiate the drag operation, and the setHandleElId()
    + * method provides a way to define this.</li>
    + * <li>drag element: this represents an the element that would be moved along
    + * with the cursor during a drag operation.  By default, this is the linked
    + * element itself as in {@link YAHOO.util.DD}.  setDragElId() lets you define
    + * a separate element that would be moved, as in {@link YAHOO.util.DDProxy}
    + * </li>
    + * </ul>
    + * This class should not be instantiated until the onload event to ensure that
    + * the associated elements are available.
    + * The following would define a DragDrop obj that would interact with any
    + * other DragDrop obj in the "group1" group:
    + * <pre>
    + *  dd = new YAHOO.util.DragDrop("div1", "group1");
    + * </pre>
    + * Since none of the event handlers have been implemented, nothing would
    + * actually happen if you were to run the code above.  Normally you would
    + * override this class or one of the default implementations, but you can
    + * also override the methods you want on an instance of the class...
    + * <pre>
    + *  dd.onDragDrop = function(e, id) {
    + *  &nbsp;&nbsp;alert("dd was dropped on " + id);
    + *  }
    + * </pre>
    + * @namespace YAHOO.util
    + * @class DragDrop
    + * @constructor
    + * @param {String} id of the element that is linked to this instance
    + * @param {String} sGroup the group of related DragDrop objects
    + * @param {object} config an object containing configurable attributes
    + *                Valid properties for DragDrop:
    + *                    padding, isTarget, maintainOffset, primaryButtonOnly
    + */
    +YAHOO.util.DragDrop = function(id, sGroup, config) {
    +    if (id) {
    +        this.init(id, sGroup, config);
    +    }
    +};
    +
    +YAHOO.util.DragDrop.prototype = {
    +
    +    /**
    +     * The id of the element associated with this object.  This is what we
    +     * refer to as the "linked element" because the size and position of
    +     * this element is used to determine when the drag and drop objects have
    +     * interacted.
    +     * @property id
    +     * @type String
    +     */
    +    id: null,
    +
    +    /**
    +     * Configuration attributes passed into the constructor
    +     * @property config
    +     * @type object
    +     */
    +    config: null,
    +
    +    /**
    +     * The id of the element that will be dragged.  By default this is same
    +     * as the linked element , but could be changed to another element. Ex:
    +     * YAHOO.util.DDProxy
    +     * @property dragElId
    +     * @type String
    +     * @private
    +     */
    +    dragElId: null,
    +
    +    /**
    +     * the id of the element that initiates the drag operation.  By default
    +     * this is the linked element, but could be changed to be a child of this
    +     * element.  This lets us do things like only starting the drag when the
    +     * header element within the linked html element is clicked.
    +     * @property handleElId
    +     * @type String
    +     * @private
    +     */
    +    handleElId: null,
    +
    +    /**
    +     * An associative array of HTML tags that will be ignored if clicked.
    +     * @property invalidHandleTypes
    +     * @type {string: string}
    +     */
    +    invalidHandleTypes: null,
    +
    +    /**
    +     * An associative array of ids for elements that will be ignored if clicked
    +     * @property invalidHandleIds
    +     * @type {string: string}
    +     */
    +    invalidHandleIds: null,
    +
    +    /**
    +     * An indexted array of css class names for elements that will be ignored
    +     * if clicked.
    +     * @property invalidHandleClasses
    +     * @type string[]
    +     */
    +    invalidHandleClasses: null,
    +
    +    /**
    +     * The linked element's absolute X position at the time the drag was
    +     * started
    +     * @property startPageX
    +     * @type int
    +     * @private
    +     */
    +    startPageX: 0,
    +
    +    /**
    +     * The linked element's absolute X position at the time the drag was
    +     * started
    +     * @property startPageY
    +     * @type int
    +     * @private
    +     */
    +    startPageY: 0,
    +
    +    /**
    +     * The group defines a logical collection of DragDrop objects that are
    +     * related.  Instances only get events when interacting with other
    +     * DragDrop object in the same group.  This lets us define multiple
    +     * groups using a single DragDrop subclass if we want.
    +     * @property groups
    +     * @type {string: string}
    +     */
    +    groups: null,
    +
    +    /**
    +     * Individual drag/drop instances can be locked.  This will prevent
    +     * onmousedown start drag.
    +     * @property locked
    +     * @type boolean
    +     * @private
    +     */
    +    locked: false,
    +
    +    /**
    +     * Lock this instance
    +     * @method lock
    +     */
    +    lock: function() { this.locked = true; },
    +
    +    /**
    +     * Unlock this instace
    +     * @method unlock
    +     */
    +    unlock: function() { this.locked = false; },
    +
    +    /**
    +     * By default, all insances can be a drop target.  This can be disabled by
    +     * setting isTarget to false.
    +     * @method isTarget
    +     * @type boolean
    +     */
    +    isTarget: true,
    +
    +    /**
    +     * The padding configured for this drag and drop object for calculating
    +     * the drop zone intersection with this object.
    +     * @method padding
    +     * @type int[]
    +     */
    +    padding: null,
    +
    +    /**
    +     * Cached reference to the linked element
    +     * @property _domRef
    +     * @private
    +     */
    +    _domRef: null,
    +
    +    /**
    +     * Internal typeof flag
    +     * @property __ygDragDrop
    +     * @private
    +     */
    +    __ygDragDrop: true,
    +
    +    /**
    +     * Set to true when horizontal contraints are applied
    +     * @property constrainX
    +     * @type boolean
    +     * @private
    +     */
    +    constrainX: false,
    +
    +    /**
    +     * Set to true when vertical contraints are applied
    +     * @property constrainY
    +     * @type boolean
    +     * @private
    +     */
    +    constrainY: false,
    +
    +    /**
    +     * The left constraint
    +     * @property minX
    +     * @type int
    +     * @private
    +     */
    +    minX: 0,
    +
    +    /**
    +     * The right constraint
    +     * @property maxX
    +     * @type int
    +     * @private
    +     */
    +    maxX: 0,
    +
    +    /**
    +     * The up constraint
    +     * @property minY
    +     * @type int
    +     * @type int
    +     * @private
    +     */
    +    minY: 0,
    +
    +    /**
    +     * The down constraint
    +     * @property maxY
    +     * @type int
    +     * @private
    +     */
    +    maxY: 0,
    +
    +    /**
    +     * Maintain offsets when we resetconstraints.  Set to true when you want
    +     * the position of the element relative to its parent to stay the same
    +     * when the page changes
    +     *
    +     * @property maintainOffset
    +     * @type boolean
    +     */
    +    maintainOffset: false,
    +
    +    /**
    +     * Array of pixel locations the element will snap to if we specified a
    +     * horizontal graduation/interval.  This array is generated automatically
    +     * when you define a tick interval.
    +     * @property xTicks
    +     * @type int[]
    +     */
    +    xTicks: null,
    +
    +    /**
    +     * Array of pixel locations the element will snap to if we specified a
    +     * vertical graduation/interval.  This array is generated automatically
    +     * when you define a tick interval.
    +     * @property yTicks
    +     * @type int[]
    +     */
    +    yTicks: null,
    +
    +    /**
    +     * By default the drag and drop instance will only respond to the primary
    +     * button click (left button for a right-handed mouse).  Set to true to
    +     * allow drag and drop to start with any mouse click that is propogated
    +     * by the browser
    +     * @property primaryButtonOnly
    +     * @type boolean
    +     */
    +    primaryButtonOnly: true,
    +
    +    /**
    +     * The availabe property is false until the linked dom element is accessible.
    +     * @property available
    +     * @type boolean
    +     */
    +    available: false,
    +
    +    /**
    +     * By default, drags can only be initiated if the mousedown occurs in the
    +     * region the linked element is.  This is done in part to work around a
    +     * bug in some browsers that mis-report the mousedown if the previous
    +     * mouseup happened outside of the window.  This property is set to true
    +     * if outer handles are defined.
    +     *
    +     * @property hasOuterHandles
    +     * @type boolean
    +     * @default false
    +     */
    +    hasOuterHandles: false,
    +
    +    /**
    +     * Code that executes immediately before the startDrag event
    +     * @method b4StartDrag
    +     * @private
    +     */
    +    b4StartDrag: function(x, y) { },
    +
    +    /**
    +     * Abstract method called after a drag/drop object is clicked
    +     * and the drag or mousedown time thresholds have beeen met.
    +     * @method startDrag
    +     * @param {int} X click location
    +     * @param {int} Y click location
    +     */
    +    startDrag: function(x, y) { /* override this */ },
    +
    +    /**
    +     * Code that executes immediately before the onDrag event
    +     * @method b4Drag
    +     * @private
    +     */
    +    b4Drag: function(e) { },
    +
    +    /**
    +     * Abstract method called during the onMouseMove event while dragging an
    +     * object.
    +     * @method onDrag
    +     * @param {Event} e the mousemove event
    +     */
    +    onDrag: function(e) { /* override this */ },
    +
    +    /**
    +     * Abstract method called when this element fist begins hovering over
    +     * another DragDrop obj
    +     * @method onDragEnter
    +     * @param {Event} e the mousemove event
    +     * @param {String|DragDrop[]} id In POINT mode, the element
    +     * id this is hovering over.  In INTERSECT mode, an array of one or more
    +     * dragdrop items being hovered over.
    +     */
    +    onDragEnter: function(e, id) { /* override this */ },
    +
    +    /**
    +     * Code that executes immediately before the onDragOver event
    +     * @method b4DragOver
    +     * @private
    +     */
    +    b4DragOver: function(e) { },
    +
    +    /**
    +     * Abstract method called when this element is hovering over another
    +     * DragDrop obj
    +     * @method onDragOver
    +     * @param {Event} e the mousemove event
    +     * @param {String|DragDrop[]} id In POINT mode, the element
    +     * id this is hovering over.  In INTERSECT mode, an array of dd items
    +     * being hovered over.
    +     */
    +    onDragOver: function(e, id) { /* override this */ },
    +
    +    /**
    +     * Code that executes immediately before the onDragOut event
    +     * @method b4DragOut
    +     * @private
    +     */
    +    b4DragOut: function(e) { },
    +
    +    /**
    +     * Abstract method called when we are no longer hovering over an element
    +     * @method onDragOut
    +     * @param {Event} e the mousemove event
    +     * @param {String|DragDrop[]} id In POINT mode, the element
    +     * id this was hovering over.  In INTERSECT mode, an array of dd items
    +     * that the mouse is no longer over.
    +     */
    +    onDragOut: function(e, id) { /* override this */ },
    +
    +    /**
    +     * Code that executes immediately before the onDragDrop event
    +     * @method b4DragDrop
    +     * @private
    +     */
    +    b4DragDrop: function(e) { },
    +
    +    /**
    +     * Abstract method called when this item is dropped on another DragDrop
    +     * obj
    +     * @method onDragDrop
    +     * @param {Event} e the mouseup event
    +     * @param {String|DragDrop[]} id In POINT mode, the element
    +     * id this was dropped on.  In INTERSECT mode, an array of dd items this
    +     * was dropped on.
    +     */
    +    onDragDrop: function(e, id) { /* override this */ },
    +
    +    /**
    +     * Abstract method called when this item is dropped on an area with no
    +     * drop target
    +     * @method onInvalidDrop
    +     * @param {Event} e the mouseup event
    +     */
    +    onInvalidDrop: function(e) { /* override this */ },
    +
    +    /**
    +     * Code that executes immediately before the endDrag event
    +     * @method b4EndDrag
    +     * @private
    +     */
    +    b4EndDrag: function(e) { },
    +
    +    /**
    +     * Fired when we are done dragging the object
    +     * @method endDrag
    +     * @param {Event} e the mouseup event
    +     */
    +    endDrag: function(e) { /* override this */ },
    +
    +    /**
    +     * Code executed immediately before the onMouseDown event
    +     * @method b4MouseDown
    +     * @param {Event} e the mousedown event
    +     * @private
    +     */
    +    b4MouseDown: function(e) {  },
    +
    +    /**
    +     * Event handler that fires when a drag/drop obj gets a mousedown
    +     * @method onMouseDown
    +     * @param {Event} e the mousedown event
    +     */
    +    onMouseDown: function(e) { /* override this */ },
    +
    +    /**
    +     * Event handler that fires when a drag/drop obj gets a mouseup
    +     * @method onMouseUp
    +     * @param {Event} e the mouseup event
    +     */
    +    onMouseUp: function(e) { /* override this */ },
    +
    +    /**
    +     * Override the onAvailable method to do what is needed after the initial
    +     * position was determined.
    +     * @method onAvailable
    +     */
    +    onAvailable: function () {
    +    },
    +
    +    /**
    +     * Returns a reference to the linked element
    +     * @method getEl
    +     * @return {HTMLElement} the html element
    +     */
    +    getEl: function() {
    +        if (!this._domRef) {
    +            this._domRef = Dom.get(this.id);
    +        }
    +
    +        return this._domRef;
    +    },
    +
    +    /**
    +     * Returns a reference to the actual element to drag.  By default this is
    +     * the same as the html element, but it can be assigned to another
    +     * element. An example of this can be found in YAHOO.util.DDProxy
    +     * @method getDragEl
    +     * @return {HTMLElement} the html element
    +     */
    +    getDragEl: function() {
    +        return Dom.get(this.dragElId);
    +    },
    +
    +    /**
    +     * Sets up the DragDrop object.  Must be called in the constructor of any
    +     * YAHOO.util.DragDrop subclass
    +     * @method init
    +     * @param id the id of the linked element
    +     * @param {String} sGroup the group of related items
    +     * @param {object} config configuration attributes
    +     */
    +    init: function(id, sGroup, config) {
    +        this.initTarget(id, sGroup, config);
    +        Event.on(this.id, "mousedown", this.handleMouseDown, this, true);
    +        // Event.on(this.id, "selectstart", Event.preventDefault);
    +    },
    +
    +    /**
    +     * Initializes Targeting functionality only... the object does not
    +     * get a mousedown handler.
    +     * @method initTarget
    +     * @param id the id of the linked element
    +     * @param {String} sGroup the group of related items
    +     * @param {object} config configuration attributes
    +     */
    +    initTarget: function(id, sGroup, config) {
    +
    +        // configuration attributes
    +        this.config = config || {};
    +
    +        // create a local reference to the drag and drop manager
    +        this.DDM = YAHOO.util.DDM;
    +        // initialize the groups array
    +        this.groups = {};
    +
    +        // assume that we have an element reference instead of an id if the
    +        // parameter is not a string
    +        if (typeof id !== "string") {
    +            YAHOO.log("id is not a string, assuming it is an HTMLElement");
    +            id = Dom.generateId(id);
    +        }
    +
    +        // set the id
    +        this.id = id;
    +
    +        // add to an interaction group
    +        this.addToGroup((sGroup) ? sGroup : "default");
    +
    +        // We don't want to register this as the handle with the manager
    +        // so we just set the id rather than calling the setter.
    +        this.handleElId = id;
    +
    +        Event.onAvailable(id, this.handleOnAvailable, this, true);
    +
    +
    +        // the linked element is the element that gets dragged by default
    +        this.setDragElId(id);
    +
    +        // by default, clicked anchors will not start drag operations.
    +        // @TODO what else should be here?  Probably form fields.
    +        this.invalidHandleTypes = { A: "A" };
    +        this.invalidHandleIds = {};
    +        this.invalidHandleClasses = [];
    +
    +        this.applyConfig();
    +    },
    +
    +    /**
    +     * Applies the configuration parameters that were passed into the constructor.
    +     * This is supposed to happen at each level through the inheritance chain.  So
    +     * a DDProxy implentation will execute apply config on DDProxy, DD, and
    +     * DragDrop in order to get all of the parameters that are available in
    +     * each object.
    +     * @method applyConfig
    +     */
    +    applyConfig: function() {
    +
    +        // configurable properties:
    +        //    padding, isTarget, maintainOffset, primaryButtonOnly
    +        this.padding           = this.config.padding || [0, 0, 0, 0];
    +        this.isTarget          = (this.config.isTarget !== false);
    +        this.maintainOffset    = (this.config.maintainOffset);
    +        this.primaryButtonOnly = (this.config.primaryButtonOnly !== false);
    +
    +    },
    +
    +    /**
    +     * Executed when the linked element is available
    +     * @method handleOnAvailable
    +     * @private
    +     */
    +    handleOnAvailable: function() {
    +        this.available = true;
    +        this.resetConstraints();
    +        this.onAvailable();
    +    },
    +
    +     /**
    +     * Configures the padding for the target zone in px.  Effectively expands
    +     * (or reduces) the virtual object size for targeting calculations.
    +     * Supports css-style shorthand; if only one parameter is passed, all sides
    +     * will have that padding, and if only two are passed, the top and bottom
    +     * will have the first param, the left and right the second.
    +     * @method setPadding
    +     * @param {int} iTop    Top pad
    +     * @param {int} iRight  Right pad
    +     * @param {int} iBot    Bot pad
    +     * @param {int} iLeft   Left pad
    +     */
    +    setPadding: function(iTop, iRight, iBot, iLeft) {
    +        // this.padding = [iLeft, iRight, iTop, iBot];
    +        if (!iRight && 0 !== iRight) {
    +            this.padding = [iTop, iTop, iTop, iTop];
    +        } else if (!iBot && 0 !== iBot) {
    +            this.padding = [iTop, iRight, iTop, iRight];
    +        } else {
    +            this.padding = [iTop, iRight, iBot, iLeft];
    +        }
    +    },
    +
    +    /**
    +     * Stores the initial placement of the linked element.
    +     * @method setInitialPosition
    +     * @param {int} diffX   the X offset, default 0
    +     * @param {int} diffY   the Y offset, default 0
    +     */
    +    setInitPosition: function(diffX, diffY) {
    +        var el = this.getEl();
    +
    +        if (!this.DDM.verifyEl(el)) {
    +            return;
    +        }
    +
    +        var dx = diffX || 0;
    +        var dy = diffY || 0;
    +
    +        var p = Dom.getXY( el );
    +
    +        this.initPageX = p[0] - dx;
    +        this.initPageY = p[1] - dy;
    +
    +        this.lastPageX = p[0];
    +        this.lastPageY = p[1];
    +
    +
    +        this.setStartPosition(p);
    +    },
    +
    +    /**
    +     * Sets the start position of the element.  This is set when the obj
    +     * is initialized, the reset when a drag is started.
    +     * @method setStartPosition
    +     * @param pos current position (from previous lookup)
    +     * @private
    +     */
    +    setStartPosition: function(pos) {
    +        var p = pos || Dom.getXY( this.getEl() );
    +        this.deltaSetXY = null;
    +
    +        this.startPageX = p[0];
    +        this.startPageY = p[1];
    +    },
    +
    +    /**
    +     * Add this instance to a group of related drag/drop objects.  All
    +     * instances belong to at least one group, and can belong to as many
    +     * groups as needed.
    +     * @method addToGroup
    +     * @param sGroup {string} the name of the group
    +     */
    +    addToGroup: function(sGroup) {
    +        this.groups[sGroup] = true;
    +        this.DDM.regDragDrop(this, sGroup);
    +    },
    +
    +    /**
    +     * Remove's this instance from the supplied interaction group
    +     * @method removeFromGroup
    +     * @param {string}  sGroup  The group to drop
    +     */
    +    removeFromGroup: function(sGroup) {
    +        if (this.groups[sGroup]) {
    +            delete this.groups[sGroup];
    +        }
    +
    +        this.DDM.removeDDFromGroup(this, sGroup);
    +    },
    +
    +    /**
    +     * Allows you to specify that an element other than the linked element
    +     * will be moved with the cursor during a drag
    +     * @method setDragElId
    +     * @param id {string} the id of the element that will be used to initiate the drag
    +     */
    +    setDragElId: function(id) {
    +        this.dragElId = id;
    +    },
    +
    +    /**
    +     * Allows you to specify a child of the linked element that should be
    +     * used to initiate the drag operation.  An example of this would be if
    +     * you have a content div with text and links.  Clicking anywhere in the
    +     * content area would normally start the drag operation.  Use this method
    +     * to specify that an element inside of the content div is the element
    +     * that starts the drag operation.
    +     * @method setHandleElId
    +     * @param id {string} the id of the element that will be used to
    +     * initiate the drag.
    +     */
    +    setHandleElId: function(id) {
    +        if (typeof id !== "string") {
    +            YAHOO.log("id is not a string, assuming it is an HTMLElement");
    +            id = Dom.generateId(id);
    +        }
    +        this.handleElId = id;
    +        this.DDM.regHandle(this.id, id);
    +    },
    +
    +    /**
    +     * Allows you to set an element outside of the linked element as a drag
    +     * handle
    +     * @method setOuterHandleElId
    +     * @param id the id of the element that will be used to initiate the drag
    +     */
    +    setOuterHandleElId: function(id) {
    +        if (typeof id !== "string") {
    +            YAHOO.log("id is not a string, assuming it is an HTMLElement");
    +            id = Dom.generateId(id);
    +        }
    +        Event.on(id, "mousedown",
    +                this.handleMouseDown, this, true);
    +        this.setHandleElId(id);
    +
    +        this.hasOuterHandles = true;
    +    },
    +
    +    /**
    +     * Remove all drag and drop hooks for this element
    +     * @method unreg
    +     */
    +    unreg: function() {
    +        Event.removeListener(this.id, "mousedown",
    +                this.handleMouseDown);
    +        this._domRef = null;
    +        this.DDM._remove(this);
    +    },
    +
    +    /**
    +     * Returns true if this instance is locked, or the drag drop mgr is locked
    +     * (meaning that all drag/drop is disabled on the page.)
    +     * @method isLocked
    +     * @return {boolean} true if this obj or all drag/drop is locked, else
    +     * false
    +     */
    +    isLocked: function() {
    +        return (this.DDM.isLocked() || this.locked);
    +    },
    +
    +    /**
    +     * Fired when this object is clicked
    +     * @method handleMouseDown
    +     * @param {Event} e
    +     * @param {YAHOO.util.DragDrop} oDD the clicked dd object (this dd obj)
    +     * @private
    +     */
    +    handleMouseDown: function(e, oDD) {
    +
    +        var button = e.which || e.button;
    +
    +        if (this.primaryButtonOnly && button > 1) {
    +            return;
    +        }
    +
    +        if (this.isLocked()) {
    +            return;
    +        }
    +
    +        this.DDM.refreshCache(this.groups);
    +        // var self = this;
    +        // setTimeout( function() { self.DDM.refreshCache(self.groups); }, 0);
    +
    +        // Only process the event if we really clicked within the linked
    +        // element.  The reason we make this check is that in the case that
    +        // another element was moved between the clicked element and the
    +        // cursor in the time between the mousedown and mouseup events. When
    +        // this happens, the element gets the next mousedown event
    +        // regardless of where on the screen it happened.
    +        var pt = new YAHOO.util.Point(Event.getPageX(e), Event.getPageY(e));
    +        if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {
    +        } else {
    +            if (this.clickValidator(e)) {
    +
    +
    +                // set the initial element position
    +                this.setStartPosition();
    +
    +
    +                this.b4MouseDown(e);
    +                this.onMouseDown(e);
    +                this.DDM.handleMouseDown(e, this);
    +
    +                this.DDM.stopEvent(e);
    +            } else {
    +
    +
    +            }
    +        }
    +    },
    +
    +    clickValidator: function(e) {
    +        var target = Event.getTarget(e);
    +        return ( this.isValidHandleChild(target) &&
    +                    (this.id == this.handleElId ||
    +                        this.DDM.handleWasClicked(target, this.id)) );
    +    },
    +
    +    /**
    +     * Allows you to specify a tag name that should not start a drag operation
    +     * when clicked.  This is designed to facilitate embedding links within a
    +     * drag handle that do something other than start the drag.
    +     * @method addInvalidHandleType
    +     * @param {string} tagName the type of element to exclude
    +     */
    +    addInvalidHandleType: function(tagName) {
    +        var type = tagName.toUpperCase();
    +        this.invalidHandleTypes[type] = type;
    +    },
    +
    +    /**
    +     * Lets you to specify an element id for a child of a drag handle
    +     * that should not initiate a drag
    +     * @method addInvalidHandleId
    +     * @param {string} id the element id of the element you wish to ignore
    +     */
    +    addInvalidHandleId: function(id) {
    +        if (typeof id !== "string") {
    +            YAHOO.log("id is not a string, assuming it is an HTMLElement");
    +            id = Dom.generateId(id);
    +        }
    +        this.invalidHandleIds[id] = id;
    +    },
    +
    +    /**
    +     * Lets you specify a css class of elements that will not initiate a drag
    +     * @method addInvalidHandleClass
    +     * @param {string} cssClass the class of the elements you wish to ignore
    +     */
    +    addInvalidHandleClass: function(cssClass) {
    +        this.invalidHandleClasses.push(cssClass);
    +    },
    +
    +    /**
    +     * Unsets an excluded tag name set by addInvalidHandleType
    +     * @method removeInvalidHandleType
    +     * @param {string} tagName the type of element to unexclude
    +     */
    +    removeInvalidHandleType: function(tagName) {
    +        var type = tagName.toUpperCase();
    +        // this.invalidHandleTypes[type] = null;
    +        delete this.invalidHandleTypes[type];
    +    },
    +
    +    /**
    +     * Unsets an invalid handle id
    +     * @method removeInvalidHandleId
    +     * @param {string} id the id of the element to re-enable
    +     */
    +    removeInvalidHandleId: function(id) {
    +        if (typeof id !== "string") {
    +            YAHOO.log("id is not a string, assuming it is an HTMLElement");
    +            id = Dom.generateId(id);
    +        }
    +        delete this.invalidHandleIds[id];
    +    },
    +
    +    /**
    +     * Unsets an invalid css class
    +     * @method removeInvalidHandleClass
    +     * @param {string} cssClass the class of the element(s) you wish to
    +     * re-enable
    +     */
    +    removeInvalidHandleClass: function(cssClass) {
    +        for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
    +            if (this.invalidHandleClasses[i] == cssClass) {
    +                delete this.invalidHandleClasses[i];
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Checks the tag exclusion list to see if this click should be ignored
    +     * @method isValidHandleChild
    +     * @param {HTMLElement} node the HTMLElement to evaluate
    +     * @return {boolean} true if this is a valid tag type, false if not
    +     */
    +    isValidHandleChild: function(node) {
    +
    +        var valid = true;
    +        // var n = (node.nodeName == "#text") ? node.parentNode : node;
    +        var nodeName;
    +        try {
    +            nodeName = node.nodeName.toUpperCase();
    +        } catch(e) {
    +            nodeName = node.nodeName;
    +        }
    +        valid = valid && !this.invalidHandleTypes[nodeName];
    +        valid = valid && !this.invalidHandleIds[node.id];
    +
    +        for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
    +            valid = !Dom.hasClass(node, this.invalidHandleClasses[i]);
    +        }
    +
    +
    +        return valid;
    +
    +    },
    +
    +    /**
    +     * Create the array of horizontal tick marks if an interval was specified
    +     * in setXConstraint().
    +     * @method setXTicks
    +     * @private
    +     */
    +    setXTicks: function(iStartX, iTickSize) {
    +        this.xTicks = [];
    +        this.xTickSize = iTickSize;
    +
    +        var tickMap = {};
    +
    +        for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
    +            if (!tickMap[i]) {
    +                this.xTicks[this.xTicks.length] = i;
    +                tickMap[i] = true;
    +            }
    +        }
    +
    +        for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
    +            if (!tickMap[i]) {
    +                this.xTicks[this.xTicks.length] = i;
    +                tickMap[i] = true;
    +            }
    +        }
    +
    +        this.xTicks.sort(this.DDM.numericSort) ;
    +    },
    +
    +    /**
    +     * Create the array of vertical tick marks if an interval was specified in
    +     * setYConstraint().
    +     * @method setYTicks
    +     * @private
    +     */
    +    setYTicks: function(iStartY, iTickSize) {
    +        this.yTicks = [];
    +        this.yTickSize = iTickSize;
    +
    +        var tickMap = {};
    +
    +        for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
    +            if (!tickMap[i]) {
    +                this.yTicks[this.yTicks.length] = i;
    +                tickMap[i] = true;
    +            }
    +        }
    +
    +        for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
    +            if (!tickMap[i]) {
    +                this.yTicks[this.yTicks.length] = i;
    +                tickMap[i] = true;
    +            }
    +        }
    +
    +        this.yTicks.sort(this.DDM.numericSort) ;
    +    },
    +
    +    /**
    +     * By default, the element can be dragged any place on the screen.  Use
    +     * this method to limit the horizontal travel of the element.  Pass in
    +     * 0,0 for the parameters if you want to lock the drag to the y axis.
    +     * @method setXConstraint
    +     * @param {int} iLeft the number of pixels the element can move to the left
    +     * @param {int} iRight the number of pixels the element can move to the
    +     * right
    +     * @param {int} iTickSize optional parameter for specifying that the
    +     * element
    +     * should move iTickSize pixels at a time.
    +     */
    +    setXConstraint: function(iLeft, iRight, iTickSize) {
    +        this.leftConstraint = iLeft;
    +        this.rightConstraint = iRight;
    +
    +        this.minX = this.initPageX - iLeft;
    +        this.maxX = this.initPageX + iRight;
    +        if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
    +
    +        this.constrainX = true;
    +    },
    +
    +    /**
    +     * Clears any constraints applied to this instance.  Also clears ticks
    +     * since they can't exist independent of a constraint at this time.
    +     * @method clearConstraints
    +     */
    +    clearConstraints: function() {
    +        this.constrainX = false;
    +        this.constrainY = false;
    +        this.clearTicks();
    +    },
    +
    +    /**
    +     * Clears any tick interval defined for this instance
    +     * @method clearTicks
    +     */
    +    clearTicks: function() {
    +        this.xTicks = null;
    +        this.yTicks = null;
    +        this.xTickSize = 0;
    +        this.yTickSize = 0;
    +    },
    +
    +    /**
    +     * By default, the element can be dragged any place on the screen.  Set
    +     * this to limit the vertical travel of the element.  Pass in 0,0 for the
    +     * parameters if you want to lock the drag to the x axis.
    +     * @method setYConstraint
    +     * @param {int} iUp the number of pixels the element can move up
    +     * @param {int} iDown the number of pixels the element can move down
    +     * @param {int} iTickSize optional parameter for specifying that the
    +     * element should move iTickSize pixels at a time.
    +     */
    +    setYConstraint: function(iUp, iDown, iTickSize) {
    +        this.topConstraint = iUp;
    +        this.bottomConstraint = iDown;
    +
    +        this.minY = this.initPageY - iUp;
    +        this.maxY = this.initPageY + iDown;
    +        if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
    +
    +        this.constrainY = true;
    +
    +    },
    +
    +    /**
    +     * resetConstraints must be called if you manually reposition a dd element.
    +     * @method resetConstraints
    +     * @param {boolean} maintainOffset
    +     */
    +    resetConstraints: function() {
    +
    +
    +        // Maintain offsets if necessary
    +        if (this.initPageX || this.initPageX === 0) {
    +            // figure out how much this thing has moved
    +            var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
    +            var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
    +
    +            this.setInitPosition(dx, dy);
    +
    +        // This is the first time we have detected the element's position
    +        } else {
    +            this.setInitPosition();
    +        }
    +
    +        if (this.constrainX) {
    +            this.setXConstraint( this.leftConstraint,
    +                                 this.rightConstraint,
    +                                 this.xTickSize        );
    +        }
    +
    +        if (this.constrainY) {
    +            this.setYConstraint( this.topConstraint,
    +                                 this.bottomConstraint,
    +                                 this.yTickSize         );
    +        }
    +    },
    +
    +    /**
    +     * Normally the drag element is moved pixel by pixel, but we can specify
    +     * that it move a number of pixels at a time.  This method resolves the
    +     * location when we have it set up like this.
    +     * @method getTick
    +     * @param {int} val where we want to place the object
    +     * @param {int[]} tickArray sorted array of valid points
    +     * @return {int} the closest tick
    +     * @private
    +     */
    +    getTick: function(val, tickArray) {
    +
    +        if (!tickArray) {
    +            // If tick interval is not defined, it is effectively 1 pixel,
    +            // so we return the value passed to us.
    +            return val;
    +        } else if (tickArray[0] >= val) {
    +            // The value is lower than the first tick, so we return the first
    +            // tick.
    +            return tickArray[0];
    +        } else {
    +            for (var i=0, len=tickArray.length; i<len; ++i) {
    +                var next = i + 1;
    +                if (tickArray[next] && tickArray[next] >= val) {
    +                    var diff1 = val - tickArray[i];
    +                    var diff2 = tickArray[next] - val;
    +                    return (diff2 > diff1) ? tickArray[i] : tickArray[next];
    +                }
    +            }
    +
    +            // The value is larger than the last tick, so we return the last
    +            // tick.
    +            return tickArray[tickArray.length - 1];
    +        }
    +    },
    +
    +    /**
    +     * toString method
    +     * @method toString
    +     * @return {string} string representation of the dd obj
    +     */
    +    toString: function() {
    +        return ("DragDrop " + this.id);
    +    }
    +
    +};
    +
    +})();
    +/**
    + * The drag and drop utility provides a framework for building drag and drop
    + * applications.  In addition to enabling drag and drop for specific elements,
    + * the drag and drop elements are tracked by the manager class, and the
    + * interactions between the various elements are tracked during the drag and
    + * the implementing code is notified about these important moments.
    + * @module dragdrop
    + * @title Drag and Drop
    + * @requires yahoo,dom,event
    + * @namespace YAHOO.util
    + */
    +
    +// Only load the library once.  Rewriting the manager class would orphan
    +// existing drag and drop instances.
    +if (!YAHOO.util.DragDropMgr) {
    +
    +/**
    + * DragDropMgr is a singleton that tracks the element interaction for
    + * all DragDrop items in the window.  Generally, you will not call
    + * this class directly, but it does have helper methods that could
    + * be useful in your DragDrop implementations.
    + * @class DragDropMgr
    + * @static
    + */
    +YAHOO.util.DragDropMgr = function() {
    +
    +    var Event = YAHOO.util.Event;
    +
    +    return {
    +
    +        /**
    +         * Two dimensional Array of registered DragDrop objects.  The first
    +         * dimension is the DragDrop item group, the second the DragDrop
    +         * object.
    +         * @property ids
    +         * @type {string: string}
    +         * @private
    +         * @static
    +         */
    +        ids: {},
    +
    +        /**
    +         * Array of element ids defined as drag handles.  Used to determine
    +         * if the element that generated the mousedown event is actually the
    +         * handle and not the html element itself.
    +         * @property handleIds
    +         * @type {string: string}
    +         * @private
    +         * @static
    +         */
    +        handleIds: {},
    +
    +        /**
    +         * the DragDrop object that is currently being dragged
    +         * @property dragCurrent
    +         * @type DragDrop
    +         * @private
    +         * @static
    +         **/
    +        dragCurrent: null,
    +
    +        /**
    +         * the DragDrop object(s) that are being hovered over
    +         * @property dragOvers
    +         * @type Array
    +         * @private
    +         * @static
    +         */
    +        dragOvers: {},
    +
    +        /**
    +         * the X distance between the cursor and the object being dragged
    +         * @property deltaX
    +         * @type int
    +         * @private
    +         * @static
    +         */
    +        deltaX: 0,
    +
    +        /**
    +         * the Y distance between the cursor and the object being dragged
    +         * @property deltaY
    +         * @type int
    +         * @private
    +         * @static
    +         */
    +        deltaY: 0,
    +
    +        /**
    +         * Flag to determine if we should prevent the default behavior of the
    +         * events we define. By default this is true, but this can be set to
    +         * false if you need the default behavior (not recommended)
    +         * @property preventDefault
    +         * @type boolean
    +         * @static
    +         */
    +        preventDefault: true,
    +
    +        /**
    +         * Flag to determine if we should stop the propagation of the events
    +         * we generate. This is true by default but you may want to set it to
    +         * false if the html element contains other features that require the
    +         * mouse click.
    +         * @property stopPropagation
    +         * @type boolean
    +         * @static
    +         */
    +        stopPropagation: true,
    +
    +        /**
    +         * Internal flag that is set to true when drag and drop has been
    +         * intialized
    +         * @property initialized
    +         * @private
    +         * @static
    +         */
    +        initalized: false,
    +
    +        /**
    +         * All drag and drop can be disabled.
    +         * @property locked
    +         * @private
    +         * @static
    +         */
    +        locked: false,
    +
    +        /**
    +         * Called the first time an element is registered.
    +         * @method init
    +         * @private
    +         * @static
    +         */
    +        init: function() {
    +            this.initialized = true;
    +        },
    +
    +        /**
    +         * In point mode, drag and drop interaction is defined by the
    +         * location of the cursor during the drag/drop
    +         * @property POINT
    +         * @type int
    +         * @static
    +         */
    +        POINT: 0,
    +
    +        /**
    +         * In intersect mode, drag and drop interactio nis defined by the
    +         * overlap of two or more drag and drop objects.
    +         * @property INTERSECT
    +         * @type int
    +         * @static
    +         */
    +        INTERSECT: 1,
    +
    +        /**
    +         * The current drag and drop mode.  Default: POINT
    +         * @property mode
    +         * @type int
    +         * @static
    +         */
    +        mode: 0,
    +
    +        /**
    +         * Runs method on all drag and drop objects
    +         * @method _execOnAll
    +         * @private
    +         * @static
    +         */
    +        _execOnAll: function(sMethod, args) {
    +            for (var i in this.ids) {
    +                for (var j in this.ids[i]) {
    +                    var oDD = this.ids[i][j];
    +                    if (! this.isTypeOfDD(oDD)) {
    +                        continue;
    +                    }
    +                    oDD[sMethod].apply(oDD, args);
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Drag and drop initialization.  Sets up the global event handlers
    +         * @method _onLoad
    +         * @private
    +         * @static
    +         */
    +        _onLoad: function() {
    +
    +            this.init();
    +
    +
    +            Event.on(document, "mouseup",   this.handleMouseUp, this, true);
    +            Event.on(document, "mousemove", this.handleMouseMove, this, true);
    +            Event.on(window,   "unload",    this._onUnload, this, true);
    +            Event.on(window,   "resize",    this._onResize, this, true);
    +            // Event.on(window,   "mouseout",    this._test);
    +
    +        },
    +
    +        /**
    +         * Reset constraints on all drag and drop objs
    +         * @method _onResize
    +         * @private
    +         * @static
    +         */
    +        _onResize: function(e) {
    +            this._execOnAll("resetConstraints", []);
    +        },
    +
    +        /**
    +         * Lock all drag and drop functionality
    +         * @method lock
    +         * @static
    +         */
    +        lock: function() { this.locked = true; },
    +
    +        /**
    +         * Unlock all drag and drop functionality
    +         * @method unlock
    +         * @static
    +         */
    +        unlock: function() { this.locked = false; },
    +
    +        /**
    +         * Is drag and drop locked?
    +         * @method isLocked
    +         * @return {boolean} True if drag and drop is locked, false otherwise.
    +         * @static
    +         */
    +        isLocked: function() { return this.locked; },
    +
    +        /**
    +         * Location cache that is set for all drag drop objects when a drag is
    +         * initiated, cleared when the drag is finished.
    +         * @property locationCache
    +         * @private
    +         * @static
    +         */
    +        locationCache: {},
    +
    +        /**
    +         * Set useCache to false if you want to force object the lookup of each
    +         * drag and drop linked element constantly during a drag.
    +         * @property useCache
    +         * @type boolean
    +         * @static
    +         */
    +        useCache: true,
    +
    +        /**
    +         * The number of pixels that the mouse needs to move after the
    +         * mousedown before the drag is initiated.  Default=3;
    +         * @property clickPixelThresh
    +         * @type int
    +         * @static
    +         */
    +        clickPixelThresh: 3,
    +
    +        /**
    +         * The number of milliseconds after the mousedown event to initiate the
    +         * drag if we don't get a mouseup event. Default=1000
    +         * @property clickTimeThresh
    +         * @type int
    +         * @static
    +         */
    +        clickTimeThresh: 1000,
    +
    +        /**
    +         * Flag that indicates that either the drag pixel threshold or the
    +         * mousdown time threshold has been met
    +         * @property dragThreshMet
    +         * @type boolean
    +         * @private
    +         * @static
    +         */
    +        dragThreshMet: false,
    +
    +        /**
    +         * Timeout used for the click time threshold
    +         * @property clickTimeout
    +         * @type Object
    +         * @private
    +         * @static
    +         */
    +        clickTimeout: null,
    +
    +        /**
    +         * The X position of the mousedown event stored for later use when a
    +         * drag threshold is met.
    +         * @property startX
    +         * @type int
    +         * @private
    +         * @static
    +         */
    +        startX: 0,
    +
    +        /**
    +         * The Y position of the mousedown event stored for later use when a
    +         * drag threshold is met.
    +         * @property startY
    +         * @type int
    +         * @private
    +         * @static
    +         */
    +        startY: 0,
    +
    +        /**
    +         * Each DragDrop instance must be registered with the DragDropMgr.
    +         * This is executed in DragDrop.init()
    +         * @method regDragDrop
    +         * @param {DragDrop} oDD the DragDrop object to register
    +         * @param {String} sGroup the name of the group this element belongs to
    +         * @static
    +         */
    +        regDragDrop: function(oDD, sGroup) {
    +            if (!this.initialized) { this.init(); }
    +
    +            if (!this.ids[sGroup]) {
    +                this.ids[sGroup] = {};
    +            }
    +            this.ids[sGroup][oDD.id] = oDD;
    +        },
    +
    +        /**
    +         * Removes the supplied dd instance from the supplied group. Executed
    +         * by DragDrop.removeFromGroup, so don't call this function directly.
    +         * @method removeDDFromGroup
    +         * @private
    +         * @static
    +         */
    +        removeDDFromGroup: function(oDD, sGroup) {
    +            if (!this.ids[sGroup]) {
    +                this.ids[sGroup] = {};
    +            }
    +
    +            var obj = this.ids[sGroup];
    +            if (obj && obj[oDD.id]) {
    +                delete obj[oDD.id];
    +            }
    +        },
    +
    +        /**
    +         * Unregisters a drag and drop item.  This is executed in
    +         * DragDrop.unreg, use that method instead of calling this directly.
    +         * @method _remove
    +         * @private
    +         * @static
    +         */
    +        _remove: function(oDD) {
    +            for (var g in oDD.groups) {
    +                if (g && this.ids[g][oDD.id]) {
    +                    delete this.ids[g][oDD.id];
    +                }
    +            }
    +            delete this.handleIds[oDD.id];
    +        },
    +
    +        /**
    +         * Each DragDrop handle element must be registered.  This is done
    +         * automatically when executing DragDrop.setHandleElId()
    +         * @method regHandle
    +         * @param {String} sDDId the DragDrop id this element is a handle for
    +         * @param {String} sHandleId the id of the element that is the drag
    +         * handle
    +         * @static
    +         */
    +        regHandle: function(sDDId, sHandleId) {
    +            if (!this.handleIds[sDDId]) {
    +                this.handleIds[sDDId] = {};
    +            }
    +            this.handleIds[sDDId][sHandleId] = sHandleId;
    +        },
    +
    +        /**
    +         * Utility function to determine if a given element has been
    +         * registered as a drag drop item.
    +         * @method isDragDrop
    +         * @param {String} id the element id to check
    +         * @return {boolean} true if this element is a DragDrop item,
    +         * false otherwise
    +         * @static
    +         */
    +        isDragDrop: function(id) {
    +            return ( this.getDDById(id) ) ? true : false;
    +        },
    +
    +        /**
    +         * Returns the drag and drop instances that are in all groups the
    +         * passed in instance belongs to.
    +         * @method getRelated
    +         * @param {DragDrop} p_oDD the obj to get related data for
    +         * @param {boolean} bTargetsOnly if true, only return targetable objs
    +         * @return {DragDrop[]} the related instances
    +         * @static
    +         */
    +        getRelated: function(p_oDD, bTargetsOnly) {
    +            var oDDs = [];
    +            for (var i in p_oDD.groups) {
    +                for (j in this.ids[i]) {
    +                    var dd = this.ids[i][j];
    +                    if (! this.isTypeOfDD(dd)) {
    +                        continue;
    +                    }
    +                    if (!bTargetsOnly || dd.isTarget) {
    +                        oDDs[oDDs.length] = dd;
    +                    }
    +                }
    +            }
    +
    +            return oDDs;
    +        },
    +
    +        /**
    +         * Returns true if the specified dd target is a legal target for
    +         * the specifice drag obj
    +         * @method isLegalTarget
    +         * @param {DragDrop} the drag obj
    +         * @param {DragDrop} the target
    +         * @return {boolean} true if the target is a legal target for the
    +         * dd obj
    +         * @static
    +         */
    +        isLegalTarget: function (oDD, oTargetDD) {
    +            var targets = this.getRelated(oDD, true);
    +            for (var i=0, len=targets.length;i<len;++i) {
    +                if (targets[i].id == oTargetDD.id) {
    +                    return true;
    +                }
    +            }
    +
    +            return false;
    +        },
    +
    +        /**
    +         * My goal is to be able to transparently determine if an object is
    +         * typeof DragDrop, and the exact subclass of DragDrop.  typeof
    +         * returns "object", oDD.constructor.toString() always returns
    +         * "DragDrop" and not the name of the subclass.  So for now it just
    +         * evaluates a well-known variable in DragDrop.
    +         * @method isTypeOfDD
    +         * @param {Object} the object to evaluate
    +         * @return {boolean} true if typeof oDD = DragDrop
    +         * @static
    +         */
    +        isTypeOfDD: function (oDD) {
    +            return (oDD && oDD.__ygDragDrop);
    +        },
    +
    +        /**
    +         * Utility function to determine if a given element has been
    +         * registered as a drag drop handle for the given Drag Drop object.
    +         * @method isHandle
    +         * @param {String} id the element id to check
    +         * @return {boolean} true if this element is a DragDrop handle, false
    +         * otherwise
    +         * @static
    +         */
    +        isHandle: function(sDDId, sHandleId) {
    +            return ( this.handleIds[sDDId] &&
    +                            this.handleIds[sDDId][sHandleId] );
    +        },
    +
    +        /**
    +         * Returns the DragDrop instance for a given id
    +         * @method getDDById
    +         * @param {String} id the id of the DragDrop object
    +         * @return {DragDrop} the drag drop object, null if it is not found
    +         * @static
    +         */
    +        getDDById: function(id) {
    +            for (var i in this.ids) {
    +                if (this.ids[i][id]) {
    +                    return this.ids[i][id];
    +                }
    +            }
    +            return null;
    +        },
    +
    +        /**
    +         * Fired after a registered DragDrop object gets the mousedown event.
    +         * Sets up the events required to track the object being dragged
    +         * @method handleMouseDown
    +         * @param {Event} e the event
    +         * @param oDD the DragDrop object being dragged
    +         * @private
    +         * @static
    +         */
    +        handleMouseDown: function(e, oDD) {
    +
    +            this.currentTarget = YAHOO.util.Event.getTarget(e);
    +
    +            this.dragCurrent = oDD;
    +
    +            var el = oDD.getEl();
    +
    +            // track start position
    +            this.startX = YAHOO.util.Event.getPageX(e);
    +            this.startY = YAHOO.util.Event.getPageY(e);
    +
    +            this.deltaX = this.startX - el.offsetLeft;
    +            this.deltaY = this.startY - el.offsetTop;
    +
    +            this.dragThreshMet = false;
    +
    +            this.clickTimeout = setTimeout(
    +                    function() {
    +                        var DDM = YAHOO.util.DDM;
    +                        DDM.startDrag(DDM.startX, DDM.startY);
    +                    },
    +                    this.clickTimeThresh );
    +        },
    +
    +        /**
    +         * Fired when either the drag pixel threshol or the mousedown hold
    +         * time threshold has been met.
    +         * @method startDrag
    +         * @param x {int} the X position of the original mousedown
    +         * @param y {int} the Y position of the original mousedown
    +         * @static
    +         */
    +        startDrag: function(x, y) {
    +            clearTimeout(this.clickTimeout);
    +            if (this.dragCurrent) {
    +                this.dragCurrent.b4StartDrag(x, y);
    +                this.dragCurrent.startDrag(x, y);
    +            }
    +            this.dragThreshMet = true;
    +        },
    +
    +        /**
    +         * Internal function to handle the mouseup event.  Will be invoked
    +         * from the context of the document.
    +         * @method handleMouseUp
    +         * @param {Event} e the event
    +         * @private
    +         * @static
    +         */
    +        handleMouseUp: function(e) {
    +
    +            if (! this.dragCurrent) {
    +                return;
    +            }
    +
    +            clearTimeout(this.clickTimeout);
    +
    +            if (this.dragThreshMet) {
    +                this.fireEvents(e, true);
    +            } else {
    +            }
    +
    +            this.stopDrag(e);
    +
    +            this.stopEvent(e);
    +        },
    +
    +        /**
    +         * Utility to stop event propagation and event default, if these
    +         * features are turned on.
    +         * @method stopEvent
    +         * @param {Event} e the event as returned by this.getEvent()
    +         * @static
    +         */
    +        stopEvent: function(e) {
    +            if (this.stopPropagation) {
    +                YAHOO.util.Event.stopPropagation(e);
    +            }
    +
    +            if (this.preventDefault) {
    +                YAHOO.util.Event.preventDefault(e);
    +            }
    +        },
    +
    +        /**
    +         * Internal function to clean up event handlers after the drag
    +         * operation is complete
    +         * @method stopDrag
    +         * @param {Event} e the event
    +         * @private
    +         * @static
    +         */
    +        stopDrag: function(e) {
    +
    +            // Fire the drag end event for the item that was dragged
    +            if (this.dragCurrent) {
    +                if (this.dragThreshMet) {
    +                    this.dragCurrent.b4EndDrag(e);
    +                    this.dragCurrent.endDrag(e);
    +                }
    +
    +                this.dragCurrent.onMouseUp(e);
    +            }
    +
    +            this.dragCurrent = null;
    +            this.dragOvers = {};
    +        },
    +
    +        /**
    +         * Internal function to handle the mousemove event.  Will be invoked
    +         * from the context of the html element.
    +         *
    +         * @TODO figure out what we can do about mouse events lost when the
    +         * user drags objects beyond the window boundary.  Currently we can
    +         * detect this in internet explorer by verifying that the mouse is
    +         * down during the mousemove event.  Firefox doesn't give us the
    +         * button state on the mousemove event.
    +         * @method handleMouseMove
    +         * @param {Event} e the event
    +         * @private
    +         * @static
    +         */
    +        handleMouseMove: function(e) {
    +            if (! this.dragCurrent) {
    +                return true;
    +            }
    +
    +            // var button = e.which || e.button;
    +
    +            // check for IE mouseup outside of page boundary
    +            if (YAHOO.util.Event.isIE && !e.button) {
    +                this.stopEvent(e);
    +                return this.handleMouseUp(e);
    +            }
    +
    +            if (!this.dragThreshMet) {
    +                var diffX = Math.abs(this.startX - YAHOO.util.Event.getPageX(e));
    +                var diffY = Math.abs(this.startY - YAHOO.util.Event.getPageY(e));
    +                if (diffX > this.clickPixelThresh ||
    +                            diffY > this.clickPixelThresh) {
    +                    this.startDrag(this.startX, this.startY);
    +                }
    +            }
    +
    +            if (this.dragThreshMet) {
    +                this.dragCurrent.b4Drag(e);
    +                this.dragCurrent.onDrag(e);
    +                this.fireEvents(e, false);
    +            }
    +
    +            this.stopEvent(e);
    +
    +            return true;
    +        },
    +
    +        /**
    +         * Iterates over all of the DragDrop elements to find ones we are
    +         * hovering over or dropping on
    +         * @method fireEvents
    +         * @param {Event} e the event
    +         * @param {boolean} isDrop is this a drop op or a mouseover op?
    +         * @private
    +         * @static
    +         */
    +        fireEvents: function(e, isDrop) {
    +            var dc = this.dragCurrent;
    +
    +            // If the user did the mouse up outside of the window, we could
    +            // get here even though we have ended the drag.
    +            if (!dc || dc.isLocked()) {
    +                return;
    +            }
    +
    +            var x = YAHOO.util.Event.getPageX(e);
    +            var y = YAHOO.util.Event.getPageY(e);
    +            var pt = new YAHOO.util.Point(x,y);
    +
    +            // cache the previous dragOver array
    +            var oldOvers = [];
    +
    +            var outEvts   = [];
    +            var overEvts  = [];
    +            var dropEvts  = [];
    +            var enterEvts = [];
    +
    +            // Check to see if the object(s) we were hovering over is no longer
    +            // being hovered over so we can fire the onDragOut event
    +            for (var i in this.dragOvers) {
    +
    +                var ddo = this.dragOvers[i];
    +
    +                if (! this.isTypeOfDD(ddo)) {
    +                    continue;
    +                }
    +
    +                if (! this.isOverTarget(pt, ddo, this.mode)) {
    +                    outEvts.push( ddo );
    +                }
    +
    +                oldOvers[i] = true;
    +                delete this.dragOvers[i];
    +            }
    +
    +            for (var sGroup in dc.groups) {
    +
    +                if ("string" != typeof sGroup) {
    +                    continue;
    +                }
    +
    +                for (i in this.ids[sGroup]) {
    +                    var oDD = this.ids[sGroup][i];
    +                    if (! this.isTypeOfDD(oDD)) {
    +                        continue;
    +                    }
    +
    +                    if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {
    +                        if (this.isOverTarget(pt, oDD, this.mode)) {
    +                            // look for drop interactions
    +                            if (isDrop) {
    +                                dropEvts.push( oDD );
    +                            // look for drag enter and drag over interactions
    +                            } else {
    +
    +                                // initial drag over: dragEnter fires
    +                                if (!oldOvers[oDD.id]) {
    +                                    enterEvts.push( oDD );
    +                                // subsequent drag overs: dragOver fires
    +                                } else {
    +                                    overEvts.push( oDD );
    +                                }
    +
    +                                this.dragOvers[oDD.id] = oDD;
    +                            }
    +                        }
    +                    }
    +                }
    +            }
    +
    +            if (this.mode) {
    +                if (outEvts.length) {
    +                    dc.b4DragOut(e, outEvts);
    +                    dc.onDragOut(e, outEvts);
    +                }
    +
    +                if (enterEvts.length) {
    +                    dc.onDragEnter(e, enterEvts);
    +                }
    +
    +                if (overEvts.length) {
    +                    dc.b4DragOver(e, overEvts);
    +                    dc.onDragOver(e, overEvts);
    +                }
    +
    +                if (dropEvts.length) {
    +                    dc.b4DragDrop(e, dropEvts);
    +                    dc.onDragDrop(e, dropEvts);
    +                }
    +
    +            } else {
    +                // fire dragout events
    +                var len = 0;
    +                for (i=0, len=outEvts.length; i<len; ++i) {
    +                    dc.b4DragOut(e, outEvts[i].id);
    +                    dc.onDragOut(e, outEvts[i].id);
    +                }
    +
    +                // fire enter events
    +                for (i=0,len=enterEvts.length; i<len; ++i) {
    +                    // dc.b4DragEnter(e, oDD.id);
    +                    dc.onDragEnter(e, enterEvts[i].id);
    +                }
    +
    +                // fire over events
    +                for (i=0,len=overEvts.length; i<len; ++i) {
    +                    dc.b4DragOver(e, overEvts[i].id);
    +                    dc.onDragOver(e, overEvts[i].id);
    +                }
    +
    +                // fire drop events
    +                for (i=0, len=dropEvts.length; i<len; ++i) {
    +                    dc.b4DragDrop(e, dropEvts[i].id);
    +                    dc.onDragDrop(e, dropEvts[i].id);
    +                }
    +
    +            }
    +
    +            // notify about a drop that did not find a target
    +            if (isDrop && !dropEvts.length) {
    +                dc.onInvalidDrop(e);
    +            }
    +
    +        },
    +
    +        /**
    +         * Helper function for getting the best match from the list of drag
    +         * and drop objects returned by the drag and drop events when we are
    +         * in INTERSECT mode.  It returns either the first object that the
    +         * cursor is over, or the object that has the greatest overlap with
    +         * the dragged element.
    +         * @method getBestMatch
    +         * @param  {DragDrop[]} dds The array of drag and drop objects
    +         * targeted
    +         * @return {DragDrop}       The best single match
    +         * @static
    +         */
    +        getBestMatch: function(dds) {
    +            var winner = null;
    +            // Return null if the input is not what we expect
    +            //if (!dds || !dds.length || dds.length == 0) {
    +               // winner = null;
    +            // If there is only one item, it wins
    +            //} else if (dds.length == 1) {
    +
    +            var len = dds.length;
    +
    +            if (len == 1) {
    +                winner = dds[0];
    +            } else {
    +                // Loop through the targeted items
    +                for (var i=0; i<len; ++i) {
    +                    var dd = dds[i];
    +                    // If the cursor is over the object, it wins.  If the
    +                    // cursor is over multiple matches, the first one we come
    +                    // to wins.
    +                    if (dd.cursorIsOver) {
    +                        winner = dd;
    +                        break;
    +                    // Otherwise the object with the most overlap wins
    +                    } else {
    +                        if (!winner ||
    +                            winner.overlap.getArea() < dd.overlap.getArea()) {
    +                            winner = dd;
    +                        }
    +                    }
    +                }
    +            }
    +
    +            return winner;
    +        },
    +
    +        /**
    +         * Refreshes the cache of the top-left and bottom-right points of the
    +         * drag and drop objects in the specified group(s).  This is in the
    +         * format that is stored in the drag and drop instance, so typical
    +         * usage is:
    +         * <code>
    +         * YAHOO.util.DragDropMgr.refreshCache(ddinstance.groups);
    +         * </code>
    +         * Alternatively:
    +         * <code>
    +         * YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true});
    +         * </code>
    +         * @TODO this really should be an indexed array.  Alternatively this
    +         * method could accept both.
    +         * @method refreshCache
    +         * @param {Object} groups an associative array of groups to refresh
    +         * @static
    +         */
    +        refreshCache: function(groups) {
    +            for (var sGroup in groups) {
    +                if ("string" != typeof sGroup) {
    +                    continue;
    +                }
    +                for (var i in this.ids[sGroup]) {
    +                    var oDD = this.ids[sGroup][i];
    +
    +                    if (this.isTypeOfDD(oDD)) {
    +                    // if (this.isTypeOfDD(oDD) && oDD.isTarget) {
    +                        var loc = this.getLocation(oDD);
    +                        if (loc) {
    +                            this.locationCache[oDD.id] = loc;
    +                        } else {
    +                            delete this.locationCache[oDD.id];
    +                            // this will unregister the drag and drop object if
    +                            // the element is not in a usable state
    +                            // oDD.unreg();
    +                        }
    +                    }
    +                }
    +            }
    +        },
    +
    +        /**
    +         * This checks to make sure an element exists and is in the DOM.  The
    +         * main purpose is to handle cases where innerHTML is used to remove
    +         * drag and drop objects from the DOM.  IE provides an 'unspecified
    +         * error' when trying to access the offsetParent of such an element
    +         * @method verifyEl
    +         * @param {HTMLElement} el the element to check
    +         * @return {boolean} true if the element looks usable
    +         * @static
    +         */
    +        verifyEl: function(el) {
    +            try {
    +                if (el) {
    +                    var parent = el.offsetParent;
    +                    if (parent) {
    +                        return true;
    +                    }
    +                }
    +            } catch(e) {
    +            }
    +
    +            return false;
    +        },
    +
    +        /**
    +         * Returns a Region object containing the drag and drop element's position
    +         * and size, including the padding configured for it
    +         * @method getLocation
    +         * @param {DragDrop} oDD the drag and drop object to get the
    +         *                       location for
    +         * @return {YAHOO.util.Region} a Region object representing the total area
    +         *                             the element occupies, including any padding
    +         *                             the instance is configured for.
    +         * @static
    +         */
    +        getLocation: function(oDD) {
    +            if (! this.isTypeOfDD(oDD)) {
    +                return null;
    +            }
    +
    +            var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
    +
    +            try {
    +                pos= YAHOO.util.Dom.getXY(el);
    +            } catch (e) { }
    +
    +            if (!pos) {
    +                return null;
    +            }
    +
    +            x1 = pos[0];
    +            x2 = x1 + el.offsetWidth;
    +            y1 = pos[1];
    +            y2 = y1 + el.offsetHeight;
    +
    +            t = y1 - oDD.padding[0];
    +            r = x2 + oDD.padding[1];
    +            b = y2 + oDD.padding[2];
    +            l = x1 - oDD.padding[3];
    +
    +            return new YAHOO.util.Region( t, r, b, l );
    +        },
    +
    +        /**
    +         * Checks the cursor location to see if it over the target
    +         * @method isOverTarget
    +         * @param {YAHOO.util.Point} pt The point to evaluate
    +         * @param {DragDrop} oTarget the DragDrop object we are inspecting
    +         * @return {boolean} true if the mouse is over the target
    +         * @private
    +         * @static
    +         */
    +        isOverTarget: function(pt, oTarget, intersect) {
    +            // use cache if available
    +            var loc = this.locationCache[oTarget.id];
    +            if (!loc || !this.useCache) {
    +                loc = this.getLocation(oTarget);
    +                this.locationCache[oTarget.id] = loc;
    +
    +            }
    +
    +            if (!loc) {
    +                return false;
    +            }
    +
    +            oTarget.cursorIsOver = loc.contains( pt );
    +
    +            // DragDrop is using this as a sanity check for the initial mousedown
    +            // in this case we are done.  In POINT mode, if the drag obj has no
    +            // contraints, we are also done. Otherwise we need to evaluate the
    +            // location of the target as related to the actual location of the
    +            // dragged element.
    +            var dc = this.dragCurrent;
    +            if (!dc || !dc.getTargetCoord ||
    +                    (!intersect && !dc.constrainX && !dc.constrainY)) {
    +                return oTarget.cursorIsOver;
    +            }
    +
    +            oTarget.overlap = null;
    +
    +            // Get the current location of the drag element, this is the
    +            // location of the mouse event less the delta that represents
    +            // where the original mousedown happened on the element.  We
    +            // need to consider constraints and ticks as well.
    +            var pos = dc.getTargetCoord(pt.x, pt.y);
    +
    +            var el = dc.getDragEl();
    +            var curRegion = new YAHOO.util.Region( pos.y,
    +                                                   pos.x + el.offsetWidth,
    +                                                   pos.y + el.offsetHeight,
    +                                                   pos.x );
    +
    +            var overlap = curRegion.intersect(loc);
    +
    +            if (overlap) {
    +                oTarget.overlap = overlap;
    +                return (intersect) ? true : oTarget.cursorIsOver;
    +            } else {
    +                return false;
    +            }
    +        },
    +
    +        /**
    +         * unload event handler
    +         * @method _onUnload
    +         * @private
    +         * @static
    +         */
    +        _onUnload: function(e, me) {
    +            this.unregAll();
    +        },
    +
    +        /**
    +         * Cleans up the drag and drop events and objects.
    +         * @method unregAll
    +         * @private
    +         * @static
    +         */
    +        unregAll: function() {
    +
    +            if (this.dragCurrent) {
    +                this.stopDrag();
    +                this.dragCurrent = null;
    +            }
    +
    +            this._execOnAll("unreg", []);
    +
    +            for (i in this.elementCache) {
    +                delete this.elementCache[i];
    +            }
    +
    +            this.elementCache = {};
    +            this.ids = {};
    +        },
    +
    +        /**
    +         * A cache of DOM elements
    +         * @property elementCache
    +         * @private
    +         * @static
    +         */
    +        elementCache: {},
    +
    +        /**
    +         * Get the wrapper for the DOM element specified
    +         * @method getElWrapper
    +         * @param {String} id the id of the element to get
    +         * @return {YAHOO.util.DDM.ElementWrapper} the wrapped element
    +         * @private
    +         * @deprecated This wrapper isn't that useful
    +         * @static
    +         */
    +        getElWrapper: function(id) {
    +            var oWrapper = this.elementCache[id];
    +            if (!oWrapper || !oWrapper.el) {
    +                oWrapper = this.elementCache[id] =
    +                    new this.ElementWrapper(YAHOO.util.Dom.get(id));
    +            }
    +            return oWrapper;
    +        },
    +
    +        /**
    +         * Returns the actual DOM element
    +         * @method getElement
    +         * @param {String} id the id of the elment to get
    +         * @return {Object} The element
    +         * @deprecated use YAHOO.util.Dom.get instead
    +         * @static
    +         */
    +        getElement: function(id) {
    +            return YAHOO.util.Dom.get(id);
    +        },
    +
    +        /**
    +         * Returns the style property for the DOM element (i.e.,
    +         * document.getElById(id).style)
    +         * @method getCss
    +         * @param {String} id the id of the elment to get
    +         * @return {Object} The style property of the element
    +         * @deprecated use YAHOO.util.Dom instead
    +         * @static
    +         */
    +        getCss: function(id) {
    +            var el = YAHOO.util.Dom.get(id);
    +            return (el) ? el.style : null;
    +        },
    +
    +        /**
    +         * Inner class for cached elements
    +         * @class DragDropMgr.ElementWrapper
    +         * @for DragDropMgr
    +         * @private
    +         * @deprecated
    +         */
    +        ElementWrapper: function(el) {
    +                /**
    +                 * The element
    +                 * @property el
    +                 */
    +                this.el = el || null;
    +                /**
    +                 * The element id
    +                 * @property id
    +                 */
    +                this.id = this.el && el.id;
    +                /**
    +                 * A reference to the style property
    +                 * @property css
    +                 */
    +                this.css = this.el && el.style;
    +            },
    +
    +        /**
    +         * Returns the X position of an html element
    +         * @method getPosX
    +         * @param el the element for which to get the position
    +         * @return {int} the X coordinate
    +         * @for DragDropMgr
    +         * @deprecated use YAHOO.util.Dom.getX instead
    +         * @static
    +         */
    +        getPosX: function(el) {
    +            return YAHOO.util.Dom.getX(el);
    +        },
    +
    +        /**
    +         * Returns the Y position of an html element
    +         * @method getPosY
    +         * @param el the element for which to get the position
    +         * @return {int} the Y coordinate
    +         * @deprecated use YAHOO.util.Dom.getY instead
    +         * @static
    +         */
    +        getPosY: function(el) {
    +            return YAHOO.util.Dom.getY(el);
    +        },
    +
    +        /**
    +         * Swap two nodes.  In IE, we use the native method, for others we
    +         * emulate the IE behavior
    +         * @method swapNode
    +         * @param n1 the first node to swap
    +         * @param n2 the other node to swap
    +         * @static
    +         */
    +        swapNode: function(n1, n2) {
    +            if (n1.swapNode) {
    +                n1.swapNode(n2);
    +            } else {
    +                var p = n2.parentNode;
    +                var s = n2.nextSibling;
    +
    +                if (s == n1) {
    +                    p.insertBefore(n1, n2);
    +                } else if (n2 == n1.nextSibling) {
    +                    p.insertBefore(n2, n1);
    +                } else {
    +                    n1.parentNode.replaceChild(n2, n1);
    +                    p.insertBefore(n1, s);
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Returns the current scroll position
    +         * @method getScroll
    +         * @private
    +         * @static
    +         */
    +        getScroll: function () {
    +            var t, l, dde=document.documentElement, db=document.body;
    +            if (dde && (dde.scrollTop || dde.scrollLeft)) {
    +                t = dde.scrollTop;
    +                l = dde.scrollLeft;
    +            } else if (db) {
    +                t = db.scrollTop;
    +                l = db.scrollLeft;
    +            } else {
    +                YAHOO.log("could not get scroll property");
    +            }
    +            return { top: t, left: l };
    +        },
    +
    +        /**
    +         * Returns the specified element style property
    +         * @method getStyle
    +         * @param {HTMLElement} el          the element
    +         * @param {string}      styleProp   the style property
    +         * @return {string} The value of the style property
    +         * @deprecated use YAHOO.util.Dom.getStyle
    +         * @static
    +         */
    +        getStyle: function(el, styleProp) {
    +            return YAHOO.util.Dom.getStyle(el, styleProp);
    +        },
    +
    +        /**
    +         * Gets the scrollTop
    +         * @method getScrollTop
    +         * @return {int} the document's scrollTop
    +         * @static
    +         */
    +        getScrollTop: function () { return this.getScroll().top; },
    +
    +        /**
    +         * Gets the scrollLeft
    +         * @method getScrollLeft
    +         * @return {int} the document's scrollTop
    +         * @static
    +         */
    +        getScrollLeft: function () { return this.getScroll().left; },
    +
    +        /**
    +         * Sets the x/y position of an element to the location of the
    +         * target element.
    +         * @method moveToEl
    +         * @param {HTMLElement} moveEl      The element to move
    +         * @param {HTMLElement} targetEl    The position reference element
    +         * @static
    +         */
    +        moveToEl: function (moveEl, targetEl) {
    +            var aCoord = YAHOO.util.Dom.getXY(targetEl);
    +            YAHOO.util.Dom.setXY(moveEl, aCoord);
    +        },
    +
    +        /**
    +         * Gets the client height
    +         * @method getClientHeight
    +         * @return {int} client height in px
    +         * @deprecated use YAHOO.util.Dom.getViewportHeight instead
    +         * @static
    +         */
    +        getClientHeight: function() {
    +            return YAHOO.util.Dom.getViewportHeight();
    +        },
    +
    +        /**
    +         * Gets the client width
    +         * @method getClientWidth
    +         * @return {int} client width in px
    +         * @deprecated use YAHOO.util.Dom.getViewportWidth instead
    +         * @static
    +         */
    +        getClientWidth: function() {
    +            return YAHOO.util.Dom.getViewportWidth();
    +        },
    +
    +        /**
    +         * Numeric array sort function
    +         * @method numericSort
    +         * @static
    +         */
    +        numericSort: function(a, b) { return (a - b); },
    +
    +        /**
    +         * Internal counter
    +         * @property _timeoutCount
    +         * @private
    +         * @static
    +         */
    +        _timeoutCount: 0,
    +
    +        /**
    +         * Trying to make the load order less important.  Without this we get
    +         * an error if this file is loaded before the Event Utility.
    +         * @method _addListeners
    +         * @private
    +         * @static
    +         */
    +        _addListeners: function() {
    +            var DDM = YAHOO.util.DDM;
    +            if ( YAHOO.util.Event && document ) {
    +                DDM._onLoad();
    +            } else {
    +                if (DDM._timeoutCount > 2000) {
    +                } else {
    +                    setTimeout(DDM._addListeners, 10);
    +                    if (document && document.body) {
    +                        DDM._timeoutCount += 1;
    +                    }
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Recursively searches the immediate parent and all child nodes for
    +         * the handle element in order to determine wheter or not it was
    +         * clicked.
    +         * @method handleWasClicked
    +         * @param node the html element to inspect
    +         * @static
    +         */
    +        handleWasClicked: function(node, id) {
    +            if (this.isHandle(id, node.id)) {
    +                return true;
    +            } else {
    +                // check to see if this is a text node child of the one we want
    +                var p = node.parentNode;
    +
    +                while (p) {
    +                    if (this.isHandle(id, p.id)) {
    +                        return true;
    +                    } else {
    +                        p = p.parentNode;
    +                    }
    +                }
    +            }
    +
    +            return false;
    +        }
    +
    +    };
    +
    +}();
    +
    +// shorter alias, save a few bytes
    +YAHOO.util.DDM = YAHOO.util.DragDropMgr;
    +YAHOO.util.DDM._addListeners();
    +
    +}
    +
    +/**
    + * A DragDrop implementation where the linked element follows the
    + * mouse cursor during a drag.
    + * @class DD
    + * @extends YAHOO.util.DragDrop
    + * @constructor
    + * @param {String} id the id of the linked element
    + * @param {String} sGroup the group of related DragDrop items
    + * @param {object} config an object containing configurable attributes
    + *                Valid properties for DD:
    + *                    scroll
    + */
    +YAHOO.util.DD = function(id, sGroup, config) {
    +    if (id) {
    +        this.init(id, sGroup, config);
    +    }
    +};
    +
    +YAHOO.extend(YAHOO.util.DD, YAHOO.util.DragDrop, {
    +
    +    /**
    +     * When set to true, the utility automatically tries to scroll the browser
    +     * window wehn a drag and drop element is dragged near the viewport boundary.
    +     * Defaults to true.
    +     * @property scroll
    +     * @type boolean
    +     */
    +    scroll: true,
    +
    +    /**
    +     * Sets the pointer offset to the distance between the linked element's top
    +     * left corner and the location the element was clicked
    +     * @method autoOffset
    +     * @param {int} iPageX the X coordinate of the click
    +     * @param {int} iPageY the Y coordinate of the click
    +     */
    +    autoOffset: function(iPageX, iPageY) {
    +        var x = iPageX - this.startPageX;
    +        var y = iPageY - this.startPageY;
    +        this.setDelta(x, y);
    +    },
    +
    +    /**
    +     * Sets the pointer offset.  You can call this directly to force the
    +     * offset to be in a particular location (e.g., pass in 0,0 to set it
    +     * to the center of the object, as done in YAHOO.widget.Slider)
    +     * @method setDelta
    +     * @param {int} iDeltaX the distance from the left
    +     * @param {int} iDeltaY the distance from the top
    +     */
    +    setDelta: function(iDeltaX, iDeltaY) {
    +        this.deltaX = iDeltaX;
    +        this.deltaY = iDeltaY;
    +    },
    +
    +    /**
    +     * Sets the drag element to the location of the mousedown or click event,
    +     * maintaining the cursor location relative to the location on the element
    +     * that was clicked.  Override this if you want to place the element in a
    +     * location other than where the cursor is.
    +     * @method setDragElPos
    +     * @param {int} iPageX the X coordinate of the mousedown or drag event
    +     * @param {int} iPageY the Y coordinate of the mousedown or drag event
    +     */
    +    setDragElPos: function(iPageX, iPageY) {
    +        // the first time we do this, we are going to check to make sure
    +        // the element has css positioning
    +
    +        var el = this.getDragEl();
    +        this.alignElWithMouse(el, iPageX, iPageY);
    +    },
    +
    +    /**
    +     * Sets the element to the location of the mousedown or click event,
    +     * maintaining the cursor location relative to the location on the element
    +     * that was clicked.  Override this if you want to place the element in a
    +     * location other than where the cursor is.
    +     * @method alignElWithMouse
    +     * @param {HTMLElement} el the element to move
    +     * @param {int} iPageX the X coordinate of the mousedown or drag event
    +     * @param {int} iPageY the Y coordinate of the mousedown or drag event
    +     */
    +    alignElWithMouse: function(el, iPageX, iPageY) {
    +        var oCoord = this.getTargetCoord(iPageX, iPageY);
    +
    +        if (!this.deltaSetXY) {
    +            var aCoord = [oCoord.x, oCoord.y];
    +            YAHOO.util.Dom.setXY(el, aCoord);
    +            var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 );
    +            var newTop  = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 );
    +
    +            this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
    +        } else {
    +            YAHOO.util.Dom.setStyle(el, "left", (oCoord.x + this.deltaSetXY[0]) + "px");
    +            YAHOO.util.Dom.setStyle(el, "top",  (oCoord.y + this.deltaSetXY[1]) + "px");
    +        }
    +
    +        this.cachePosition(oCoord.x, oCoord.y);
    +        this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
    +    },
    +
    +    /**
    +     * Saves the most recent position so that we can reset the constraints and
    +     * tick marks on-demand.  We need to know this so that we can calculate the
    +     * number of pixels the element is offset from its original position.
    +     * @method cachePosition
    +     * @param iPageX the current x position (optional, this just makes it so we
    +     * don't have to look it up again)
    +     * @param iPageY the current y position (optional, this just makes it so we
    +     * don't have to look it up again)
    +     */
    +    cachePosition: function(iPageX, iPageY) {
    +        if (iPageX) {
    +            this.lastPageX = iPageX;
    +            this.lastPageY = iPageY;
    +        } else {
    +            var aCoord = YAHOO.util.Dom.getXY(this.getEl());
    +            this.lastPageX = aCoord[0];
    +            this.lastPageY = aCoord[1];
    +        }
    +    },
    +
    +    /**
    +     * Auto-scroll the window if the dragged object has been moved beyond the
    +     * visible window boundary.
    +     * @method autoScroll
    +     * @param {int} x the drag element's x position
    +     * @param {int} y the drag element's y position
    +     * @param {int} h the height of the drag element
    +     * @param {int} w the width of the drag element
    +     * @private
    +     */
    +    autoScroll: function(x, y, h, w) {
    +
    +        if (this.scroll) {
    +            // The client height
    +            var clientH = this.DDM.getClientHeight();
    +
    +            // The client width
    +            var clientW = this.DDM.getClientWidth();
    +
    +            // The amt scrolled down
    +            var st = this.DDM.getScrollTop();
    +
    +            // The amt scrolled right
    +            var sl = this.DDM.getScrollLeft();
    +
    +            // Location of the bottom of the element
    +            var bot = h + y;
    +
    +            // Location of the right of the element
    +            var right = w + x;
    +
    +            // The distance from the cursor to the bottom of the visible area,
    +            // adjusted so that we don't scroll if the cursor is beyond the
    +            // element drag constraints
    +            var toBot = (clientH + st - y - this.deltaY);
    +
    +            // The distance from the cursor to the right of the visible area
    +            var toRight = (clientW + sl - x - this.deltaX);
    +
    +
    +            // How close to the edge the cursor must be before we scroll
    +            // var thresh = (document.all) ? 100 : 40;
    +            var thresh = 40;
    +
    +            // How many pixels to scroll per autoscroll op.  This helps to reduce
    +            // clunky scrolling. IE is more sensitive about this ... it needs this
    +            // value to be higher.
    +            var scrAmt = (document.all) ? 80 : 30;
    +
    +            // Scroll down if we are near the bottom of the visible page and the
    +            // obj extends below the crease
    +            if ( bot > clientH && toBot < thresh ) {
    +                window.scrollTo(sl, st + scrAmt);
    +            }
    +
    +            // Scroll up if the window is scrolled down and the top of the object
    +            // goes above the top border
    +            if ( y < st && st > 0 && y - st < thresh ) {
    +                window.scrollTo(sl, st - scrAmt);
    +            }
    +
    +            // Scroll right if the obj is beyond the right border and the cursor is
    +            // near the border.
    +            if ( right > clientW && toRight < thresh ) {
    +                window.scrollTo(sl + scrAmt, st);
    +            }
    +
    +            // Scroll left if the window has been scrolled to the right and the obj
    +            // extends past the left border
    +            if ( x < sl && sl > 0 && x - sl < thresh ) {
    +                window.scrollTo(sl - scrAmt, st);
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Finds the location the element should be placed if we want to move
    +     * it to where the mouse location less the click offset would place us.
    +     * @method getTargetCoord
    +     * @param {int} iPageX the X coordinate of the click
    +     * @param {int} iPageY the Y coordinate of the click
    +     * @return an object that contains the coordinates (Object.x and Object.y)
    +     * @private
    +     */
    +    getTargetCoord: function(iPageX, iPageY) {
    +
    +
    +        var x = iPageX - this.deltaX;
    +        var y = iPageY - this.deltaY;
    +
    +        if (this.constrainX) {
    +            if (x < this.minX) { x = this.minX; }
    +            if (x > this.maxX) { x = this.maxX; }
    +        }
    +
    +        if (this.constrainY) {
    +            if (y < this.minY) { y = this.minY; }
    +            if (y > this.maxY) { y = this.maxY; }
    +        }
    +
    +        x = this.getTick(x, this.xTicks);
    +        y = this.getTick(y, this.yTicks);
    +
    +
    +        return {x:x, y:y};
    +    },
    +
    +    /*
    +     * Sets up config options specific to this class. Overrides
    +     * YAHOO.util.DragDrop, but all versions of this method through the
    +     * inheritance chain are called
    +     */
    +    applyConfig: function() {
    +        YAHOO.util.DD.superclass.applyConfig.call(this);
    +        this.scroll = (this.config.scroll !== false);
    +    },
    +
    +    /*
    +     * Event that fires prior to the onMouseDown event.  Overrides
    +     * YAHOO.util.DragDrop.
    +     */
    +    b4MouseDown: function(e) {
    +        // this.resetConstraints();
    +        this.autoOffset(YAHOO.util.Event.getPageX(e),
    +                            YAHOO.util.Event.getPageY(e));
    +    },
    +
    +    /*
    +     * Event that fires prior to the onDrag event.  Overrides
    +     * YAHOO.util.DragDrop.
    +     */
    +    b4Drag: function(e) {
    +        this.setDragElPos(YAHOO.util.Event.getPageX(e),
    +                            YAHOO.util.Event.getPageY(e));
    +    },
    +
    +    toString: function() {
    +        return ("DD " + this.id);
    +    }
    +
    +    //////////////////////////////////////////////////////////////////////////
    +    // Debugging ygDragDrop events that can be overridden
    +    //////////////////////////////////////////////////////////////////////////
    +    /*
    +    startDrag: function(x, y) {
    +    },
    +
    +    onDrag: function(e) {
    +    },
    +
    +    onDragEnter: function(e, id) {
    +    },
    +
    +    onDragOver: function(e, id) {
    +    },
    +
    +    onDragOut: function(e, id) {
    +    },
    +
    +    onDragDrop: function(e, id) {
    +    },
    +
    +    endDrag: function(e) {
    +    }
    +
    +    */
    +
    +});
    +/**
    + * A DragDrop implementation that inserts an empty, bordered div into
    + * the document that follows the cursor during drag operations.  At the time of
    + * the click, the frame div is resized to the dimensions of the linked html
    + * element, and moved to the exact location of the linked element.
    + *
    + * References to the "frame" element refer to the single proxy element that
    + * was created to be dragged in place of all DDProxy elements on the
    + * page.
    + *
    + * @class DDProxy
    + * @extends YAHOO.util.DD
    + * @constructor
    + * @param {String} id the id of the linked html element
    + * @param {String} sGroup the group of related DragDrop objects
    + * @param {object} config an object containing configurable attributes
    + *                Valid properties for DDProxy in addition to those in DragDrop:
    + *                   resizeFrame, centerFrame, dragElId
    + */
    +YAHOO.util.DDProxy = function(id, sGroup, config) {
    +    if (id) {
    +        this.init(id, sGroup, config);
    +        this.initFrame();
    +    }
    +};
    +
    +/**
    + * The default drag frame div id
    + * @property YAHOO.util.DDProxy.dragElId
    + * @type String
    + * @static
    + */
    +YAHOO.util.DDProxy.dragElId = "ygddfdiv";
    +
    +YAHOO.extend(YAHOO.util.DDProxy, YAHOO.util.DD, {
    +
    +    /**
    +     * By default we resize the drag frame to be the same size as the element
    +     * we want to drag (this is to get the frame effect).  We can turn it off
    +     * if we want a different behavior.
    +     * @property resizeFrame
    +     * @type boolean
    +     */
    +    resizeFrame: true,
    +
    +    /**
    +     * By default the frame is positioned exactly where the drag element is, so
    +     * we use the cursor offset provided by YAHOO.util.DD.  Another option that works only if
    +     * you do not have constraints on the obj is to have the drag frame centered
    +     * around the cursor.  Set centerFrame to true for this effect.
    +     * @property centerFrame
    +     * @type boolean
    +     */
    +    centerFrame: false,
    +
    +    /**
    +     * Creates the proxy element if it does not yet exist
    +     * @method createFrame
    +     */
    +    createFrame: function() {
    +        var self = this;
    +        var body = document.body;
    +
    +        if (!body || !body.firstChild) {
    +            setTimeout( function() { self.createFrame(); }, 50 );
    +            return;
    +        }
    +
    +        var div = this.getDragEl();
    +
    +        if (!div) {
    +            div    = document.createElement("div");
    +            div.id = this.dragElId;
    +            var s  = div.style;
    +
    +            s.position   = "absolute";
    +            s.visibility = "hidden";
    +            s.cursor     = "move";
    +            s.border     = "2px solid #aaa";
    +            s.zIndex     = 999;
    +
    +            // appendChild can blow up IE if invoked prior to the window load event
    +            // while rendering a table.  It is possible there are other scenarios
    +            // that would cause this to happen as well.
    +            body.insertBefore(div, body.firstChild);
    +        }
    +    },
    +
    +    /**
    +     * Initialization for the drag frame element.  Must be called in the
    +     * constructor of all subclasses
    +     * @method initFrame
    +     */
    +    initFrame: function() {
    +        this.createFrame();
    +    },
    +
    +    applyConfig: function() {
    +        YAHOO.util.DDProxy.superclass.applyConfig.call(this);
    +
    +        this.resizeFrame = (this.config.resizeFrame !== false);
    +        this.centerFrame = (this.config.centerFrame);
    +        this.setDragElId(this.config.dragElId || YAHOO.util.DDProxy.dragElId);
    +    },
    +
    +    /**
    +     * Resizes the drag frame to the dimensions of the clicked object, positions
    +     * it over the object, and finally displays it
    +     * @method showFrame
    +     * @param {int} iPageX X click position
    +     * @param {int} iPageY Y click position
    +     * @private
    +     */
    +    showFrame: function(iPageX, iPageY) {
    +        var el = this.getEl();
    +        var dragEl = this.getDragEl();
    +        var s = dragEl.style;
    +
    +        this._resizeProxy();
    +
    +        if (this.centerFrame) {
    +            this.setDelta( Math.round(parseInt(s.width,  10)/2),
    +                           Math.round(parseInt(s.height, 10)/2) );
    +        }
    +
    +        this.setDragElPos(iPageX, iPageY);
    +
    +        YAHOO.util.Dom.setStyle(dragEl, "visibility", "visible");
    +    },
    +
    +    /**
    +     * The proxy is automatically resized to the dimensions of the linked
    +     * element when a drag is initiated, unless resizeFrame is set to false
    +     * @method _resizeProxy
    +     * @private
    +     */
    +    _resizeProxy: function() {
    +        if (this.resizeFrame) {
    +            var DOM    = YAHOO.util.Dom;
    +            var el     = this.getEl();
    +            var dragEl = this.getDragEl();
    +
    +            var bt = parseInt( DOM.getStyle(dragEl, "borderTopWidth"    ), 10);
    +            var br = parseInt( DOM.getStyle(dragEl, "borderRightWidth"  ), 10);
    +            var bb = parseInt( DOM.getStyle(dragEl, "borderBottomWidth" ), 10);
    +            var bl = parseInt( DOM.getStyle(dragEl, "borderLeftWidth"   ), 10);
    +
    +            if (isNaN(bt)) { bt = 0; }
    +            if (isNaN(br)) { br = 0; }
    +            if (isNaN(bb)) { bb = 0; }
    +            if (isNaN(bl)) { bl = 0; }
    +
    +
    +            var newWidth  = Math.max(0, el.offsetWidth  - br - bl);
    +            var newHeight = Math.max(0, el.offsetHeight - bt - bb);
    +
    +
    +            DOM.setStyle( dragEl, "width",  newWidth  + "px" );
    +            DOM.setStyle( dragEl, "height", newHeight + "px" );
    +        }
    +    },
    +
    +    // overrides YAHOO.util.DragDrop
    +    b4MouseDown: function(e) {
    +        var x = YAHOO.util.Event.getPageX(e);
    +        var y = YAHOO.util.Event.getPageY(e);
    +        this.autoOffset(x, y);
    +        this.setDragElPos(x, y);
    +    },
    +
    +    // overrides YAHOO.util.DragDrop
    +    b4StartDrag: function(x, y) {
    +        // show the drag frame
    +        this.showFrame(x, y);
    +    },
    +
    +    // overrides YAHOO.util.DragDrop
    +    b4EndDrag: function(e) {
    +        YAHOO.util.Dom.setStyle(this.getDragEl(), "visibility", "hidden");
    +    },
    +
    +    // overrides YAHOO.util.DragDrop
    +    // By default we try to move the element to the last location of the frame.
    +    // This is so that the default behavior mirrors that of YAHOO.util.DD.
    +    endDrag: function(e) {
    +        var DOM = YAHOO.util.Dom;
    +        var lel = this.getEl();
    +        var del = this.getDragEl();
    +
    +        // Show the drag frame briefly so we can get its position
    +        // del.style.visibility = "";
    +        DOM.setStyle(del, "visibility", "");
    +
    +        // Hide the linked element before the move to get around a Safari
    +        // rendering bug.
    +        //lel.style.visibility = "hidden";
    +        DOM.setStyle(lel, "visibility", "hidden");
    +        YAHOO.util.DDM.moveToEl(lel, del);
    +        //del.style.visibility = "hidden";
    +        DOM.setStyle(del, "visibility", "hidden");
    +        //lel.style.visibility = "";
    +        DOM.setStyle(lel, "visibility", "");
    +    },
    +
    +    toString: function() {
    +        return ("DDProxy " + this.id);
    +    }
    +
    +});
    +/**
    + * A DragDrop implementation that does not move, but can be a drop
    + * target.  You would get the same result by simply omitting implementation
    + * for the event callbacks, but this way we reduce the processing cost of the
    + * event listener and the callbacks.
    + * @class DDTarget
    + * @extends YAHOO.util.DragDrop
    + * @constructor
    + * @param {String} id the id of the element that is a drop target
    + * @param {String} sGroup the group of related DragDrop objects
    + * @param {object} config an object containing configurable attributes
    + *                 Valid properties for DDTarget in addition to those in
    + *                 DragDrop:
    + *                    none
    + */
    +YAHOO.util.DDTarget = function(id, sGroup, config) {
    +    if (id) {
    +        this.initTarget(id, sGroup, config);
    +    }
    +};
    +
    +// YAHOO.util.DDTarget.prototype = new YAHOO.util.DragDrop();
    +YAHOO.extend(YAHOO.util.DDTarget, YAHOO.util.DragDrop, {
    +    toString: function() {
    +        return ("DDTarget " + this.id);
    +    }
    +});
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/event.js.html b/www/extras/yui-ext/docs/output/event.js.html new file mode 100644 index 000000000..471d77d1e --- /dev/null +++ b/www/extras/yui-ext/docs/output/event.js.html @@ -0,0 +1,1739 @@ +event.js
    /*                                                                                                                                                      
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The CustomEvent class lets you define events for your application
    + * that can be subscribed to by one or more independent component.
    + *
    + * @param {String}  type The type of event, which is passed to the callback
    + *                  when the event fires
    + * @param {Object}  oScope The context the event will fire from.  "this" will
    + *                  refer to this object in the callback.  Default value: 
    + *                  the window object.  The listener can override this.
    + * @param {boolean} silent pass true to prevent the event from writing to
    + *                  the log system
    + * @namespace YAHOO.util
    + * @class CustomEvent
    + * @constructor
    + */
    +YAHOO.util.CustomEvent = function(type, oScope, silent, signature) {
    +
    +    /**
    +     * The type of event, returned to subscribers when the event fires
    +     * @property type
    +     * @type string
    +     */
    +    this.type = type;
    +
    +    /**
    +     * The scope the the event will fire from by default.  Defaults to the window 
    +     * obj
    +     * @property scope
    +     * @type object
    +     */
    +    this.scope = oScope || window;
    +
    +    /**
    +     * By default all custom events are logged in the debug build, set silent
    +     * to true to disable logging for this event.
    +     * @property silent
    +     * @type boolean
    +     */
    +    this.silent = silent;
    +
    +    /**
    +     * Custom events support two styles of arguments provided to the event
    +     * subscribers.  
    +     * <ul>
    +     * <li>YAHOO.util.CustomEvent.LIST: 
    +     *   <ul>
    +     *   <li>param1: event name</li>
    +     *   <li>param2: array of arguments sent to fire</li>
    +     *   <li>param3: <optional> a custom object supplied by the subscriber</li>
    +     *   </ul>
    +     * </li>
    +     * <li>YAHOO.util.CustomEvent.FLAT
    +     *   <ul>
    +     *   <li>param1: the first argument passed to fire.  If you need to
    +     *           pass multiple parameters, use and array or object literal</li>
    +     *   <li>param2: <optional> a custom object supplied by the subscriber</li>
    +     *   </ul>
    +     * </li>
    +     * </ul>
    +     *   @property signature
    +     *   @type int
    +     */
    +    this.signature = signature || YAHOO.util.CustomEvent.LIST;
    +
    +    /**
    +     * The subscribers to this event
    +     * @property subscribers
    +     * @type Subscriber[]
    +     */
    +    this.subscribers = [];
    +
    +    if (!this.silent) {
    +    }
    +
    +    var onsubscribeType = "_YUICEOnSubscribe";
    +
    +    // Only add subscribe events for events that are not generated by 
    +    // CustomEvent
    +    if (type !== onsubscribeType) {
    +
    +        /**
    +         * Custom events provide a custom event that fires whenever there is
    +         * a new subscriber to the event.  This provides an opportunity to
    +         * handle the case where there is a non-repeating event that has
    +         * already fired has a new subscriber.  
    +         *
    +         * @event subscribeEvent
    +         * @type YAHOO.util.CustomEvent
    +         * @param {Function} fn The function to execute
    +         * @param {Object}   obj An object to be passed along when the event 
    +         *                       fires
    +         * @param {boolean|Object}  override If true, the obj passed in becomes 
    +         *                                   the execution scope of the listener.
    +         *                                   if an object, that object becomes the
    +         *                                   the execution scope.
    +         */
    +        this.subscribeEvent = 
    +                new YAHOO.util.CustomEvent(onsubscribeType, this, true);
    +
    +    } 
    +};
    +
    +/**
    + * Subscriber listener sigature constant.  The LIST type returns three
    + * parameters: the event type, the array of args passed to fire, and
    + * the optional custom object
    + * @property YAHOO.util.CustomEvent.LIST
    + * @static
    + * @type int
    + */
    +YAHOO.util.CustomEvent.LIST = 0;
    +
    +/**
    + * Subscriber listener sigature constant.  The FLAT type returns two
    + * parameters: the first argument passed to fire and the optional 
    + * custom object
    + * @property YAHOO.util.CustomEvent.FLAT
    + * @static
    + * @type int
    + */
    +YAHOO.util.CustomEvent.FLAT = 1;
    +
    +YAHOO.util.CustomEvent.prototype = {
    +
    +    /**
    +     * Subscribes the caller to this event
    +     * @method subscribe
    +     * @param {Function} fn        The function to execute
    +     * @param {Object}   obj       An object to be passed along when the event 
    +     *                             fires
    +     * @param {boolean|Object}  override If true, the obj passed in becomes 
    +     *                                   the execution scope of the listener.
    +     *                                   if an object, that object becomes the
    +     *                                   the execution scope.
    +     */
    +    subscribe: function(fn, obj, override) {
    +        if (this.subscribeEvent) {
    +            this.subscribeEvent.fire(fn, obj, override);
    +        }
    +
    +        this.subscribers.push( new YAHOO.util.Subscriber(fn, obj, override) );
    +    },
    +
    +    /**
    +     * Unsubscribes the caller from this event
    +     * @method unsubscribe
    +     * @param {Function} fn  The function to execute
    +     * @param {Object}   obj  The custom object passed to subscribe (optional)
    +     * @return {boolean} True if the subscriber was found and detached.
    +     */
    +    unsubscribe: function(fn, obj) {
    +        var found = false;
    +        for (var i=0, len=this.subscribers.length; i<len; ++i) {
    +            var s = this.subscribers[i];
    +            if (s && s.contains(fn, obj)) {
    +                this._delete(i);
    +                found = true;
    +            }
    +        }
    +
    +        return found;
    +    },
    +
    +    /**
    +     * Notifies the subscribers.  The callback functions will be executed
    +     * from the scope specified when the event was created, and with the 
    +     * following parameters:
    +     *   <ul>
    +     *   <li>The type of event</li>
    +     *   <li>All of the arguments fire() was executed with as an array</li>
    +     *   <li>The custom object (if any) that was passed into the subscribe() 
    +     *       method</li>
    +     *   </ul>
    +     * @method fire 
    +     * @param {Object*} arguments an arbitrary set of parameters to pass to 
    +     *                            the handler.
    +     */
    +    fire: function() {
    +        var len=this.subscribers.length;
    +        if (!len && this.silent) {
    +            return true;
    +        }
    +
    +        var args=[], ret=true, i;
    +
    +        for (i=0; i<arguments.length; ++i) {
    +            args.push(arguments[i]);
    +        }
    +
    +        var argslength = args.length;
    +
    +        if (!this.silent) {
    +        }
    +
    +        for (i=0; i<len; ++i) {
    +            var s = this.subscribers[i];
    +            if (s) {
    +                if (!this.silent) {
    +                }
    +
    +                var scope = s.getScope(this.scope);
    +
    +                if (this.signature == YAHOO.util.CustomEvent.FLAT) {
    +                    var param = null;
    +                    if (args.length > 0) {
    +                        param = args[0];
    +                    }
    +                    ret = s.fn.call(scope, param, s.obj);
    +                } else {
    +                    ret = s.fn.call(scope, this.type, args, s.obj);
    +                }
    +                if (false === ret) {
    +                    if (!this.silent) {
    +                    }
    +
    +                    //break;
    +                    return false;
    +                }
    +            }
    +        }
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Removes all listeners
    +     * @method unsubscribeAll
    +     */
    +    unsubscribeAll: function() {
    +        for (var i=0, len=this.subscribers.length; i<len; ++i) {
    +            this._delete(len - 1 - i);
    +        }
    +    },
    +
    +    /**
    +     * @method _delete
    +     * @private
    +     */
    +    _delete: function(index) {
    +        var s = this.subscribers[index];
    +        if (s) {
    +            delete s.fn;
    +            delete s.obj;
    +        }
    +
    +        // delete this.subscribers[index];
    +        this.subscribers.splice(index, 1);
    +    },
    +
    +    /**
    +     * @method toString
    +     */
    +    toString: function() {
    +         return "CustomEvent: " + "'" + this.type  + "', " + 
    +             "scope: " + this.scope;
    +
    +    }
    +};
    +
    +/////////////////////////////////////////////////////////////////////
    +
    +/**
    + * Stores the subscriber information to be used when the event fires.
    + * @param {Function} fn       The function to execute
    + * @param {Object}   obj      An object to be passed along when the event fires
    + * @param {boolean}  override If true, the obj passed in becomes the execution
    + *                            scope of the listener
    + * @class Subscriber
    + * @constructor
    + */
    +YAHOO.util.Subscriber = function(fn, obj, override) {
    +
    +    /**
    +     * The callback that will be execute when the event fires
    +     * @property fn
    +     * @type function
    +     */
    +    this.fn = fn;
    +
    +    /**
    +     * An optional custom object that will passed to the callback when
    +     * the event fires
    +     * @property obj
    +     * @type object
    +     */
    +    this.obj = obj || null;
    +
    +    /**
    +     * The default execution scope for the event listener is defined when the
    +     * event is created (usually the object which contains the event).
    +     * By setting override to true, the execution scope becomes the custom
    +     * object passed in by the subscriber.  If override is an object, that 
    +     * object becomes the scope.
    +     * @property override
    +     * @type boolean|object
    +     */
    +    this.override = override;
    +
    +};
    +
    +/**
    + * Returns the execution scope for this listener.  If override was set to true
    + * the custom obj will be the scope.  If override is an object, that is the
    + * scope, otherwise the default scope will be used.
    + * @method getScope
    + * @param {Object} defaultScope the scope to use if this listener does not
    + *                              override it.
    + */
    +YAHOO.util.Subscriber.prototype.getScope = function(defaultScope) {
    +    if (this.override) {
    +        if (this.override === true) {
    +            return this.obj;
    +        } else {
    +            return this.override;
    +        }
    +    }
    +    return defaultScope;
    +};
    +
    +/**
    + * Returns true if the fn and obj match this objects properties.
    + * Used by the unsubscribe method to match the right subscriber.
    + *
    + * @method contains
    + * @param {Function} fn the function to execute
    + * @param {Object} obj an object to be passed along when the event fires
    + * @return {boolean} true if the supplied arguments match this 
    + *                   subscriber's signature.
    + */
    +YAHOO.util.Subscriber.prototype.contains = function(fn, obj) {
    +    if (obj) {
    +        return (this.fn == fn && this.obj == obj);
    +    } else {
    +        return (this.fn == fn);
    +    }
    +};
    +
    +/**
    + * @method toString
    + */
    +YAHOO.util.Subscriber.prototype.toString = function() {
    +    return "Subscriber { obj: " + (this.obj || "")  + 
    +           ", override: " +  (this.override || "no") + " }";
    +};
    +
    +/**
    + * The Event Utility provides utilities for managing DOM Events and tools
    + * for building event systems
    + *
    + * @module event
    + * @title Event Utility
    + * @namespace YAHOO.util
    + * @requires yahoo
    + */
    +
    +// The first instance of Event will win if it is loaded more than once.
    +if (!YAHOO.util.Event) {
    +
    +/**
    + * The event utility provides functions to add and remove event listeners,
    + * event cleansing.  It also tries to automatically remove listeners it
    + * registers during the unload event.
    + *
    + * @class Event
    + * @static
    + */
    +    YAHOO.util.Event = function() {
    +
    +        /**
    +         * True after the onload event has fired
    +         * @property loadComplete
    +         * @type boolean
    +         * @static
    +         * @private
    +         */
    +        var loadComplete =  false;
    +
    +        /**
    +         * Cache of wrapped listeners
    +         * @property listeners
    +         * @type array
    +         * @static
    +         * @private
    +         */
    +        var listeners = [];
    +
    +        /**
    +         * User-defined unload function that will be fired before all events
    +         * are detached
    +         * @property unloadListeners
    +         * @type array
    +         * @static
    +         * @private
    +         */
    +        var unloadListeners = [];
    +
    +        /**
    +         * Cache of DOM0 event handlers to work around issues with DOM2 events
    +         * in Safari
    +         * @property legacyEvents
    +         * @static
    +         * @private
    +         */
    +        var legacyEvents = [];
    +
    +        /**
    +         * Listener stack for DOM0 events
    +         * @property legacyHandlers
    +         * @static
    +         * @private
    +         */
    +        var legacyHandlers = [];
    +
    +        /**
    +         * The number of times to poll after window.onload.  This number is
    +         * increased if additional late-bound handlers are requested after
    +         * the page load.
    +         * @property retryCount
    +         * @static
    +         * @private
    +         */
    +        var retryCount = 0;
    +
    +        /**
    +         * onAvailable listeners
    +         * @property onAvailStack
    +         * @static
    +         * @private
    +         */
    +        var onAvailStack = [];
    +
    +        /**
    +         * Lookup table for legacy events
    +         * @property legacyMap
    +         * @static
    +         * @private
    +         */
    +        var legacyMap = [];
    +
    +        /**
    +         * Counter for auto id generation
    +         * @property counter
    +         * @static
    +         * @private
    +         */
    +        var counter = 0;
    +
    +        return { // PREPROCESS
    +
    +            /**
    +             * The number of times we should look for elements that are not
    +             * in the DOM at the time the event is requested after the document
    +             * has been loaded.  The default is 200@amp;50 ms, so it will poll
    +             * for 10 seconds or until all outstanding handlers are bound
    +             * (whichever comes first).
    +             * @property POLL_RETRYS
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            POLL_RETRYS: 200,
    +
    +            /**
    +             * The poll interval in milliseconds
    +             * @property POLL_INTERVAL
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            POLL_INTERVAL: 20,
    +
    +            /**
    +             * Element to bind, int constant
    +             * @property EL
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            EL: 0,
    +
    +            /**
    +             * Type of event, int constant
    +             * @property TYPE
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            TYPE: 1,
    +
    +            /**
    +             * Function to execute, int constant
    +             * @property FN
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            FN: 2,
    +
    +            /**
    +             * Function wrapped for scope correction and cleanup, int constant
    +             * @property WFN
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            WFN: 3,
    +
    +            /**
    +             * Object passed in by the user that will be returned as a 
    +             * parameter to the callback, int constant
    +             * @property OBJ
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            OBJ: 3,
    +
    +            /**
    +             * Adjusted scope, either the element we are registering the event
    +             * on or the custom object passed in by the listener, int constant
    +             * @property ADJ_SCOPE
    +             * @type int
    +             * @static
    +             * @final
    +             */
    +            ADJ_SCOPE: 4,
    +
    +            /**
    +             * Safari detection is necessary to work around the preventDefault
    +             * bug that makes it so you can't cancel a href click from the 
    +             * handler.  There is not a capabilities check we can use here.
    +             * @property isSafari
    +             * @private
    +             * @static
    +             */
    +            isSafari: (/Safari|Konqueror|KHTML/gi).test(navigator.userAgent),
    +
    +            /**
    +             * IE detection needed to properly calculate pageX and pageY.  
    +             * capabilities checking didn't seem to work because another 
    +             * browser that does not provide the properties have the values 
    +             * calculated in a different manner than IE.
    +             * @property isIE
    +             * @private
    +             * @static
    +             */
    +            isIE: (!this.isSafari && !navigator.userAgent.match(/opera/gi) && 
    +                    navigator.userAgent.match(/msie/gi)),
    +
    +            /**
    +             * poll handle
    +             * @property _interval
    +             * @private
    +             */
    +            _interval: null,
    +
    +            /**
    +             * @method startInterval
    +             * @static
    +             * @private
    +             */
    +            startInterval: function() {
    +                if (!this._interval) {
    +                    var self = this;
    +                    var callback = function() { self._tryPreloadAttach(); };
    +                    this._interval = setInterval(callback, this.POLL_INTERVAL);
    +                    // this.timeout = setTimeout(callback, i);
    +                }
    +            },
    +
    +            /**
    +             * Executes the supplied callback when the item with the supplied
    +             * id is found.  This is meant to be used to execute behavior as
    +             * soon as possible as the page loads.  If you use this after the
    +             * initial page load it will poll for a fixed time for the element.
    +             * The number of times it will poll and the frequency are
    +             * configurable.  By default it will poll for 10 seconds.
    +             *
    +             * @method onAvailable
    +             *
    +             * @param {string}   p_id the id of the element to look for.
    +             * @param {function} p_fn what to execute when the element is found.
    +             * @param {object}   p_obj an optional object to be passed back as
    +             *                   a parameter to p_fn.
    +             * @param {boolean}  p_override If set to true, p_fn will execute
    +             *                   in the scope of p_obj
    +             *
    +             * @static
    +             */
    +            onAvailable: function(p_id, p_fn, p_obj, p_override) {
    +                onAvailStack.push( { id:         p_id, 
    +                                     fn:         p_fn, 
    +                                     obj:        p_obj, 
    +                                     override:   p_override, 
    +                                     checkReady: false    } );
    +
    +                retryCount = this.POLL_RETRYS;
    +                this.startInterval();
    +            },
    +
    +            /**
    +             * Works the same way as onAvailable, but additionally checks the
    +             * state of sibling elements to determine if the content of the
    +             * available element is safe to modify.
    +             *
    +             * @method onContentReady
    +             *
    +             * @param {string}   p_id the id of the element to look for.
    +             * @param {function} p_fn what to execute when the element is ready.
    +             * @param {object}   p_obj an optional object to be passed back as
    +             *                   a parameter to p_fn.
    +             * @param {boolean}  p_override If set to true, p_fn will execute
    +             *                   in the scope of p_obj
    +             *
    +             * @static
    +             */
    +            onContentReady: function(p_id, p_fn, p_obj, p_override) {
    +                onAvailStack.push( { id:         p_id, 
    +                                     fn:         p_fn, 
    +                                     obj:        p_obj, 
    +                                     override:   p_override,
    +                                     checkReady: true      } );
    +
    +                retryCount = this.POLL_RETRYS;
    +                this.startInterval();
    +            },
    +
    +            /**
    +             * Appends an event handler
    +             *
    +             * @method addListener
    +             *
    +             * @param {Object}   el        The html element to assign the 
    +             *                             event to
    +             * @param {String}   sType     The type of event to append
    +             * @param {Function} fn        The method the event invokes
    +             * @param {Object}   obj    An arbitrary object that will be 
    +             *                             passed as a parameter to the handler
    +             * @param {boolean}  override  If true, the obj passed in becomes
    +             *                             the execution scope of the listener
    +             * @return {boolean} True if the action was successful or defered,
    +             *                        false if one or more of the elements 
    +             *                        could not have the event bound to it.
    +             * @static
    +             */
    +            addListener: function(el, sType, fn, obj, override) {
    +
    +                if (!fn || !fn.call) {
    +                    return false;
    +                }
    +
    +                // The el argument can be an array of elements or element ids.
    +                if ( this._isValidCollection(el)) {
    +                    var ok = true;
    +                    for (var i=0,len=el.length; i<len; ++i) {
    +                        ok = this.on(el[i], 
    +                                       sType, 
    +                                       fn, 
    +                                       obj, 
    +                                       override) && ok;
    +                    }
    +                    return ok;
    +
    +                } else if (typeof el == "string") {
    +                    var oEl = this.getEl(el);
    +                    // If the el argument is a string, we assume it is 
    +                    // actually the id of the element.  If the page is loaded
    +                    // we convert el to the actual element, otherwise we 
    +                    // defer attaching the event until onload event fires
    +
    +                    // check to see if we need to delay hooking up the event 
    +                    // until after the page loads.
    +                    if (oEl) {
    +                        el = oEl;
    +                    } else {
    +                        // defer adding the event until the element is available
    +                        this.onAvailable(el, function() {
    +                           YAHOO.util.Event.on(el, sType, fn, obj, override);
    +                        });
    +
    +                        return true;
    +                    }
    +                }
    +
    +                // Element should be an html element or an array if we get 
    +                // here.
    +                if (!el) {
    +                    return false;
    +                }
    +
    +                // we need to make sure we fire registered unload events 
    +                // prior to automatically unhooking them.  So we hang on to 
    +                // these instead of attaching them to the window and fire the
    +                // handles explicitly during our one unload event.
    +                if ("unload" == sType && obj !== this) {
    +                    unloadListeners[unloadListeners.length] =
    +                            [el, sType, fn, obj, override];
    +                    return true;
    +                }
    +
    +                // if the user chooses to override the scope, we use the custom
    +                // object passed in, otherwise the executing scope will be the
    +                // HTML element that the event is registered on
    +                var scope = el;
    +                if (override) {
    +                    if (override === true) {
    +                        scope = obj;
    +                    } else {
    +                        scope = override;
    +                    }
    +                }
    +
    +                // wrap the function so we can return the obj object when
    +                // the event fires;
    +                var wrappedFn = function(e) {
    +                        return fn.call(scope, YAHOO.util.Event.getEvent(e), 
    +                                obj);
    +                    };
    +
    +                var li = [el, sType, fn, wrappedFn, scope];
    +                var index = listeners.length;
    +                // cache the listener so we can try to automatically unload
    +                listeners[index] = li;
    +
    +                if (this.useLegacyEvent(el, sType)) {
    +                    var legacyIndex = this.getLegacyIndex(el, sType);
    +
    +                    // Add a new dom0 wrapper if one is not detected for this
    +                    // element
    +                    if ( legacyIndex == -1 || 
    +                                el != legacyEvents[legacyIndex][0] ) {
    +
    +                        legacyIndex = legacyEvents.length;
    +                        legacyMap[el.id + sType] = legacyIndex;
    +
    +                        // cache the signature for the DOM0 event, and 
    +                        // include the existing handler for the event, if any
    +                        legacyEvents[legacyIndex] = 
    +                            [el, sType, el["on" + sType]];
    +                        legacyHandlers[legacyIndex] = [];
    +
    +                        el["on" + sType] = 
    +                            function(e) {
    +                                YAHOO.util.Event.fireLegacyEvent(
    +                                    YAHOO.util.Event.getEvent(e), legacyIndex);
    +                            };
    +                    }
    +
    +                    // add a reference to the wrapped listener to our custom
    +                    // stack of events
    +                    //legacyHandlers[legacyIndex].push(index);
    +                    legacyHandlers[legacyIndex].push(li);
    +
    +                } else {
    +                    this._simpleAdd(el, sType, wrappedFn, false);
    +                }
    +
    +                return true;
    +                
    +            },
    +
    +            /**
    +             * When using legacy events, the handler is routed to this object
    +             * so we can fire our custom listener stack.
    +             * @method fireLegacyEvent
    +             * @static
    +             * @private
    +             */
    +            fireLegacyEvent: function(e, legacyIndex) {
    +                var ok = true;
    +
    +                var le = legacyHandlers[legacyIndex];
    +                for (var i=0,len=le.length; i<len; ++i) {
    +                    var li = le[i];
    +                    if ( li && li[this.WFN] ) {
    +                        var scope = li[this.ADJ_SCOPE];
    +                        var ret = li[this.WFN].call(scope, e);
    +                        ok = (ok && ret);
    +                    }
    +                }
    +
    +                return ok;
    +            },
    +
    +            /**
    +             * Returns the legacy event index that matches the supplied 
    +             * signature
    +             * @method getLegacyIndex
    +             * @static
    +             * @private
    +             */
    +            getLegacyIndex: function(el, sType) {
    +                var key = this.generateId(el) + sType;
    +                if (typeof legacyMap[key] == "undefined") { 
    +                    return -1;
    +                } else {
    +                    return legacyMap[key];
    +                }
    +            },
    +
    +            /**
    +             * Logic that determines when we should automatically use legacy
    +             * events instead of DOM2 events.
    +             * @method useLegacyEvent
    +             * @static
    +             * @private
    +             */
    +            useLegacyEvent: function(el, sType) {
    +                if (!el.addEventListener && !el.attachEvent) {
    +                    return true;
    +                } else if (this.isSafari) {
    +                    if ("click" == sType || "dblclick" == sType) {
    +                        return true;
    +                    }
    +                }
    +                return false;
    +            },
    +                    
    +            /**
    +             * Removes an event handler
    +             *
    +             * @method removeListener
    +             *
    +             * @param {Object} el the html element or the id of the element to 
    +             * assign the event to.
    +             * @param {String} sType the type of event to remove.
    +             * @param {Function} fn the method the event invokes.  If fn is
    +             * undefined, then all event handlers for the type of event are 
    +             * removed.
    +             * @return {boolean} true if the unbind was successful, false 
    +             * otherwise.
    +             * @static
    +             */
    +            removeListener: function(el, sType, fn) {
    +                var i, len;
    +
    +                // The el argument can be a string
    +                if (typeof el == "string") {
    +                    el = this.getEl(el);
    +                // The el argument can be an array of elements or element ids.
    +                } else if ( this._isValidCollection(el)) {
    +                    var ok = true;
    +                    for (i=0,len=el.length; i<len; ++i) {
    +                        ok = ( this.removeListener(el[i], sType, fn) && ok );
    +                    }
    +                    return ok;
    +                }
    +
    +                if (!fn || !fn.call) {
    +                    //return false;
    +                    return this.purgeElement(el, false, sType);
    +                }
    +
    +                if ("unload" == sType) {
    +
    +                    for (i=0, len=unloadListeners.length; i<len; i++) {
    +                        var li = unloadListeners[i];
    +                        if (li && 
    +                            li[0] == el && 
    +                            li[1] == sType && 
    +                            li[2] == fn) {
    +                                unloadListeners.splice(i, 1);
    +                                return true;
    +                        }
    +                    }
    +
    +                    return false;
    +                }
    +
    +                var cacheItem = null;
    +
    +                // The index is a hidden parameter; needed to remove it from
    +                // the method signature because it was tempting users to
    +                // try and take advantage of it, which is not possible.
    +                var index = arguments[3];
    +  
    +                if ("undefined" == typeof index) {
    +                    index = this._getCacheIndex(el, sType, fn);
    +                }
    +
    +                if (index >= 0) {
    +                    cacheItem = listeners[index];
    +                }
    +
    +                if (!el || !cacheItem) {
    +                    return false;
    +                }
    +
    +                if (this.useLegacyEvent(el, sType)) {
    +                    var legacyIndex = this.getLegacyIndex(el, sType);
    +                    var llist = legacyHandlers[legacyIndex];
    +                    if (llist) {
    +                        for (i=0, len=llist.length; i<len; ++i) {
    +                            li = llist[i];
    +                            if (li && 
    +                                li[this.EL] == el && 
    +                                li[this.TYPE] == sType && 
    +                                li[this.FN] == fn) {
    +                                    llist.splice(i, 1);
    +                                    break;
    +                            }
    +                        }
    +                    }
    +
    +                } else {
    +                    this._simpleRemove(el, sType, cacheItem[this.WFN], false);
    +                }
    +
    +                // removed the wrapped handler
    +                delete listeners[index][this.WFN];
    +                delete listeners[index][this.FN];
    +                listeners.splice(index, 1);
    +
    +                return true;
    +
    +            },
    +
    +            /**
    +             * Returns the event's target element
    +             * @method getTarget
    +             * @param {Event} ev the event
    +             * @param {boolean} resolveTextNode when set to true the target's
    +             *                  parent will be returned if the target is a 
    +             *                  text node.  @deprecated, the text node is
    +             *                  now resolved automatically
    +             * @return {HTMLElement} the event's target
    +             * @static
    +             */
    +            getTarget: function(ev, resolveTextNode) {
    +                var t = ev.target || ev.srcElement;
    +                return this.resolveTextNode(t);
    +            },
    +
    +            /**
    +             * In some cases, some browsers will return a text node inside
    +             * the actual element that was targeted.  This normalizes the
    +             * return value for getTarget and getRelatedTarget.
    +             * @method resolveTextNode
    +             * @param {HTMLElement} node node to resolve
    +             * @return {HTMLElement} the normized node
    +             * @static
    +             */
    +            resolveTextNode: function(node) {
    +                // if (node && node.nodeName && 
    +                        // "#TEXT" == node.nodeName.toUpperCase()) {
    +                if (node && 3 == node.nodeType) {
    +                    return node.parentNode;
    +                } else {
    +                    return node;
    +                }
    +            },
    +
    +            /**
    +             * Returns the event's pageX
    +             * @method getPageX
    +             * @param {Event} ev the event
    +             * @return {int} the event's pageX
    +             * @static
    +             */
    +            getPageX: function(ev) {
    +                var x = ev.pageX;
    +                if (!x && 0 !== x) {
    +                    x = ev.clientX || 0;
    +
    +                    if ( this.isIE ) {
    +                        x += this._getScrollLeft();
    +                    }
    +                }
    +
    +                return x;
    +            },
    +
    +            /**
    +             * Returns the event's pageY
    +             * @method getPageY
    +             * @param {Event} ev the event
    +             * @return {int} the event's pageY
    +             * @static
    +             */
    +            getPageY: function(ev) {
    +                var y = ev.pageY;
    +                if (!y && 0 !== y) {
    +                    y = ev.clientY || 0;
    +
    +                    if ( this.isIE ) {
    +                        y += this._getScrollTop();
    +                    }
    +                }
    +
    +                return y;
    +            },
    +
    +            /**
    +             * Returns the pageX and pageY properties as an indexed array.
    +             * @method getXY
    +             * @type int[]
    +             * @static
    +             */
    +            getXY: function(ev) {
    +                return [this.getPageX(ev), this.getPageY(ev)];
    +            },
    +
    +            /**
    +             * Returns the event's related target 
    +             * @method getRelatedTarget
    +             * @param {Event} ev the event
    +             * @return {HTMLElement} the event's relatedTarget
    +             * @static
    +             */
    +            getRelatedTarget: function(ev) {
    +                var t = ev.relatedTarget;
    +                if (!t) {
    +                    if (ev.type == "mouseout") {
    +                        t = ev.toElement;
    +                    } else if (ev.type == "mouseover") {
    +                        t = ev.fromElement;
    +                    }
    +                }
    +
    +                return this.resolveTextNode(t);
    +            },
    +
    +            /**
    +             * Returns the time of the event.  If the time is not included, the
    +             * event is modified using the current time.
    +             * @method getTime
    +             * @param {Event} ev the event
    +             * @return {Date} the time of the event
    +             * @static
    +             */
    +            getTime: function(ev) {
    +                if (!ev.time) {
    +                    var t = new Date().getTime();
    +                    try {
    +                        ev.time = t;
    +                    } catch(e) { 
    +                        return t;
    +                    }
    +                }
    +
    +                return ev.time;
    +            },
    +
    +            /**
    +             * Convenience method for stopPropagation + preventDefault
    +             * @method stopEvent
    +             * @param {Event} ev the event
    +             * @static
    +             */
    +            stopEvent: function(ev) {
    +                this.stopPropagation(ev);
    +                this.preventDefault(ev);
    +            },
    +
    +            /**
    +             * Stops event propagation
    +             * @method stopPropagation
    +             * @param {Event} ev the event
    +             * @static
    +             */
    +            stopPropagation: function(ev) {
    +                if (ev.stopPropagation) {
    +                    ev.stopPropagation();
    +                } else {
    +                    ev.cancelBubble = true;
    +                }
    +            },
    +
    +            /**
    +             * Prevents the default behavior of the event
    +             * @method preventDefault
    +             * @param {Event} ev the event
    +             * @static
    +             */
    +            preventDefault: function(ev) {
    +                if (ev.preventDefault) {
    +                    ev.preventDefault();
    +                } else {
    +                    ev.returnValue = false;
    +                }
    +            },
    +             
    +            /**
    +             * Finds the event in the window object, the caller's arguments, or
    +             * in the arguments of another method in the callstack.  This is
    +             * executed automatically for events registered through the event
    +             * manager, so the implementer should not normally need to execute
    +             * this function at all.
    +             * @method getEvent
    +             * @param {Event} e the event parameter from the handler
    +             * @return {Event} the event 
    +             * @static
    +             */
    +            getEvent: function(e) {
    +                var ev = e || window.event;
    +
    +                if (!ev) {
    +                    var c = this.getEvent.caller;
    +                    while (c) {
    +                        ev = c.arguments[0];
    +                        if (ev && Event == ev.constructor) {
    +                            break;
    +                        }
    +                        c = c.caller;
    +                    }
    +                }
    +
    +                return ev;
    +            },
    +
    +            /**
    +             * Returns the charcode for an event
    +             * @method getCharCode
    +             * @param {Event} ev the event
    +             * @return {int} the event's charCode
    +             * @static
    +             */
    +            getCharCode: function(ev) {
    +                return ev.charCode || ev.keyCode || 0;
    +            },
    +
    +            /**
    +             * Locating the saved event handler data by function ref
    +             *
    +             * @method _getCacheIndex
    +             * @static
    +             * @private
    +             */
    +            _getCacheIndex: function(el, sType, fn) {
    +                for (var i=0,len=listeners.length; i<len; ++i) {
    +                    var li = listeners[i];
    +                    if ( li                 && 
    +                         li[this.FN] == fn  && 
    +                         li[this.EL] == el  && 
    +                         li[this.TYPE] == sType ) {
    +                        return i;
    +                    }
    +                }
    +
    +                return -1;
    +            },
    +
    +            /**
    +             * Generates an unique ID for the element if it does not already 
    +             * have one.
    +             * @method generateId
    +             * @param el the element to create the id for
    +             * @return {string} the resulting id of the element
    +             * @static
    +             */
    +            generateId: function(el) {
    +                var id = el.id;
    +
    +                if (!id) {
    +                    id = "yuievtautoid-" + counter;
    +                    ++counter;
    +                    el.id = id;
    +                }
    +
    +                return id;
    +            },
    +
    +            /**
    +             * We want to be able to use getElementsByTagName as a collection
    +             * to attach a group of events to.  Unfortunately, different 
    +             * browsers return different types of collections.  This function
    +             * tests to determine if the object is array-like.  It will also 
    +             * fail if the object is an array, but is empty.
    +             * @method _isValidCollection
    +             * @param o the object to test
    +             * @return {boolean} true if the object is array-like and populated
    +             * @static
    +             * @private
    +             */
    +            _isValidCollection: function(o) {
    +                // this.logger.debug(o.constructor.toString())
    +                // this.logger.debug(typeof o)
    +
    +                return ( o                    && // o is something
    +                         o.length             && // o is indexed
    +                         typeof o != "string" && // o is not a string
    
    +                         !o.tagName           && // o is not an HTML element
    
    +                         !o.alert             && // o is not a window
    +                         typeof o[0] != "undefined" );
    +
    +            },
    +
    +            /**
    +             * @private
    +             * @property elCache
    +             * DOM element cache
    +             * @static
    +             */
    +            elCache: {},
    +
    +            /**
    +             * We cache elements bound by id because when the unload event 
    +             * fires, we can no longer use document.getElementById
    +             * @method getEl
    +             * @static
    +             * @private
    +             */
    +            getEl: function(id) {
    +                return document.getElementById(id);
    +            },
    +
    +            /**
    +             * Clears the element cache
    +             * @deprecated Elements are not cached any longer
    +             * @method clearCache
    +             * @static
    +             * @private
    +             */
    +            clearCache: function() { },
    +
    +            /**
    +             * hook up any deferred listeners
    +             * @method _load
    +             * @static
    +             * @private
    +             */
    +            _load: function(e) {
    +                loadComplete = true;
    +                var EU = YAHOO.util.Event;
    +                // Remove the listener to assist with the IE memory issue, but not
    +                // for other browsers because FF 1.0x does not like it.
    +                if (this.isIE) {
    +                    EU._simpleRemove(window, "load", EU._load);
    +                }
    +            },
    +
    +            /**
    +             * Polling function that runs before the onload event fires, 
    +             * attempting to attach to DOM Nodes as soon as they are 
    +             * available
    +             * @method _tryPreloadAttach
    +             * @static
    +             * @private
    +             */
    +            _tryPreloadAttach: function() {
    +
    +                if (this.locked) {
    +                    return false;
    +                }
    +
    +                this.locked = true;
    +
    +                // keep trying until after the page is loaded.  We need to 
    +                // check the page load state prior to trying to bind the 
    +                // elements so that we can be certain all elements have been 
    +                // tested appropriately
    +                var tryAgain = !loadComplete;
    +                if (!tryAgain) {
    +                    tryAgain = (retryCount > 0);
    +                }
    +
    +                // onAvailable
    +                var notAvail = [];
    +                for (var i=0,len=onAvailStack.length; i<len ; ++i) {
    +                    var item = onAvailStack[i];
    +                    if (item) {
    +                        var el = this.getEl(item.id);
    +
    +                        if (el) {
    +                            // The element is available, but not necessarily ready
    +
    +                            if ( !item.checkReady || 
    +                                    loadComplete || 
    +                                    el.nextSibling ||
    +                                    (document && document.body) ) {
    +
    +                                var scope = el;
    +                                if (item.override) {
    +                                    if (item.override === true) {
    +                                        scope = item.obj;
    +                                    } else {
    +                                        scope = item.override;
    +                                    }
    +                                }
    +                                item.fn.call(scope, item.obj);
    +                                delete onAvailStack[i];
    +                            }
    +                        } else {
    +                            notAvail.push(item);
    +                        }
    +                    }
    +                }
    +
    +                retryCount = (notAvail.length === 0) ? 0 : retryCount - 1;
    +
    +                if (tryAgain) {
    +                    this.startInterval();
    +                } else {
    +                    clearInterval(this._interval);
    +                    this._interval = null;
    +                }
    +
    +                this.locked = false;
    +
    +                return true;
    +
    +            },
    +
    +            /**
    +             * Removes all listeners attached to the given element via addListener.
    +             * Optionally, the node's children can also be purged.
    +             * Optionally, you can specify a specific type of event to remove.
    +             * @method purgeElement
    +             * @param {HTMLElement} el the element to purge
    +             * @param {boolean} recurse recursively purge this element's children
    +             * as well.  Use with caution.
    +             * @param {string} sType optional type of listener to purge. If
    +             * left out, all listeners will be removed
    +             * @static
    +             */
    +            purgeElement: function(el, recurse, sType) {
    +                var elListeners = this.getListeners(el, sType);
    +                if (elListeners) {
    +                    for (var i=0,len=elListeners.length; i<len ; ++i) {
    +                        var l = elListeners[i];
    +                        // can't use the index on the changing collection
    +                        //this.removeListener(el, l.type, l.fn, l.index);
    +                        this.removeListener(el, l.type, l.fn);
    +                    }
    +                }
    +
    +                if (recurse && el && el.childNodes) {
    +                    for (i=0,len=el.childNodes.length; i<len ; ++i) {
    +                        this.purgeElement(el.childNodes[i], recurse, sType);
    +                    }
    +                }
    +            },
    +
    +            /**
    +             * Returns all listeners attached to the given element via addListener.
    +             * Optionally, you can specify a specific type of event to return.
    +             * @method getListeners
    +             * @param el {HTMLElement} the element to inspect 
    +             * @param sType {string} optional type of listener to return. If
    +             * left out, all listeners will be returned
    +             * @return {Object} the listener. Contains the following fields:
    +             * &nbsp;&nbsp;type:   (string)   the type of event
    +             * &nbsp;&nbsp;fn:     (function) the callback supplied to addListener
    +             * &nbsp;&nbsp;obj:    (object)   the custom object supplied to addListener
    +             * &nbsp;&nbsp;adjust: (boolean)  whether or not to adjust the default scope
    +             * &nbsp;&nbsp;index:  (int)      its position in the Event util listener cache
    +             * @static
    +             */           
    +            getListeners: function(el, sType) {
    +                var elListeners = [];
    +                if (listeners && listeners.length > 0) {
    +                    for (var i=0,len=listeners.length; i<len ; ++i) {
    +                        var l = listeners[i];
    +                        if ( l  && l[this.EL] === el && 
    +                                (!sType || sType === l[this.TYPE]) ) {
    +                            elListeners.push({
    +                                type:   l[this.TYPE],
    +                                fn:     l[this.FN],
    +                                obj:    l[this.OBJ],
    +                                adjust: l[this.ADJ_SCOPE],
    +                                index:  i
    +                            });
    +                        }
    +                    }
    +                }
    +
    +                return (elListeners.length) ? elListeners : null;
    +            },
    +
    +            /**
    +             * Removes all listeners registered by pe.event.  Called 
    +             * automatically during the unload event.
    +             * @method _unload
    +             * @static
    +             * @private
    +             */
    +            _unload: function(e) {
    +
    +                var EU = YAHOO.util.Event, i, j, l, len, index;
    +
    +                for (i=0,len=unloadListeners.length; i<len; ++i) {
    +                    l = unloadListeners[i];
    +                    if (l) {
    +                        var scope = window;
    +                        if (l[EU.ADJ_SCOPE]) {
    +                            if (l[EU.ADJ_SCOPE] === true) {
    +                                scope = l[EU.OBJ];
    +                            } else {
    +                                scope = l[EU.ADJ_SCOPE];
    +                            }
    +                        }
    +                        l[EU.FN].call(scope, EU.getEvent(e), l[EU.OBJ] );
    +                        delete unloadListeners[i];
    +                        l=null;
    +                        scope=null;
    +                    }
    +                }
    +
    +                if (listeners && listeners.length > 0) {
    +                    j = listeners.length;
    +                    while (j) {
    +                        index = j-1;
    +                        l = listeners[index];
    +                        if (l) {
    +                            EU.removeListener(l[EU.EL], l[EU.TYPE], 
    +                                    l[EU.FN], index);
    +                        } 
    +                        j = j - 1;
    +                    }
    +                    l=null;
    +
    +                    EU.clearCache();
    +                }
    +
    +                for (i=0,len=legacyEvents.length; i<len; ++i) {
    +                    // dereference the element
    +                    delete legacyEvents[i][0];
    +                    // delete the array item
    +                    delete legacyEvents[i];
    +                }
    +
    +                EU._simpleRemove(window, "unload", EU._unload);
    +
    +            },
    +
    +            /**
    +             * Returns scrollLeft
    +             * @method _getScrollLeft
    +             * @static
    +             * @private
    +             */
    +            _getScrollLeft: function() {
    +                return this._getScroll()[1];
    +            },
    +
    +            /**
    +             * Returns scrollTop
    +             * @method _getScrollTop
    +             * @static
    +             * @private
    +             */
    +            _getScrollTop: function() {
    +                return this._getScroll()[0];
    +            },
    +
    +            /**
    +             * Returns the scrollTop and scrollLeft.  Used to calculate the 
    +             * pageX and pageY in Internet Explorer
    +             * @method _getScroll
    +             * @static
    +             * @private
    +             */
    +            _getScroll: function() {
    +                var dd = document.documentElement, db = document.body;
    +                if (dd && (dd.scrollTop || dd.scrollLeft)) {
    +                    return [dd.scrollTop, dd.scrollLeft];
    +                } else if (db) {
    +                    return [db.scrollTop, db.scrollLeft];
    +                } else {
    +                    return [0, 0];
    +                }
    +            },
    +
    +            /**
    +             * Adds a DOM event directly without the caching, cleanup, scope adj, etc
    +             *
    +             * @method _simpleAdd
    +             * @param {HTMLElement} el      the element to bind the handler to
    +             * @param {string}      sType   the type of event handler
    +             * @param {function}    fn      the callback to invoke
    +             * @param {boolen}      capture capture or bubble phase
    +             * @static
    +             * @private
    +             */
    +            _simpleAdd: function () {
    +                if (window.addEventListener) {
    +                    return function(el, sType, fn, capture) {
    +                        el.addEventListener(sType, fn, (capture));
    +                    };
    +                } else if (window.attachEvent) {
    +                    return function(el, sType, fn, capture) {
    +                        el.attachEvent("on" + sType, fn);
    +                    };
    +                } else {
    +                    return function(){};
    +                }
    +            }(),
    +
    +            /**
    +             * Basic remove listener
    +             *
    +             * @method _simpleRemove
    +             * @param {HTMLElement} el      the element to bind the handler to
    +             * @param {string}      sType   the type of event handler
    +             * @param {function}    fn      the callback to invoke
    +             * @param {boolen}      capture capture or bubble phase
    +             * @static
    +             * @private
    +             */
    +            _simpleRemove: function() {
    +                if (window.removeEventListener) {
    +                    return function (el, sType, fn, capture) {
    +                        el.removeEventListener(sType, fn, (capture));
    +                    };
    +                } else if (window.detachEvent) {
    +                    return function (el, sType, fn) {
    +                        el.detachEvent("on" + sType, fn);
    +                    };
    +                } else {
    +                    return function(){};
    +                }
    +            }()
    +        };
    +
    +    }();
    +
    +    (function() {
    +        var EU = YAHOO.util.Event;
    +
    +        /**
    +         * YAHOO.util.Event.on is an alias for addListener
    +         * @method on
    +         * @see addListener
    +         * @static
    +         */
    +        EU.on = EU.addListener;
    +
    +        // YAHOO.mix(EU, YAHOO.util.EventProvider.prototype);
    +        // EU.createEvent("DOMContentReady");
    +        // EU.subscribe("DOMContentReady", EU._load);
    +
    +        if (document && document.body) {
    +            EU._load();
    +        } else {
    +            // EU._simpleAdd(document, "DOMContentLoaded", EU._load);
    +            EU._simpleAdd(window, "load", EU._load);
    +        }
    +        EU._simpleAdd(window, "unload", EU._unload);
    +        EU._tryPreloadAttach();
    +    })();
    +}
    +
    +/**
    + * EventProvider is designed to be used with YAHOO.augment to wrap 
    + * CustomEvents in an interface that allows events to be subscribed to 
    + * and fired by name.  This makes it possible for implementing code to
    + * subscribe to an event that either has not been created yet, or will
    + * not be created at all.
    + *
    + * @Class EventProvider
    + */
    +YAHOO.util.EventProvider = function() { };
    +
    +YAHOO.util.EventProvider.prototype = {
    +
    +    /**
    +     * Private storage of custom events
    +     * @property __yui_events
    +     * @type Object[]
    +     * @private
    +     */
    +    __yui_events: null,
    +
    +    /**
    +     * Private storage of custom event subscribers
    +     * @property __yui_subscribers
    +     * @type Object[]
    +     * @private
    +     */
    +    __yui_subscribers: null,
    +    
    +    /**
    +     * Subscribe to a CustomEvent by event type
    +     *
    +     * @method subscribe
    +     * @param p_type     {string}   the type, or name of the event
    +     * @param p_fn       {function} the function to exectute when the event fires
    +     * @param p_obj
    +     * @param p_obj      {Object}   An object to be passed along when the event 
    +     *                              fires
    +     * @param p_override {boolean}  If true, the obj passed in becomes the 
    +     *                              execution scope of the listener
    +     */
    +    subscribe: function(p_type, p_fn, p_obj, p_override) {
    +
    +        this.__yui_events = this.__yui_events || {};
    +        var ce = this.__yui_events[p_type];
    +
    +        if (ce) {
    +            ce.subscribe(p_fn, p_obj, p_override);
    +        } else {
    +            this.__yui_subscribers = this.__yui_subscribers || {};
    +            var subs = this.__yui_subscribers;
    +            if (!subs[p_type]) {
    +                subs[p_type] = [];
    +            }
    +            subs[p_type].push(
    +                { fn: p_fn, obj: p_obj, override: p_override } );
    +        }
    +    },
    +
    +    /**
    +     * Unsubscribes the from the specified event
    +     * @method unsubscribe
    +     * @param p_type {string}   The type, or name of the event
    +     * @param p_fn   {Function} The function to execute
    +     * @param p_obj  {Object}   The custom object passed to subscribe (optional)
    +     * @return {boolean} true if the subscriber was found and detached.
    +     */
    +    unsubscribe: function(p_type, p_fn, p_obj) {
    +        this.__yui_events = this.__yui_events || {};
    +        var ce = this.__yui_events[p_type];
    +        if (ce) {
    +            return ce.unsubscribe(p_fn, p_obj);
    +        } else {
    +            return false;
    +        }
    +    },
    +
    +    /**
    +     * Creates a new custom event of the specified type.  If a custom event
    +     * by that name already exists, it will not be re-created.  In either
    +     * case the custom event is returned. 
    +     *
    +     * @method createEvent
    +     *
    +     * @param p_type {string} the type, or name of the event
    +     * @param p_config {object} optional config params.  Valid properties are:
    +     *
    +     *  <ul>
    +     *    <li>
    +     *      scope: defines the default execution scope.  If not defined
    +     *      the default scope will be this instance.
    +     *    </li>
    +     *    <li>
    +     *      silent: if true, the custom event will not generate log messages.
    +     *      This is false by default.
    +     *    </li>
    +     *    <li>
    +     *      onSubscribeCallback: specifies a callback to execute when the
    +     *      event has a new subscriber.  This will fire immediately for
    +     *      each queued subscriber if any exist prior to the creation of
    +     *      the event.
    +     *    </li>
    +     *  </ul>
    +     *
    +     *  @return {CustomEvent} the custom event
    +     *
    +     */
    +    createEvent: function(p_type, p_config) {
    +
    +        this.__yui_events = this.__yui_events || {};
    +        var opts = p_config || {};
    +        var events = this.__yui_events;
    +
    +        if (events[p_type]) {
    +        } else {
    +
    +            var scope  = opts.scope  || this;
    +            var silent = opts.silent || null;
    +
    +            var ce = new YAHOO.util.CustomEvent(p_type, scope, silent,
    +                    YAHOO.util.CustomEvent.FLAT);
    +            events[p_type] = ce;
    +
    +            if (opts.onSubscribeCallback) {
    +                ce.subscribeEvent.subscribe(opts.onSubscribeCallback);
    +            }
    +
    +            this.__yui_subscribers = this.__yui_subscribers || {};
    +            var qs = this.__yui_subscribers[p_type];
    +
    +            if (qs) {
    +                for (var i=0; i<qs.length; ++i) {
    +                    ce.subscribe(qs[i].fn, qs[i].obj, qs[i].override);
    +                }
    +            }
    +        }
    +
    +        return events[p_type];
    +    },
    +
    +   /**
    +     * Fire a custom event by name.  The callback functions will be executed
    +     * from the scope specified when the event was created, and with the 
    +     * following parameters:
    +     *   <ul>
    +     *   <li>The first argument fire() was executed with</li>
    +     *   <li>The custom object (if any) that was passed into the subscribe() 
    +     *       method</li>
    +     *   </ul>
    +     * @method fireEvent
    +     * @param p_type    {string}  the type, or name of the event
    +     * @param arguments {Object*} an arbitrary set of parameters to pass to 
    +     *                            the handler.
    +     * @return {boolean} the return value from CustomEvent.fire, or null if 
    +     *                   the custom event does not exist.
    +     */
    +    fireEvent: function(p_type, arg1, arg2, etc) {
    +
    +        this.__yui_events = this.__yui_events || {};
    +        var ce = this.__yui_events[p_type];
    +
    +        if (ce) {
    +            var args = [];
    +            for (var i=1; i<arguments.length; ++i) {
    +                args.push(arguments[i]);
    +            }
    +            return ce.fire.apply(ce, args);
    +        } else {
    +            return null;
    +        }
    +    },
    +
    +    /**
    +     * Returns true if the custom event of the provided type has been created
    +     * with createEvent.
    +     * @method hasEvent
    +     * @param type {string} the type, or name of the event
    +     */
    +    hasEvent: function(type) {
    +        if (this.__yui_events) {
    +            if (this.__yui_events[type]) {
    +                return true;
    +            }
    +        }
    +        return false;
    +    }
    +
    +};
    +
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/logger.js.html b/www/extras/yui-ext/docs/output/logger.js.html new file mode 100644 index 000000000..2f10737af --- /dev/null +++ b/www/extras/yui-ext/docs/output/logger.js.html @@ -0,0 +1,1568 @@ +logger.js
    /*
    
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    
    +Code licensed under the BSD License:
    
    +http://developer.yahoo.com/yui/license.txt
    
    +version: 0.12.0
    
    +*/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * The LogMsg class defines a single log message.
    
    + *
    
    + * @class YAHOO.widget.LogMsg
    
    + * @constructor
    
    + * @param oConfigs {Object} Object literal of configuration params.
    
    + */
    
    + YAHOO.widget.LogMsg = function(oConfigs) {
    
    +    // Parse configs
    
    +    if (typeof oConfigs == "object") {
    
    +        for(var param in oConfigs) {
    
    +            this[param] = oConfigs[param];
    
    +        }
    
    +    }
    
    + };
    
    + 
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Log message.
    
    + *
    
    + * @property msg
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogMsg.prototype.msg = null;
    
    + 
    
    +/**
    
    + * Log timestamp.
    
    + *
    
    + * @property time
    
    + * @type Date
    
    + */
    
    +YAHOO.widget.LogMsg.prototype.time = null;
    
    +
    
    +/**
    
    + * Log category.
    
    + *
    
    + * @property category
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogMsg.prototype.category = null;
    
    +
    
    +/**
    
    + * Log source. The first word passed in as the source argument.
    
    + *
    
    + * @property source
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogMsg.prototype.source = null;
    
    +
    
    +/**
    
    + * Log source detail. The remainder of the string passed in as the source argument, not
    
    + * including the first word (if any).
    
    + *
    
    + * @property sourceDetail
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogMsg.prototype.sourceDetail = null;
    
    +
    
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * The LogWriter class provides a mechanism to log messages through
    
    + * YAHOO.widget.Logger from a named source.
    
    + *
    
    + * @class YAHOO.widget.LogWriter
    
    + * @constructor
    
    + * @param sSource {String} Source of LogWriter instance.
    
    + */
    
    +YAHOO.widget.LogWriter = function(sSource) {
    
    +    if(!sSource) {
    
    +        YAHOO.log("Could not instantiate LogWriter due to invalid source.",
    
    +            "error", "LogWriter");
    
    +        return;
    
    +    }
    
    +    this._source = sSource;
    
    + };
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    + /**
    
    + * Public accessor to the unique name of the LogWriter instance.
    
    + *
    
    + * @method toString
    
    + * @return {String} Unique name of the LogWriter instance.
    
    + */
    
    +YAHOO.widget.LogWriter.prototype.toString = function() {
    
    +    return "LogWriter " + this._sSource;
    
    +};
    
    +
    
    +/**
    
    + * Logs a message attached to the source of the LogWriter.
    
    + *
    
    + * @method log
    
    + * @param sMsg {String} The log message.
    
    + * @param sCategory {String} Category name.
    
    + */
    
    +YAHOO.widget.LogWriter.prototype.log = function(sMsg, sCategory) {
    
    +    YAHOO.widget.Logger.log(sMsg, sCategory, this._source);
    
    +};
    
    +
    
    +/**
    
    + * Public accessor to get the source name.
    
    + *
    
    + * @method getSource
    
    + * @return {String} The LogWriter source.
    
    + */
    
    +YAHOO.widget.LogWriter.prototype.getSource = function() {
    
    +    return this._sSource;
    
    +};
    
    +
    
    +/**
    
    + * Public accessor to set the source name.
    
    + *
    
    + * @method setSource
    
    + * @param sSource {String} Source of LogWriter instance.
    
    + */
    
    +YAHOO.widget.LogWriter.prototype.setSource = function(sSource) {
    
    +    if(!sSource) {
    
    +        YAHOO.log("Could not set source due to invalid source.", "error", this.toString());
    
    +        return;
    
    +    }
    
    +    else {
    
    +        this._sSource = sSource;
    
    +    }
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Source of the LogWriter instance.
    
    + *
    
    + * @property _source
    
    + * @type String
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogWriter.prototype._source = null;
    
    +
    
    +
    
    +
    
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * The LogReader class provides UI to read messages logged to YAHOO.widget.Logger.
    
    + *
    
    + * @class YAHOO.widget.LogReader
    
    + * @constructor
    
    + * @param elContainer {HTMLElement} (optional) DOM element reference of an existing DIV.
    
    + * @param elContainer {String} (optional) String ID of an existing DIV.
    
    + * @param oConfigs {Object} (optional) Object literal of configuration params.
    
    + */
    
    +YAHOO.widget.LogReader = function(elContainer, oConfigs) {
    
    +    var oSelf = this;
    
    +    this._sName = YAHOO.widget.LogReader._index;
    
    +    YAHOO.widget.LogReader._index++;
    
    +
    
    +    // Parse config vars here
    
    +    if (typeof oConfigs == "object") {
    
    +        for(var param in oConfigs) {
    
    +            this[param] = oConfigs[param];
    
    +        }
    
    +    }
    
    +
    
    +    // Attach container...
    
    +    if(elContainer) {
    
    +        if(typeof elContainer == "string") {
    
    +            this._elContainer = document.getElementById(elContainer);
    
    +        }
    
    +        else if(elContainer.tagName) {
    
    +            this._elContainer = elContainer;
    
    +        }
    
    +        this._elContainer.className = "yui-log";
    
    +    }
    
    +    // ...or create container from scratch
    
    +    if(!this._elContainer) {
    
    +        if(YAHOO.widget.LogReader._elDefaultContainer) {
    
    +            this._elContainer =  YAHOO.widget.LogReader._elDefaultContainer;
    
    +        }
    
    +        else {
    
    +            this._elContainer = document.body.appendChild(document.createElement("div"));
    
    +            this._elContainer.id = "yui-log";
    
    +            this._elContainer.className = "yui-log";
    
    +
    
    +            YAHOO.widget.LogReader._elDefaultContainer = this._elContainer;
    
    +        }
    
    +
    
    +        // If implementer has provided container values, trust and set those
    
    +        var containerStyle = this._elContainer.style;
    
    +        if(this.width) {
    
    +            containerStyle.width = this.width;
    
    +        }
    
    +        if(this.left) {
    
    +            containerStyle.left = this.left;
    
    +        }
    
    +        if(this.right) {
    
    +            containerStyle.right = this.right;
    
    +        }
    
    +        if(this.bottom) {
    
    +            containerStyle.bottom = this.bottom;
    
    +        }
    
    +        if(this.top) {
    
    +            containerStyle.top = this.top;
    
    +        }
    
    +        if(this.fontSize) {
    
    +            containerStyle.fontSize = this.fontSize;
    
    +        }
    
    +    }
    
    +
    
    +    if(this._elContainer) {
    
    +        // Create header
    
    +        if(!this._elHd) {
    
    +            this._elHd = this._elContainer.appendChild(document.createElement("div"));
    
    +            this._elHd.id = "yui-log-hd" + this._sName;
    
    +            this._elHd.className = "yui-log-hd";
    
    +
    
    +            this._elCollapse = this._elHd.appendChild(document.createElement("div"));
    
    +            this._elCollapse.className = "yui-log-btns";
    
    +
    
    +            this._btnCollapse = document.createElement("input");
    
    +            this._btnCollapse.type = "button";
    
    +            this._btnCollapse.style.fontSize =
    
    +                YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");
    
    +            this._btnCollapse.className = "yui-log-button";
    
    +            this._btnCollapse.value = "Collapse";
    
    +            this._btnCollapse = this._elCollapse.appendChild(this._btnCollapse);
    
    +            YAHOO.util.Event.addListener(
    
    +                oSelf._btnCollapse,'click',oSelf._onClickCollapseBtn,oSelf);
    
    +
    
    +            this._title = this._elHd.appendChild(document.createElement("h4"));
    
    +            this._title.innerHTML = "Logger Console";
    
    +
    
    +            // If Drag and Drop utility is available...
    
    +            // ...and this container was created from scratch...
    
    +            // ...then make the header draggable
    
    +            if(YAHOO.util.DD &&
    
    +            (YAHOO.widget.LogReader._elDefaultContainer == this._elContainer)) {
    
    +                var ylog_dd = new YAHOO.util.DD(this._elContainer.id);
    
    +                ylog_dd.setHandleElId(this._elHd.id);
    
    +                this._elHd.style.cursor = "move";
    
    +            }
    
    +        }
    
    +        // Ceate console
    
    +        if(!this._elConsole) {
    
    +            this._elConsole =
    
    +                this._elContainer.appendChild(document.createElement("div"));
    
    +            this._elConsole.className = "yui-log-bd";
    
    +
    
    +            // If implementer has provided console, trust and set those
    
    +            if(this.height) {
    
    +                this._elConsole.style.height = this.height;
    
    +            }
    
    +        }
    
    +        // Don't create footer if disabled
    
    +        if(!this._elFt && this.footerEnabled) {
    
    +            this._elFt = this._elContainer.appendChild(document.createElement("div"));
    
    +            this._elFt.className = "yui-log-ft";
    
    +
    
    +            this._elBtns = this._elFt.appendChild(document.createElement("div"));
    
    +            this._elBtns.className = "yui-log-btns";
    
    +
    
    +            this._btnPause = document.createElement("input");
    
    +            this._btnPause.type = "button";
    
    +            this._btnPause.style.fontSize =
    
    +                YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");
    
    +            this._btnPause.className = "yui-log-button";
    
    +            this._btnPause.value = "Pause";
    
    +            this._btnPause = this._elBtns.appendChild(this._btnPause);
    
    +            YAHOO.util.Event.addListener(
    
    +                oSelf._btnPause,'click',oSelf._onClickPauseBtn,oSelf);
    
    +
    
    +            this._btnClear = document.createElement("input");
    
    +            this._btnClear.type = "button";
    
    +            this._btnClear.style.fontSize =
    
    +                YAHOO.util.Dom.getStyle(this._elContainer,"fontSize");
    
    +            this._btnClear.className = "yui-log-button";
    
    +            this._btnClear.value = "Clear";
    
    +            this._btnClear = this._elBtns.appendChild(this._btnClear);
    
    +            YAHOO.util.Event.addListener(
    
    +                oSelf._btnClear,'click',oSelf._onClickClearBtn,oSelf);
    
    +
    
    +            this._elCategoryFilters = this._elFt.appendChild(document.createElement("div"));
    
    +            this._elCategoryFilters.className = "yui-log-categoryfilters";
    
    +            this._elSourceFilters = this._elFt.appendChild(document.createElement("div"));
    
    +            this._elSourceFilters.className = "yui-log-sourcefilters";
    
    +        }
    
    +    }
    
    +
    
    +    // Initialize internal vars
    
    +    if(!this._buffer) {
    
    +        this._buffer = []; // output buffer
    
    +    }
    
    +    // Timestamp of last log message to console
    
    +    this._lastTime = YAHOO.widget.Logger.getStartTime(); 
    
    +    
    
    +    // Subscribe to Logger custom events
    
    +    YAHOO.widget.Logger.newLogEvent.subscribe(this._onNewLog, this);
    
    +    YAHOO.widget.Logger.logResetEvent.subscribe(this._onReset, this);
    
    +
    
    +    // Initialize category filters
    
    +    this._categoryFilters = [];
    
    +    var catsLen = YAHOO.widget.Logger.categories.length;
    
    +    if(this._elCategoryFilters) {
    
    +        for(var i=0; i < catsLen; i++) {
    
    +            this._createCategoryCheckbox(YAHOO.widget.Logger.categories[i]);
    
    +        }
    
    +    }
    
    +    // Initialize source filters
    
    +    this._sourceFilters = [];
    
    +    var sourcesLen = YAHOO.widget.Logger.sources.length;
    
    +    if(this._elSourceFilters) {
    
    +        for(var j=0; j < sourcesLen; j++) {
    
    +            this._createSourceCheckbox(YAHOO.widget.Logger.sources[j]);
    
    +        }
    
    +    }
    
    +    YAHOO.widget.Logger.categoryCreateEvent.subscribe(this._onCategoryCreate, this);
    
    +    YAHOO.widget.Logger.sourceCreateEvent.subscribe(this._onSourceCreate, this);
    
    +
    
    +    this._filterLogs();
    
    +    YAHOO.log("LogReader initialized", null, this.toString());
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Whether or not the log reader is enabled to output log messages.
    
    + *
    
    + * @property logReaderEnabled
    
    + * @type Boolean
    
    + * @default true
    
    + */
    
    +YAHOO.widget.LogReader.prototype.logReaderEnabled = true;
    
    +
    
    +/**
    
    + * Public member to access CSS width of the log reader container.
    
    + *
    
    + * @property width
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.width = null;
    
    +
    
    +/**
    
    + * Public member to access CSS height of the log reader container.
    
    + *
    
    + * @property height
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.height = null;
    
    +
    
    +/**
    
    + * Public member to access CSS top position of the log reader container.
    
    + *
    
    + * @property top
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.top = null;
    
    +
    
    +/**
    
    + * Public member to access CSS left position of the log reader container.
    
    + *
    
    + * @property left
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.left = null;
    
    +
    
    +/**
    
    + * Public member to access CSS right position of the log reader container.
    
    + *
    
    + * @property right
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.right = null;
    
    +
    
    +/**
    
    + * Public member to access CSS bottom position of the log reader container.
    
    + *
    
    + * @property bottom
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.bottom = null;
    
    +
    
    +/**
    
    + * Public member to access CSS font size of the log reader container.
    
    + *
    
    + * @property fontSize
    
    + * @type String
    
    + */
    
    +YAHOO.widget.LogReader.prototype.fontSize = null;
    
    +
    
    +/**
    
    + * Whether or not the footer UI is enabled for the log reader.
    
    + *
    
    + * @property footerEnabled
    
    + * @type Boolean
    
    + * @default true
    
    + */
    
    +YAHOO.widget.LogReader.prototype.footerEnabled = true;
    
    +
    
    +/**
    
    + * Whether or not output is verbose (more readable). Setting to true will make
    
    + * output more compact (less readable).
    
    + *
    
    + * @property verboseOutput
    
    + * @type Boolean
    
    + * @default true
    
    + */
    
    +YAHOO.widget.LogReader.prototype.verboseOutput = true;
    
    +
    
    +/**
    
    + * Whether or not newest message is printed on top.
    
    + *
    
    + * @property newestOnTop
    
    + * @type Boolean
    
    + */
    
    +YAHOO.widget.LogReader.prototype.newestOnTop = true;
    
    +
    
    +/**
    
    + * Maximum number of messages a LogReader console will display.
    
    + *
    
    + * @property thresholdMax
    
    + * @type Number
    
    + * @default 500
    
    + */
    
    +YAHOO.widget.LogReader.prototype.thresholdMax = 500;
    
    +
    
    +/**
    
    + * When a LogReader console reaches its thresholdMax, it will clear out messages
    
    + * and print out the latest thresholdMin number of messages.
    
    + *
    
    + * @property thresholdMin
    
    + * @type Number
    
    + * @default 100
    
    + */
    
    +YAHOO.widget.LogReader.prototype.thresholdMin = 100;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    + /**
    
    + * Public accessor to the unique name of the LogReader instance.
    
    + *
    
    + * @method toString
    
    + * @return {String} Unique name of the LogReader instance.
    
    + */
    
    +YAHOO.widget.LogReader.prototype.toString = function() {
    
    +    return "LogReader instance" + this._sName;
    
    +};
    
    +/**
    
    + * Pauses output of log messages. While paused, log messages are not lost, but
    
    + * get saved to a buffer and then output upon resume of log reader.
    
    + *
    
    + * @method pause
    
    + */
    
    +YAHOO.widget.LogReader.prototype.pause = function() {
    
    +    this._timeout = null;
    
    +    this.logReaderEnabled = false;
    
    +};
    
    +
    
    +/**
    
    + * Resumes output of log messages, including outputting any log messages that
    
    + * have been saved to buffer while paused.
    
    + *
    
    + * @method resume
    
    + */
    
    +YAHOO.widget.LogReader.prototype.resume = function() {
    
    +    this.logReaderEnabled = true;
    
    +    this._printBuffer();
    
    +};
    
    +
    
    +/**
    
    + * Hides UI of log reader. Logging functionality is not disrupted.
    
    + *
    
    + * @method hide
    
    + */
    
    +YAHOO.widget.LogReader.prototype.hide = function() {
    
    +    this._elContainer.style.display = "none";
    
    +};
    
    +
    
    +/**
    
    + * Shows UI of log reader. Logging functionality is not disrupted.
    
    + *
    
    + * @method show
    
    + */
    
    +YAHOO.widget.LogReader.prototype.show = function() {
    
    +    this._elContainer.style.display = "block";
    
    +};
    
    +
    
    +/**
    
    + * Updates title to given string.
    
    + *
    
    + * @method setTitle
    
    + * @param sTitle {String} New title.
    
    + */
    
    +YAHOO.widget.LogReader.prototype.setTitle = function(sTitle) {
    
    +    this._title.innerHTML = this.html2Text(sTitle);
    
    +};
    
    +
    
    +/**
    
    + * Gets timestamp of the last log.
    
    + *
    
    + * @method getLastTime
    
    + * @return {Date} Timestamp of the last log.
    
    + */
    
    +YAHOO.widget.LogReader.prototype.getLastTime = function() {
    
    +    return this._lastTime;
    
    +};
    
    +
    
    +/**
    
    + * Formats message string to HTML for output to console.
    
    + *
    
    + * @method formatMsg
    
    + * @param oLogMsg {Object} Log message object.
    
    + * @return {String} HTML-formatted message for output to console.
    
    + */
    
    +YAHOO.widget.LogReader.prototype.formatMsg = function(oLogMsg) {
    
    +    var category = oLogMsg.category;
    
    +    
    
    +    // Label for color-coded display
    
    +    var label = category.substring(0,4).toUpperCase();
    
    +
    
    +    // Calculate the elapsed time to be from the last item that passed through the filter,
    
    +    // not the absolute previous item in the stack
    
    +
    
    +    var time = oLogMsg.time;
    
    +    if (time.toLocaleTimeString) {
    
    +        var localTime  = time.toLocaleTimeString();
    
    +    }
    
    +    else {
    
    +        localTime = time.toString();
    
    +    }
    
    +
    
    +    var msecs = time.getTime();
    
    +    var startTime = YAHOO.widget.Logger.getStartTime();
    
    +    var totalTime = msecs - startTime;
    
    +    var elapsedTime = msecs - this.getLastTime();
    
    +
    
    +    var source = oLogMsg.source;
    
    +    var sourceDetail = oLogMsg.sourceDetail;
    
    +    var sourceAndDetail = (sourceDetail) ?
    
    +        source + " " + sourceDetail : source;
    
    +        
    
    +    // Escape HTML entities in the log message itself for output to console
    
    +    var msg = this.html2Text(oLogMsg.msg);
    
    +
    
    +    // Verbose output includes extra line breaks
    
    +    var output =  (this.verboseOutput) ?
    
    +        ["<p><span class='", category, "'>", label, "</span> ",
    
    +        totalTime, "ms (+", elapsedTime, ") ",
    
    +        localTime, ": ",
    
    +        "</p><p>",
    
    +        sourceAndDetail,
    
    +        ": </p><p>",
    
    +        msg,
    
    +        "</p>"] :
    
    +
    
    +        ["<p><span class='", category, "'>", label, "</span> ",
    
    +        totalTime, "ms (+", elapsedTime, ") ",
    
    +        localTime, ": ",
    
    +        sourceAndDetail, ": ",
    
    +        msg,"</p>"];
    
    +
    
    +    return output.join("");
    
    +};
    
    +
    
    +/**
    
    + * Converts input chars "<", ">", and "&" to HTML entities.
    
    + *
    
    + * @method html2Text
    
    + * @param sHtml {String} String to convert.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype.html2Text = function(sHtml) {
    
    +    if(sHtml) {
    
    +        sHtml += "";
    
    +        return sHtml.replace(/&/g, "&#38;").replace(/</g, "&#60;").replace(/>/g, "&#62;");
    
    +    }
    
    +    return "";
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private member variables
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Internal class member to index multiple log reader instances.
    
    + *
    
    + * @property _memberName
    
    + * @static
    
    + * @type Number
    
    + * @default 0
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader._index = 0;
    
    +
    
    +/**
    
    + * Name of LogReader instance.
    
    + *
    
    + * @property _sName
    
    + * @type String
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._sName = null;
    
    +
    
    +/**
    
    + * A class member shared by all log readers if a container needs to be
    
    + * created during instantiation. Will be null if a container element never needs to
    
    + * be created on the fly, such as when the implementer passes in their own element.
    
    + *
    
    + * @property _elDefaultContainer
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader._elDefaultContainer = null;
    
    +
    
    +/**
    
    + * Buffer of log message objects for batch output.
    
    + *
    
    + * @property _buffer
    
    + * @type Object[]
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._buffer = null;
    
    +
    
    +/**
    
    + * Number of log messages output to console.
    
    + *
    
    + * @property _consoleMsgCount
    
    + * @type Number
    
    + * @default 0
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._consoleMsgCount = 0;
    
    +
    
    +/**
    
    + * Date of last output log message.
    
    + *
    
    + * @property _lastTime
    
    + * @type Date
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._lastTime = null;
    
    +
    
    +/**
    
    + * Batched output timeout ID.
    
    + *
    
    + * @property _timeout
    
    + * @type Number
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._timeout = null;
    
    +
    
    +/**
    
    + * Array of filters for log message categories.
    
    + *
    
    + * @property _categoryFilters
    
    + * @type String[]
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._categoryFilters = null;
    
    +
    
    +/**
    
    + * Array of filters for log message sources.
    
    + *
    
    + * @property _sourceFilters
    
    + * @type String[]
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._sourceFilters = null;
    
    +
    
    +/**
    
    + * Log reader container element.
    
    + *
    
    + * @property _elContainer
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elContainer = null;
    
    +
    
    +/**
    
    + * Log reader header element.
    
    + *
    
    + * @property _elHd
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elHd = null;
    
    +
    
    +/**
    
    + * Log reader collapse element.
    
    + *
    
    + * @property _elCollapse
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elCollapse = null;
    
    +
    
    +/**
    
    + * Log reader collapse button element.
    
    + *
    
    + * @property _btnCollapse
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._btnCollapse = null;
    
    +
    
    +/**
    
    + * Log reader title header element.
    
    + *
    
    + * @property _title
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._title = null;
    
    +
    
    +/**
    
    + * Log reader console element.
    
    + *
    
    + * @property _elConsole
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elConsole = null;
    
    +
    
    +/**
    
    + * Log reader footer element.
    
    + *
    
    + * @property _elFt
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elFt = null;
    
    +
    
    +/**
    
    + * Log reader buttons container element.
    
    + *
    
    + * @property _elBtns
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elBtns = null;
    
    +
    
    +/**
    
    + * Container element for log reader category filter checkboxes.
    
    + *
    
    + * @property _elCategoryFilters
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elCategoryFilters = null;
    
    +
    
    +/**
    
    + * Container element for log reader source filter checkboxes.
    
    + *
    
    + * @property _elSourceFilters
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._elSourceFilters = null;
    
    +
    
    +/**
    
    + * Log reader pause button element.
    
    + *
    
    + * @property _btnPause
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._btnPause = null;
    
    +
    
    +/**
    
    + * Clear button element.
    
    + *
    
    + * @property _btnClear
    
    + * @type HTMLElement
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._btnClear = null;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Creates the UI for a category filter in the log reader footer element.
    
    + *
    
    + * @method _createCategoryCheckbox
    
    + * @param sCategory {String} Category name.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._createCategoryCheckbox = function(sCategory) {
    
    +    var oSelf = this;
    
    +
    
    +    if(this._elFt) {
    
    +        var elParent = this._elCategoryFilters;
    
    +        var filters = this._categoryFilters;
    
    +
    
    +        var elFilter = elParent.appendChild(document.createElement("span"));
    
    +        elFilter.className = "yui-log-filtergrp";
    
    +            // Append el at the end so IE 5.5 can set "type" attribute
    
    +            // and THEN set checked property
    
    +            var chkCategory = document.createElement("input");
    
    +            chkCategory.id = "yui-log-filter-" + sCategory + this._sName;
    
    +            chkCategory.className = "yui-log-filter-" + sCategory;
    
    +            chkCategory.type = "checkbox";
    
    +            chkCategory.category = sCategory;
    
    +            chkCategory = elFilter.appendChild(chkCategory);
    
    +            chkCategory.checked = true;
    
    +
    
    +            // Add this checked filter to the internal array of filters
    
    +            filters.push(sCategory);
    
    +            // Subscribe to the click event
    
    +            YAHOO.util.Event.addListener(chkCategory,'click',oSelf._onCheckCategory,oSelf);
    
    +
    
    +            // Create and class the text label
    
    +            var lblCategory = elFilter.appendChild(document.createElement("label"));
    
    +            lblCategory.htmlFor = chkCategory.id;
    
    +            lblCategory.className = sCategory;
    
    +            lblCategory.innerHTML = sCategory;
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Creates a checkbox in the log reader footer element to filter by source.
    
    + *
    
    + * @method _createSourceCheckbox
    
    + * @param sSource {String} Source name.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._createSourceCheckbox = function(sSource) {
    
    +    var oSelf = this;
    
    +
    
    +    if(this._elFt) {
    
    +        var elParent = this._elSourceFilters;
    
    +        var filters = this._sourceFilters;
    
    +
    
    +        var elFilter = elParent.appendChild(document.createElement("span"));
    
    +        elFilter.className = "yui-log-filtergrp";
    
    +
    
    +        // Append el at the end so IE 5.5 can set "type" attribute
    
    +        // and THEN set checked property
    
    +        var chkSource = document.createElement("input");
    
    +        chkSource.id = "yui-log-filter" + sSource + this._sName;
    
    +        chkSource.className = "yui-log-filter" + sSource;
    
    +        chkSource.type = "checkbox";
    
    +        chkSource.source = sSource;
    
    +        chkSource = elFilter.appendChild(chkSource);
    
    +        chkSource.checked = true;
    
    +
    
    +        // Add this checked filter to the internal array of filters
    
    +        filters.push(sSource);
    
    +        // Subscribe to the click event
    
    +        YAHOO.util.Event.addListener(chkSource,'click',oSelf._onCheckSource,oSelf);
    
    +
    
    +        // Create and class the text label
    
    +        var lblSource = elFilter.appendChild(document.createElement("label"));
    
    +        lblSource.htmlFor = chkSource.id;
    
    +        lblSource.className = sSource;
    
    +        lblSource.innerHTML = sSource;
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Reprints all log messages in the stack through filters.
    
    + *
    
    + * @method _filterLogs
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._filterLogs = function() {
    
    +    // Reprint stack with new filters
    
    +    if (this._elConsole !== null) {
    
    +        this._clearConsole();
    
    +        this._printToConsole(YAHOO.widget.Logger.getStack());
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Clears all outputted log messages from the console and resets the time of the
    
    + * last output log message.
    
    + *
    
    + * @method _clearConsole
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._clearConsole = function() {
    
    +    // Clear the buffer of any pending messages
    
    +    this._timeout = null;
    
    +    this._buffer = [];
    
    +    this._consoleMsgCount = 0;
    
    +
    
    +    // Reset the rolling timer
    
    +    this._lastTime = YAHOO.widget.Logger.getStartTime();
    
    +
    
    +    var elConsole = this._elConsole;
    
    +    while(elConsole.hasChildNodes()) {
    
    +        elConsole.removeChild(elConsole.firstChild);
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Sends buffer of log messages to output and clears buffer.
    
    + *
    
    + * @method _printBuffer
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._printBuffer = function() {
    
    +    this._timeout = null;
    
    +
    
    +    if(this._elConsole !== null) {
    
    +        var thresholdMax = this.thresholdMax;
    
    +        thresholdMax = (thresholdMax && !isNaN(thresholdMax)) ? thresholdMax : 500;
    
    +        if(this._consoleMsgCount < thresholdMax) {
    
    +            var entries = [];
    
    +            for (var i=0; i<this._buffer.length; i++) {
    
    +                entries[i] = this._buffer[i];
    
    +            }
    
    +            this._buffer = [];
    
    +            this._printToConsole(entries);
    
    +        }
    
    +        else {
    
    +            this._filterLogs();
    
    +        }
    
    +        
    
    +        if(!this.newestOnTop) {
    
    +            this._elConsole.scrollTop = this._elConsole.scrollHeight;
    
    +        }
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Cycles through an array of log messages, and outputs each one to the console
    
    + * if its category has not been filtered out.
    
    + *
    
    + * @method _printToConsole
    
    + * @param aEntries {Object[]} Array of LogMsg objects to output to console.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._printToConsole = function(aEntries) {
    
    +    // Manage the number of messages displayed in the console
    
    +    var entriesLen = aEntries.length;
    
    +    var thresholdMin = this.thresholdMin;
    
    +    if(isNaN(thresholdMin) || (thresholdMin > this.thresholdMax)) {
    
    +        thresholdMin = 0;
    
    +    }
    
    +    var entriesStartIndex = (entriesLen > thresholdMin) ? (entriesLen - thresholdMin) : 0;
    
    +    
    
    +    // Iterate through all log entries 
    
    +    var sourceFiltersLen = this._sourceFilters.length;
    
    +    var categoryFiltersLen = this._categoryFilters.length;
    
    +    for(var i=entriesStartIndex; i<entriesLen; i++) {
    
    +        // Print only the ones that filter through
    
    +        var okToPrint = false;
    
    +        var okToFilterCats = false;
    
    +
    
    +        // Get log message details
    
    +        var entry = aEntries[i];
    
    +        var source = entry.source;
    
    +        var category = entry.category;
    
    +
    
    +        for(var j=0; j<sourceFiltersLen; j++) {
    
    +            if(source == this._sourceFilters[j]) {
    
    +                okToFilterCats = true;
    
    +                break;
    
    +            }
    
    +        }
    
    +        if(okToFilterCats) {
    
    +            for(var k=0; k<categoryFiltersLen; k++) {
    
    +                if(category == this._categoryFilters[k]) {
    
    +                    okToPrint = true;
    
    +                    break;
    
    +                }
    
    +            }
    
    +        }
    
    +        if(okToPrint) {
    
    +            var output = this.formatMsg(entry);
    
    +
    
    +            // Verbose output uses <code> tag instead of <pre> tag (for wrapping)
    
    +            var container = (this.verboseOutput) ? "CODE" : "PRE";
    
    +            var oNewElement = (this.newestOnTop) ?
    
    +                this._elConsole.insertBefore(
    
    +                    document.createElement(container),this._elConsole.firstChild):
    
    +                this._elConsole.appendChild(document.createElement(container));
    
    +
    
    +            oNewElement.innerHTML = output;
    
    +            this._consoleMsgCount++;
    
    +            this._lastTime = entry.time.getTime();
    
    +        }
    
    +    }
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private event handlers
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Handles Logger's categoryCreateEvent.
    
    + *
    
    + * @method _onCategoryCreate
    
    + * @param sType {String} The event.
    
    + * @param aArgs {Object[]} Data passed from event firer.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onCategoryCreate = function(sType, aArgs, oSelf) {
    
    +    var category = aArgs[0];
    
    +    if(oSelf._elFt) {
    
    +        oSelf._createCategoryCheckbox(category);
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Handles Logger's sourceCreateEvent.
    
    + *
    
    + * @method _onSourceCreate
    
    + * @param sType {String} The event.
    
    + * @param aArgs {Object[]} Data passed from event firer.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onSourceCreate = function(sType, aArgs, oSelf) {
    
    +    var source = aArgs[0];
    
    +    if(oSelf._elFt) {
    
    +        oSelf._createSourceCheckbox(source);
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Handles check events on the category filter checkboxes.
    
    + *
    
    + * @method _onCheckCategory
    
    + * @param v {HTMLEvent} The click event.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onCheckCategory = function(v, oSelf) {
    
    +    var newFilter = this.category;
    
    +    var filtersArray = oSelf._categoryFilters;
    
    +
    
    +    if(!this.checked) { // Remove category from filters
    
    +        for(var i=0; i<filtersArray.length; i++) {
    
    +            if(newFilter == filtersArray[i]) {
    
    +                filtersArray.splice(i, 1);
    
    +                break;
    
    +            }
    
    +        }
    
    +    }
    
    +    else { // Add category to filters
    
    +        filtersArray.push(newFilter);
    
    +    }
    
    +    oSelf._filterLogs();
    
    +};
    
    +
    
    +/**
    
    + * Handles check events on the category filter checkboxes.
    
    + *
    
    + * @method _onCheckSource
    
    + * @param v {HTMLEvent} The click event.
    
    + * @param oSelf {Object} The log reader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onCheckSource = function(v, oSelf) {
    
    +    var newFilter = this.source;
    
    +    var filtersArray = oSelf._sourceFilters;
    
    +
    
    +    if(!this.checked) { // Remove category from filters
    
    +        for(var i=0; i<filtersArray.length; i++) {
    
    +            if(newFilter == filtersArray[i]) {
    
    +                filtersArray.splice(i, 1);
    
    +                break;
    
    +            }
    
    +        }
    
    +    }
    
    +    else { // Add category to filters
    
    +        filtersArray.push(newFilter);
    
    +    }
    
    +    oSelf._filterLogs();
    
    +};
    
    +
    
    +/**
    
    + * Handles click events on the collapse button.
    
    + *
    
    + * @method _onClickCollapseBtn
    
    + * @param v {HTMLEvent} The click event.
    
    + * @param oSelf {Object} The LogReader instance
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onClickCollapseBtn = function(v, oSelf) {
    
    +    var btn = oSelf._btnCollapse;
    
    +    if(btn.value == "Expand") {
    
    +        oSelf._elConsole.style.display = "block";
    
    +        if(oSelf._elFt) {
    
    +            oSelf._elFt.style.display = "block";
    
    +        }
    
    +        btn.value = "Collapse";
    
    +    }
    
    +    else {
    
    +        oSelf._elConsole.style.display = "none";
    
    +        if(oSelf._elFt) {
    
    +            oSelf._elFt.style.display = "none";
    
    +        }
    
    +        btn.value = "Expand";
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Handles click events on the pause button.
    
    + *
    
    + * @method _onClickPauseBtn
    
    + * @param v {HTMLEvent} The click event.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onClickPauseBtn = function(v, oSelf) {
    
    +    var btn = oSelf._btnPause;
    
    +    if(btn.value == "Resume") {
    
    +        oSelf.resume();
    
    +        btn.value = "Pause";
    
    +    }
    
    +    else {
    
    +        oSelf.pause();
    
    +        btn.value = "Resume";
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Handles click events on the clear button.
    
    + *
    
    + * @method _onClickClearBtn
    
    + * @param v {HTMLEvent} The click event.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onClickClearBtn = function(v, oSelf) {
    
    +    oSelf._clearConsole();
    
    +};
    
    +
    
    +/**
    
    + * Handles Logger's newLogEvent.
    
    + *
    
    + * @method _onNewLog
    
    + * @param sType {String} The event.
    
    + * @param aArgs {Object[]} Data passed from event firer.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onNewLog = function(sType, aArgs, oSelf) {
    
    +    var logEntry = aArgs[0];
    
    +    oSelf._buffer.push(logEntry);
    
    +
    
    +    if (oSelf.logReaderEnabled === true && oSelf._timeout === null) {
    
    +        oSelf._timeout = setTimeout(function(){oSelf._printBuffer();}, 100);
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Handles Logger's resetEvent.
    
    + *
    
    + * @method _onReset
    
    + * @param sType {String} The event.
    
    + * @param aArgs {Object[]} Data passed from event firer.
    
    + * @param oSelf {Object} The LogReader instance.
    
    + * @private
    
    + */
    
    +YAHOO.widget.LogReader.prototype._onReset = function(sType, aArgs, oSelf) {
    
    +    oSelf._filterLogs();
    
    +};
    
    + /**
    
    + * The Logger widget provides a simple way to read or write log messages in
    
    + * JavaScript code. Integration with the YUI Library's debug builds allow
    
    + * implementers to access under-the-hood events, errors, and debugging messages.
    
    + * Output may be read through a LogReader console and/or output to a browser
    
    + * console.
    
    + *
    
    + * @module logger
    
    + * @requires yahoo, event, dom
    
    + * @optional dragdrop
    
    + * @namespace YAHOO.widget
    
    + * @title Logger Widget
    
    + */
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/****************************************************************************/
    +// holder
    +/**
    
    + * The singleton Logger class provides core log management functionality. Saves
    
    + * logs written through the global YAHOO.log function or written by a LogWriter
    
    + * instance. Provides access to logs for reading by a LogReader instance or
    
    + * native browser console such as the Firebug extension to Firefox or Safari's
    
    + * JavaScript console through integration with the console.log() method.
    
    + *
    
    + * @class YAHOO.widget.Logger
    
    + * @static
    
    + */
    
    +YAHOO.widget.Logger = {
    
    +    // Initialize members
    
    +    loggerEnabled: true,
    
    +    _browserConsoleEnabled: false,
    
    +    categories: ["info","warn","error","time","window"],
    
    +    sources: ["global"],
    
    +    _stack: [], // holds all log msgs
    
    +    maxStackEntries: 2500,
    
    +    _startTime: new Date().getTime(), // static start timestamp
    
    +    _lastTime: null // timestamp of last logged message
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +/**
    
    + * Saves a log message to the stack and fires newLogEvent. If the log message is
    
    + * assigned to an unknown category, creates a new category. If the log message is
    
    + * from an unknown source, creates a new source.  If browser console is enabled,
    
    + * outputs the log message to browser console.
    
    + *
    
    + * @method log
    
    + * @param sMsg {String} The log message.
    
    + * @param sCategory {String} Category of log message, or null.
    
    + * @param sSource {String} Source of LogWriter, or null if global.
    
    + */
    
    +YAHOO.widget.Logger.log = function(sMsg, sCategory, sSource) {
    
    +    if(this.loggerEnabled) {
    
    +        if(!sCategory) {
    
    +            sCategory = "info"; // default category
    
    +        }
    
    +        else {
    
    +            sCategory = sCategory.toLocaleLowerCase();
    
    +            if(this._isNewCategory(sCategory)) {
    
    +                this._createNewCategory(sCategory);
    
    +            }
    
    +        }
    
    +        var sClass = "global"; // default source
    
    +        var sDetail = null;
    
    +        if(sSource) {
    
    +            var spaceIndex = sSource.indexOf(" ");
    
    +            if(spaceIndex > 0) {
    
    +                // Substring until first space
    
    +                sClass = sSource.substring(0,spaceIndex);
    
    +                // The rest of the source
    
    +                sDetail = sSource.substring(spaceIndex,sSource.length);
    
    +            }
    
    +            else {
    
    +                sClass = sSource;
    
    +            }
    
    +            if(this._isNewSource(sClass)) {
    
    +                this._createNewSource(sClass);
    
    +            }
    
    +        }
    
    +
    
    +        var timestamp = new Date();
    
    +        var logEntry = new YAHOO.widget.LogMsg({
    
    +            msg: sMsg,
    
    +            time: timestamp,
    
    +            category: sCategory,
    
    +            source: sClass,
    
    +            sourceDetail: sDetail
    
    +        });
    
    +
    
    +        var stack = this._stack;
    
    +        var maxStackEntries = this.maxStackEntries;
    
    +        if(maxStackEntries && !isNaN(maxStackEntries) &&
    
    +            (stack.length >= maxStackEntries)) {
    
    +            stack.shift();
    
    +        }
    
    +        stack.push(logEntry);
    
    +        this.newLogEvent.fire(logEntry);
    
    +
    
    +        if(this._browserConsoleEnabled) {
    
    +            this._printToBrowserConsole(logEntry);
    
    +        }
    
    +        return true;
    
    +    }
    
    +    else {
    
    +        return false;
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Resets internal stack and startTime, enables Logger, and fires logResetEvent.
    
    + *
    
    + * @method reset
    
    + */
    
    +YAHOO.widget.Logger.reset = function() {
    
    +    this._stack = [];
    
    +    this._startTime = new Date().getTime();
    
    +    this.loggerEnabled = true;
    
    +    this.log("Logger reset");
    
    +    this.logResetEvent.fire();
    
    +};
    
    +
    
    +/**
    
    + * Public accessor to internal stack of log message objects.
    
    + *
    
    + * @method getStack
    
    + * @return {Object[]} Array of log message objects.
    
    + */
    
    +YAHOO.widget.Logger.getStack = function() {
    
    +    return this._stack;
    
    +};
    
    +
    
    +/**
    
    + * Public accessor to internal start time.
    
    + *
    
    + * @method getStartTime
    
    + * @return {Date} Internal date of when Logger singleton was initialized.
    
    + */
    
    +YAHOO.widget.Logger.getStartTime = function() {
    
    +    return this._startTime;
    
    +};
    
    +
    
    +/**
    
    + * Disables output to the browser's global console.log() function, which is used
    
    + * by the Firebug extension to Firefox as well as Safari.
    
    + *
    
    + * @method disableBrowserConsole
    
    + */
    
    +YAHOO.widget.Logger.disableBrowserConsole = function() {
    
    +    YAHOO.log("Logger output to the function console.log() has been disabled.");
    
    +    this._browserConsoleEnabled = false;
    
    +};
    
    +
    
    +/**
    
    + * Enables output to the browser's global console.log() function, which is used
    
    + * by the Firebug extension to Firefox as well as Safari.
    
    + *
    
    + * @method enableBrowserConsole
    
    + */
    
    +YAHOO.widget.Logger.enableBrowserConsole = function() {
    
    +    this._browserConsoleEnabled = true;
    
    +    YAHOO.log("Logger output to the function console.log() has been enabled.");
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Public events
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    + /**
    
    + * Fired when a new category has been created.
    
    + *
    
    + * @event categoryCreateEvent
    
    + * @param sCategory {String} Category name.
    
    + */
    
    +YAHOO.widget.Logger.categoryCreateEvent =
    
    +    new YAHOO.util.CustomEvent("categoryCreate", this, true);
    
    +
    
    + /**
    
    + * Fired when a new source has been named.
    
    + *
    
    + * @event sourceCreateEvent
    
    + * @param sSource {String} Source name.
    
    + */
    
    +YAHOO.widget.Logger.sourceCreateEvent =
    
    +    new YAHOO.util.CustomEvent("sourceCreate", this, true);
    
    +
    
    + /**
    
    + * Fired when a new log message has been created.
    
    + *
    
    + * @event newLogEvent
    
    + * @param sMsg {String} Log message.
    
    + */
    
    +YAHOO.widget.Logger.newLogEvent = new YAHOO.util.CustomEvent("newLog", this, true);
    
    +
    
    +/**
    
    + * Fired when the Logger has been reset has been created.
    
    + *
    
    + * @event logResetEvent
    
    + */
    
    +YAHOO.widget.Logger.logResetEvent = new YAHOO.util.CustomEvent("logReset", this, true);
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private methods
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Creates a new category of log messages and fires categoryCreateEvent.
    
    + *
    
    + * @method _createNewCategory
    
    + * @param sCategory {String} Category name.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._createNewCategory = function(sCategory) {
    
    +    this.categories.push(sCategory);
    
    +    this.categoryCreateEvent.fire(sCategory);
    
    +};
    
    +
    
    +/**
    
    + * Checks to see if a category has already been created.
    
    + *
    
    + * @method _isNewCategory
    
    + * @param sCategory {String} Category name.
    
    + * @return {Boolean} Returns true if category is unknown, else returns false.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._isNewCategory = function(sCategory) {
    
    +    for(var i=0; i < this.categories.length; i++) {
    
    +        if(sCategory == this.categories[i]) {
    
    +            return false;
    
    +        }
    
    +    }
    
    +    return true;
    
    +};
    
    +
    
    +/**
    
    + * Creates a new source of log messages and fires sourceCreateEvent.
    
    + *
    
    + * @method _createNewSource
    
    + * @param sSource {String} Source name.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._createNewSource = function(sSource) {
    
    +    this.sources.push(sSource);
    
    +    this.sourceCreateEvent.fire(sSource);
    
    +};
    
    +
    
    +/**
    
    + * Checks to see if a source already exists.
    
    + *
    
    + * @method _isNewSource
    
    + * @param sSource {String} Source name.
    
    + * @return {Boolean} Returns true if source is unknown, else returns false.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._isNewSource = function(sSource) {
    
    +    if(sSource) {
    
    +        for(var i=0; i < this.sources.length; i++) {
    
    +            if(sSource == this.sources[i]) {
    
    +                return false;
    
    +            }
    
    +        }
    
    +        return true;
    
    +    }
    
    +};
    
    +
    
    +/**
    
    + * Outputs a log message to global console.log() function.
    
    + *
    
    + * @method _printToBrowserConsole
    
    + * @param oEntry {Object} Log entry object.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._printToBrowserConsole = function(oEntry) {
    
    +    if(window.console && console.log) {
    
    +        var category = oEntry.category;
    
    +        var label = oEntry.category.substring(0,4).toUpperCase();
    
    +
    
    +        var time = oEntry.time;
    
    +        if (time.toLocaleTimeString) {
    
    +            var localTime  = time.toLocaleTimeString();
    
    +        }
    
    +        else {
    
    +            localTime = time.toString();
    
    +        }
    
    +
    
    +        var msecs = time.getTime();
    
    +        var elapsedTime = (YAHOO.widget.Logger._lastTime) ?
    
    +            (msecs - YAHOO.widget.Logger._lastTime) : 0;
    
    +        YAHOO.widget.Logger._lastTime = msecs;
    
    +
    
    +        var output =
    
    +            localTime + " (" +
    
    +            elapsedTime + "ms): " +
    
    +            oEntry.source + ": " +
    
    +            oEntry.msg;
    
    +
    
    +        console.log(output);
    
    +    }
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Private event handlers
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +/**
    
    + * Handles logging of messages due to window error events.
    
    + *
    
    + * @method _onWindowError
    
    + * @param sMsg {String} The error message.
    
    + * @param sUrl {String} URL of the error.
    
    + * @param sLine {String} Line number of the error.
    
    + * @private
    
    + */
    
    +YAHOO.widget.Logger._onWindowError = function(sMsg,sUrl,sLine) {
    
    +    // Logger is not in scope of this event handler
    
    +    try {
    
    +        YAHOO.widget.Logger.log(sMsg+' ('+sUrl+', line '+sLine+')', "window");
    
    +        if(YAHOO.widget.Logger._origOnWindowError) {
    
    +            YAHOO.widget.Logger._origOnWindowError();
    
    +        }
    
    +    }
    
    +    catch(e) {
    
    +        return false;
    
    +    }
    
    +};
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// Enable handling of native JavaScript errors
    
    +// NB: Not all browsers support the window.onerror event
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +if(window.onerror) {
    
    +    // Save any previously defined handler to call
    
    +    YAHOO.widget.Logger._origOnWindowError = window.onerror;
    
    +}
    
    +window.onerror = YAHOO.widget.Logger._onWindowError;
    
    +
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +//
    
    +// First log
    
    +//
    
    +/////////////////////////////////////////////////////////////////////////////
    
    +
    
    +YAHOO.widget.Logger.log("Logger initialized");
    
    +
    
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/menu.js.html b/www/extras/yui-ext/docs/output/menu.js.html new file mode 100644 index 000000000..607aff015 --- /dev/null +++ b/www/extras/yui-ext/docs/output/menu.js.html @@ -0,0 +1,6779 @@ +menu.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.com/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    +* @module menu
    +* @description <p>The Menu Library features a collection of widgets that make
    +* it easy to add menus to your website or web application.  With the Menu
    +* Library you can create website fly-out menus, customized context menus, or
    +* application-style menu bars with just a small amount of scripting.</p>
    +* <ul>
    +*    <li>Screen-reader accessibility.</li>
    +*    <li>Keyboard and mouse navigation.</li>
    +*    <li>A rich event model that provides access to all of a menu's
    +*    interesting moments.</li>
    +*    <li>Support for
    +*    <a href="http://en.wikipedia.org/wiki/Progressive_Enhancement">Progressive
    +*    Enhancement</a>; Menus can be created from simple,
    +*    semantic markup on the page or purely through JavaScript.</li>
    +* </ul>
    +* @title Menu Library
    +* @namespace YAHOO.widget
    +* @requires Event, Dom, Container
    +*/
    +(function() {
    +
    +var Dom = YAHOO.util.Dom;
    +var Event = YAHOO.util.Event;
    +
    +/**
    +* Singleton that manages a collection of all menus and menu items.  Listens for
    +* DOM events at the document level and dispatches the events to the
    +* corresponding menu or menu item.
    +*
    +* @namespace YAHOO.widget
    +* @class MenuManager
    +* @static
    +*/
    +YAHOO.widget.MenuManager = new function() {
    +
    +    // Private member variables
    +
    +    // Flag indicating if the DOM event handlers have been attached
    +
    +    var m_bInitializedEventHandlers = false;
    +
    +    // Collection of menus
    +
    +    var m_oMenus = {};
    +
    +
    +    //  Collection of menu items
    +
    +    var m_oItems = {};
    +
    +    // Collection of visible menus
    +
    +    var m_oVisibleMenus = {};
    +
    +    // Logger
    +
    +
    +    // Private methods
    +
    +    /**
    +    * Adds an item to the collection of known menu items.
    +    * @private
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem
    +    * instance to be added.
    +    */
    +    var addItem = function(p_oItem) {
    +
    +        var sYUIId = Dom.generateId();
    +
    +        if(p_oItem && m_oItems[sYUIId] != p_oItem) {
    +
    +            p_oItem.element.setAttribute("yuiid", sYUIId);
    +
    +            m_oItems[sYUIId] = p_oItem;
    +
    +            p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem);
    +
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * Removes an item from the collection of known menu items.
    +    * @private
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object specifying the MenuItem
    +    * instance to be removed.
    +    */
    +    var removeItem = function(p_oItem) {
    +
    +        var sYUIId = p_oItem.element.getAttribute("yuiid");
    +
    +        if(sYUIId && m_oItems[sYUIId]) {
    +
    +            delete m_oItems[sYUIId];
    +
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * Finds the root DIV node of a menu or the root LI node of a menu item.
    +    * @private
    +    * @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-58190037">HTMLElement</a>} p_oElement Object specifying
    +    * an HTML element.
    +    */
    +    var getMenuRootElement = function(p_oElement) {
    +
    +        var oParentNode;
    +
    +        if(p_oElement && p_oElement.tagName) {
    +
    +            switch(p_oElement.tagName.toUpperCase()) {
    +
    +                case "DIV":
    +
    +                    oParentNode = p_oElement.parentNode;
    +
    +                    // Check if the DIV is the inner "body" node of a menu
    +
    +                    if(
    +                        Dom.hasClass(p_oElement, "bd") &&
    +                        oParentNode &&
    +                        oParentNode.tagName &&
    +                        oParentNode.tagName.toUpperCase() == "DIV"
    +                    ) {
    +
    +                        return oParentNode;
    +
    +                    }
    +                    else {
    +
    +                        return p_oElement;
    +
    +                    }
    +
    +                break;
    +
    +                case "LI":
    +
    +                    return p_oElement;
    +
    +                default:
    +
    +                    oParentNode = p_oElement.parentNode;
    +
    +                    if(oParentNode) {
    +
    +                        return getMenuRootElement(oParentNode);
    +
    +                    }
    +
    +                break;
    +
    +            }
    +
    +        }
    +
    +    };
    +
    +    // Private event handlers
    +
    +    /**
    +    * Generic, global event handler for all of a menu's DOM-based
    +    * events.  This listens for events against the document object.  If the
    +    * target of a given event is a member of a menu or menu item's DOM, the
    +    * instance's corresponding Custom Event is fired.
    +    * @private
    +    * @param {Event} p_oEvent Object representing the DOM event object passed
    +    * back by the event utility (YAHOO.util.Event).
    +    */
    +    var onDOMEvent = function(p_oEvent) {
    +
    +        // Get the target node of the DOM event
    +
    +        var oTarget = Event.getTarget(p_oEvent);
    +
    +        // See if the target of the event was a menu, or a menu item
    +
    +        var oElement = getMenuRootElement(oTarget);
    +
    +        var oMenuItem;
    +        var oMenu;
    +
    +        if(oElement) {
    +
    +            var sTagName = oElement.tagName.toUpperCase();
    +
    +            if(sTagName == "LI") {
    +
    +                var sYUIId = oElement.getAttribute("yuiid");
    +
    +                if(sYUIId) {
    +
    +                    oMenuItem = m_oItems[sYUIId];
    +                    oMenu = oMenuItem.parent;
    +
    +                }
    +
    +            }
    +            else if(sTagName == "DIV") {
    +
    +                if(oElement.id) {
    +
    +                    oMenu = m_oMenus[oElement.id];
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +        if(oMenu) {
    +
    +            // Map of DOM event names to CustomEvent names
    +
    +            var oEventTypes =  {
    +                    "click": "clickEvent",
    +                    "mousedown": "mouseDownEvent",
    +                    "mouseup": "mouseUpEvent",
    +                    "mouseover": "mouseOverEvent",
    +                    "mouseout": "mouseOutEvent",
    +                    "keydown": "keyDownEvent",
    +                    "keyup": "keyUpEvent",
    +                    "keypress": "keyPressEvent"
    +                };
    +
    +            var sCustomEventType = oEventTypes[p_oEvent.type];
    +
    +            // Fire the Custom Even that corresponds the current DOM event
    +
    +            if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) {
    +
    +                oMenuItem[sCustomEventType].fire(p_oEvent);
    +
    +            }
    +
    +            oMenu[sCustomEventType].fire(p_oEvent, oMenuItem);
    +
    +        }
    +        else if(p_oEvent.type == "mousedown") {
    +
    +            /*
    +                If the target of the event wasn't a menu, hide all
    +                dynamically positioned menus
    +            */
    +
    +            var oActiveItem;
    +
    +            for(var i in m_oMenus) {
    +
    +                if(m_oMenus.hasOwnProperty(i)) {
    +
    +                    oMenu = m_oMenus[i];
    +
    +                    if(
    +                        oMenu.cfg.getProperty("clicktohide") &&
    +                        oMenu.cfg.getProperty("position") == "dynamic"
    +                    ) {
    +
    +                        oMenu.hide();
    +
    +                    }
    +                    else {
    +
    +                        oMenu.clearActiveItem(true);
    +
    +                    }
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * "destroy" event handler for a menu.
    +    * @private
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +    * fired the event.
    +    */
    +    var onMenuDestroy = function(p_sType, p_aArgs, p_oMenu) {
    +
    +        this.removeMenu(p_oMenu);
    +
    +    };
    +
    +    /**
    +    * "destroy" event handler for a MenuItem instance.
    +    * @private
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    var onItemDestroy = function(p_sType, p_aArgs, p_oItem) {
    +
    +        var sYUIId = p_oItem.element.getAttribute("yuiid");
    +
    +        if(sYUIId) {
    +
    +            delete m_oItems[sYUIId];
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * Event handler for when the "visible" configuration property
    +    * of a Menu instance changes.
    +    * @private
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +    * fired the event.
    +    */
    +    var onMenuVisibleConfigChange = function(p_sType, p_aArgs, p_oMenu) {
    +
    +        var bVisible = p_aArgs[0];
    +
    +        if(bVisible) {
    +
    +            m_oVisibleMenus[p_oMenu.id] = p_oMenu;
    +
    +
    +        }
    +        else if(m_oVisibleMenus[p_oMenu.id]) {
    +
    +            delete m_oVisibleMenus[p_oMenu.id];
    +
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * "itemadded" event handler for a Menu instance.
    +    * @private
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    */
    +    var onItemAdded = function(p_sType, p_aArgs) {
    +
    +        addItem(p_aArgs[0]);
    +
    +    };
    +
    +
    +    /**
    +    * "itemremoved" event handler for a Menu instance.
    +    * @private
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    */
    +    var onItemRemoved = function(p_sType, p_aArgs) {
    +
    +        removeItem(p_aArgs[0]);
    +
    +    };
    +
    +    // Privileged methods
    +
    +    /**
    +    * @method addMenu
    +    * @description Adds a menu to the collection of known menus.
    +    * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu instance
    +    * to be added.
    +    */
    +    this.addMenu = function(p_oMenu) {
    +
    +        if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) {
    +
    +            m_oMenus[p_oMenu.id] = p_oMenu;
    +
    +
    +            if(!m_bInitializedEventHandlers) {
    +
    +                var oDoc = document;
    +
    +                Event.addListener(oDoc, "mouseover", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "mouseout", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "mousedown", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "mouseup", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "click", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "keydown", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "keyup", onDOMEvent, this, true);
    +                Event.addListener(oDoc, "keypress", onDOMEvent, this, true);
    +
    +                m_bInitializedEventHandlers = true;
    +
    +
    +            }
    +
    +            p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, this);
    +
    +            p_oMenu.cfg.subscribeToConfigEvent(
    +                "visible",
    +                onMenuVisibleConfigChange,
    +                p_oMenu
    +            );
    +
    +            p_oMenu.itemAddedEvent.subscribe(onItemAdded);
    +            p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);
    +
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * @method removeMenu
    +    * @description Removes a menu from the collection of known menus.
    +    * @param {YAHOO.widget.Menu} p_oMenu Object specifying the Menu instance
    +    * to be removed.
    +    */
    +    this.removeMenu = function(p_oMenu) {
    +
    +        if(p_oMenu && m_oMenus[p_oMenu.id]) {
    +
    +            delete m_oMenus[p_oMenu.id];
    +
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * @method hideVisible
    +    * @description Hides all visible, dynamically positioned menus.
    +    */
    +    this.hideVisible = function() {
    +
    +        var oMenu;
    +
    +        for(var i in m_oVisibleMenus) {
    +
    +            if(m_oVisibleMenus.hasOwnProperty(i)) {
    +
    +                oMenu = m_oVisibleMenus[i];
    +
    +                if(oMenu.cfg.getProperty("position") == "dynamic") {
    +
    +                    oMenu.hide();
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +    };
    +
    +    /**
    +    * @method getMenus
    +    * @description Returns an array of all menus registered with the
    +    * menu manger.
    +    * @return {Array}
    +    */
    +    this.getMenus = function() {
    +
    +        return m_oMenus;
    +
    +    };
    +
    +    /**
    +    * @method getMenu
    +    * @description Returns a menu with the specified id.
    +    * @param {String} p_sId String specifying the id of the menu to
    +    * be retrieved.
    +    * @return {YAHOO.widget.Menu}
    +    */
    +    this.getMenu = function(p_sId) {
    +
    +        if(m_oMenus[p_sId]) {
    +
    +            return m_oMenus[p_sId];
    +
    +        }
    +
    +    };
    +
    +
    +    /**
    +    * @method toString
    +    * @description Returns a string representing the menu manager.
    +    * @return {String}
    +    */
    +    this.toString = function() {
    +
    +        return ("MenuManager");
    +
    +    };
    +
    +};
    +
    +})();
    +
    +(function() {
    +
    +var Dom = YAHOO.util.Dom;
    +var Event = YAHOO.util.Event;
    +
    +/**
    +* The Menu class creates a container that holds a vertical list representing
    +* a set of options or commands.  Menu is the base class for all
    +* menu containers.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the menu.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source
    +* for the menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +* level-one-html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object
    +* specifying the <code>&#60;div&#62;</code> element of the menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +* level-one-html.html#ID-94282980">HTMLSelectElement</a>} p_oElement
    +* Object specifying the <code>&#60;select&#62;</code> element to be used as
    +* the data source for the menu.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu. See configuration class documentation for
    +* more details.
    +* @namespace YAHOO.widget
    +* @class Menu
    +* @constructor
    +* @extends YAHOO.widget.Overlay
    +*/
    +YAHOO.widget.Menu = function(p_oElement, p_oConfig) {
    +
    +    if(p_oConfig) {
    +
    +        this.parent = p_oConfig.parent;
    +
    +        this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload;
    +
    +        this.itemData = p_oConfig.itemData || p_oConfig.itemdata;
    +
    +    }
    +
    +    YAHOO.widget.Menu.superclass.constructor.call(
    +        this,
    +        p_oElement,
    +        p_oConfig
    +    );
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, {
    +
    +// Constants
    +
    +/**
    +* @property CSS_CLASS_NAME
    +* @description String representing the CSS class(es) to be applied to the
    +* menu's <code>&#60;div&#62;</code> element.
    +* @default "yuimenu"
    +* @final
    +* @type String
    +*/
    +CSS_CLASS_NAME: "yuimenu",
    +
    +/**
    +* @property ITEM_TYPE
    +* @description Object representing the type of menu item to instantiate and
    +* add when parsing the child nodes (either <code>&#60;li&#62;</code> element,
    +* <code>&#60;optgroup&#62;</code> element or <code>&#60;option&#62;</code>)
    +* of the menu's source HTML element.
    +* @default YAHOO.widget.MenuItem
    +* @final
    +* @type YAHOO.widget.MenuItem
    +*/
    +ITEM_TYPE: null,
    +
    +/**
    +* @property GROUP_TITLE_TAG_NAME
    +* @description String representing the tagname of the HTML element used to
    +* title the menu's item groups.
    +* @default H6
    +* @final
    +* @type String
    +*/
    +GROUP_TITLE_TAG_NAME: "h6",
    +
    +// Private properties
    +
    +/**
    +* @property _nHideDelayId
    +* @description Number representing the time-out setting used to cancel the
    +* hiding of a menu.
    +* @default null
    +* @private
    +* @type Number
    +*/
    +_nHideDelayId: null,
    +
    +/**
    +* @property _nShowDelayId
    +* @description Number representing the time-out setting used to cancel the
    +* showing of a menu.
    +* @default null
    +* @private
    +* @type Number
    +*/
    +_nShowDelayId: null,
    +
    +/**
    +* @property _hideDelayEventHandlersAssigned
    +* @description Boolean indicating if the "mouseover" and "mouseout" event
    +* handlers used for hiding the menu via a call to "window.setTimeout" have
    +* already been assigned.
    +* @default false
    +* @private
    +* @type Boolean
    +*/
    +_hideDelayEventHandlersAssigned: false,
    +
    +/**
    +* @property _bHandledMouseOverEvent
    +* @description Boolean indicating the current state of the menu's
    +* "mouseover" event.
    +* @default false
    +* @private
    +* @type Boolean
    +*/
    +_bHandledMouseOverEvent: false,
    +
    +/**
    +* @property _bHandledMouseOutEvent
    +* @description Boolean indicating the current state of the menu's
    +* "mouseout" event.
    +* @default false
    +* @private
    +* @type Boolean
    +*/
    +_bHandledMouseOutEvent: false,
    +
    +/**
    +* @property _aGroupTitleElements
    +* @description Array of HTML element used to title groups of menu items.
    +* @default []
    +* @private
    +* @type Array
    +*/
    +_aGroupTitleElements: null,
    +
    +/**
    +* @property _aItemGroups
    +* @description Array of menu items.
    +* @default []
    +* @private
    +* @type Array
    +*/
    +_aItemGroups: null,
    +
    +/**
    +* @property _aListElements
    +* @description Array of <code>&#60;ul&#62;</code> elements, each of which is
    +* the parent node for each item's <code>&#60;li&#62;</code> element.
    +* @default []
    +* @private
    +* @type Array
    +*/
    +_aListElements: null,
    +
    +// Public properties
    +
    +/**
    +* @property lazyLoad
    +* @description Boolean indicating if the menu's "lazy load" feature is
    +* enabled.  If set to "true," initialization and rendering of the menu's
    +* items will be deferred until the first time it is made visible.  This
    +* property should be set via the constructor using the configuration
    +* object literal.
    +* @default false
    +* @type Boolean
    +*/
    +lazyLoad: false,
    +
    +/**
    +* @property itemData
    +* @description Array of items to be added to the menu.  The array can contain
    +* strings representing the text for each item to be created, object literals
    +* representing the menu item configuration properties, or MenuItem instances.
    +* This property should be set via the constructor using the configuration
    +* object literal.
    +* @default null
    +* @type Array
    +*/
    +itemData: null,
    +
    +/**
    +* @property activeItem
    +* @description Object reference to the item in the menu that has focus.
    +* @default null
    +* @type YAHOO.widget.MenuItem
    +*/
    +activeItem: null,
    +
    +/**
    +* @property parent
    +* @description Object reference to the menu's parent menu or menu item.
    +* This property can be set via the constructor using the configuration
    +* object literal.
    +* @default null
    +* @type YAHOO.widget.MenuItem
    +*/
    +parent: null,
    +
    +/**
    +* @property srcElement
    +* @description Object reference to the HTML element (either
    +* <code>&#60;select&#62;</code> or <code>&#60;div&#62;</code>) used to
    +* create the menu.
    +* @default null
    +* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +* level-one-html.html#ID-94282980">HTMLSelectElement</a>|<a
    +* href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.
    +* html#ID-22445964">HTMLDivElement</a>
    +*/
    +srcElement: null,
    +
    +// Events
    +
    +/**
    +* @event mouseOverEvent
    +* @description Fires when the mouse has entered the menu.  Passes back
    +* the DOM Event object as an argument.
    +*/
    +mouseOverEvent: null,
    +
    +/**
    +* @event mouseOutEvent
    +* @description Fires when the mouse has left the menu.  Passes back the DOM
    +* Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +mouseOutEvent: null,
    +
    +/**
    +* @event mouseDownEvent
    +* @description Fires when the user mouses down on the menu.  Passes back the
    +* DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +mouseDownEvent: null,
    +
    +/**
    +* @event mouseUpEvent
    +* @description Fires when the user releases a mouse button while the mouse is
    +* over the menu.  Passes back the DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +mouseUpEvent: null,
    +
    +/**
    +* @event clickEvent
    +* @description Fires when the user clicks the on the menu.  Passes back the
    +* DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +clickEvent: null,
    +
    +/**
    +* @event keyPressEvent
    +* @description Fires when the user presses an alphanumeric key when one of the
    +* menu's items has focus.  Passes back the DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +keyPressEvent: null,
    +
    +/**
    +* @event keyDownEvent
    +* @description Fires when the user presses a key when one of the menu's items
    +* has focus.  Passes back the DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +keyDownEvent: null,
    +
    +/**
    +* @event keyUpEvent
    +* @description Fires when the user releases a key when one of the menu's items
    +* has focus.  Passes back the DOM Event object as an argument.
    +* @type YAHOO.util.CustomEvent
    +*/
    +keyUpEvent: null,
    +
    +/**
    +* @event itemAddedEvent
    +* @description Fires when an item is added to the menu.
    +* @type YAHOO.util.CustomEvent
    +*/
    +itemAddedEvent: null,
    +
    +/**
    +* @event itemRemovedEvent
    +* @description Fires when an item is removed to the menu.
    +* @type YAHOO.util.CustomEvent
    +*/
    +itemRemovedEvent: null,
    +
    +/**
    +* @method init
    +* @description The Menu class's initialization method. This method is
    +* automatically called by the constructor, and sets up all DOM references
    +* for pre-existing markup, and creates required markup if it is not
    +* already present.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the menu.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source
    +* for the menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +* level-one-html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object
    +* specifying the <code>&#60;div&#62;</code> element of the menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +* level-one-html.html#ID-94282980">HTMLSelectElement</a>} p_oElement
    +* Object specifying the <code>&#60;select&#62;</code> element to be used as
    +* the data source for the menu.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu. See configuration class documentation for
    +* more details.
    +*/
    +init: function(p_oElement, p_oConfig) {
    +
    +    this._aItemGroups = [];
    +    this._aListElements = [];
    +    this._aGroupTitleElements = [];
    +
    +    if(!this.ITEM_TYPE) {
    +
    +        this.ITEM_TYPE = YAHOO.widget.MenuItem;
    +
    +    }
    +
    +    var oElement;
    +
    +    if(typeof p_oElement == "string") {
    +
    +        oElement = document.getElementById(p_oElement);
    +
    +    }
    +    else if(p_oElement.tagName) {
    +
    +        oElement = p_oElement;
    +
    +    }
    +
    +    if(oElement && oElement.tagName) {
    +
    +        switch(oElement.tagName.toUpperCase()) {
    +
    +            case "DIV":
    +
    +                this.srcElement = oElement;
    +
    +                if(!oElement.id) {
    +
    +                    oElement.setAttribute("id", Dom.generateId());
    +
    +                }
    +
    +                /*
    +                    Note: we don't pass the user config in here yet
    +                    because we only want it executed once, at the lowest
    +                    subclass level.
    +                */
    +
    +                YAHOO.widget.Menu.superclass.init.call(this, oElement);
    +
    +                this.beforeInitEvent.fire(YAHOO.widget.Menu);
    +
    +
    +            break;
    +
    +            case "SELECT":
    +
    +                this.srcElement = oElement;
    +
    +
    +                /*
    +                    The source element is not something that we can use
    +                    outright, so we need to create a new Overlay
    +
    +                    Note: we don't pass the user config in here yet
    +                    because we only want it executed once, at the lowest
    +                    subclass level.
    +                */
    +
    +                YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId());
    +
    +                this.beforeInitEvent.fire(YAHOO.widget.Menu);
    +
    +            break;
    +
    +        }
    +
    +    }
    +    else {
    +
    +        /*
    +            Note: we don't pass the user config in here yet
    +            because we only want it executed once, at the lowest
    +            subclass level.
    +        */
    +
    +        YAHOO.widget.Menu.superclass.init.call(this, p_oElement);
    +
    +        this.beforeInitEvent.fire(YAHOO.widget.Menu);
    +
    +    }
    +
    +    if(this.element) {
    +
    +        var oEl = this.element;
    +
    +        Dom.addClass(oEl, this.CSS_CLASS_NAME);
    +
    +        // Subscribe to Custom Events
    +
    +        this.initEvent.subscribe(this._onInit, this, true);
    +        this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true);
    +        this.renderEvent.subscribe(this._onRender, this, true);
    +        this.beforeShowEvent.subscribe(this._onBeforeShow, this, true);
    +        this.showEvent.subscribe(this._onShow, this, true);
    +        this.beforeHideEvent.subscribe(this._onBeforeHide, this, true);
    +        this.mouseOverEvent.subscribe(this._onMouseOver, this, true);
    +        this.mouseOutEvent.subscribe(this._onMouseOut, this, true);
    +        this.clickEvent.subscribe(this._onClick, this, true);
    +        this.keyDownEvent.subscribe(this._onKeyDown, this, true);
    +
    +        if(p_oConfig) {
    +
    +            this.cfg.applyConfig(p_oConfig, true);
    +
    +        }
    +
    +        // Register the Menu instance with the MenuManager
    +
    +        YAHOO.widget.MenuManager.addMenu(this);
    +
    +
    +        this.initEvent.fire(YAHOO.widget.Menu);
    +
    +    }
    +
    +},
    +
    +// Private methods
    +
    +/**
    +* @method _initSubTree
    +* @description Iterates the childNodes of the source element to find nodes
    +* used to instantiate menu and menu items.
    +* @private
    +*/
    +_initSubTree: function() {
    +
    +    var oNode;
    +
    +    if(this.srcElement.tagName == "DIV") {
    +
    +        /*
    +            Populate the collection of item groups and item
    +            group titles
    +        */
    +
    +        oNode = this.body.firstChild;
    +
    +        var nGroup = 0;
    +        var sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase();
    +
    +        do {
    +
    +            if(oNode && oNode.tagName) {
    +
    +                switch(oNode.tagName.toUpperCase()) {
    +
    +                    case sGroupTitleTagName:
    +
    +                        this._aGroupTitleElements[nGroup] = oNode;
    +
    +                    break;
    +
    +                    case "UL":
    +
    +                        this._aListElements[nGroup] = oNode;
    +                        this._aItemGroups[nGroup] = [];
    +                        nGroup++;
    +
    +                    break;
    +
    +                }
    +
    +            }
    +
    +        }
    +        while((oNode = oNode.nextSibling));
    +
    +        /*
    +            Apply the "first-of-type" class to the first UL to mimic
    +            the "first-of-type" CSS3 psuedo class.
    +        */
    +
    +        if(this._aListElements[0]) {
    +
    +            Dom.addClass(this._aListElements[0], "first-of-type");
    +
    +        }
    +
    +    }
    +
    +    oNode = null;
    +
    +    if(this.srcElement.tagName) {
    +
    +        switch(this.srcElement.tagName.toUpperCase()) {
    +
    +            case "DIV":
    +
    +                if(this._aListElements.length > 0) {
    +
    +
    +                    var i = this._aListElements.length - 1;
    +
    +                    do {
    +
    +                        oNode = this._aListElements[i].firstChild;
    +
    +
    +                        do {
    +
    +                            if(oNode && oNode.tagName) {
    +
    +                                switch(oNode.tagName.toUpperCase()) {
    +
    +                                    case "LI":
    +
    +
    +                                        this.addItem(
    +                                                new this.ITEM_TYPE(
    +                                                    oNode,
    +                                                    { parent: this }
    +                                                ),
    +                                                i
    +                                            );
    +
    +                                    break;
    +
    +                                }
    +
    +                            }
    +
    +                        }
    +                        while((oNode = oNode.nextSibling));
    +
    +                    }
    +                    while(i--);
    +
    +                }
    +
    +            break;
    +
    +            case "SELECT":
    +
    +
    +                oNode = this.srcElement.firstChild;
    +
    +                do {
    +
    +                    if(oNode && oNode.tagName) {
    +
    +                        switch(oNode.tagName.toUpperCase()) {
    +
    +                            case "OPTGROUP":
    +                            case "OPTION":
    +
    +
    +                                this.addItem(
    +                                        new this.ITEM_TYPE(
    +                                                oNode,
    +                                                { parent: this }
    +                                            )
    +                                        );
    +
    +                            break;
    +
    +                        }
    +
    +                    }
    +
    +                }
    +                while((oNode = oNode.nextSibling));
    +
    +            break;
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _getFirstEnabledItem
    +* @description Returns the first enabled item in the menu.
    +* @return {YAHOO.widget.MenuItem}
    +* @private
    +*/
    +_getFirstEnabledItem: function() {
    +
    +    var nGroups = this._aItemGroups.length;
    +    var oItem;
    +    var aItemGroup;
    +
    +    for(var i=0; i<nGroups; i++) {
    +
    +        aItemGroup = this._aItemGroups[i];
    +
    +        if(aItemGroup) {
    +
    +            var nItems = aItemGroup.length;
    +
    +            for(var n=0; n<nItems; n++) {
    +
    +                oItem = aItemGroup[n];
    +
    +                if(
    +                    !oItem.cfg.getProperty("disabled") &&
    +                    oItem.element.style.display != "none"
    +                ) {
    +
    +                    return oItem;
    +
    +                }
    +
    +                oItem = null;
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _checkPosition
    +* @description Checks to make sure that the value of the "position" property
    +* is one of the supported strings. Returns true if the position is supported.
    +* @private
    +* @param {Object} p_sPosition String specifying the position of the menu.
    +* @return {Boolean}
    +*/
    +_checkPosition: function(p_sPosition) {
    +
    +    if(typeof p_sPosition == "string") {
    +
    +        var sPosition = p_sPosition.toLowerCase();
    +
    +        return ("dynamic,static".indexOf(sPosition) != -1);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _addItemToGroup
    +* @description Adds a menu item to a group.
    +* @private
    +* @param {Number} p_nGroupIndex Number indicating the group to which the
    +* item belongs.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance to be added to the menu.
    +* @param {String} p_oItem String specifying the text of the item to be added
    +* to the menu.
    +* @param {Object} p_oItem Object literal containing a set of menu item
    +* configuration properties.
    +* @param {Number} p_nItemIndex Optional. Number indicating the index at
    +* which the menu item should be added.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +_addItemToGroup: function(p_nGroupIndex, p_oItem, p_nItemIndex) {
    +
    +    var oItem;
    +
    +    if(p_oItem instanceof this.ITEM_TYPE) {
    +
    +        oItem = p_oItem;
    +        oItem.parent = this;
    +
    +    }
    +    else if(typeof p_oItem == "string") {
    +
    +        oItem = new this.ITEM_TYPE(p_oItem, { parent: this });
    +
    +    }
    +    else if(typeof p_oItem == "object" && p_oItem.text) {
    +
    +        var sText = p_oItem.text;
    +
    +        delete p_oItem["text"];
    +
    +        p_oItem.parent = this;
    +
    +        oItem = new this.ITEM_TYPE(sText, p_oItem);
    +
    +    }
    +
    +    if(oItem) {
    +
    +        var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
    +
    +        var aGroup = this._getItemGroup(nGroupIndex);
    +
    +        var oGroupItem;
    +
    +        if(!aGroup) {
    +
    +            aGroup = this._createItemGroup(nGroupIndex);
    +
    +        }
    +
    +        if(typeof p_nItemIndex == "number") {
    +
    +            var bAppend = (p_nItemIndex >= aGroup.length);
    +
    +            if(aGroup[p_nItemIndex]) {
    +
    +                aGroup.splice(p_nItemIndex, 0, oItem);
    +
    +            }
    +            else {
    +
    +                aGroup[p_nItemIndex] = oItem;
    +
    +            }
    +
    +            oGroupItem = aGroup[p_nItemIndex];
    +
    +            if(oGroupItem) {
    +
    +                if(
    +                    bAppend &&
    +                    (
    +                        !oGroupItem.element.parentNode ||
    +                        oGroupItem.element.parentNode.nodeType == 11
    +                    )
    +                ) {
    +
    +                    this._aListElements[nGroupIndex].appendChild(
    +                        oGroupItem.element
    +                    );
    +
    +                }
    +                else {
    +
    +
    +                    /**
    +                    * Returns the next sibling of an item in an array.
    +                    * @private
    +                    * @param {p_aArray} Array to search.
    +                    * @param {p_nStartIndex} Number indicating the index to
    +                    * start searching the array.
    +                    * @return {Object}
    +                    */
    +                    var getNextItemSibling =
    +
    +                        function(p_aArray, p_nStartIndex) {
    +
    +                            return (
    +                                    p_aArray[p_nStartIndex] ||
    +                                    getNextItemSibling(
    +                                        p_aArray,
    +                                        (p_nStartIndex+1)
    +                                    )
    +                                );
    +
    +                        };
    +
    +
    +                    var oNextItemSibling =
    +                            getNextItemSibling(aGroup, (p_nItemIndex+1));
    +
    +                    if(
    +                        oNextItemSibling &&
    +                        (
    +                            !oGroupItem.element.parentNode ||
    +                            oGroupItem.element.parentNode.nodeType == 11
    +                        )
    +                    ) {
    +
    +                        this._aListElements[nGroupIndex].insertBefore(
    +                                oGroupItem.element,
    +                                oNextItemSibling.element
    +                            );
    +
    +                    }
    +
    +                }
    +
    +
    +                oGroupItem.parent = this;
    +
    +                this._subscribeToItemEvents(oGroupItem);
    +
    +                this._configureSubmenu(oGroupItem);
    +
    +                this._updateItemProperties(nGroupIndex);
    +
    +
    +                this.itemAddedEvent.fire(oGroupItem);
    +
    +                return oGroupItem;
    +
    +            }
    +
    +        }
    +        else {
    +
    +            var nItemIndex = aGroup.length;
    +
    +            aGroup[nItemIndex] = oItem;
    +
    +            oGroupItem = aGroup[nItemIndex];
    +
    +
    +            if(oGroupItem) {
    +
    +                if(
    +                    !Dom.isAncestor(
    +                        this._aListElements[nGroupIndex],
    +                        oGroupItem.element
    +                    )
    +                ) {
    +
    +                    this._aListElements[nGroupIndex].appendChild(
    +                        oGroupItem.element
    +                    );
    +
    +                }
    +
    +                oGroupItem.element.setAttribute("groupindex", nGroupIndex);
    +                oGroupItem.element.setAttribute("index", nItemIndex);
    +
    +                oGroupItem.parent = this;
    +
    +                oGroupItem.index = nItemIndex;
    +                oGroupItem.groupIndex = nGroupIndex;
    +
    +                this._subscribeToItemEvents(oGroupItem);
    +
    +                this._configureSubmenu(oGroupItem);
    +
    +                if(nItemIndex === 0) {
    +
    +                    Dom.addClass(oGroupItem.element, "first-of-type");
    +
    +                }
    +
    +
    +
    +                this.itemAddedEvent.fire(oGroupItem);
    +
    +                return oGroupItem;
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _removeItemFromGroupByIndex
    +* @description Removes a menu item from a group by index.  Returns the menu
    +* item that was removed.
    +* @private
    +* @param {Number} p_nGroupIndex Number indicating the group to which the menu
    +* item belongs.
    +* @param {Number} p_nItemIndex Number indicating the index of the menu item
    +* to be removed.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) {
    +
    +    var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
    +    var aGroup = this._getItemGroup(nGroupIndex);
    +
    +    if(aGroup) {
    +
    +        var aArray = aGroup.splice(p_nItemIndex, 1);
    +        var oItem = aArray[0];
    +
    +        if(oItem) {
    +
    +            // Update the index and className properties of each member
    +
    +            this._updateItemProperties(nGroupIndex);
    +
    +            if(aGroup.length === 0) {
    +
    +                // Remove the UL
    +
    +                var oUL = this._aListElements[nGroupIndex];
    +
    +                if(this.body && oUL) {
    +
    +                    this.body.removeChild(oUL);
    +
    +                }
    +
    +                // Remove the group from the array of items
    +
    +                this._aItemGroups.splice(nGroupIndex, 1);
    +
    +
    +                // Remove the UL from the array of ULs
    +
    +                this._aListElements.splice(nGroupIndex, 1);
    +
    +
    +                /*
    +                     Assign the "first-of-type" class to the new first UL
    +                     in the collection
    +                */
    +
    +                oUL = this._aListElements[0];
    +
    +                if(oUL) {
    +
    +                    Dom.addClass(oUL, "first-of-type");
    +
    +                }
    +
    +            }
    +
    +
    +            this.itemRemovedEvent.fire(oItem);
    +
    +            // Return a reference to the item that was removed
    +
    +            return oItem;
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _removeItemFromGroupByValue
    +* @description Removes a menu item from a group by reference.  Returns the
    +* menu item that was removed.
    +* @private
    +* @param {Number} p_nGroupIndex Number indicating the group to which the
    +* menu item belongs.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance to be removed.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) {
    +
    +    var aGroup = this._getItemGroup(p_nGroupIndex);
    +
    +    if(aGroup) {
    +
    +        var nItems = aGroup.length;
    +        var nItemIndex = -1;
    +
    +        if(nItems > 0) {
    +
    +            var i = nItems-1;
    +
    +            do {
    +
    +                if(aGroup[i] == p_oItem) {
    +
    +                    nItemIndex = i;
    +                    break;
    +
    +                }
    +
    +            }
    +            while(i--);
    +
    +            if(nItemIndex > -1) {
    +
    +                return this._removeItemFromGroupByIndex(
    +                            p_nGroupIndex,
    +                            nItemIndex
    +                        );
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _updateItemProperties
    +* @description Updates the "index," "groupindex," and "className" properties
    +* of the menu items in the specified group.
    +* @private
    +* @param {Number} p_nGroupIndex Number indicating the group of items to update.
    +*/
    +_updateItemProperties: function(p_nGroupIndex) {
    +
    +    var aGroup = this._getItemGroup(p_nGroupIndex);
    +    var nItems = aGroup.length;
    +
    +    if(nItems > 0) {
    +
    +        var i = nItems - 1;
    +        var oItem;
    +        var oLI;
    +
    +        // Update the index and className properties of each member
    +
    +        do {
    +
    +            oItem = aGroup[i];
    +
    +            if(oItem) {
    +
    +                oLI = oItem.element;
    +
    +                oItem.index = i;
    +                oItem.groupIndex = p_nGroupIndex;
    +
    +                oLI.setAttribute("groupindex", p_nGroupIndex);
    +                oLI.setAttribute("index", i);
    +
    +                Dom.removeClass(oLI, "first-of-type");
    +
    +            }
    +
    +        }
    +        while(i--);
    +
    +        if(oLI) {
    +
    +            Dom.addClass(oLI, "first-of-type");
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _createItemGroup
    +* @description Creates a new menu item group (array) and its associated
    +* <code>&#60;ul&#62;</code> element. Returns an aray of menu item groups.
    +* @private
    +* @param {Number} p_nIndex Number indicating the group to create.
    +* @return {Array}
    +*/
    +_createItemGroup: function(p_nIndex) {
    +
    +    if(!this._aItemGroups[p_nIndex]) {
    +
    +        this._aItemGroups[p_nIndex] = [];
    +
    +        var oUL = document.createElement("ul");
    +
    +        this._aListElements[p_nIndex] = oUL;
    +
    +        return this._aItemGroups[p_nIndex];
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _getItemGroup
    +* @description Returns the menu item group at the specified index.
    +* @private
    +* @param {Number} p_nIndex Number indicating the index of the menu item group
    +* to be retrieved.
    +* @return {Array}
    +*/
    +_getItemGroup: function(p_nIndex) {
    +
    +    var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0);
    +
    +    return this._aItemGroups[nIndex];
    +
    +},
    +
    +/**
    +* @method _configureSubmenu
    +* @description Subscribes the menu item's submenu to its parent menu's events.
    +* @private
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance with the submenu to be configured.
    +*/
    +_configureSubmenu: function(p_oItem) {
    +
    +    var oSubmenu = p_oItem.cfg.getProperty("submenu");
    +
    +    if(oSubmenu) {
    +
    +        /*
    +            Listen for configuration changes to the parent menu
    +            so they they can be applied to the submenu.
    +        */
    +
    +        this.cfg.configChangedEvent.subscribe(
    +                this._onParentMenuConfigChange,
    +                oSubmenu,
    +                true
    +            );
    +
    +        this.renderEvent.subscribe(
    +                this._onParentMenuRender,
    +                oSubmenu,
    +                true
    +            );
    +
    +        oSubmenu.beforeShowEvent.subscribe(
    +                this._onSubmenuBeforeShow,
    +                oSubmenu,
    +                true
    +            );
    +
    +        oSubmenu.showEvent.subscribe(
    +                this._onSubmenuShow,
    +                oSubmenu,
    +                true
    +            );
    +
    +        oSubmenu.hideEvent.subscribe(
    +                this._onSubmenuHide,
    +                oSubmenu,
    +                true
    +            );
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _subscribeToItemEvents
    +* @description Subscribes a menu to a menu item's event.
    +* @private
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance whose events should be subscribed to.
    +*/
    +_subscribeToItemEvents: function(p_oItem) {
    +
    +    p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this);
    +
    +    p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true);
    +
    +    p_oItem.cfg.configChangedEvent.subscribe(
    +        this._onMenuItemConfigChange,
    +        p_oItem,
    +        this
    +    );
    +
    +},
    +
    +/**
    +* @method _getOffsetWidth
    +* @description Returns the offset width of the menu's
    +* <code>&#60;div&#62;</code> element.
    +* @private
    +*/
    +_getOffsetWidth: function() {
    +
    +    var oClone = this.element.cloneNode(true);
    +
    +    Dom.setStyle(oClone, "width", "");
    +
    +    document.body.appendChild(oClone);
    +
    +    var sWidth = oClone.offsetWidth;
    +
    +    document.body.removeChild(oClone);
    +
    +    return sWidth;
    +
    +},
    +
    +/**
    +* @method _cancelHideDelay
    +* @description Cancels the call to "hideMenu."
    +* @private
    +*/
    +_cancelHideDelay: function() {
    +
    +    var oRoot = this.getRoot();
    +
    +    if(oRoot._nHideDelayId) {
    +
    +        window.clearTimeout(oRoot._nHideDelayId);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _execHideDelay
    +* @description Hides the menu after the number of milliseconds specified by
    +* the "hidedelay" configuration property.
    +* @private
    +*/
    +_execHideDelay: function() {
    +
    +    this._cancelHideDelay();
    +
    +    var oRoot = this.getRoot();
    +    var me = this;
    +
    +    var hideMenu = function() {
    +
    +        if(oRoot.activeItem) {
    +
    +            oRoot.clearActiveItem();
    +
    +        }
    +
    +        if(oRoot == me && me.cfg.getProperty("position") == "dynamic") {
    +
    +            me.hide();
    +
    +        }
    +
    +    };
    +
    +    oRoot._nHideDelayId =
    +        window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay"));
    +
    +},
    +
    +/**
    +* @method _cancelShowDelay
    +* @description Cancels the call to the "showMenu."
    +* @private
    +*/
    +_cancelShowDelay: function() {
    +
    +    var oRoot = this.getRoot();
    +
    +    if(oRoot._nShowDelayId) {
    +
    +        window.clearTimeout(oRoot._nShowDelayId);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _execShowDelay
    +* @description Shows the menu after the number of milliseconds specified by
    +* the "showdelay" configuration property have ellapsed.
    +* @private
    +* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should
    +* be made visible.
    +*/
    +_execShowDelay: function(p_oMenu) {
    +
    +    this._cancelShowDelay();
    +
    +    var oRoot = this.getRoot();
    +
    +    var showMenu = function() {
    +
    +        p_oMenu.show();
    +
    +    };
    +
    +    oRoot._nShowDelayId =
    +        window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));
    +
    +},
    +
    +// Protected methods
    +
    +/**
    +* @method _onMouseOver
    +* @description "mouseover" event handler for the menu.
    +* @protected
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onMouseOver: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var oEvent = p_aArgs[0];
    +    var oItem = p_aArgs[1];
    +    var oTarget = Event.getTarget(oEvent);
    +
    +    if(
    +        !this._bHandledMouseOverEvent &&
    +        (oTarget == this.element || Dom.isAncestor(this.element, oTarget))
    +    ) {
    +
    +        // MENU  MOUSEOVER LOGIC HERE
    +
    +        this.clearActiveItem();
    +
    +        this._bHandledMouseOverEvent = true;
    +        this._bHandledMouseOutEvent = false;
    +
    +    }
    +
    +    if(
    +        oItem && !oItem.handledMouseOverEvent &&
    +        (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))
    +    ) {
    +
    +        var oItemCfg = oItem.cfg;
    +
    +        // Select and focus the current menu item
    +
    +        oItemCfg.setProperty("selected", true);
    +        oItem.focus();
    +
    +        if(this.cfg.getProperty("autosubmenudisplay")) {
    +
    +            // Show the submenu this menu item
    +
    +            var oSubmenu = oItemCfg.getProperty("submenu");
    +
    +            if(oSubmenu) {
    +
    +                if(this.cfg.getProperty("showdelay") > 0) {
    +
    +                    this._execShowDelay(oSubmenu);
    +
    +                }
    +                else {
    +
    +                    oSubmenu.show();
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +        oItem.handledMouseOverEvent = true;
    +        oItem.handledMouseOutEvent = false;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onMouseOut
    +* @description "mouseout" event handler for the menu.
    +* @protected
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onMouseOut: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var oEvent = p_aArgs[0];
    +    var oItem = p_aArgs[1];
    +    var oRelatedTarget = Event.getRelatedTarget(oEvent);
    +    var bMovingToSubmenu = false;
    +
    +    if(oItem) {
    +
    +        var oItemCfg = oItem.cfg;
    +        var oSubmenu = oItemCfg.getProperty("submenu");
    +
    +        if(
    +            oSubmenu &&
    +            (
    +                oRelatedTarget == oSubmenu.element ||
    +                Dom.isAncestor(oSubmenu.element, oRelatedTarget)
    +            )
    +        ) {
    +
    +            bMovingToSubmenu = true;
    +
    +        }
    +
    +        if(
    +            !oItem.handledMouseOutEvent &&
    +            (
    +                (
    +                    oRelatedTarget != oItem.element &&
    +                    !Dom.isAncestor(oItem.element, oRelatedTarget)
    +                ) || bMovingToSubmenu
    +            )
    +        ) {
    +
    +            if(this.cfg.getProperty("showdelay") > 0) {
    +
    +                this._cancelShowDelay();
    +
    +            }
    +
    +            if(!bMovingToSubmenu) {
    +
    +                oItemCfg.setProperty("selected", false);
    +
    +            }
    +
    +            if(this.cfg.getProperty("autosubmenudisplay")) {
    +
    +                if(oSubmenu) {
    +
    +                    if(
    +                        !(
    +                            oRelatedTarget == oSubmenu.element ||
    +                            YAHOO.util.Dom.isAncestor(
    +                                oSubmenu.element,
    +                                oRelatedTarget
    +                            )
    +                        )
    +                    ) {
    +
    +                        oSubmenu.hide();
    +
    +                    }
    +
    +                }
    +
    +            }
    +
    +            oItem.handledMouseOutEvent = true;
    +            oItem.handledMouseOverEvent = false;
    +
    +        }
    +
    +    }
    +
    +    if(
    +        !this._bHandledMouseOutEvent &&
    +        (
    +            (
    +                oRelatedTarget != this.element &&
    +                !Dom.isAncestor(this.element, oRelatedTarget)
    +            )
    +            || bMovingToSubmenu
    +        )
    +    ) {
    +
    +        this._bHandledMouseOutEvent = true;
    +        this._bHandledMouseOverEvent = false;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onClick
    +* @description "click" event handler for the menu.
    +* @protected
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onClick: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var oEvent = p_aArgs[0];
    +    var oItem = p_aArgs[1];
    +    var oTarget = Event.getTarget(oEvent);
    +
    +    if(oItem) {
    +
    +        var oItemCfg = oItem.cfg;
    +        var oSubmenu = oItemCfg.getProperty("submenu");
    +
    +        /*
    +            ACCESSIBILITY FEATURE FOR SCREEN READERS:
    +            Expand/collapse the submenu when the user clicks
    +            on the submenu indicator image.
    +        */
    +
    +        if(oTarget == oItem.submenuIndicator && oSubmenu) {
    +
    +            if(oSubmenu.cfg.getProperty("visible")) {
    +
    +                oSubmenu.hide();
    +
    +            }
    +            else {
    +
    +                this.clearActiveItem();
    +
    +                this.activeItem = oItem;
    +
    +                oItem.cfg.setProperty("selected", true);
    +
    +                oSubmenu.show();
    +
    +            }
    +
    +        }
    +        else {
    +
    +            var sURL = oItemCfg.getProperty("url");
    +            var bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#");
    +            var sTarget = oItemCfg.getProperty("target");
    +            var bHasTarget = (sTarget && sTarget.length > 0);
    +
    +            /*
    +                Prevent the browser from following links
    +                equal to "#"
    +            */
    +
    +            if(
    +                oTarget.tagName.toUpperCase() == "A" &&
    +                bCurrentPageURL && !bHasTarget
    +            ) {
    +
    +                Event.preventDefault(oEvent);
    +
    +            }
    +
    +            if(
    +                oTarget.tagName.toUpperCase() != "A" &&
    +                !bCurrentPageURL && !bHasTarget
    +            ) {
    +
    +                /*
    +                    Follow the URL of the item regardless of
    +                    whether or not the user clicked specifically
    +                    on the anchor element.
    +                */
    +
    +                document.location = sURL;
    +
    +            }
    +
    +            /*
    +                If the item doesn't navigate to a URL and it doesn't have
    +                a submenu, then collapse the menu tree.
    +            */
    +
    +            if(bCurrentPageURL && !oSubmenu) {
    +
    +                var oRoot = this.getRoot();
    +
    +                if(oRoot.cfg.getProperty("position") == "static") {
    +
    +                    oRoot.clearActiveItem();
    +
    +                }
    +                else {
    +
    +                    oRoot.hide();
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onKeyDown
    +* @description "keydown" event handler for the menu.
    +* @protected
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onKeyDown: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var oEvent = p_aArgs[0];
    +    var oItem = p_aArgs[1];
    +    var oSubmenu;
    +
    +    if(oItem) {
    +
    +        var oItemCfg = oItem.cfg;
    +        var oParentItem = this.parent;
    +        var oRoot;
    +        var oNextItem;
    +
    +        switch(oEvent.keyCode) {
    +
    +            case 38:    // Up arrow
    +            case 40:    // Down arrow
    +
    +                if(
    +                    oItem == this.activeItem &&
    +                    !oItemCfg.getProperty("selected")
    +                ) {
    +
    +                    oItemCfg.setProperty("selected", true);
    +
    +                }
    +                else {
    +
    +                    oNextItem = (oEvent.keyCode == 38) ?
    +                        oItem.getPreviousEnabledSibling() :
    +                        oItem.getNextEnabledSibling();
    +
    +                    if(oNextItem) {
    +
    +                        this.clearActiveItem();
    +
    +                        oNextItem.cfg.setProperty("selected", true);
    +                        oNextItem.focus();
    +
    +                    }
    +
    +                }
    +
    +                Event.preventDefault(oEvent);
    +
    +            break;
    +
    +
    +            case 39:    // Right arrow
    +
    +                oSubmenu = oItemCfg.getProperty("submenu");
    +
    +                if(oSubmenu) {
    +
    +                    if(!oItemCfg.getProperty("selected")) {
    +
    +                        oItemCfg.setProperty("selected", true);
    +
    +                    }
    +
    +                    oSubmenu.show();
    +
    +                    oSubmenu.setInitialSelection();
    +
    +                }
    +                else {
    +
    +                    oRoot = this.getRoot();
    +
    +                    if(oRoot instanceof YAHOO.widget.MenuBar) {
    +
    +                        oNextItem = oRoot.activeItem.getNextEnabledSibling();
    +
    +                        if(oNextItem) {
    +
    +                            oRoot.clearActiveItem();
    +
    +                            oNextItem.cfg.setProperty("selected", true);
    +
    +                            oSubmenu = oNextItem.cfg.getProperty("submenu");
    +
    +                            if(oSubmenu) {
    +
    +                                oSubmenu.show();
    +
    +                            }
    +
    +                            oNextItem.focus();
    +
    +                        }
    +
    +                    }
    +
    +                }
    +
    +
    +                Event.preventDefault(oEvent);
    +
    +            break;
    +
    +
    +            case 37:    // Left arrow
    +
    +                if(oParentItem) {
    +
    +                    var oParentMenu = oParentItem.parent;
    +
    +                    if(oParentMenu instanceof YAHOO.widget.MenuBar) {
    +
    +                        oNextItem =
    +                            oParentMenu.activeItem.getPreviousEnabledSibling();
    +
    +                        if(oNextItem) {
    +
    +                            oParentMenu.clearActiveItem();
    +
    +                            oNextItem.cfg.setProperty("selected", true);
    +
    +                            oSubmenu = oNextItem.cfg.getProperty("submenu");
    +
    +                            if(oSubmenu) {
    +
    +                                oSubmenu.show();
    +
    +                            }
    +
    +                            oNextItem.focus();
    +
    +                        }
    +
    +                    }
    +                    else {
    +
    +                        this.hide();
    +
    +                        oParentItem.focus();
    +
    +                    }
    +
    +                }
    +
    +                Event.preventDefault(oEvent);
    +
    +            break;
    +
    +        }
    +
    +    }
    +
    +    if(oEvent.keyCode == 27) { // Esc key
    +
    +        if(this.cfg.getProperty("position") == "dynamic") {
    +
    +            this.hide();
    +
    +            if(this.parent) {
    +
    +                this.parent.focus();
    +
    +            }
    +
    +        }
    +        else if(this.activeItem) {
    +
    +            oSubmenu = this.activeItem.cfg.getProperty("submenu");
    +
    +            if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
    +
    +                oSubmenu.hide();
    +                this.activeItem.focus();
    +
    +            }
    +            else {
    +
    +                this.activeItem.cfg.setProperty("selected", false);
    +                this.activeItem.blur();
    +
    +            }
    +
    +        }
    +
    +        Event.preventDefault(oEvent);
    +
    +    }
    +
    +},
    +
    +// Private methods
    +
    +/**
    +* @method _onInit
    +* @description "init" event handler for the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onInit: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    if(
    +        (
    +            (this.parent && !this.lazyLoad) ||
    +            (!this.parent && this.cfg.getProperty("position") == "static") ||
    +            (
    +                !this.parent &&
    +                !this.lazyLoad &&
    +                this.cfg.getProperty("position") == "dynamic"
    +            )
    +        ) &&
    +        this.getItemGroups().length === 0
    +    ) {
    +
    +        if(this.srcElement) {
    +
    +            this._initSubTree();
    +
    +        }
    +
    +        if(this.itemData) {
    +
    +            this.addItems(this.itemData);
    +
    +        }
    +
    +    }
    +    else if(this.lazyLoad) {
    +
    +        this.cfg.fireQueue();
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onBeforeRender
    +* @description "beforerender" event handler for the menu.  Appends all of the
    +* <code>&#60;ul&#62;</code>, <code>&#60;li&#62;</code> and their accompanying
    +* title elements to the body element of the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var oConfig = this.cfg;
    +    var oEl = this.element;
    +    var nListElements = this._aListElements.length;
    +
    +    if(nListElements > 0) {
    +
    +        var i = 0;
    +        var bFirstList = true;
    +        var oUL;
    +        var oGroupTitle;
    +
    +        do {
    +
    +            oUL = this._aListElements[i];
    +
    +            if(oUL) {
    +
    +                if(bFirstList) {
    +
    +                    Dom.addClass(oUL, "first-of-type");
    +                    bFirstList = false;
    +
    +                }
    +
    +                if(!Dom.isAncestor(oEl, oUL)) {
    +
    +                    this.appendToBody(oUL);
    +
    +                }
    +
    +                oGroupTitle = this._aGroupTitleElements[i];
    +
    +                if(oGroupTitle) {
    +
    +                    if(!Dom.isAncestor(oEl, oGroupTitle)) {
    +
    +                        oUL.parentNode.insertBefore(oGroupTitle, oUL);
    +
    +                    }
    +
    +                    Dom.addClass(oUL, "hastitle");
    +
    +                }
    +
    +            }
    +
    +            i++;
    +
    +        }
    +        while(i < nListElements);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onRender
    +* @description "render" event handler for the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onRender: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    if(this.cfg.getProperty("position") == "dynamic") {
    +
    +        var sWidth =
    +            this.element.parentNode.tagName.toUpperCase() == "BODY" ?
    +            this.element.offsetWidth : this._getOffsetWidth();
    +
    +        this.cfg.setProperty("width", (sWidth + "px"));
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onBeforeShow
    +* @description "beforeshow" event handler for the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    if(this.lazyLoad && this.getItemGroups().length === 0) {
    +
    +        if(this.srcElement) {
    +
    +            this._initSubTree();
    +
    +        }
    +
    +        if(this.itemData) {
    +
    +            if(
    +                this.parent && this.parent.parent &&
    +                this.parent.parent.srcElement &&
    +                this.parent.parent.srcElement.tagName.toUpperCase() == "SELECT"
    +            ) {
    +
    +                var nOptions = this.itemData.length;
    +
    +                for(var n=0; n<nOptions; n++) {
    +
    +                    if(this.itemData[n].tagName) {
    +
    +                        this.addItem((new this.ITEM_TYPE(this.itemData[n])));
    +
    +                    }
    +
    +                }
    +
    +            }
    +            else {
    +
    +                this.addItems(this.itemData);
    +
    +            }
    +
    +        }
    +
    +        if(this.srcElement) {
    +
    +            this.render();
    +
    +        }
    +        else {
    +
    +            if(this.parent) {
    +
    +                this.render(this.parent.element);
    +
    +            }
    +            else {
    +
    +                this.render(this.cfg.getProperty("container"));
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onShow
    +* @description "show" event handler for the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired
    +* the event.
    +*/
    +_onShow: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    this.setInitialFocus();
    +
    +    var oParent = this.parent;
    +
    +    if(oParent) {
    +
    +        var oParentMenu = oParent.parent;
    +
    +        var aParentAlignment = oParentMenu.cfg.getProperty("submenualignment");
    +        var aAlignment = this.cfg.getProperty("submenualignment");
    +
    +        if(
    +            (aParentAlignment[0] != aAlignment[0]) &&
    +            (aParentAlignment[1] != aAlignment[1])
    +        ) {
    +
    +            this.cfg.setProperty(
    +                "submenualignment",
    +                [ aParentAlignment[0], aParentAlignment[1] ]
    +            );
    +
    +        }
    +
    +        if(
    +            !oParentMenu.cfg.getProperty("autosubmenudisplay") &&
    +            oParentMenu.cfg.getProperty("position") == "static"
    +        ) {
    +
    +            oParentMenu.cfg.setProperty("autosubmenudisplay", true);
    +
    +            /**
    +            * "click" event handler for the document
    +            * @private
    +            * @param {Event} p_oEvent Object reference for the DOM event object
    +            * passed back by the event utility (YAHOO.util.Event).
    +            */
    +            var disableAutoSubmenuDisplay = function(p_oEvent) {
    +
    +                if(
    +                    p_oEvent.type == "mousedown" ||
    +                    (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27)
    +                ) {
    +
    +                    /*
    +                        Set the "autosubmenudisplay" to "false" if the user
    +                        clicks outside the menu bar.
    +                    */
    +
    +                    var oTarget = Event.getTarget(p_oEvent);
    +
    +                    if(
    +                        oTarget != oParentMenu.element ||
    +                        !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget)
    +                    ) {
    +
    +                        oParentMenu.cfg.setProperty(
    +                            "autosubmenudisplay",
    +                            false
    +                        );
    +
    +                        Event.removeListener(
    +                                document,
    +                                "mousedown",
    +                                disableAutoSubmenuDisplay
    +                            );
    +
    +                        Event.removeListener(
    +                                document,
    +                                "keydown",
    +                                disableAutoSubmenuDisplay
    +                            );
    +
    +                    }
    +
    +                }
    +
    +            };
    +
    +            Event.addListener(document, "mousedown", disableAutoSubmenuDisplay);
    +            Event.addListener(document, "keydown", disableAutoSubmenuDisplay);
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onBeforeHide
    +* @description "beforehide" event handler for the menu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that fired
    +* the event.
    +*/
    +_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    this.clearActiveItem(true);
    +
    +},
    +
    +/**
    +* @method _onParentMenuConfigChange
    +* @description "configchange" event handler for a submenu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that
    +* subscribed to the event.
    +*/
    +_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) {
    +
    +    var sPropertyName = p_aArgs[0][0];
    +    var oPropertyValue = p_aArgs[0][1];
    +
    +    switch(sPropertyName) {
    +
    +        case "iframe":
    +        case "constraintoviewport":
    +        case "hidedelay":
    +        case "showdelay":
    +        case "clicktohide":
    +        case "effect":
    +
    +            p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue);
    +
    +        break;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onParentMenuRender
    +* @description "render" event handler for a submenu.  Renders a
    +* submenu in response to the firing of its parent's "render" event.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that
    +* subscribed to the event.
    +*/
    +_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) {
    +
    +    /*
    +        Set the "constraintoviewport" configuration
    +        property to match the parent Menu
    +    */
    +
    +    var oParentMenu = p_oSubmenu.parent.parent;
    +
    +    var oConfig = {
    +
    +            constraintoviewport:
    +                oParentMenu.cfg.getProperty("constraintoviewport"),
    +
    +            xy: [0,0],
    +
    +            clicktohide:
    +                oParentMenu.cfg.getProperty("clicktohide"),
    +
    +            effect:
    +                oParentMenu.cfg.getProperty("effect")
    +
    +        };
    +
    +    var nShowDelay = oParentMenu.cfg.getProperty("showdelay");
    +
    +    if(nShowDelay > 0) {
    +
    +        oConfig.showdelay = nShowDelay;
    +
    +    }
    +
    +    var nHideDelay = oParentMenu.cfg.getProperty("hidedelay");
    +
    +    if(nHideDelay > 0) {
    +
    +        oConfig.hidedelay = nHideDelay;
    +
    +    }
    +
    +    /*
    +        Only sync the "iframe" configuration property if the parent
    +        menu's "position" configuration is the same.
    +    */
    +
    +    if(
    +        this.cfg.getProperty("position") ==
    +        oParentMenu.cfg.getProperty("position")
    +    ) {
    +
    +        oConfig.iframe = oParentMenu.cfg.getProperty("iframe");
    +
    +    }
    +
    +
    +    p_oSubmenu.cfg.applyConfig(oConfig);
    +
    +    if(!this.lazyLoad) {
    +
    +        if(Dom.inDocument(this.element)) {
    +
    +            this.render();
    +
    +        }
    +        else {
    +
    +            this.render(this.parent.element);
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onSubmenuBeforeShow
    +* @description "beforeshow" event handler for a submenu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that
    +* subscribed to the event.
    +*/
    +_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) {
    +
    +    var oParent = this.parent;
    +    var aAlignment = oParent.parent.cfg.getProperty("submenualignment");
    +
    +    this.cfg.setProperty(
    +        "context",
    +        [oParent.element, aAlignment[0], aAlignment[1]]
    +    );
    +
    +    oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +},
    +
    +/**
    +* @method _onSubmenuShow
    +* @description "show" event handler for a submenu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that
    +* subscribed to the event.
    +*/
    +_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) {
    +
    +    var oParent = this.parent;
    +
    +    oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +},
    +
    +/**
    +* @method _onSubmenuHide
    +* @description "hide" Custom Event handler for a submenu.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oSubmenu Object representing the submenu that
    +* subscribed to the event.
    +*/
    +_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) {
    +
    +    var oParent = this.parent;
    +
    +    oParent.submenuIndicator.alt = oParent.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +},
    +
    +/**
    +* @method _onMenuItemFocus
    +* @description "focus" event handler for the menu's items.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +* that fired the event.
    +*/
    +_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) {
    +
    +    this.activeItem = p_oItem;
    +
    +},
    +
    +/**
    +* @method _onMenuItemBlur
    +* @description "blur" event handler for the menu's items.
    +* @private
    +* @param {String} p_sType String representing the name of the event
    +* that was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +*/
    +_onMenuItemBlur: function(p_sType, p_aArgs) {
    +
    +    this.activeItem = null;
    +
    +},
    +
    +/**
    +* @method _onMenuItemConfigChange
    +* @description "configchange" event handler for the menu's items.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +* that fired the event.
    +*/
    +_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) {
    +
    +    var sProperty = p_aArgs[0][0];
    +
    +    switch(sProperty) {
    +
    +        case "submenu":
    +
    +            var oSubmenu = p_aArgs[0][1];
    +
    +            if(oSubmenu) {
    +
    +                this._configureSubmenu(p_oItem);
    +
    +            }
    +
    +        break;
    +
    +        case "text":
    +        case "helptext":
    +
    +            /*
    +                A change to an item's "text" or "helptext"
    +                configuration properties requires the width of the parent
    +                menu to be recalculated.
    +            */
    +
    +            if(this.element.style.width) {
    +
    +                var sWidth = this._getOffsetWidth() + "px";
    +
    +                Dom.setStyle(this.element, "width", sWidth);
    +
    +            }
    +
    +        break;
    +
    +    }
    +
    +},
    +
    +// Public event handlers for configuration properties
    +
    +/**
    +* @method enforceConstraints
    +* @description The default event handler executed when the moveEvent is fired,
    +* if the "constraintoviewport" configuration property is set to true.
    +* @param {String} type The name of the event that was fired.
    +* @param {Array} args Collection of arguments sent when the
    +* event was fired.
    +* @param {Array} obj Array containing the current Menu instance
    +* and the item that fired the event.
    +*/
    +enforceConstraints: function(type, args, obj) {
    +
    +    var oConfig = this.cfg;
    +
    +    var pos = args[0];
    +
    +    var x = pos[0];
    +    var y = pos[1];
    +
    +    var bod = document.getElementsByTagName('body')[0];
    +    var htm = document.getElementsByTagName('html')[0];
    +
    +    var bodyOverflow = Dom.getStyle(bod, "overflow");
    +    var htmOverflow = Dom.getStyle(htm, "overflow");
    +
    +    var offsetHeight = this.element.offsetHeight;
    +    var offsetWidth = this.element.offsetWidth;
    +
    +    var viewPortWidth = Dom.getClientWidth();
    +    var viewPortHeight = Dom.getClientHeight();
    +
    +    var scrollX = window.scrollX || document.body.scrollLeft;
    +    var scrollY = window.scrollY || document.body.scrollTop;
    +
    +    var topConstraint = scrollY + 10;
    +    var leftConstraint = scrollX + 10;
    +    var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10;
    +    var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10;
    +
    +    var aContext = oConfig.getProperty("context");
    +    var oContextElement = aContext ? aContext[0] : null;
    +
    +
    +    if (x < 10) {
    +
    +        x = leftConstraint;
    +
    +    } else if ((x + offsetWidth) > viewPortWidth) {
    +
    +        if(
    +            oContextElement &&
    +            ((x - oContextElement.offsetWidth) > offsetWidth)
    +        ) {
    +
    +            x = (x - (oContextElement.offsetWidth + offsetWidth));
    +
    +        }
    +        else {
    +
    +            x = rightConstraint;
    +
    +        }
    +
    +    }
    +
    +    if (y < 10) {
    +
    +        y = topConstraint;
    +
    +    } else if (y > bottomConstraint) {
    +
    +        if(oContextElement && (y > offsetHeight)) {
    +
    +            y = ((y + oContextElement.offsetHeight) - offsetHeight);
    +
    +        }
    +        else {
    +
    +            y = bottomConstraint;
    +
    +        }
    +
    +    }
    +
    +    oConfig.setProperty("x", x, true);
    +    oConfig.setProperty("y", y, true);
    +
    +},
    +
    +/**
    +* @method configVisible
    +* @description Event handler for when the "visible" configuration property
    +* the menu changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +configVisible: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    if(this.cfg.getProperty("position") == "dynamic") {
    +
    +        YAHOO.widget.Menu.superclass.configVisible.call(
    +            this,
    +            p_sType,
    +            p_aArgs,
    +            p_oMenu
    +        );
    +
    +    }
    +    else {
    +
    +        var bVisible = p_aArgs[0];
    +    	var sDisplay = Dom.getStyle(this.element, "display");
    +
    +        if(bVisible) {
    +
    +            if(sDisplay != "block") {
    +                this.beforeShowEvent.fire();
    +                Dom.setStyle(this.element, "display", "block");
    +                this.showEvent.fire();
    +            }
    +
    +        }
    +        else {
    +
    +			if(sDisplay == "block") {
    +				this.beforeHideEvent.fire();
    +				Dom.setStyle(this.element, "display", "none");
    +				this.hideEvent.fire();
    +			}
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method configPosition
    +* @description Event handler for when the "position" configuration property
    +* of the menu changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +configPosition: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute";
    +    var oCfg = this.cfg;
    +
    +    Dom.setStyle(this.element, "position", sCSSPosition);
    +
    +    if(sCSSPosition == "static") {
    +
    +        /*
    +            Remove the iframe for statically positioned menus since it will
    +            intercept mouse events.
    +        */
    +
    +        oCfg.setProperty("iframe", false);
    +
    +        // Statically positioned menus are visible by default
    +
    +        Dom.setStyle(this.element, "display", "block");
    +
    +        oCfg.setProperty("visible", true);
    +
    +    }
    +    else {
    +
    +        /*
    +            Even though the "visible" property is queued to
    +            "false" by default, we need to set the "visibility" property to
    +            "hidden" since Overlay's "configVisible" implementation checks the
    +            element's "visibility" style property before deciding whether
    +            or not to show an Overlay instance.
    +        */
    +
    +        Dom.setStyle(this.element, "visibility", "hidden");
    +
    +    }
    +
    +    if(sCSSPosition == "absolute") {
    +
    +        var nZIndex = oCfg.getProperty("zindex");
    +
    +        if(!nZIndex || nZIndex === 0) {
    +
    +            nZIndex = this.parent ?
    +                (this.parent.parent.cfg.getProperty("zindex") + 1) : 1;
    +
    +            oCfg.setProperty("zindex", nZIndex);
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method configIframe
    +* @description Event handler for when the "iframe" configuration property of
    +* the menu changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +configIframe: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    if(this.cfg.getProperty("position") == "dynamic") {
    +
    +        YAHOO.widget.Menu.superclass.configIframe.call(
    +            this,
    +            p_sType,
    +            p_aArgs,
    +            p_oMenu
    +        );
    +
    +    }
    +
    +},
    +
    +/**
    +* @method configHideDelay
    +* @description Event handler for when the "hidedelay" configuration property
    +* of the menu changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +configHideDelay: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var nHideDelay = p_aArgs[0];
    +    var oMouseOutEvent = this.mouseOutEvent;
    +    var oMouseOverEvent = this.mouseOverEvent;
    +    var oKeyDownEvent = this.keyDownEvent;
    +
    +    if(nHideDelay > 0) {
    +
    +        /*
    +            Only assign event handlers once. This way the user change
    +            the value for the hidedelay as many times as they want.
    +        */
    +
    +        if(!this._hideDelayEventHandlersAssigned) {
    +
    +            oMouseOutEvent.subscribe(this._execHideDelay, true);
    +            oMouseOverEvent.subscribe(this._cancelHideDelay, this, true);
    +            oKeyDownEvent.subscribe(this._cancelHideDelay, this, true);
    +
    +            this._hideDelayEventHandlersAssigned = true;
    +
    +        }
    +
    +    }
    +    else {
    +
    +        oMouseOutEvent.unsubscribe(this._execHideDelay, this);
    +        oMouseOverEvent.unsubscribe(this._cancelHideDelay, this);
    +        oKeyDownEvent.unsubscribe(this._cancelHideDelay, this);
    +
    +        this._hideDelayEventHandlersAssigned = false;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method configContainer
    +* @description Event handler for when the "container" configuration property
    +of the menu changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.Menu} p_oMenu Object representing the menu that
    +* fired the event.
    +*/
    +configContainer: function(p_sType, p_aArgs, p_oMenu) {
    +
    +	var oElement = p_aArgs[0];
    +
    +	if(typeof oElement == 'string') {
    +
    +        this.cfg.setProperty(
    +                "container",
    +                document.getElementById(oElement),
    +                true
    +            );
    +
    +	}
    +
    +},
    +
    +// Public methods
    +
    +/**
    +* Event handler called when the resize monitor element's "resize" evet is fired.
    +*/
    +onDomResize: function(e, obj) {
    +
    +    if(!this._handleResize) {
    +
    +        this._handleResize = true;
    +        return;
    +
    +    }
    +
    +    var oConfig = this.cfg;
    +
    +    if(oConfig.getProperty("position") == "dynamic") {
    +
    +        oConfig.setProperty("width", (this._getOffsetWidth() + "px"));
    +
    +    }
    +
    +    YAHOO.widget.Menu.superclass.onDomResize.call(this, e, obj);
    +
    +},
    +
    +/**
    +* @method initEvents
    +* @description Initializes the custom events for the menu.
    +*/
    +initEvents: function() {
    +
    +	YAHOO.widget.Menu.superclass.initEvents.call(this);
    +
    +    // Create custom events
    +
    +    var CustomEvent = YAHOO.util.CustomEvent;
    +
    +    this.mouseOverEvent = new CustomEvent("mouseOverEvent", this);
    +    this.mouseOutEvent = new CustomEvent("mouseOutEvent", this);
    +    this.mouseDownEvent = new CustomEvent("mouseDownEvent", this);
    +    this.mouseUpEvent = new CustomEvent("mouseUpEvent", this);
    +    this.clickEvent = new CustomEvent("clickEvent", this);
    +    this.keyPressEvent = new CustomEvent("keyPressEvent", this);
    +    this.keyDownEvent = new CustomEvent("keyDownEvent", this);
    +    this.keyUpEvent = new CustomEvent("keyUpEvent", this);
    +    this.itemAddedEvent = new CustomEvent("itemAddedEvent", this);
    +    this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this);
    +
    +},
    +
    +/**
    +* @method getRoot
    +* @description Finds the menu's root menu.
    +*/
    +getRoot: function() {
    +
    +    var oItem = this.parent;
    +
    +    if(oItem) {
    +
    +        var oParentMenu = oItem.parent;
    +
    +        return oParentMenu ? oParentMenu.getRoot() : this;
    +
    +    }
    +    else {
    +
    +        return this;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method toString
    +* @description Returns a string representing the menu.
    +* @return {String}
    +*/
    +toString: function() {
    +
    +    return ("Menu " + this.id);
    +
    +},
    +
    +/**
    +* @method setItemGroupTitle
    +* @description Sets the title of a group of menu items.
    +* @param {String} p_sGroupTitle String specifying the title of the group.
    +* @param {Number} p_nGroupIndex Optional. Number specifying the group to which
    +* the title belongs.
    +*/
    +setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) {
    +
    +    if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) {
    +
    +        var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
    +        var oTitle = this._aGroupTitleElements[nGroupIndex];
    +
    +        if(oTitle) {
    +
    +            oTitle.innerHTML = p_sGroupTitle;
    +
    +        }
    +        else {
    +
    +            oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME);
    +
    +            oTitle.innerHTML = p_sGroupTitle;
    +
    +            this._aGroupTitleElements[nGroupIndex] = oTitle;
    +
    +        }
    +
    +        var i = this._aGroupTitleElements.length - 1;
    +        var nFirstIndex;
    +
    +        do {
    +
    +            if(this._aGroupTitleElements[i]) {
    +
    +                Dom.removeClass(this._aGroupTitleElements[i], "first-of-type");
    +
    +                nFirstIndex = i;
    +
    +            }
    +
    +        }
    +        while(i--);
    +
    +        if(nFirstIndex !== null) {
    +
    +            Dom.addClass(
    +                this._aGroupTitleElements[nFirstIndex],
    +                "first-of-type"
    +            );
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method addItem
    +* @description Appends an item to the menu.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance to be added to the menu.
    +* @param {String} p_oItem String specifying the text of the item to be added
    +* to the menu.
    +* @param {Object} p_oItem Object literal containing a set of menu item
    +* configuration properties.
    +* @param {Number} p_nGroupIndex Optional. Number indicating the group to
    +* which the item belongs.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +addItem: function(p_oItem, p_nGroupIndex) {
    +
    +    if(p_oItem) {
    +
    +        return this._addItemToGroup(p_nGroupIndex, p_oItem);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method addItems
    +* @description Adds an array of items to the menu.
    +* @param {Array} p_aItems Array of items to be added to the menu.  The array
    +* can contain strings specifying the text for each item to be created, object
    +* literals specifying each of the menu item configuration properties,
    +* or MenuItem instances.
    +* @param {Number} p_nGroupIndex Optional. Number specifying the group to
    +* which the items belongs.
    +* @return {Array}
    +*/
    +addItems: function(p_aItems, p_nGroupIndex) {
    +
    +    function isArray(p_oValue) {
    +
    +        return (typeof p_oValue == "object" && p_oValue.constructor == Array);
    +
    +    }
    +
    +    if(isArray(p_aItems)) {
    +
    +        var nItems = p_aItems.length;
    +        var aItems = [];
    +        var oItem;
    +
    +        for(var i=0; i<nItems; i++) {
    +
    +            oItem = p_aItems[i];
    +
    +            if(isArray(oItem)) {
    +
    +                aItems[aItems.length] = this.addItems(oItem, i);
    +
    +            }
    +            else {
    +
    +                aItems[aItems.length] =
    +                    this._addItemToGroup(p_nGroupIndex, oItem);
    +
    +            }
    +
    +        }
    +
    +        if(aItems.length) {
    +
    +            return aItems;
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method insertItem
    +* @description Inserts an item into the menu at the specified index.
    +* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
    +* instance to be added to the menu.
    +* @param {String} p_oItem String specifying the text of the item to be added
    +* to the menu.
    +* @param {Object} p_oItem Object literal containing a set of menu item
    +* configuration properties.
    +* @param {Number} p_nItemIndex Number indicating the ordinal position at which
    +* the item should be added.
    +* @param {Number} p_nGroupIndex Optional. Number indicating the group to which
    +* the item belongs.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +insertItem: function(p_oItem, p_nItemIndex, p_nGroupIndex) {
    +
    +    if(p_oItem) {
    +
    +        return this._addItemToGroup(p_nGroupIndex, p_oItem, p_nItemIndex);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method removeItem
    +* @description Removes the specified item from the menu.
    +* @param {YAHOO.widget.MenuItem} p_oObject Object reference for the MenuItem
    +* instance to be removed from the menu.
    +* @param {Number} p_oObject Number specifying the index of the item
    +* to be removed.
    +* @param {Number} p_nGroupIndex Optional. Number specifying the group to
    +* which the item belongs.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +removeItem: function(p_oObject, p_nGroupIndex) {
    +
    +    if(typeof p_oObject != "undefined") {
    +
    +        var oItem;
    +
    +        if(p_oObject instanceof YAHOO.widget.MenuItem) {
    +
    +            oItem = this._removeItemFromGroupByValue(p_nGroupIndex, p_oObject);
    +
    +        }
    +        else if(typeof p_oObject == "number") {
    +
    +            oItem = this._removeItemFromGroupByIndex(p_nGroupIndex, p_oObject);
    +
    +        }
    +
    +        if(oItem) {
    +
    +            oItem.destroy();
    +
    +            return oItem;
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method getItemGroups
    +* @description Returns a multi-dimensional array of all of the items in the menu.
    +* @return {Array}
    +*/
    +getItemGroups: function() {
    +
    +    return this._aItemGroups;
    +
    +},
    +
    +/**
    +* @method getItem
    +* @description Returns the item at the specified index.
    +* @param {Number} p_nItemIndex Number indicating the ordinal position of the
    +* item to be retrieved.
    +* @param {Number} p_nGroupIndex Optional. Number indicating the group to which
    +* the item belongs.
    +* @return {YAHOO.widget.MenuItem}
    +*/
    +getItem: function(p_nItemIndex, p_nGroupIndex) {
    +
    +    if(typeof p_nItemIndex == "number") {
    +
    +        var aGroup = this._getItemGroup(p_nGroupIndex);
    +
    +        if(aGroup) {
    +
    +            return aGroup[p_nItemIndex];
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @method destroy
    +* @description Removes the menu's <code>&#60;div&#62;</code> element
    +* (and accompanying child nodes) from the document.
    +*/
    +destroy: function() {
    +
    +    // Remove Custom Event listeners
    +
    +    this.mouseOverEvent.unsubscribeAll();
    +    this.mouseOutEvent.unsubscribeAll();
    +    this.mouseDownEvent.unsubscribeAll();
    +    this.mouseUpEvent.unsubscribeAll();
    +    this.clickEvent.unsubscribeAll();
    +    this.keyPressEvent.unsubscribeAll();
    +    this.keyDownEvent.unsubscribeAll();
    +    this.keyUpEvent.unsubscribeAll();
    +
    +    var nItemGroups = this._aItemGroups.length;
    +    var nItems;
    +    var oItemGroup;
    +    var oItem;
    +    var i;
    +    var n;
    +
    +    // Remove all items
    +
    +    if(nItemGroups > 0) {
    +
    +        i = nItemGroups - 1;
    +
    +        do {
    +
    +            oItemGroup = this._aItemGroups[i];
    +
    +            if(oItemGroup) {
    +
    +                nItems = oItemGroup.length;
    +
    +                if(nItems > 0) {
    +
    +                    n = nItems - 1;
    +
    +                    do {
    +
    +                        oItem = this._aItemGroups[i][n];
    +
    +                        if(oItem) {
    +
    +                            oItem.destroy();
    +                        }
    +
    +                    }
    +                    while(n--);
    +
    +                }
    +
    +            }
    +
    +        }
    +        while(i--);
    +
    +    }
    +
    +    // Continue with the superclass implementation of this method
    +
    +    YAHOO.widget.Menu.superclass.destroy.call(this);
    +
    +
    +},
    +
    +/**
    +* @method setInitialFocus
    +* @description Sets focus to the menu's first enabled item.
    +*/
    +setInitialFocus: function() {
    +
    +    var oItem = this._getFirstEnabledItem();
    +
    +    if(oItem) {
    +
    +        oItem.focus();
    +    }
    +
    +},
    +
    +/**
    +* @method setInitialSelection
    +* @description Sets the "selected" configuration property of the menu's first
    +* enabled item to "true."
    +*/
    +setInitialSelection: function() {
    +
    +    var oItem = this._getFirstEnabledItem();
    +
    +    if(oItem) {
    +
    +        oItem.cfg.setProperty("selected", true);
    +    }
    +
    +},
    +
    +/**
    +* @method clearActiveItem
    +* @description Sets the "selected" configuration property of the menu's active
    +* item to "false" and hides the item's submenu.
    +* @param {Boolean} p_bBlur Boolean indicating if the menu's active item
    +* should be blurred.
    +*/
    +clearActiveItem: function(p_bBlur) {
    +
    +    if(this.cfg.getProperty("showdelay") > 0) {
    +
    +        this._cancelShowDelay();
    +
    +    }
    +
    +    var oActiveItem = this.activeItem;
    +
    +    if(oActiveItem) {
    +
    +        var oConfig = oActiveItem.cfg;
    +
    +        oConfig.setProperty("selected", false);
    +
    +        var oSubmenu = oConfig.getProperty("submenu");
    +
    +        if(oSubmenu) {
    +
    +            oSubmenu.hide();
    +
    +        }
    +
    +        if(p_bBlur) {
    +
    +            oActiveItem.blur();
    +
    +        }
    +
    +    }
    +
    +},
    +
    +/**
    +* @description Initializes the class's configurable properties which can be
    +* changed using the menu's Config object ("cfg").
    +* @method initDefaultConfig
    +*/
    +initDefaultConfig: function() {
    +
    +    YAHOO.widget.Menu.superclass.initDefaultConfig.call(this);
    +
    +    var oConfig = this.cfg;
    +
    +	// Add configuration properties
    +
    +    /*
    +        Change the default value for the "visible" configuration
    +        property to "false" by re-adding the property.
    +    */
    +// holder
    +/**
    +    * @config visible
    +    * @description Boolean indicating whether or not the menu is visible.  If
    +    * the menu's "position" configuration property is set to "dynamic" (the
    +    * default), this property toggles the menu's <code>&#60;div&#62;</code>
    +    * element's "visibility" style property between "visible" (true) or
    +    * "hidden" (false).  If the menu's "position" configuration property is
    +    * set to "static" this property toggles the menu's
    +    * <code>&#60;div&#62;</code> element's "display" style property
    +    * between "block" (true) or "none" (false).
    +    * @default false
    +    * @type Boolean
    +    */
    +    oConfig.addProperty(
    +        "visible",
    +        {
    +            value:false,
    +            handler:this.configVisible,
    +            validator:this.cfg.checkBoolean
    +         }
    +     );
    +
    +    /*
    +        Change the default value for the "constraintoviewport" configuration
    +        property to "true" by re-adding the property.
    +    */
    +// holder
    +/**
    +    * @config constraintoviewport
    +    * @description Boolean indicating if the menu will try to remain inside
    +    * the boundaries of the size of viewport.
    +    * @default true
    +    * @type Boolean
    +    */
    +    oConfig.addProperty(
    +        "constraintoviewport",
    +        {
    +            value:true,
    +            handler:this.configConstrainToViewport,
    +            validator:this.cfg.checkBoolean,
    +            supercedes:["iframe","x","y","xy"]
    +        }
    +    );
    +
    +    /**
    +    * @config position
    +    * @description String indicating how a menu should be positioned on the
    +    * screen.  Possible values are "static" and "dynamic."  Static menus are
    +    * visible by default and reside in the normal flow of the document
    +    * (CSS position: static).  Dynamic menus are hidden by default, reside
    +    * out of the normal flow of the document (CSS position: absolute), and
    +    * can overlay other elements on the screen.
    +    * @default dynamic
    +    * @type String
    +    */
    +    oConfig.addProperty(
    +        "position",
    +        {
    +            value: "dynamic",
    +            handler: this.configPosition,
    +            validator: this._checkPosition,
    +            supercedes: ["visible"]
    +        }
    +    );
    +
    +    /**
    +    * @config submenualignment
    +    * @description Array defining how submenus should be aligned to their
    +    * parent menu item. The format is: [itemCorner, submenuCorner]. By default
    +    * a submenu's top left corner is aligned to its parent menu item's top
    +    * right corner.
    +    * @default ["tl","tr"]
    +    * @type Array
    +    */
    +    oConfig.addProperty("submenualignment", { value: ["tl","tr"] } );
    +
    +    /**
    +    * @config autosubmenudisplay
    +    * @description Boolean indicating if submenus are automatically made
    +    * visible when the user mouses over the menu's items.
    +    * @default true
    +    * @type Boolean
    +    */
    +	oConfig.addProperty(
    +	   "autosubmenudisplay",
    +	   {
    +	       value: true,
    +	       validator: oConfig.checkBoolean
    +       }
    +    );
    +
    +    /**
    +    * @config showdelay
    +    * @description Number indicating the time (in milliseconds) that should
    +    * expire before a submenu is made visible when the user mouses over
    +    * the menu's items.
    +    * @default 0
    +    * @type Number
    +    */
    +	oConfig.addProperty(
    +	   "showdelay",
    +	   {
    +	       value: 0,
    +	       validator: oConfig.checkNumber
    +       }
    +    );
    +
    +    /**
    +    * @config hidedelay
    +    * @description Number indicating the time (in milliseconds) that should
    +    * expire before the menu is hidden.
    +    * @default 0
    +    * @type Number
    +    */
    +	oConfig.addProperty(
    +	   "hidedelay",
    +	   {
    +	       value: 0,
    +	       validator: oConfig.checkNumber,
    +	       handler: this.configHideDelay,
    +	       suppressEvent: true
    +       }
    +    );
    +
    +    /**
    +    * @config clicktohide
    +    * @description Boolean indicating if the menu will automatically be
    +    * hidden if the user clicks outside of it.
    +    * @default true
    +    * @type Boolean
    +    */
    +    oConfig.addProperty(
    +        "clicktohide",
    +        {
    +            value: true,
    +            validator: oConfig.checkBoolean
    +        }
    +    );
    +
    +	/**
    +	* @config container
    +	* @description HTML element reference or string specifying the id
    +	* attribute of the HTML element that the menu's markup should be rendered into.
    +	* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +	* level-one-html.html#ID-58190037">HTMLElement</a>|String
    +	* @default document.body
    +	*/
    +	this.cfg.addProperty(
    +	   "container",
    +	   { value:document.body, handler:this.configContainer }
    +   );
    +
    +}
    +
    +}); // END YAHOO.extend
    +
    +})();
    +
    +/**
    +* The base class for all menuing containers.
    +*
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the menu module.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source for the
    +* menu module.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929
    +* /level-one-html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object
    +* specifying the <code>&#60;div&#62;</code> element of the menu module.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-94282980">HTMLSelectElement</a>} p_oElement Object
    +* specifying the <code>&#60;select&#62;</code> element to be used as the data
    +* source for the menu module.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu module. See configuration class documentation for
    +* more details.
    +* @class MenuModule
    +* @constructor
    +* @extends YAHOO.widget.Overlay
    +* @deprecated As of version 0.12, all MenuModule functionality has been
    +* implemented directly in YAHOO.widget.Menu, making YAHOO.widget.Menu the base
    +* class for all menuing containers.
    +*/
    +YAHOO.widget.MenuModule = YAHOO.widget.Menu;
    +
    +(function() {
    +
    +var Dom = YAHOO.util.Dom;
    +var Module = YAHOO.widget.Module;
    +var Menu = YAHOO.widget.Menu;
    +
    +/**
    +* Creates an item for a menu.
    +*
    +* @param {String} p_oObject String specifying the text of the menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying
    +* the <code>&#60;li&#62;</code> element of the menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +* specifying the <code>&#60;optgroup&#62;</code> element of the menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object
    +* specifying the <code>&#60;option&#62;</code> element of the menu item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu item. See configuration class documentation
    +* for more details.
    +* @class MenuItem
    +* @constructor
    +*/
    +YAHOO.widget.MenuItem = function(p_oObject, p_oConfig) {
    +
    +    if(p_oObject) {
    +
    +        if(p_oConfig) {
    +
    +            this.parent = p_oConfig.parent;
    +            this.value = p_oConfig.value;
    +
    +        }
    +
    +        this.init(p_oObject, p_oConfig);
    +
    +    }
    +
    +};
    +
    +YAHOO.widget.MenuItem.prototype = {
    +
    +    // Constants
    +
    +    /**
    +    * @property SUBMENU_INDICATOR_IMAGE_PATH
    +    * @description String representing the path to the image to be used for the
    +    * menu item's submenu arrow indicator.
    +    * @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif",
    +
    +    /**
    +    * @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
    +    * @description String representing the path to the image to be used for the
    +    * submenu arrow indicator when the menu item is selected.
    +    * @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH:
    +        "nt/ic/ut/alt1/menuarorght8_hov_1.gif",
    +
    +    /**
    +    * @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
    +    * @description String representing the path to the image to be used for the
    +    * submenu arrow indicator when the menu item is disabled.
    +    * @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:
    +        "nt/ic/ut/alt1/menuarorght8_dim_1.gif",
    +
    +    /**
    +    * @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT
    +    * @description String representing the alt text for the image to be used
    +    * for the submenu arrow indicator.
    +    * @default "Collapsed.  Click to expand."
    +    * @final
    +    * @type String
    +    */
    +    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed.  Click to expand.",
    +
    +    /**
    +    * @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT
    +    * @description String representing the alt text for the image to be used
    +    * for the submenu arrow indicator when the submenu is visible.
    +    * @default "Expanded.  Click to collapse."
    +    * @final
    +    * @type String
    +    */
    +    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded.  Click to collapse.",
    +
    +    /**
    +    * @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT
    +    * @description String representing the alt text for the image to be used
    +    * for the submenu arrow indicator when the menu item is disabled.
    +    * @default "Disabled."
    +    * @final
    +    * @type String
    +    */
    +    DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.",
    +
    +    /**
    +    * @property CHECKED_IMAGE_PATH
    +    * @description String representing the path to the image to be used for
    +    * the checked state.
    +    * @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif",
    +
    +
    +    /**
    +    * @property SELECTED_CHECKED_IMAGE_PATH
    +    * @description String representing the path to the image to be used for
    +    * the selected checked state.
    +    * @default "nt/ic/ut/bsc/menuchk8_hov_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif",
    +
    +
    +    /**
    +    * @property DISABLED_CHECKED_IMAGE_PATH
    +    * @description String representing the path to the image to be used for
    +    * the disabled checked state.
    +    * @default "nt/ic/ut/bsc/menuchk8_dim_1.gif"
    +    * @final
    +    * @type String
    +    */
    +    DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif",
    +
    +
    +    /**
    +    * @property CHECKED_IMAGE_ALT_TEXT
    +    * @description String representing the alt text for the image to be used
    +    * for the checked image.
    +    * @default "Checked."
    +    * @final
    +    * @type String
    +    */
    +    CHECKED_IMAGE_ALT_TEXT: "Checked.",
    +
    +
    +    /**
    +    * @property DISABLED_CHECKED_IMAGE_ALT_TEXT
    +    * @description String representing the alt text for the image to be used
    +    * for the checked image when the item is disabled.
    +    * @default "Checked. (Item disabled.)"
    +    * @final
    +    * @type String
    +    */
    +    DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)",
    +
    +    /**
    +    * @property CSS_CLASS_NAME
    +    * @description String representing the CSS class(es) to be applied to the
    +    * <code>&#60;li&#62;</code> element of the menu item.
    +    * @default "yuimenuitem"
    +    * @final
    +    * @type String
    +    */
    +    CSS_CLASS_NAME: "yuimenuitem",
    +
    +    /**
    +    * @property SUBMENU_TYPE
    +    * @description Object representing the type of menu to instantiate and
    +    * add when parsing the child nodes of the menu item's source HTML element.
    +    * @final
    +    * @type YAHOO.widget.Menu
    +    */
    +    SUBMENU_TYPE: null,
    +
    +    /**
    +    * @property IMG_ROOT
    +    * @description String representing the prefix path to use for
    +    * non-secure images.
    +    * @default "http://us.i1.yimg.com/us.yimg.com/i/"
    +    * @type String
    +    */
    +    IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/",
    +
    +
    +    /**
    +    * @property IMG_ROOT_SSL
    +    * @description String representing the prefix path to use for securely
    +    * served images.
    +    * @default "https://a248.e.akamai.net/sec.yimg.com/i/"
    +    * @type String
    +    */
    +    IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/",
    +
    +    // Private member variables
    +
    +    /**
    +    * @property _oAnchor
    +    * @description Object reference to the menu item's
    +    * <code>&#60;a&#62;</code> element.
    +    * @default null
    +    * @private
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-48250443">HTMLAnchorElement</a>
    +    */
    +    _oAnchor: null,
    +
    +
    +    /**
    +    * @property _oText
    +    * @description Object reference to the menu item's text node.
    +    * @default null
    +    * @private
    +    * @type TextNode
    +    */
    +    _oText: null,
    +
    +
    +    /**
    +    * @property _oHelpTextEM
    +    * @description Object reference to the menu item's help text
    +    * <code>&#60;em&#62;</code> element.
    +    * @default null
    +    * @private
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-58190037">HTMLElement</a>
    +    */
    +    _oHelpTextEM: null,
    +
    +
    +    /**
    +    * @property _oSubmenu
    +    * @description Object reference to the menu item's submenu.
    +    * @default null
    +    * @private
    +    * @type YAHOO.widget.Menu
    +    */
    +    _oSubmenu: null,
    +
    +    /**
    +    * @property _checkImage
    +    * @description Object reference to the menu item's checkmark image.
    +    * @default null
    +    * @private
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-17701901">HTMLImageElement</a>
    +    */
    +    _checkImage: null,
    +
    +    // Public properties
    +
    +	/**
    +    * @property constructor
    +	* @description Object reference to the menu item's constructor function.
    +    * @default YAHOO.widget.MenuItem
    +	* @type YAHOO.widget.MenuItem
    +	*/
    +	constructor: YAHOO.widget.MenuItem,
    +
    +	/**
    +    * @property imageRoot
    +	* @description String representing the root path for all of the menu
    +	* item's images.
    +	* @type String
    +	*/
    +	imageRoot: null,
    +
    +	/**
    +    * @property isSecure
    +	* @description Boolean representing whether or not the current browsing
    +	* context is secure (HTTPS).
    +	* @type Boolean
    +	*/
    +	isSecure: Module.prototype.isSecure,
    +
    +    /**
    +    * @property index
    +    * @description Number indicating the ordinal position of the menu item in
    +    * its group.
    +    * @default null
    +    * @type Number
    +    */
    +    index: null,
    +
    +    /**
    +    * @property groupIndex
    +    * @description Number indicating the index of the group to which the menu
    +    * item belongs.
    +    * @default null
    +    * @type Number
    +    */
    +    groupIndex: null,
    +
    +    /**
    +    * @property parent
    +    * @description Object reference to the menu item's parent menu.
    +    * @default null
    +    * @type YAHOO.widget.Menu
    +    */
    +    parent: null,
    +
    +    /**
    +    * @property element
    +    * @description Object reference to the menu item's
    +    * <code>&#60;li&#62;</code> element.
    +    * @default <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level
    +    * -one-html.html#ID-74680021">HTMLLIElement</a>
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-74680021">HTMLLIElement</a>
    +    */
    +    element: null,
    +
    +    /**
    +    * @property srcElement
    +    * @description Object reference to the HTML element (either
    +    * <code>&#60;li&#62;</code>, <code>&#60;optgroup&#62;</code> or
    +    * <code>&#60;option&#62;</code>) used create the menu item.
    +    * @default <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-74680021">HTMLLIElement</a>|<a href="http://www.
    +    * w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-38450247"
    +    * >HTMLOptGroupElement</a>|<a href="http://www.w3.org/TR/2000/WD-DOM-
    +    * Level-1-20000929/level-one-html.html#ID-70901257">HTMLOptionElement</a>
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-74680021">HTMLLIElement</a>|<a href="http://www.w3.
    +    * org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-38450247">
    +    * HTMLOptGroupElement</a>|<a href="http://www.w3.org/TR/2000/WD-DOM-
    +    * Level-1-20000929/level-one-html.html#ID-70901257">HTMLOptionElement</a>
    +    */
    +    srcElement: null,
    +
    +    /**
    +    * @property value
    +    * @description Object reference to the menu item's value.
    +    * @default null
    +    * @type Object
    +    */
    +    value: null,
    +
    +    /**
    +    * @property submenuIndicator
    +    * @description Object reference to the <code>&#60;img&#62;</code> element
    +    * used to create the submenu indicator for the menu item.
    +    * @default <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-17701901">HTMLImageElement</a>
    +    * @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-17701901">HTMLImageElement</a>
    +    */
    +    submenuIndicator: null,
    +
    +	/**
    +    * @property browser
    +	* @description String representing the browser.
    +	* @type String
    +	*/
    +	browser: Module.prototype.browser,
    +
    +    // Events
    +
    +    /**
    +    * @event destroyEvent
    +    * @description Fires when the menu item's <code>&#60;li&#62;</code>
    +    * element is removed from its parent <code>&#60;ul&#62;</code> element.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    destroyEvent: null,
    +
    +    /**
    +    * @event mouseOverEvent
    +    * @description Fires when the mouse has entered the menu item.  Passes
    +    * back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    mouseOverEvent: null,
    +
    +    /**
    +    * @event mouseOutEvent
    +    * @description Fires when the mouse has left the menu item.  Passes back
    +    * the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    mouseOutEvent: null,
    +
    +    /**
    +    * @event mouseDownEvent
    +    * @description Fires when the user mouses down on the menu item.  Passes
    +    * back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    mouseDownEvent: null,
    +
    +    /**
    +    * @event mouseUpEvent
    +    * @description Fires when the user releases a mouse button while the mouse
    +    * is over the menu item.  Passes back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    mouseUpEvent: null,
    +
    +    /**
    +    * @event clickEvent
    +    * @description Fires when the user clicks the on the menu item.  Passes
    +    * back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    clickEvent: null,
    +
    +    /**
    +    * @event keyPressEvent
    +    * @description Fires when the user presses an alphanumeric key when the
    +    * menu item has focus.  Passes back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    keyPressEvent: null,
    +
    +    /**
    +    * @event keyDownEvent
    +    * @description Fires when the user presses a key when the menu item has
    +    * focus.  Passes back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    keyDownEvent: null,
    +
    +    /**
    +    * @event keyUpEvent
    +    * @description Fires when the user releases a key when the menu item has
    +    * focus.  Passes back the DOM Event object as an argument.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    keyUpEvent: null,
    +
    +    /**
    +    * @event focusEvent
    +    * @description Fires when the menu item receives focus.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    focusEvent: null,
    +
    +    /**
    +    * @event blurEvent
    +    * @description Fires when the menu item loses the input focus.
    +    * @type YAHOO.util.CustomEvent
    +    */
    +    blurEvent: null,
    +
    +    /**
    +    * @method init
    +    * @description The MenuItem class's initialization method. This method is
    +    * automatically called by the constructor, and sets up all DOM references
    +    * for pre-existing markup, and creates required markup if it is not
    +    * already present.
    +    * @param {String} p_oObject String specifying the text of the menu item.
    +    * @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying
    +    * the <code>&#60;li&#62;</code> element of the menu item.
    +    * @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +    * specifying the <code>&#60;optgroup&#62;</code> element of the menu item.
    +    * @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +    * one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object
    +    * specifying the <code>&#60;option&#62;</code> element of the menu item.
    +    * @param {Object} p_oConfig Optional. Object literal specifying the
    +    * configuration for the menu item. See configuration class documentation
    +    * for more details.
    +    */
    +    init: function(p_oObject, p_oConfig) {
    +
    +        this.imageRoot = (this.isSecure) ? this.IMG_ROOT_SSL : this.IMG_ROOT;
    +
    +        if(!this.SUBMENU_TYPE) {
    +
    +            this.SUBMENU_TYPE = Menu;
    +
    +        }
    +
    +        // Create the config object
    +
    +        this.cfg = new YAHOO.util.Config(this);
    +
    +        this.initDefaultConfig();
    +
    +        var oConfig = this.cfg;
    +
    +        if(this._checkString(p_oObject)) {
    +
    +            this._createRootNodeStructure();
    +
    +            oConfig.setProperty("text", p_oObject);
    +
    +        }
    +        else if(this._checkDOMNode(p_oObject)) {
    +
    +            switch(p_oObject.tagName.toUpperCase()) {
    +
    +                case "OPTION":
    +
    +                    this._createRootNodeStructure();
    +
    +                    oConfig.setProperty("text", p_oObject.text);
    +
    +                    this.srcElement = p_oObject;
    +
    +                break;
    +
    +                case "OPTGROUP":
    +
    +                    this._createRootNodeStructure();
    +
    +                    oConfig.setProperty("text", p_oObject.label);
    +
    +                    this.srcElement = p_oObject;
    +
    +                    this._initSubTree();
    +
    +                break;
    +
    +                case "LI":
    +
    +                    // Get the anchor node (if it exists)
    +
    +                    var oAnchor = this._getFirstElement(p_oObject, "A");
    +                    var sURL = "#";
    +                    var sTarget = null;
    +                    var sText = null;
    +
    +                    // Capture the "text" and/or the "URL"
    +
    +                    if(oAnchor) {
    +
    +                        sURL = oAnchor.getAttribute("href");
    +                        sTarget = oAnchor.getAttribute("target");
    +
    +                        if(oAnchor.innerText) {
    +
    +                            sText = oAnchor.innerText;
    +
    +                        }
    +                        else {
    +
    +                            var oRange = oAnchor.ownerDocument.createRange();
    +
    +                            oRange.selectNodeContents(oAnchor);
    +
    +                            sText = oRange.toString();
    +
    +                        }
    +
    +                    }
    +                    else {
    +
    +                        var oText = p_oObject.firstChild;
    +
    +                        sText = oText.nodeValue;
    +
    +                        oAnchor = document.createElement("a");
    +
    +                        oAnchor.setAttribute("href", sURL);
    +
    +                        p_oObject.replaceChild(oAnchor, oText);
    +
    +                        oAnchor.appendChild(oText);
    +
    +                    }
    +
    +                    this.srcElement = p_oObject;
    +                    this.element = p_oObject;
    +                    this._oAnchor = oAnchor;
    +
    +
    +                    // Check if emphasis has been applied to the MenuItem
    +
    +                    var oEmphasisNode = this._getFirstElement(oAnchor);
    +                    var bEmphasis = false;
    +                    var bStrongEmphasis = false;
    +
    +                    if(oEmphasisNode) {
    +
    +                        // Set a reference to the text node
    +
    +                        this._oText = oEmphasisNode.firstChild;
    +
    +                        switch(oEmphasisNode.tagName.toUpperCase()) {
    +
    +                            case "EM":
    +
    +                                bEmphasis = true;
    +
    +                            break;
    +
    +                            case "STRONG":
    +
    +                                bStrongEmphasis = true;
    +
    +                            break;
    +
    +                        }
    +
    +                    }
    +                    else {
    +
    +                        // Set a reference to the text node
    +
    +                        this._oText = oAnchor.firstChild;
    +
    +                    }
    +
    +                    /*
    +                        Set these properties silently to sync up the
    +                        configuration object without making changes to the
    +                        element's DOM
    +                    */
    +
    +                    oConfig.setProperty("text", sText, true);
    +                    oConfig.setProperty("url", sURL, true);
    +                    oConfig.setProperty("target", sTarget, true);
    +                    oConfig.setProperty("emphasis", bEmphasis, true);
    +                    oConfig.setProperty(
    +                        "strongemphasis",
    +                        bStrongEmphasis,
    +                        true
    +                    );
    +
    +                    this._initSubTree();
    +
    +                break;
    +
    +            }
    +
    +        }
    +
    +        if(this.element) {
    +
    +            Dom.addClass(this.element, this.CSS_CLASS_NAME);
    +
    +            // Create custom events
    +
    +            var CustomEvent = YAHOO.util.CustomEvent;
    +
    +            this.destroyEvent = new CustomEvent("destroyEvent", this);
    +            this.mouseOverEvent = new CustomEvent("mouseOverEvent", this);
    +            this.mouseOutEvent = new CustomEvent("mouseOutEvent", this);
    +            this.mouseDownEvent = new CustomEvent("mouseDownEvent", this);
    +            this.mouseUpEvent = new CustomEvent("mouseUpEvent", this);
    +            this.clickEvent = new CustomEvent("clickEvent", this);
    +            this.keyPressEvent = new CustomEvent("keyPressEvent", this);
    +            this.keyDownEvent = new CustomEvent("keyDownEvent", this);
    +            this.keyUpEvent = new CustomEvent("keyUpEvent", this);
    +            this.focusEvent = new CustomEvent("focusEvent", this);
    +            this.blurEvent = new CustomEvent("blurEvent", this);
    +
    +            if(p_oConfig) {
    +
    +                oConfig.applyConfig(p_oConfig);
    +
    +            }
    +
    +            oConfig.fireQueue();
    +
    +        }
    +
    +    },
    +
    +    // Private methods
    +
    +    /**
    +    * @method _getFirstElement
    +    * @description Returns an HTML element's first HTML element node.
    +    * @private
    +    * @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-58190037">HTMLElement</a>} p_oElement Object
    +    * reference specifying the element to be evaluated.
    +    * @param {String} p_sTagName Optional. String specifying the tagname of
    +    * the element to be retrieved.
    +    * @return {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-58190037">HTMLElement</a>}
    +    */
    +    _getFirstElement: function(p_oElement, p_sTagName) {
    +
    +        var oElement;
    +
    +        if(p_oElement.firstChild && p_oElement.firstChild.nodeType == 1) {
    +
    +            oElement = p_oElement.firstChild;
    +
    +        }
    +        else if(
    +            p_oElement.firstChild &&
    +            p_oElement.firstChild.nextSibling &&
    +            p_oElement.firstChild.nextSibling.nodeType == 1
    +        ) {
    +
    +            oElement = p_oElement.firstChild.nextSibling;
    +
    +        }
    +
    +        if(p_sTagName) {
    +
    +            return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ?
    +                oElement : false;
    +
    +        }
    +
    +        return oElement;
    +
    +    },
    +
    +    /**
    +    * @method _checkString
    +    * @description Determines if an object is a string.
    +    * @private
    +    * @param {Object} p_oObject Object to be evaluated.
    +    * @return {Boolean}
    +    */
    +    _checkString: function(p_oObject) {
    +
    +        return (typeof p_oObject == "string");
    +
    +    },
    +
    +    /**
    +    * @method _checkDOMNode
    +    * @description Determines if an object is an HTML element.
    +    * @private
    +    * @param {Object} p_oObject Object to be evaluated.
    +    * @return {Boolean}
    +    */
    +    _checkDOMNode: function(p_oObject) {
    +
    +        return (p_oObject && p_oObject.tagName);
    +
    +    },
    +
    +    /**
    +    * @method _createRootNodeStructure
    +    * @description Creates the core DOM structure for the menu item.
    +    * @private
    +    */
    +    _createRootNodeStructure: function () {
    +
    +        this.element = document.createElement("li");
    +
    +        this._oText = document.createTextNode("");
    +
    +        this._oAnchor = document.createElement("a");
    +        this._oAnchor.appendChild(this._oText);
    +
    +        this.cfg.refireEvent("url");
    +
    +        this.element.appendChild(this._oAnchor);
    +
    +    },
    +
    +    /**
    +    * @method _initSubTree
    +    * @description Iterates the source element's childNodes collection and uses
    +    * the child nodes to instantiate other menus.
    +    * @private
    +    */
    +    _initSubTree: function() {
    +
    +        var oSrcEl = this.srcElement;
    +        var oConfig = this.cfg;
    +
    +        if(oSrcEl.childNodes.length > 0) {
    +
    +            if(
    +                this.parent.lazyLoad &&
    +                this.parent.srcElement &&
    +                this.parent.srcElement.tagName.toUpperCase() == "SELECT"
    +            ) {
    +
    +                oConfig.setProperty(
    +                        "submenu",
    +                        { id: Dom.generateId(), itemdata: oSrcEl.childNodes }
    +                    );
    +
    +            }
    +            else {
    +
    +                var oNode = oSrcEl.firstChild;
    +                var aOptions = [];
    +
    +                do {
    +
    +                    if(oNode && oNode.tagName) {
    +
    +                        switch(oNode.tagName.toUpperCase()) {
    +
    +                            case "DIV":
    +
    +                                oConfig.setProperty("submenu", oNode);
    +
    +                            break;
    +
    +                            case "OPTION":
    +
    +                                aOptions[aOptions.length] = oNode;
    +
    +                            break;
    +
    +                        }
    +
    +                    }
    +
    +                }
    +                while((oNode = oNode.nextSibling));
    +
    +
    +                var nOptions = aOptions.length;
    +
    +                if(nOptions > 0) {
    +
    +                    var oMenu = new this.SUBMENU_TYPE(Dom.generateId());
    +
    +                    oConfig.setProperty("submenu", oMenu);
    +
    +                    for(var n=0; n<nOptions; n++) {
    +
    +                        oMenu.addItem((new oMenu.ITEM_TYPE(aOptions[n])));
    +
    +                    }
    +
    +                }
    +
    +            }
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method _preloadImage
    +    * @description Preloads an image by creating an image element from the
    +    * specified path and appending the image to the body of the document.
    +    * @private
    +    * @param {String} p_sPath String specifying the path to the image.
    +    */
    +    _preloadImage: function(p_sPath) {
    +
    +        var sPath = this.imageRoot + p_sPath;
    +
    +        if(!document.images[sPath]) {
    +
    +            var oImage = document.createElement("img");
    +            oImage.src = sPath;
    +            oImage.name = sPath;
    +            oImage.id = sPath;
    +            oImage.style.display = "none";
    +
    +            document.body.appendChild(oImage);
    +
    +        }
    +
    +    },
    +
    +    // Event handlers for configuration properties
    +
    +    /**
    +    * @method configText
    +    * @description Event handler for when the "text" configuration property of
    +    * the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configText: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var sText = p_aArgs[0];
    +
    +        if(this._oText) {
    +
    +            this._oText.nodeValue = sText;
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configHelpText
    +    * @description Event handler for when the "helptext" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configHelpText: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var me = this;
    +        var oHelpText = p_aArgs[0];
    +        var oEl = this.element;
    +        var oConfig = this.cfg;
    +        var aNodes = [oEl, this._oAnchor];
    +        var oImg = this.submenuIndicator;
    +
    +        /**
    +        * Adds the "hashelptext" class to the necessary nodes and refires the
    +        * "selected" and "disabled" configuration events.
    +        * @private
    +        */
    +        var initHelpText = function() {
    +
    +            Dom.addClass(aNodes, "hashelptext");
    +
    +            if(oConfig.getProperty("disabled")) {
    +
    +                oConfig.refireEvent("disabled");
    +
    +            }
    +
    +            if(oConfig.getProperty("selected")) {
    +
    +                oConfig.refireEvent("selected");
    +
    +            }
    +
    +        };
    +
    +        /**
    +        * Removes the "hashelptext" class and corresponding DOM element (EM).
    +        * @private
    +        */
    +        var removeHelpText = function() {
    +
    +            Dom.removeClass(aNodes, "hashelptext");
    +
    +            oEl.removeChild(me._oHelpTextEM);
    +            me._oHelpTextEM = null;
    +
    +        };
    +
    +        if(this._checkDOMNode(oHelpText)) {
    +
    +            if(this._oHelpTextEM) {
    +
    +                this._oHelpTextEM.parentNode.replaceChild(
    +                    oHelpText,
    +                    this._oHelpTextEM
    +                );
    +
    +            }
    +            else {
    +
    +                this._oHelpTextEM = oHelpText;
    +
    +                oEl.insertBefore(this._oHelpTextEM, oImg);
    +
    +            }
    +
    +            initHelpText();
    +
    +        }
    +        else if(this._checkString(oHelpText)) {
    +
    +            if(oHelpText.length === 0) {
    +
    +                removeHelpText();
    +
    +            }
    +            else {
    +
    +                if(!this._oHelpTextEM) {
    +
    +                    this._oHelpTextEM = document.createElement("em");
    +
    +                    oEl.insertBefore(this._oHelpTextEM, oImg);
    +
    +                }
    +
    +                this._oHelpTextEM.innerHTML = oHelpText;
    +
    +                initHelpText();
    +
    +            }
    +
    +        }
    +        else if(!oHelpText && this._oHelpTextEM) {
    +
    +            removeHelpText();
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configURL
    +    * @description Event handler for when the "url" configuration property of
    +    * the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configURL: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var sURL = p_aArgs[0];
    +
    +        if(!sURL) {
    +
    +            sURL = "#";
    +
    +        }
    +
    +        this._oAnchor.setAttribute("href", sURL);
    +
    +    },
    +
    +    /**
    +    * @method configTarget
    +    * @description Event handler for when the "target" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configTarget: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var sTarget = p_aArgs[0];
    +        var oAnchor = this._oAnchor;
    +
    +        if(sTarget && sTarget.length > 0) {
    +
    +            oAnchor.setAttribute("target", sTarget);
    +
    +        }
    +        else {
    +
    +            oAnchor.removeAttribute("target");
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configEmphasis
    +    * @description Event handler for when the "emphasis" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configEmphasis: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var bEmphasis = p_aArgs[0];
    +        var oAnchor = this._oAnchor;
    +        var oText = this._oText;
    +        var oConfig = this.cfg;
    +        var oEM;
    +
    +        if(bEmphasis && oConfig.getProperty("strongemphasis")) {
    +
    +            oConfig.setProperty("strongemphasis", false);
    +
    +        }
    +
    +        if(oAnchor) {
    +
    +            if(bEmphasis) {
    +
    +                oEM = document.createElement("em");
    +                oEM.appendChild(oText);
    +
    +                oAnchor.appendChild(oEM);
    +
    +            }
    +            else {
    +
    +                oEM = this._getFirstElement(oAnchor, "EM");
    +
    +                oAnchor.removeChild(oEM);
    +                oAnchor.appendChild(oText);
    +
    +            }
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configStrongEmphasis
    +    * @description Event handler for when the "strongemphasis" configuration
    +    * property of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var bStrongEmphasis = p_aArgs[0];
    +        var oAnchor = this._oAnchor;
    +        var oText = this._oText;
    +        var oConfig = this.cfg;
    +        var oStrong;
    +
    +        if(bStrongEmphasis && oConfig.getProperty("emphasis")) {
    +
    +            oConfig.setProperty("emphasis", false);
    +
    +        }
    +
    +        if(oAnchor) {
    +
    +            if(bStrongEmphasis) {
    +
    +                oStrong = document.createElement("strong");
    +                oStrong.appendChild(oText);
    +
    +                oAnchor.appendChild(oStrong);
    +
    +            }
    +            else {
    +
    +                oStrong = this._getFirstElement(oAnchor, "STRONG");
    +
    +                oAnchor.removeChild(oStrong);
    +                oAnchor.appendChild(oText);
    +
    +            }
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configChecked
    +    * @description Event handler for when the "checked" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configChecked: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var bChecked = p_aArgs[0];
    +        var oEl = this.element;
    +        var oConfig = this.cfg;
    +        var oImg;
    +
    +
    +        if(bChecked) {
    +
    +            this._preloadImage(this.CHECKED_IMAGE_PATH);
    +            this._preloadImage(this.SELECTED_CHECKED_IMAGE_PATH);
    +            this._preloadImage(this.DISABLED_CHECKED_IMAGE_PATH);
    +
    +            oImg = document.createElement("img");
    +            oImg.src = (this.imageRoot + this.CHECKED_IMAGE_PATH);
    +            oImg.alt = this.CHECKED_IMAGE_ALT_TEXT;
    +
    +            var oSubmenu = this.cfg.getProperty("submenu");
    +
    +            if(oSubmenu) {
    +
    +                oEl.insertBefore(oImg, oSubmenu.element);
    +
    +            }
    +            else {
    +
    +                oEl.appendChild(oImg);
    +
    +            }
    +
    +            Dom.addClass([oEl, oImg], "checked");
    +
    +            this._checkImage = oImg;
    +
    +            if(oConfig.getProperty("disabled")) {
    +
    +                oConfig.refireEvent("disabled");
    +
    +            }
    +
    +            if(oConfig.getProperty("selected")) {
    +
    +                oConfig.refireEvent("selected");
    +
    +            }
    +
    +        }
    +        else {
    +
    +            oImg = this._checkImage;
    +
    +            Dom.removeClass([oEl, oImg], "checked");
    +
    +            if(oImg) {
    +
    +                oEl.removeChild(oImg);
    +
    +            }
    +
    +            this._checkImage = null;
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configDisabled
    +    * @description Event handler for when the "disabled" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configDisabled: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var bDisabled = p_aArgs[0];
    +        var oAnchor = this._oAnchor;
    +        var aNodes = [this.element, oAnchor];
    +        var oEM = this._oHelpTextEM;
    +        var oConfig = this.cfg;
    +        var oImg;
    +        var sImgSrc;
    +        var sImgAlt;
    +
    +        if(oEM) {
    +
    +            aNodes[2] = oEM;
    +
    +        }
    +
    +        if(this.cfg.getProperty("checked")) {
    +
    +            sImgAlt = this.CHECKED_IMAGE_ALT_TEXT;
    +            sImgSrc = this.CHECKED_IMAGE_PATH;
    +            oImg = this._checkImage;
    +
    +            if(bDisabled) {
    +
    +                sImgAlt = this.DISABLED_CHECKED_IMAGE_ALT_TEXT;
    +                sImgSrc = this.DISABLED_CHECKED_IMAGE_PATH;
    +
    +            }
    +
    +            oImg.src = document.images[(this.imageRoot + sImgSrc)].src;
    +            oImg.alt = sImgAlt;
    +
    +        }
    +
    +        oImg = this.submenuIndicator;
    +
    +        if(bDisabled) {
    +
    +            if(oConfig.getProperty("selected")) {
    +
    +                oConfig.setProperty("selected", false);
    +
    +            }
    +
    +            oAnchor.removeAttribute("href");
    +
    +            Dom.addClass(aNodes, "disabled");
    +
    +            sImgSrc = this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH;
    +            sImgAlt = this.DISABLED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +        }
    +        else {
    +
    +            oAnchor.setAttribute("href", oConfig.getProperty("url"));
    +
    +            Dom.removeClass(aNodes, "disabled");
    +
    +            sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
    +            sImgAlt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +        }
    +
    +        if(oImg) {
    +
    +            oImg.src = this.imageRoot + sImgSrc;
    +            oImg.alt = sImgAlt;
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configSelected
    +    * @description Event handler for when the "selected" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configSelected: function(p_sType, p_aArgs, p_oItem) {
    +
    +        if(!this.cfg.getProperty("disabled")) {
    +
    +            var bSelected = p_aArgs[0];
    +            var oEM = this._oHelpTextEM;
    +            var aNodes = [this.element, this._oAnchor];
    +            var oImg = this.submenuIndicator;
    +            var sImgSrc;
    +
    +            if(oEM) {
    +
    +                aNodes[aNodes.length] = oEM;
    +
    +            }
    +
    +            if(oImg) {
    +
    +                aNodes[aNodes.length] = oImg;
    +
    +            }
    +
    +
    +            if(this.cfg.getProperty("checked")) {
    +
    +                sImgSrc = this.imageRoot + (bSelected ?
    +                    this.SELECTED_CHECKED_IMAGE_PATH : this.CHECKED_IMAGE_PATH);
    +
    +                this._checkImage.src = document.images[sImgSrc].src;
    +
    +            }
    +
    +            if(bSelected) {
    +
    +                Dom.addClass(aNodes, "selected");
    +                sImgSrc = this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH;
    +
    +            }
    +            else {
    +
    +                Dom.removeClass(aNodes, "selected");
    +                sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
    +
    +            }
    +
    +            if(oImg) {
    +
    +                oImg.src = document.images[(this.imageRoot + sImgSrc)].src;
    +
    +            }
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method configSubmenu
    +    * @description Event handler for when the "submenu" configuration property
    +    * of the menu item changes.
    +    * @param {String} p_sType String representing the name of the event that
    +    * was fired.
    +    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    +    * that fired the event.
    +    */
    +    configSubmenu: function(p_sType, p_aArgs, p_oItem) {
    +
    +        var oEl = this.element;
    +        var oSubmenu = p_aArgs[0];
    +        var oImg = this.submenuIndicator;
    +        var oConfig = this.cfg;
    +        var aNodes = [this.element, this._oAnchor];
    +        var oMenu;
    +        var bLazyLoad = this.parent && this.parent.lazyLoad;
    +
    +        if(oSubmenu) {
    +
    +            if(oSubmenu instanceof Menu) {
    +
    +                oMenu = oSubmenu;
    +                oMenu.parent = this;
    +                oMenu.lazyLoad = bLazyLoad;
    +
    +            }
    +            else if(
    +                typeof oSubmenu == "object" &&
    +                oSubmenu.id &&
    +                !oSubmenu.nodeType
    +            ) {
    +
    +                var sSubmenuId = oSubmenu.id;
    +                var oSubmenuConfig = oSubmenu;
    +
    +                delete oSubmenu["id"];
    +
    +                oSubmenuConfig.lazyload = bLazyLoad;
    +                oSubmenuConfig.parent = this;
    +
    +                oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig);
    +
    +                // Set the value of the property to the Menu instance
    +
    +                this.cfg.setProperty("submenu", oMenu, true);
    +
    +            }
    +            else {
    +
    +                oMenu = new this.SUBMENU_TYPE(
    +                                oSubmenu,
    +                                { lazyload: bLazyLoad, parent: this }
    +                            );
    +
    +                // Set the value of the property to the Menu instance
    +
    +                this.cfg.setProperty("submenu", oMenu, true);
    +
    +            }
    +
    +            if(oMenu) {
    +
    +                this._oSubmenu = oMenu;
    +
    +                if(!oImg) {
    +
    +                    this._preloadImage(this.SUBMENU_INDICATOR_IMAGE_PATH);
    +                    this._preloadImage(
    +                            this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
    +                        );
    +
    +                    this._preloadImage(
    +                            this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
    +                        );
    +
    +                    oImg = document.createElement("img");
    +
    +                    oImg.src =
    +                        (this.imageRoot + this.SUBMENU_INDICATOR_IMAGE_PATH);
    +
    +                    oImg.alt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
    +
    +                    oEl.appendChild(oImg);
    +
    +                    this.submenuIndicator = oImg;
    +
    +                    Dom.addClass(aNodes, "hassubmenu");
    +
    +                    if(oConfig.getProperty("disabled")) {
    +
    +                        oConfig.refireEvent("disabled");
    +
    +                    }
    +
    +                    if(oConfig.getProperty("selected")) {
    +
    +                        oConfig.refireEvent("selected");
    +
    +                    }
    +
    +                }
    +
    +            }
    +
    +        }
    +        else {
    +
    +            Dom.removeClass(aNodes, "hassubmenu");
    +
    +            if(oImg) {
    +
    +                oEl.removeChild(oImg);
    +
    +            }
    +
    +            if(this._oSubmenu) {
    +
    +                this._oSubmenu.destroy();
    +
    +            }
    +
    +        }
    +
    +    },
    +
    +    // Public methods
    +
    +	/**
    +    * @method initDefaultConfig
    +	* @description Initializes an item's configurable properties.
    +	*/
    +	initDefaultConfig : function() {
    +
    +        var oConfig = this.cfg;
    +        var CheckBoolean = oConfig.checkBoolean;
    +
    +        // Define the config properties
    +
    +        /**
    +        * @config text
    +        * @description String specifying the text label for the menu item.
    +        * When building a menu from existing HTML the value of this property
    +        * will be interpreted from the menu's markup.
    +        * @default ""
    +        * @type String
    +        */
    +        oConfig.addProperty(
    +            "text",
    +            {
    +                value: "",
    +                handler: this.configText,
    +                validator: this._checkString,
    +                suppressEvent: true
    +            }
    +        );
    +
    +
    +        /**
    +        * @config helptext
    +        * @description String specifying additional instructional text to
    +        * accompany the text for the nenu item.
    +        * @default null
    +        * @type String|<a href="http://www.w3.org/TR/
    +        * 2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-58190037">
    +        * HTMLElement</a>
    +        */
    +        oConfig.addProperty("helptext", { handler: this.configHelpText });
    +
    +        /**
    +        * @config url
    +        * @description String specifying the URL for the menu item's anchor's
    +        * "href" attribute.  When building a menu from existing HTML the value
    +        * of this property will be interpreted from the menu's markup.
    +        * @default "#"
    +        * @type String
    +        */
    +        oConfig.addProperty(
    +            "url",
    +            { value: "#", handler: this.configURL, suppressEvent: true }
    +        );
    +
    +        /**
    +        * @config target
    +        * @description String specifying the value for the "target" attribute
    +        * of the menu item's anchor element. <strong>Specifying a target will
    +        * require the user to click directly on the menu item's anchor node in
    +        * order to cause the browser to navigate to the specified URL.</strong>
    +        * When building a menu from existing HTML the value of this property
    +        * will be interpreted from the menu's markup.
    +        * @default null
    +        * @type String
    +        */
    +        oConfig.addProperty(
    +            "target",
    +            { handler: this.configTarget, suppressEvent: true }
    +        );
    +
    +        /**
    +        * @config emphasis
    +        * @description Boolean indicating if the text of the menu item will be
    +        * rendered with emphasis.  When building a menu from existing HTML the
    +        * value of this property will be interpreted from the menu's markup.
    +        * @default false
    +        * @type Boolean
    +        */
    +        oConfig.addProperty(
    +            "emphasis",
    +            {
    +                value: false,
    +                handler: this.configEmphasis,
    +                validator: CheckBoolean,
    +                suppressEvent: true
    +            }
    +        );
    +
    +        /**
    +        * @config strongemphasis
    +        * @description Boolean indicating if the text of the menu item will be
    +        * rendered with strong emphasis.  When building a menu from existing
    +        * HTML the value of this property will be interpreted from the
    +        * menu's markup.
    +        * @default false
    +        * @type Boolean
    +        */
    +        oConfig.addProperty(
    +            "strongemphasis",
    +            {
    +                value: false,
    +                handler: this.configStrongEmphasis,
    +                validator: CheckBoolean,
    +                suppressEvent: true
    +            }
    +        );
    +
    +        /**
    +        * @config checked
    +        * @description Boolean indicating if the menu item should be rendered
    +        * with a checkmark.
    +        * @default false
    +        * @type Boolean
    +        */
    +        oConfig.addProperty(
    +            "checked",
    +            {
    +                value: false,
    +                handler: this.configChecked,
    +                validator: this.cfg.checkBoolean,
    +                suppressEvent: true,
    +                supercedes:["disabled"]
    +            }
    +        );
    +
    +        /**
    +        * @config disabled
    +        * @description Boolean indicating if the menu item should be disabled.
    +        * (Disabled menu items are  dimmed and will not respond to user input
    +        * or fire events.)
    +        * @default false
    +        * @type Boolean
    +        */
    +        oConfig.addProperty(
    +            "disabled",
    +            {
    +                value: false,
    +                handler: this.configDisabled,
    +                validator: CheckBoolean,
    +                suppressEvent: true
    +            }
    +        );
    +
    +        /**
    +        * @config selected
    +        * @description Boolean indicating if the menu item should
    +        * be highlighted.
    +        * @default false
    +        * @type Boolean
    +        */
    +        oConfig.addProperty(
    +            "selected",
    +            {
    +                value: false,
    +                handler: this.configSelected,
    +                validator: CheckBoolean,
    +                suppressEvent: true
    +            }
    +        );
    +
    +        /**
    +        * @config submenu
    +        * @description Object specifying the submenu to be appended to the
    +        * menu item.  The value can be one of the following: <ul><li>Object
    +        * specifying a Menu instance.</li><li>Object literal specifying the
    +        * menu to be created.  Format: <code>{ id: [menu id], itemdata:
    +        * [<a href="YAHOO.widget.Menu.html#itemData">array of values for
    +        * items</a>] }</code>.</li><li>String specifying the id attribute
    +        * of the <code>&#60;div&#62;</code> element of the menu.</li><li>
    +        * Object specifying the <code>&#60;div&#62;</code> element of the
    +        * menu.</li></ul>
    +        * @default null
    +        * @type Menu|String|Object|<a href="http://www.w3.org/TR/2000/
    +        * WD-DOM-Level-1-20000929/level-one-html.html#ID-58190037">
    +        * HTMLElement</a>
    +        */
    +        oConfig.addProperty("submenu", { handler: this.configSubmenu });
    +
    +	},
    +
    +    /**
    +    * @method getNextEnabledSibling
    +    * @description Finds the menu item's next enabled sibling.
    +    * @return YAHOO.widget.MenuItem
    +    */
    +    getNextEnabledSibling: function() {
    +
    +        if(this.parent instanceof Menu) {
    +
    +            var nGroupIndex = this.groupIndex;
    +
    +            /**
    +            * Finds the next item in an array.
    +            * @private
    +            * @param {p_aArray} Array to search.
    +            * @param {p_nStartIndex} Number indicating the index to
    +            * start searching the array.
    +            * @return {Object}
    +            */
    +            var getNextArrayItem = function(p_aArray, p_nStartIndex) {
    +
    +                return p_aArray[p_nStartIndex] ||
    +                    getNextArrayItem(p_aArray, (p_nStartIndex+1));
    +
    +            };
    +
    +
    +            var aItemGroups = this.parent.getItemGroups();
    +            var oNextItem;
    +
    +
    +            if(this.index < (aItemGroups[nGroupIndex].length - 1)) {
    +
    +                oNextItem = getNextArrayItem(
    +                        aItemGroups[nGroupIndex],
    +                        (this.index+1)
    +                    );
    +
    +            }
    +            else {
    +
    +                var nNextGroupIndex;
    +
    +                if(nGroupIndex < (aItemGroups.length - 1)) {
    +
    +                    nNextGroupIndex = nGroupIndex + 1;
    +
    +                }
    +                else {
    +
    +                    nNextGroupIndex = 0;
    +
    +                }
    +
    +                var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex);
    +
    +                // Retrieve the first menu item in the next group
    +
    +                oNextItem = getNextArrayItem(aNextGroup, 0);
    +
    +            }
    +
    +            return (
    +                oNextItem.cfg.getProperty("disabled") ||
    +                oNextItem.element.style.display == "none"
    +            ) ?
    +            oNextItem.getNextEnabledSibling() : oNextItem;
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method getPreviousEnabledSibling
    +    * @description Finds the menu item's previous enabled sibling.
    +    * @return {YAHOO.widget.MenuItem}
    +    */
    +    getPreviousEnabledSibling: function() {
    +
    +        if(this.parent instanceof Menu) {
    +
    +            var nGroupIndex = this.groupIndex;
    +
    +            /**
    +            * Returns the previous item in an array
    +            * @private
    +            * @param {p_aArray} Array to search.
    +            * @param {p_nStartIndex} Number indicating the index to
    +            * start searching the array.
    +            * @return {Object}
    +            */
    +            var getPreviousArrayItem = function(p_aArray, p_nStartIndex) {
    +
    +                return p_aArray[p_nStartIndex] ||
    +                    getPreviousArrayItem(p_aArray, (p_nStartIndex-1));
    +
    +            };
    +
    +            /**
    +            * Get the index of the first item in an array
    +            * @private
    +            * @param {p_aArray} Array to search.
    +            * @param {p_nStartIndex} Number indicating the index to
    +            * start searching the array.
    +            * @return {Object}
    +            */
    +            var getFirstItemIndex = function(p_aArray, p_nStartIndex) {
    +
    +                return p_aArray[p_nStartIndex] ?
    +                    p_nStartIndex :
    +                    getFirstItemIndex(p_aArray, (p_nStartIndex+1));
    +
    +            };
    +
    +            var aItemGroups = this.parent.getItemGroups();
    +            var oPreviousItem;
    +
    +            if(
    +                this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0)
    +            ) {
    +
    +                oPreviousItem =
    +                    getPreviousArrayItem(
    +                        aItemGroups[nGroupIndex],
    +                        (this.index-1)
    +                    );
    +
    +            }
    +            else {
    +
    +                var nPreviousGroupIndex;
    +
    +                if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) {
    +
    +                    nPreviousGroupIndex = nGroupIndex - 1;
    +
    +                }
    +                else {
    +
    +                    nPreviousGroupIndex = aItemGroups.length - 1;
    +
    +                }
    +
    +                var aPreviousGroup =
    +                        getPreviousArrayItem(aItemGroups, nPreviousGroupIndex);
    +
    +                oPreviousItem =
    +                    getPreviousArrayItem(
    +                        aPreviousGroup,
    +                        (aPreviousGroup.length - 1)
    +                    );
    +
    +            }
    +
    +            return (
    +                oPreviousItem.cfg.getProperty("disabled") ||
    +                oPreviousItem.element.style.display == "none"
    +            ) ?
    +            oPreviousItem.getPreviousEnabledSibling() : oPreviousItem;
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method focus
    +    * @description Causes the menu item to receive the focus and fires the
    +    * focus event.
    +    */
    +    focus: function() {
    +
    +        var oParent = this.parent;
    +        var oAnchor = this._oAnchor;
    +        var oActiveItem = oParent.activeItem;
    +
    +        if(
    +            !this.cfg.getProperty("disabled") &&
    +            oParent &&
    +            oParent.cfg.getProperty("visible") &&
    +            this.element.style.display != "none"
    +        ) {
    +
    +            if(oActiveItem) {
    +
    +                oActiveItem.blur();
    +
    +            }
    +
    +            try {
    +
    +                oAnchor.focus();
    +
    +            }
    +            catch(e) {
    +
    +            }
    +
    +            this.focusEvent.fire();
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method blur
    +    * @description Causes the menu item to lose focus and fires the
    +    * onblur event.
    +    */
    +    blur: function() {
    +
    +        var oParent = this.parent;
    +
    +        if(
    +            !this.cfg.getProperty("disabled") &&
    +            oParent &&
    +            Dom.getStyle(oParent.element, "visibility") == "visible"
    +        ) {
    +
    +            this._oAnchor.blur();
    +
    +            this.blurEvent.fire();
    +
    +        }
    +
    +    },
    +
    +	/**
    +    * @method destroy
    +	* @description Removes the menu item's <code>&#60;li&#62;</code> element
    +	* from its parent <code>&#60;ul&#62;</code> element.
    +	*/
    +    destroy: function() {
    +
    +        var oEl = this.element;
    +
    +        if(oEl) {
    +
    +            // Remove CustomEvent listeners
    +
    +            this.mouseOverEvent.unsubscribeAll();
    +            this.mouseOutEvent.unsubscribeAll();
    +            this.mouseDownEvent.unsubscribeAll();
    +            this.mouseUpEvent.unsubscribeAll();
    +            this.clickEvent.unsubscribeAll();
    +            this.keyPressEvent.unsubscribeAll();
    +            this.keyDownEvent.unsubscribeAll();
    +            this.keyUpEvent.unsubscribeAll();
    +            this.focusEvent.unsubscribeAll();
    +            this.blurEvent.unsubscribeAll();
    +            this.cfg.configChangedEvent.unsubscribeAll();
    +
    +            // Remove the element from the parent node
    +
    +            var oParentNode = oEl.parentNode;
    +
    +            if(oParentNode) {
    +
    +                oParentNode.removeChild(oEl);
    +
    +                this.destroyEvent.fire();
    +
    +            }
    +
    +            this.destroyEvent.unsubscribeAll();
    +
    +        }
    +
    +    },
    +
    +    /**
    +    * @method toString
    +    * @description Returns a string representing the menu item.
    +    * @return {String}
    +    */
    +    toString: function() {
    +
    +        return ("MenuItem: " + this.cfg.getProperty("text"));
    +
    +    }
    +
    +};
    +
    +})();
    +
    +/**
    +* Creates an item for a menu module.
    +*
    +* @param {String} p_oObject String specifying the text of the menu module item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying the
    +* <code>&#60;li&#62;</code> element of the menu module item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object specifying
    +* the <code>&#60;optgroup&#62;</code> element of the menu module item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object specifying the
    +* <code>&#60;option&#62;</code> element of the menu module item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu module item. See configuration class documentation
    +* for more details.
    +* @class MenuModuleItem
    +* @constructor
    +* @deprecated As of version 0.12, all MenuModuleItem functionality has been
    +* implemented directly in YAHOO.widget.MenuItem, making YAHOO.widget.MenuItem
    +* the base class for all menu items.
    +*/
    +YAHOO.widget.MenuModuleItem = YAHOO.widget.MenuItem;
    +
    +/**
    +* Creates a list of options or commands which are made visible in response to
    +* an HTML element's "contextmenu" event ("mousedown" for Opera).
    +*
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the context menu.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source for the
    +* context menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object specifying the
    +* <code>&#60;div&#62;</code> element of the context menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-94282980">HTMLSelectElement</a>} p_oElement Object specifying
    +* the <code>&#60;select&#62;</code> element to be used as the data source for
    +* the context menu.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the context menu. See configuration class documentation
    +* for more details.
    +* @class ContextMenu
    +* @constructor
    +* @extends YAHOO.widget.Menu
    +* @namespace YAHOO.widget
    +*/
    +YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) {
    +
    +    YAHOO.widget.ContextMenu.superclass.constructor.call(
    +            this,
    +            p_oElement,
    +            p_oConfig
    +        );
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, {
    +
    +// Private properties
    +
    +/**
    +* @property _oTrigger
    +* @description Object reference to the current value of the "trigger"
    +* configuration property.
    +* @default null
    +* @private
    +* @type String|<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/leve
    +* l-one-html.html#ID-58190037">HTMLElement</a>|Array
    +*/
    +_oTrigger: null,
    +
    +// Public properties
    +
    +/**
    +* @property contextEventTarget
    +* @description Object reference for the HTML element that was the target of the
    +* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of
    +* the context menu.
    +* @default null
    +* @type <a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-58190037">HTMLElement</a>
    +*/
    +contextEventTarget: null,
    +
    +/**
    +* @method init
    +* @description The ContextMenu class's initialization method. This method is
    +* automatically called by the constructor, and sets up all DOM references for
    +* pre-existing markup, and creates required markup if it is not already present.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the context menu.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source for
    +* the context menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object specifying the
    +* <code>&#60;div&#62;</code> element of the context menu.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-
    +* html.html#ID-94282980">HTMLSelectElement</a>} p_oElement Object specifying
    +* the <code>&#60;select&#62;</code> element to be used as the data source for
    +* the context menu.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the context menu. See configuration class documentation
    +* for more details.
    +*/
    +init: function(p_oElement, p_oConfig) {
    +
    +    if(!this.ITEM_TYPE) {
    +
    +        this.ITEM_TYPE = YAHOO.widget.ContextMenuItem;
    +
    +    }
    +
    +    // Call the init of the superclass (YAHOO.widget.Menu)
    +
    +    YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement);
    +
    +    this.beforeInitEvent.fire(YAHOO.widget.ContextMenu);
    +
    +    if(p_oConfig) {
    +
    +        this.cfg.applyConfig(p_oConfig, true);
    +
    +    }
    +
    +
    +    this.initEvent.fire(YAHOO.widget.ContextMenu);
    +
    +},
    +
    +// Private methods
    +
    +/**
    +* @method _removeEventHandlers
    +* @description Removes all of the DOM event handlers from the HTML element(s)
    +* whose "context menu" event ("click" for Opera) trigger the display of
    +* the context menu.
    +* @private
    +*/
    +_removeEventHandlers: function() {
    +
    +    var Event = YAHOO.util.Event;
    +    var oTrigger = this._oTrigger;
    +    var bOpera = (this.browser == "opera");
    +
    +    // Remove the event handlers from the trigger(s)
    +
    +    Event.removeListener(
    +        oTrigger,
    +        (bOpera ? "mousedown" : "contextmenu"),
    +        this._onTriggerContextMenu
    +    );
    +
    +    if(bOpera) {
    +
    +        Event.removeListener(oTrigger, "click", this._onTriggerClick);
    +
    +    }
    +
    +},
    +
    +// Private event handlers
    +
    +/**
    +* @method _onTriggerClick
    +* @description "click" event handler for the HTML element(s) identified as the
    +* "trigger" for the context menu.  Used to cancel default behaviors in Opera.
    +* @private
    +* @param {Event} p_oEvent Object representing the DOM event object passed back
    +* by the event utility (YAHOO.util.Event).
    +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context
    +* menu that is handling the event.
    +*/
    +_onTriggerClick: function(p_oEvent, p_oMenu) {
    +
    +    if(p_oEvent.ctrlKey) {
    +
    +        YAHOO.util.Event.stopEvent(p_oEvent);
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onTriggerContextMenu
    +* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML
    +* element(s) that trigger the display of the context menu.
    +* @private
    +* @param {Event} p_oEvent Object representing the DOM event object passed back
    +* by the event utility (YAHOO.util.Event).
    +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context
    +* menu that is handling the event.
    +*/
    +_onTriggerContextMenu: function(p_oEvent, p_oMenu) {
    +
    +    // Hide any other ContextMenu instances that might be visible
    +
    +    YAHOO.widget.MenuManager.hideVisible();
    +
    +    var Event = YAHOO.util.Event;
    +    var oConfig = this.cfg;
    +
    +    if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) {
    +
    +        return;
    +
    +    }
    +
    +    this.contextEventTarget = Event.getTarget(p_oEvent);
    +
    +    // Position and display the context menu
    +
    +    var nX = Event.getPageX(p_oEvent);
    +    var nY = Event.getPageY(p_oEvent);
    +
    +    oConfig.applyConfig( { xy:[nX, nY], visible:true } );
    +    oConfig.fireQueue();
    +
    +    /*
    +        Prevent the browser's default context menu from appearing and
    +        stop the propagation of the "contextmenu" event so that
    +        other ContextMenu instances are not displayed.
    +    */
    +
    +    Event.stopEvent(p_oEvent);
    +
    +},
    +
    +// Public methods
    +
    +/**
    +* @method toString
    +* @description Returns a string representing the context menu.
    +* @return {String}
    +*/
    +toString: function() {
    +
    +    return ("ContextMenu " + this.id);
    +
    +},
    +
    +/**
    +* @method initDefaultConfig
    +* @description Initializes the class's configurable properties which can be
    +* changed using the context menu's Config object ("cfg").
    +*/
    +initDefaultConfig: function() {
    +
    +    YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);
    +
    +    /**
    +    * @config trigger
    +    * @description The HTML element(s) whose "contextmenu" event ("mousedown"
    +    * for Opera) trigger the display of the context menu.  Can be a string
    +    * representing the id attribute of the HTML element, an object reference
    +    * for the HTML element, or an array of strings or HTML element references.
    +    * @default null
    +    * @type String|<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/
    +    * level-one-html.html#ID-58190037">HTMLElement</a>|Array
    +    */
    +    this.cfg.addProperty("trigger", { handler: this.configTrigger });
    +
    +},
    +
    +/**
    +* @method destroy
    +* @description Removes the context menu's <code>&#60;div&#62;</code> element
    +* (and accompanying child nodes) from the document.
    +*/
    +destroy: function() {
    +
    +    // Remove the DOM event handlers from the current trigger(s)
    +
    +    this._removeEventHandlers();
    +
    +
    +    // Continue with the superclass implementation of this method
    +
    +    YAHOO.widget.ContextMenu.superclass.destroy.call(this);
    +
    +},
    +
    +// Public event handlers for configuration properties
    +
    +/**
    +* @method configTrigger
    +* @description Event handler for when the value of the "trigger" configuration
    +* property changes.
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context
    +* menu that fired the event.
    +*/
    +configTrigger: function(p_sType, p_aArgs, p_oMenu) {
    +
    +    var Event = YAHOO.util.Event;
    +    var oTrigger = p_aArgs[0];
    +
    +    if(oTrigger) {
    +
    +        /*
    +            If there is a current "trigger" - remove the event handlers
    +            from that element(s) before assigning new ones
    +        */
    +
    +        if(this._oTrigger) {
    +
    +            this._removeEventHandlers();
    +
    +        }
    +
    +        this._oTrigger = oTrigger;
    +
    +        /*
    +            Listen for the "mousedown" event in Opera b/c it does not
    +            support the "contextmenu" event
    +        */
    +
    +        var bOpera = (this.browser == "opera");
    +
    +        Event.addListener(
    +            oTrigger,
    +            (bOpera ? "mousedown" : "contextmenu"),
    +            this._onTriggerContextMenu,
    +            this,
    +            true
    +        );
    +
    +        /*
    +            Assign a "click" event handler to the trigger element(s) for
    +            Opera to prevent default browser behaviors.
    +        */
    +
    +        if(bOpera) {
    +
    +            Event.addListener(
    +                oTrigger,
    +                "click",
    +                this._onTriggerClick,
    +                this,
    +                true
    +            );
    +
    +        }
    +
    +    }
    +    else {
    +
    +        this._removeEventHandlers();
    +
    +    }
    +
    +}
    +
    +}); // END YAHOO.extend
    +
    +/**
    +* Creates an item for a context menu.
    +*
    +* @param {String} p_oObject String specifying the text of the context menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying the
    +* <code>&#60;li&#62;</code> element of the context menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +* specifying the <code>&#60;optgroup&#62;</code> element of the context
    +* menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object specifying
    +* the <code>&#60;option&#62;</code> element of the context menu item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the context menu item. See configuration class
    +* documentation for more details.
    +* @class ContextMenuItem
    +* @constructor
    +* @extends YAHOO.widget.MenuItem
    +*/
    +YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) {
    +
    +    YAHOO.widget.ContextMenuItem.superclass.constructor.call(
    +        this,
    +        p_oObject,
    +        p_oConfig
    +    );
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, {
    +
    +/**
    +* @method init
    +* @description The ContextMenuItem class's initialization method. This method
    +* is automatically called by the constructor, and sets up all DOM references
    +* for pre-existing markup, and creates required markup if it is not
    +* already present.
    +* @param {String} p_oObject String specifying the text of the context menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying the
    +* <code>&#60;li&#62;</code> element of the context menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +* specifying the <code>&#60;optgroup&#62;</code> element of the context
    +* menu item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object specifying
    +* the <code>&#60;option&#62;</code> element of the context menu item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the context menu item. See configuration class
    +* documentation for more details.
    +*/
    +init: function(p_oObject, p_oConfig) {
    +
    +    if(!this.SUBMENU_TYPE) {
    +
    +        this.SUBMENU_TYPE = YAHOO.widget.ContextMenu;
    +
    +    }
    +
    +    /*
    +        Call the init of the superclass (YAHOO.widget.MenuItem)
    +        Note: We don't pass the user config in here yet
    +        because we only want it executed once, at the lowest
    +        subclass level.
    +    */
    +
    +    YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject);
    +
    +    var oConfig = this.cfg;
    +
    +    if(p_oConfig) {
    +
    +        oConfig.applyConfig(p_oConfig, true);
    +
    +    }
    +
    +    oConfig.fireQueue();
    +
    +},
    +
    +// Public methods
    +
    +/**
    +* @method toString
    +* @description Returns a string representing the context menu item.
    +* @return {String}
    +*/
    +toString: function() {
    +
    +    return ("MenuBarItem: " + this.cfg.getProperty("text"));
    +
    +}
    +
    +}); // END YAHOO.extend
    +
    +/**
    +* Horizontal collection of items, each of which can contain a submenu.
    +*
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the menu bar.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source for the
    +* menu bar.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object specifying
    +* the <code>&#60;div&#62;</code> element of the menu bar.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-94282980">HTMLSelectElement</a>} p_oElement Object
    +* specifying the <code>&#60;select&#62;</code> element to be used as the data
    +* source for the menu bar.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu bar. See configuration class documentation for
    +* more details.
    +* @class Menubar
    +* @constructor
    +* @extends YAHOO.widget.Menu
    +* @namespace YAHOO.widget
    +*/
    +YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) {
    +
    +    YAHOO.widget.MenuBar.superclass.constructor.call(
    +            this,
    +            p_oElement,
    +            p_oConfig
    +        );
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, {
    +
    +/**
    +* @method init
    +* @description The MenuBar class's initialization method. This method is
    +* automatically called by the constructor, and sets up all DOM references for
    +* pre-existing markup, and creates required markup if it is not already present.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;div&#62;</code> element of the menu bar.
    +* @param {String} p_oElement String specifying the id attribute of the
    +* <code>&#60;select&#62;</code> element to be used as the data source for the
    +* menu bar.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-22445964">HTMLDivElement</a>} p_oElement Object specifying
    +* the <code>&#60;div&#62;</code> element of the menu bar.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-94282980">HTMLSelectElement</a>} p_oElement Object
    +* specifying the <code>&#60;select&#62;</code> element to be used as the data
    +* source for the menu bar.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu bar. See configuration class documentation for
    +* more details.
    +*/
    +init: function(p_oElement, p_oConfig) {
    +
    +    if(!this.ITEM_TYPE) {
    +
    +        this.ITEM_TYPE = YAHOO.widget.MenuBarItem;
    +
    +    }
    +
    +    // Call the init of the superclass (YAHOO.widget.Menu)
    +
    +    YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement);
    +
    +    this.beforeInitEvent.fire(YAHOO.widget.MenuBar);
    +
    +    if(p_oConfig) {
    +
    +        this.cfg.applyConfig(p_oConfig, true);
    +
    +    }
    +
    +    this.initEvent.fire(YAHOO.widget.MenuBar);
    +
    +},
    +
    +// Constants
    +
    +/**
    +* @property CSS_CLASS_NAME
    +* @description String representing the CSS class(es) to be applied to the menu
    +* bar's <code>&#60;div&#62;</code> element.
    +* @default "yuimenubar"
    +* @final
    +* @type String
    +*/
    +CSS_CLASS_NAME: "yuimenubar",
    +
    +// Protected event handlers
    +
    +/**
    +* @method _onKeyDown
    +* @description "keydown" Custom Event handler for the menu bar.
    +* @private
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar
    +* that fired the event.
    +*/
    +_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) {
    +
    +    var Event = YAHOO.util.Event;
    +    var oEvent = p_aArgs[0];
    +    var oItem = p_aArgs[1];
    +    var oItemCfg = oItem.cfg;
    +    var oSubmenu;
    +
    +    switch(oEvent.keyCode) {
    +
    +        case 27:    // Esc key
    +
    +            if(this.cfg.getProperty("position") == "dynamic") {
    +
    +                this.hide();
    +
    +                if(this.parent) {
    +
    +                    this.parent.focus();
    +
    +                }
    +
    +            }
    +            else if(this.activeItem) {
    +
    +                oSubmenu = this.activeItem.cfg.getProperty("submenu");
    +
    +                if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
    +
    +                    oSubmenu.hide();
    +                    this.activeItem.focus();
    +
    +                }
    +                else {
    +
    +                    this.activeItem.cfg.setProperty("selected", false);
    +                    this.activeItem.blur();
    +
    +                }
    +
    +            }
    +
    +
    +            Event.preventDefault(oEvent);
    +
    +        break;
    +
    +        case 37:    // Left arrow
    +        case 39:    // Right arrow
    +
    +            if(
    +                oItem == this.activeItem &&
    +                !oItemCfg.getProperty("selected")
    +            ) {
    +
    +                oItemCfg.setProperty("selected", true);
    +
    +            }
    +            else {
    +
    +                var oNextItem = (oEvent.keyCode == 37) ?
    +                        oItem.getPreviousEnabledSibling() :
    +                        oItem.getNextEnabledSibling();
    +
    +                if(oNextItem) {
    +
    +                    this.clearActiveItem();
    +
    +                    oNextItem.cfg.setProperty("selected", true);
    +
    +                    if(this.cfg.getProperty("autosubmenudisplay")) {
    +
    +                        oSubmenu = oNextItem.cfg.getProperty("submenu");
    +
    +                        if(oSubmenu) {
    +
    +                            oSubmenu.show();
    +                            oSubmenu.activeItem.blur();
    +                            oSubmenu.activeItem = null;
    +
    +                        }
    +
    +                    }
    +
    +                    oNextItem.focus();
    +
    +                }
    +
    +            }
    +
    +            Event.preventDefault(oEvent);
    +
    +        break;
    +
    +        case 40:    // Down arrow
    +
    +            if(this.activeItem != oItem) {
    +
    +                this.clearActiveItem();
    +
    +                oItemCfg.setProperty("selected", true);
    +                oItem.focus();
    +
    +            }
    +
    +            oSubmenu = oItemCfg.getProperty("submenu");
    +
    +            if(oSubmenu) {
    +
    +                if(oSubmenu.cfg.getProperty("visible")) {
    +
    +                    oSubmenu.setInitialSelection();
    +                    oSubmenu.setInitialFocus();
    +
    +                }
    +                else {
    +
    +                    oSubmenu.show();
    +
    +                }
    +
    +            }
    +
    +            Event.preventDefault(oEvent);
    +
    +        break;
    +
    +    }
    +
    +},
    +
    +/**
    +* @method _onClick
    +* @description "click" event handler for the menu bar.
    +* @protected
    +* @param {String} p_sType String representing the name of the event that
    +* was fired.
    +* @param {Array} p_aArgs Array of arguments sent when the event was fired.
    +* @param {YAHOO.widget.MenuBar} p_oMenuBar Object representing the menu bar
    +* that fired the event.
    +*/
    +_onClick: function(p_sType, p_aArgs, p_oMenuBar) {
    +
    +    YAHOO.widget.MenuBar.superclass._onClick.call(
    +        this,
    +        p_sType,
    +        p_aArgs,
    +        p_oMenuBar
    +    );
    +
    +    var oItem = p_aArgs[1];
    +
    +    if(oItem) {
    +
    +        var Event = YAHOO.util.Event;
    +        var Dom = YAHOO.util.Dom;
    +
    +        var oEvent = p_aArgs[0];
    +        var oTarget = Event.getTarget(oEvent);
    +
    +        var oActiveItem = this.activeItem;
    +        var oConfig = this.cfg;
    +
    +        // Hide any other submenus that might be visible
    +
    +        if(oActiveItem && oActiveItem != oItem) {
    +
    +            this.clearActiveItem();
    +
    +        }
    +
    +
    +        // Select and focus the current item
    +
    +        oItem.cfg.setProperty("selected", true);
    +        oItem.focus();
    +
    +
    +        // Show the submenu for the item
    +
    +        var oSubmenu = oItem.cfg.getProperty("submenu");
    +
    +        if(oSubmenu && oTarget != oItem.submenuIndicator) {
    +
    +            if(oSubmenu.cfg.getProperty("visible")) {
    +
    +                oSubmenu.hide();
    +
    +            }
    +            else {
    +
    +                oSubmenu.show();
    +
    +            }
    +
    +        }
    +
    +    }
    +
    +},
    +
    +// Public methods
    +
    +/**
    +* @method toString
    +* @description Returns a string representing the menu bar.
    +* @return {String}
    +*/
    +toString: function() {
    +
    +    return ("MenuBar " + this.id);
    +
    +},
    +
    +/**
    +* @description Initializes the class's configurable properties which can be
    +* changed using the menu bar's Config object ("cfg").
    +* @method initDefaultConfig
    +*/
    +initDefaultConfig: function() {
    +
    +    YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);
    +
    +    var oConfig = this.cfg;
    +
    +	// Add configuration properties
    +
    +    /*
    +        Set the default value for the "position" configuration property
    +        to "static" by re-adding the property.
    +    */
    +// holder
    +/**
    +    * @config position
    +    * @description String indicating how a menu bar should be positioned on the
    +    * screen.  Possible values are "static" and "dynamic."  Static menu bars
    +    * are visible by default and reside in the normal flow of the document
    +    * (CSS position: static).  Dynamic menu bars are hidden by default, reside
    +    * out of the normal flow of the document (CSS position: absolute), and can
    +    * overlay other elements on the screen.
    +    * @default static
    +    * @type String
    +    */
    +    oConfig.addProperty(
    +        "position",
    +        {
    +            value: "static",
    +            handler: this.configPosition,
    +            validator: this._checkPosition,
    +            supercedes: ["visible"]
    +        }
    +    );
    +
    +    /*
    +        Set the default value for the "submenualignment" configuration property
    +        to ["tl","bl"] by re-adding the property.
    +    */
    +// holder
    +/**
    +    * @config submenualignment
    +    * @description Array defining how submenus should be aligned to their
    +    * parent menu bar item. The format is: [itemCorner, submenuCorner].
    +    * @default ["tl","bl"]
    +    * @type Array
    +    */
    +    oConfig.addProperty("submenualignment", { value: ["tl","bl"] } );
    +
    +    /*
    +        Change the default value for the "autosubmenudisplay" configuration
    +        property to "false" by re-adding the property.
    +    */
    +// holder
    +/**
    +    * @config autosubmenudisplay
    +    * @description Boolean indicating if submenus are automatically made
    +    * visible when the user mouses over the menu bar's items.
    +    * @default false
    +    * @type Boolean
    +    */
    +	oConfig.addProperty(
    +	   "autosubmenudisplay",
    +	   { value: false, validator: oConfig.checkBoolean }
    +    );
    +
    +}
    +
    +}); // END YAHOO.extend
    +
    +/**
    +* Creates an item for a menu bar.
    +*
    +* @param {String} p_oObject String specifying the text of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying the
    +* <code>&#60;li&#62;</code> element of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +* specifying the <code>&#60;optgroup&#62;</code> element of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object specifying
    +* the <code>&#60;option&#62;</code> element of the menu bar item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu bar item. See configuration class documentation
    +* for more details.
    +* @class MenuBarItem
    +* @constructor
    +* @extends YAHOO.widget.MenuItem
    +*/
    +YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) {
    +
    +    YAHOO.widget.MenuBarItem.superclass.constructor.call(
    +        this,
    +        p_oObject,
    +        p_oConfig
    +    );
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, {
    +
    +/**
    +* @method init
    +* @description The MenuBarItem class's initialization method. This method is
    +* automatically called by the constructor, and sets up all DOM references for
    +* pre-existing markup, and creates required markup if it is not already present.
    +* @param {String} p_oObject String specifying the text of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-74680021">HTMLLIElement</a>} p_oObject Object specifying the
    +* <code>&#60;li&#62;</code> element of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-38450247">HTMLOptGroupElement</a>} p_oObject Object
    +* specifying the <code>&#60;optgroup&#62;</code> element of the menu bar item.
    +* @param {<a href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-
    +* one-html.html#ID-70901257">HTMLOptionElement</a>} p_oObject Object specifying
    +* the <code>&#60;option&#62;</code> element of the menu bar item.
    +* @param {Object} p_oConfig Optional. Object literal specifying the
    +* configuration for the menu bar item. See configuration class documentation
    +* for more details.
    +*/
    +init: function(p_oObject, p_oConfig) {
    +
    +    if(!this.SUBMENU_TYPE) {
    +
    +        this.SUBMENU_TYPE = YAHOO.widget.Menu;
    +
    +    }
    +
    +    /*
    +        Call the init of the superclass (YAHOO.widget.MenuItem)
    +        Note: We don't pass the user config in here yet
    +        because we only want it executed once, at the lowest
    +        subclass level.
    +    */
    +
    +    YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject);
    +
    +    var oConfig = this.cfg;
    +
    +    if(p_oConfig) {
    +
    +        oConfig.applyConfig(p_oConfig, true);
    +
    +    }
    +
    +    oConfig.fireQueue();
    +
    +},
    +
    +// Constants
    +
    +/**
    +* @property CSS_CLASS_NAME
    +* @description String representing the CSS class(es) to be applied to the
    +* <code>&#60;li&#62;</code> element of the menu bar item.
    +* @default "yuimenubaritem"
    +* @final
    +* @type String
    +*/
    +CSS_CLASS_NAME: "yuimenubaritem",
    +
    +/**
    +* @property SUBMENU_INDICATOR_IMAGE_PATH
    +* @description String representing the path to the image to be used for the
    +* menu bar item's submenu arrow indicator.
    +* @default "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif"
    +* @final
    +* @type String
    +*/
    +SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif",
    +
    +/**
    +* @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
    +* @description String representing the path to the image to be used for the
    +* submenu arrow indicator when the menu bar item is selected.
    +* @default "nt/ic/ut/alt1/menuarodwn8_hov_1.gif"
    +* @final
    +* @type String
    +*/
    +SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_hov_1.gif",
    +
    +/**
    +* @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
    +* @description String representing the path to the image to be used for the
    +* submenu arrow indicator when the menu bar item is disabled.
    +* @default "nt/ic/ut/alt1/menuarodwn8_dim_1.gif"
    +* @final
    +* @type String
    +*/
    +DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_dim_1.gif",
    +
    +// Public methods
    +
    +/**
    +* @method toString
    +* @description Returns a string representing the menu bar item.
    +* @return {String}
    +*/
    +toString: function() {
    +
    +    return ("MenuBarItem: " + this.cfg.getProperty("text"));
    +
    +}
    +
    +}); // END YAHOO.extend

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output.zip b/www/extras/yui-ext/docs/output/output.zip new file mode 100644 index 0000000000000000000000000000000000000000..6421d12fb489e1a34a80603df942a666d5b308e4 GIT binary patch literal 1194566 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

    e#nMDTaDTFk2 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�Lap~5y7 zr-~A#20<_Q*6+#d%tpg{bepWBM7Wui$<#mZXxFNbBv$G->EWCVj^|4xvu+ia)kizs z5J`tzV=gNUe|Wljt6P@8D!g;N-DYfq?pzq<88&XwLW+0rSuH`y+aR)zS(pmb4jqCI4KWv!5R!Av+~fp7#K%{|9Ty5>2S z5xA)d+GeV5RSE@&{d4}8V`JBF*jF|jS2Er{!IojWsj+9)K28k0sh$<)n~z$dt0*Kr z3z-_ZnK_bWRR(82*>pYa{GH!%RVign+F>o$YSxcb4QdB*XsFnfL!ghuwYoU|kdpjR zPx+9`r&!N4~oLUl_Bzj!vJ}l93@cEjnj z_uV1hrZ!=E1shgHa@9{09AcPu8@*AzY7WsfpE9#b=HIiSikfkUvL6A%s2@|F)?!nq zdxbi~vW8bWiwkBdfdnjvQ(>?us2Vd`!5S|nfl|wMl~)Gnv?cwf43Gfr(hF|WvJ5yR zwUyfx@n-6LR6q3l!YIcwaNN}n+6i`j?ITwCL4mEAOm(iO1!o1<=+2)awP692r7b{f-9j*-WP)WA0Jd<$aAn&Q3^p9DOZQ!&;tlcDs6~?5QIuV2SN~Z zA$!7LT6jVXetk0Zf!P^XTUXX9PSk67_FOJ`>_q`SWtMp%+^@jVQ`17 zAmZUZdoGT0jUNIIWWZ-g8fJhfJtk&01D-4O{0JDFN3V%;CEOebg5th<`Cexc|>w_!lQl>%1 z(;%|Q;CTP?`F(u4A2_9vZ44~3SyIx}sG-IpSJgKJUA4$@oHSDa#dIOJ(;621%%7h0 zV&TChEcr?GbV8L^(@n+sM$kDRNSM_@0X<+^lGoxPOIiL0bgqlijeviR_~J2znTzKa zV$NhJ7J!%^tb|B{H0ZUz`l358ybW6em%zX|hzVJ1Yv(U~g5bR}db#_+tFtShGq~A? z&jJd>oJO5;{*X<9@}iX7mK$#0tcBF>pXJ}0hL|HEs+dXb*7p+&JM`!+(*fE z!QxcL=d0dSuYPL~)4cd@#wnmCs8}i9FIvzn4J5E>16#NsR8soQ68pG z`9>@&+#vd2qKx&j|w{fvbwFRdrfAs+>GcL)Cb!9fVVL@Cqw~BTN)1 zKRihSGiuCE`C-x`WX|%gq}z6NwFm!^vgXl&-=GjqehHIzpv1oX7lISv>oPa~_}fg% zX6GRy4~=acJq%q`s{7OfW@``!tGX683IikWGaqhhOYGV*t-5q31|mgt!m!2(mG`f` zZLEHTrsUI3$r>q|)x_9mMTO%X?y;5b{1{esF(N&Qpzmf)XkBF17yP-C@$Kwtf?2xE z2hwsuLxVhTfDteIl`sxfeJtimz$U{+(s68n ze|iOvKfQGJ(~<)=A#1%qz>Uv}BeAs}F-5n6ZTAR;@Sek7^WcUYnsm!s8SV)Sba#S~ zN43I{{A1c$Y;CgRsWx|t+(d;s8j_wSH7U%xUkt&nb)!+x@d+4|jFxMJ2^oLyDsGn1 z#B=wtBSep-aZgPBh+5`GYnMO^BLSx&eX=G`qGzeAY;nLchh*Cynl>qWPww6i;h+N* zjlAmM>eKE*vR7+s^_8O?OV9oV(bm_M&|biuD%{9h z8SAsdu4Jvd!@YefFYq~yYc+OeZtQk$z@KK^OIsPcvro0bQrNQ1Syr|O+EAy89BG3c zD6=K&aA^mpc?3FG?2Yn9&#^T&xjMu;6lx)4J>iJ=PG@?#x$aj_s4=F~_+B`?7~y(x z3DynKKcwX_J~CePMNI?(7YP`&9%9ilss0cgjYwxt|FzWgA2-2$BK7V$5CFg#9Kin| z>HbfOuDGLx@&9rW9IMI7Z!;kD5Z~jAaVEp3fIQDbZjC||qnjQ`J8X)IO2-&hgFTM* zu@XTpA7O3^8E9u&ecWuz&1XOhr+8G<16%?M?>6fYf|$~rhHR=1>}qH;PRZ8E_2W@l zkC*16k0XBVk9ldPZnoDT(&vUz^a5T|d_eN1)DZ})P=<0WX0QrC1H}=rU#Gd!pXHCC zFEDO{m{rD51Ska{?<0nw85aw-d21wvJ*pr$dLz&7Xxk55*;Q_~noZ6O5Z73x6Nf6iYCwY*&b=QwPATi}1JtFE8lj}m8ZgL|216nqNuKYJi->Cvyu}^y}<|1`L zT<3f&MCn`_O3T3iIP{?fVk_2*#TnMHu_uKr#yJ;K0t%{|hGdfh+C$S&oYA<2s9*%x zpJFA;-{PeKGF$H3$DARMlnf1bQwv2wbvcv$UC%IGYt(MOi((5`z=p7!v^BdC$D}T; z!4s+lVeR9OQ_r)l!)@%cXdmmyilUah#t@_GxFv@~U1_Lrhi4$0Obx84qvP&sc6m*l zsO)VV>u!qlQUY7SxSuY0O=I5gYF!>)qs|qJ-0#*R)=~+<(}qEgxtpC`$zf4S%mw=q zS3L}PxeEjm@`16a*%|$CUCX`1Be(R4PJ6BBMs>$xjf5WlY!Y(;J$w(utIybzV|<@W zPC?h{X$;OAeWR*Z+<;)rdq{|>=%0_MlBADq0?4_(VBOFshL(+pjOprbD&Fpcr&oww z9K7BT_+V%w6L*~vdl~u+{R92oy>PeBewjh&*Z)FHL;brLMR32Lh5yn*@7e$WaQDVE!`U@G#y0AcLQ?Owd_%3DV4DDOHAG?iVxlAK#rUEh~lClxwfq- z+Y8fQ_7cL!=Q$uri{*2V@7;$EVMJZ8@Aw(X{%;PxE19>Xin+qrwLHlSUhnza5oZ2} zkMq+WFCfO8MG2Sg-JhQ!@S}fJ)*mk4`wJB{_G0c-nycE2*j|r3m|beD5XN`=qqp z3i_#251+16Xt6d$wlT*%Eq%?M44wtta} z%Q{9s73DwNE27Q|+9xt7ReAYxiRuyO1TCt^!S#qnm`jlggXBskD?(V}#8})tRn`z{ zIk&+-^+5=xq~of;B_#jZ3Z>e}9T3Q}! zVd@8jo&W{K`({G6^O6EjV4Q}B66Vb}X8@l&k)krNk@G*M=}<@aFj77*LwDIDScePU zggiLbwA%YXnK$naKpFKL5 zQo%YND5}aL?*-{jc|GgF z1=|2aFmpVeAgBioEKsa)7$&xw3iSpI6pcVOh^o_~ShQMb?Q;_KuMkiyU9PqeKG0_2~0G8*8RvDmSVwOb>Q zDapR=D_|W~-NMC4^=|UTjNNa`SDXTwF|*fEc;6-C2_JFLrY&A^v41 zh?A=<#(7p|v4b{$@@$*C|1|yj?^`z0#U@K$)5yKbd`k_Pvs6eqvGe3SdHC)*2JR;& zZdT%9$1MbI7%7|FSv9-m>cpvf1Wh%Ob9AUv@N6vt7vHI&gO_)yi!z*k3Td(rWo&Hc z2qb4-3fCuE^fT?H@y4N+-N*YqG06xajgM;LuUH+T029gS>7@OoyHY;LB*L?c5P$Hbnx2 zHbYTpRsZH(&MA`(#DQE=#|i9%YC~g8`&R z1;xJi9ycY!tZJEZdfy%fvNnT!GQa{o1@JeMD4nWy6OL66Q?q~BVsG`QOw>57iAgd1 zVpty_#Y<}q8UC3(7I|@^! z+#k8+52@+t_30z|H8QbuiFF8dAa#t+`@n;%W#@U>RD*JE(4IT5n76Tw@*j zC+V$u%>`L!i>9@z65eG=P5aeY3UQ15U%*hm$9)`=b%-}g(`xa|T$Vt8cTAvoV+ZNm zqKfZ~MoIpKUQE{Z34>JrAUQ<8VkHQOG$cyqZ)xbQZt4*S`otqi{WC&)sg_w_ zd0)~d=LQV-)%wqfIv1*cmvc%we`mFxppKAw_b`d=p3(VYh1~wJ&#S^>nC~?4?9?!X zUrgjo-wr@~W-vPRs?!)=&M$xB;;<4lw8WUj${8%!AmbTqxWZQZ%BU z)qx*v#PR=#_^vcgVABN}Z<3B>CtancZ)@sm8B+{e(V7*OZh!t4R}cJOZ?jK0cNrlA z008^~0s#M?-p1O*#>Ce7e|7xVK9^31Y^k@W8I|w&3_V>IU0bws##T3BJX{X^OxHEO zJL?%FDHA(^A`*ivqV{j~)x$q~^l$=F$;LJiS%RcLcQy62)@UUQ~3CdaWs8h1Bm!!AD&){ zL6DMicynkQb!oeYO7D~JoQ8-}r640pXrv^XcHw<5n|^nqXJ0(GI$wz~RM=dwWTZnJ zqAcOaymrK_2k*OZrxj)QG5f3PMLRL8Mnv{W{k~gGlYD?jD&_i>PS~+ zzj7K6$Ci!s8#Km@vJ!k&9E1;qXVqVV4bkqL`F6w)x5ER{CzAcr znsBhj!8lWp2mB&o=Yt62lA6x$PSmoG6>|N zN$!p~kLI9f-Ko&7zvTVCE^yS((S(n`=q1k56VDc$8vID-Or#&q-UW&X`4F&YjJGN+ zBbnP1#W@rb&qCefa!;+hjs$17#PcMO_&t3KnR_N30NH(>zN)QdMnWAQlwvQQ+9oP+QU~Nw*wo4qf2q0S zbXI%DCa6UBnnc$nqsQgZZ+ilKCQ8W z8Dt0ZGdv5w6#sO0Ld)5?ejC-iT)!P5J(auhiv=F2GaBkChw`i5xyY4-Odrnm335y0 zBsM=HjyCp!Hag&98x}MCdBXKcQnZGbpMMLcJSwQv`8Vg9oDvkz#w%w>J5jZgEpOw+ zLzk~M)=yd{J6XC?qEoG0$6IJ&F4f25!JYdyjOY#6m%|8&Nmwo_`#-WcTeeC{>vxrV;fc;l; zRK1~=J{fXX;CZgCw0F!5OMM04Y$SY~k4wIf1rhQNDk(wLimpY9?(UQWE$gE*o7VEy z;WS~{Iji8z+m4z&o2D5{Ddj1;^ct|BY$*+hwXoFPG2fUZ|IiWEW-g<{6W6aUuRgxL zD3jHOPB0TQr~{vlJA7t*?x3}vJ{`KD&qkl}3(m%^aZ;%75bvQqnc&HLJkyZj)wK0Z z(*r1Wsb(A57`|va1{(OZHXEqro~mbycq^_$d*Z9f=Jo?0bxm%jyW8Py)1B7Y)@h2E0TkAEzWhxf<&e2;_-H)D1r^bma;b(FSQuWGn$c zJRV6%G~-+Y&Ktxn$T$cYB~j=l3q;C&CVW*w5+#em!IOa*{1woj^C*wO%E1Fo7KYo;YYmK8kVMQEUvIs; z4AA|~XE-T_=Xz;`H{+1susQNs7HhuhfzK_82kYkE;J^RII#UdI&s-< zO_hg^^fV6XLUmqDxQ=F4j{1yhgl|IPoK4E=$pxR@ap{hwR8Vw~&W6wqH$N1ESr1^* z^`)tK%l;j=*Xl`Wxui0?XFvQvM$)H2;8SbqOLeEHG2|@uwcI&2OsSs$PQXPJ>9}q; zSIw5*q~)X1Q!TU{!s##`MRaJ#5!_VgF%SYeZA7U>TcDBtz8VzqWA&i)X{(@2v&e$* z)l@BLO}!$QWq+w&bqhlPKa@o^UFR(MB$$-S3Trca`qY@C+g2>c3SCA^(KnD#Iw^K# zi)NS|XS`&VB^+X@6FD7&AXD)nTk>4%$8V@tz!fODV|>Nzksp zrzP%EA?RwSFWO|Jq}ngv8!(VIr2Ulo-Zir!^SQYYlS>UeH$7~)=EnYb%z24wZlwn} z_vrn#%%!(W9SwHv1xpeu06=;)@YKRd(%-f>gifZ_YI+;%nj0EDJP{Tot1x$aa3IvK zjB}K)olNn-V;oU5OeZbwxxMqGO+{K~s`e57nC`C80J_tHaS=^s{a|Inio zXpw6hDOSoYhbum0bKiB29C#J&o#R~_H?|2tV+Eh>8;_}{>sz8rrP;G<3OWq)Sj!{Q zBKnOMN$n&E8vbZs_^c9)-VrP-N312a15<>XmZ>B zJ(D*^`Ar5SuEdZEdrfDArLuu#m(UYLQD!a8@B#%aK|_M@4W>S1vLZSY1x*s-Zzr}_ zRvgIg;fj|?7uiS9ZxZ1^(&sY82h#I}AG0c%M<;XYtq6CJWeEzYQ!Z($kTmrnm74jK ziaHAXr-z@r45R`-Wpn;fo0oZjK&K&ox)0yi$i6z%2>y02DVgu-Y>2bD|{H;CJI=sy|d|LC^PMe%r ztM0WPVy{U9QG>1Z(M@+H+;n{jx~~(}Wf1({J9egh#_Y%PSzZgyqU=hfM%GyeA?`h- zAeC}um5XFf7nEa^WG3ZdtfYp#)6Q}2fgxc-l{f%)(uI7hgMXxH+gZRzR&2io1f-f- z73Le+&~v9{V~K*DuZT}3TH)nQj)pF8wrb$pmBob|fa6+vRU+9DgMGY|Rb`i`sw+pg zKxUO?iu^?m(}+^x+Z?iFT7+E%7xo6`Dy?*?KH!}82no@3loA0AiTzI!$(7AS>sifP z-VO|H>5J#Tg1eLx=3v_mnssuIAXY9bcw0R?a}OzvGbr0?$b4{k2oSKJrOa4)_k!%!O>d!7pr8;uo6}fj*1FJc$H>khTX*8R@ z7qUXqty0)@8Y&lD4bV^YE8?o;=8nVp>jqc#@H#;1knfpAu=n|tHsE#!>ue@gsvB!w zw#J|x_Lj{_^b%`0dljw*3tX@w(X_=9aF&AUoUTxp;P*(YZSG05q1EmklH0KnWJh{u z59|J!YG6jm*rrOBrmx6K`cr?@pJwsDn(3?RzN=4IZLk;OlMw{_LP7uvcw;dda_z;F z^$3<2FHi|C7SFN>oxm5%-{L7t#k)xk(}H-v)GIHYvwRhxU5YJly|Hv{rUCsoxJ)y@ zsdUTBa&++dRwSs1DIs_?&1SX+5`+1eIdynw>@Vgr0GWx}3J=7X!p#vxvy&XQX7hu$ z{KxwYq$c|&cfQs@l@SY3eSW(3vF4jokHxQFrov_!@jr`}=iwFPsiYQr*&P4TOuH&g zRP3S6Ov`HWsOGX<3siSCc6;QiWt2j)v@WGC1Da6m)8Dvs!o_TXSFbY8E%^Of{hU(i zGl^Il3WhCz0%5jlhqo{zaE*%CxU>Qfmvdt}5pD1{v)^O`rSGsC5=9i`>qU@vmdVRi z8if!~`IF}qf)<1{%Y^ZAm}R*T*`nO%LtB5^;JS}5_^Vg_l0#y*nx6={Tg}^9?x$UO zrs=2j6pYFqh<%^T-ZF|ja?esgBCZWzmXSn{?xCzk7j?l9S`3-lE0xs>wZBxeUM-l_ zF!a@6^jhH~)m+rJ9O%puU{%BV7_r-hEj4ScF>_r@zTTz6RUEKF>k^ONuZ^^s{w3OQ zN|;l^dZn^dlBLtcoF?WpF{g<+O{@h?>>5WClGswk)>|{z#j^LiRL0hZtkA~fv-j(R zZKjXOMw~+C6tZ4vF4c7DG%}}=IgQL|WKJWitC3xiL_*^gG6C6omfZ>D?RkW&Gk$zJ zK$qi<=il)GfQl6pftr^E01RGTUVVIf@$(s?37S*i2MD!wjJ%C(!v(xO}m47*thGAW7^%{B{T8r-^md%OuqsjX~`bipLs< z? z8=i&6SnB(h``tJx%s>;+(U{OTR%TS%i)M6lsWRC~0^1HTl$tROwc>_m_!B{ZOAprA zf}2EvK*w1}a5q#8Y)OL;As&^V1pDT}HznVy5TE4RUnt&g3}S4YBIbmF69(4CQJaO^ zrEh0`IP;^&=0{t#!%g)Gt!2}^@5RxiE(%*gGtuaXRm%HJ%4&3_GpTW;;NBV?9f#hb zWlJP%Uly}$IrJ7&1N0N!S6`5s$~oOrTJGaJCzs>(|U<>2fyjdC|fPs#qZdI7aGL~(am)Aw@tOY=dapwFpot6j;+wQ6+h-56@= z#py5}MRcfPceh#G$k~L>Cfr}Uu=Q&xJp)m>Vs)>kGY=mx+#Kx6io1roGyh_dYVwmx= zkV_u@O=AJC_!;oqF9Bmz{#0HHrcQwul`7dr^sHHFmadaSdZW#`LKCg19X%>Eu`7;q z%_b9{#Ki=QcrDK*%9+p^@<>Pm8SNhwpPBI?nAN~)FU@1@(meJ#%|nCtB!Xf)lu?bf zAD5WXq64ftUesR%5F(Q`fs-rm0h4%pc09m1VjqF#sT`@*C z*iS`jDn>&osD<@WmG&v#c#%KMmR3qpddr+rnmmq|si*m4Tufjj^(S~+q{J37T|F9c zQS2{T6d@XZ^IfG1!rH1y+Q@3^xQKMs6qL70`jw3Y^)6%YrfG&asBDW(VtW#Og zdW6%-G!)3Y6k(6D zLuX0G2_pG^)ikSnsQqXbpVW#m+*Q34Gp+jIiXp%) znl&=j*;1bblcY=&wKlJ(Pt6>Of3S9(Ex5-NYrUGnFAdgd)yl8BXG^_EmICmaQyCO< zyUinD!c+C?G&Jq^oZjjS0$B72dX+28s(0Pk> zt^dFn)D*`@&7CxXiw~FroQUf3hSMSv=K<5Cv(0P~Pj+Kj+s*R1-?L%t`Wk4GCWp{#~weuF)y z$rRy06mBZ#BFvYPs?0$o`YC-oAoKONvlqkwmMyjFU=scHkR25lwmIDv7uvb3nv%qR z@~&M{)Nwh%fLFa|(JZTxJW3;owGff+A}|Ot%+iE-;*&w)rA_|0tf>dQF&6JHKblV& z*Y=jlQF393x7J+FFZ1?9ERh^d_GVTkaHH+A!p%m!RRIaGBfc6q4bNddG^US!^PV3g z9P)!K^W903Kpx}T38y4JL)>^{D8ZjNhk{f{{%uzETreS$h(haVmih?|{ftG#rOfI) zucKbYv$#q)BqE;@QY@Ec*0;NzyIpPJCsC3*k4n8L$=;WCmHO)7l5n*cGwcf4=_W) zRt-GjWiG4?KyPJ^eVc#r`+E`ZFWp$B^Qh^n`l&<9%(<5|-AiSg(jy+cH%_4~PVn=A zaDvi#)Z_$ZH8mV3*dZrS7dmmApf)GiUp{aVMR<`Z1h)CWPmU4vkP(#bisJ<4oL~vW zxrbIkb}M9L6V%53zQ{g;Hj@YkSuZE8;(o6Xw|$5Dy@BTaf+f>7F}&k$EkcbE-8T2$ zIJo65FCyj0%W%6*_XSG2>a^7(iLX^&*xhGVu$ms}GzRCej8h%Z4WzBw06N;Njyt`k zaIicfJv;rh`Wnhfvd#(z9B`i0nsu{>p3VoX8>N54SvN;*-58oTU3#}PMpO;z?}UOg zZ~CVDJM%_Y%iRN)t-(1|L*hI0#)5fc-!{>(vMtm!Qe1J3Zt>9z)*=i-Pa!8j2=KpV?+8xf1%u800D z@3dc9tY1DNmtTEg;kCL!(G@h&u;7#BmB60&LqHQd@W6T};m8uhAL7ah3(cAG&s9tr zS_Ga9|98!juUXhHj+~SZ$T8$2Wys|ualrgo>l`?CEJ_kbbTUmO<1J;f@)?0yB!23e z(S8rT_KVd<6+?2&_DGp+6;T{8yVX1kj^PT1J7h`1W(tm*Jp?Q_`>|`D`$BZvFQz-J z8k6I?N6K|8sp5dyuI_0#TE1Hr2t&6+V9roPCOGnZ0^p!yG-dPkSK?)BEA*r%fKcio6&(PvmDKugMlogQqYIRPEj zTBsr%#YNlfeYA~1xQ%H#LC*qiIIY*?|Lz{LhH~XXZd}Msrx^u@6?0S0tX$O1_Q_Xo z{qI_9PJ>dlTn?yIW)&7e%Qs!G7gGwkS18v9DyR(F=@BD*$Fx)(7X#$1zJmFXCrsRO zTTh|_H?!^X_7>b`w9%fk6%WT&Y%8jbjnoomAJflWibo?cUen&}Lo9bkgycf3dlzEu zR3@h~IhDz&Of9NRP`>xN+JoS6yJsMSuw!mVZ&Yt1<2&M9|JxwEC*$;ziNPzejdwYGwSC#ywm7rZmq z({SE$GYpV|to&ZIcaJWLB36FLg}n%F0NMN*MD~2i*~*#7$2-g7viz0{a8S>X zhZ9`4te@<;Ly7CqQ8iPXD|e!w76`#*@lvr@B{rPASa@(13? zw+foIsG-g|#w4>hvvy}RNFg3J@<xJp{e zRvQaT(M&B_S#`vAD=PI4e;bl=erS?Xy~(W#N(~z8QcfziS4&P-w{e(q(l0Bs>Ez_j zmaIo|GN!)~Q~7uW@2JG%xoFuyM&=dVFP7EO3%;fGq)pNE@1mP8&`Itc6ThFHWj1Kx z3;Dt6eJxQ7lkKIXtr%EML0c^%%z|p?O6j4oY_=FjGfrE3?W<3(mSLwhRy$lqO*e@3 zb*yHCyJ4oBIY#sbZu$+_3HJV##(h-Yt4?e8iAHs5S*!UCDpyu@6@x&Sam|$j)6@(* zYiT9FBTd)~c6%WRxq7)puB%LVEz9$=JUALl#hMRLyuZoysJ&4Hxdd`S7CkF%}jtMB7zLL!Jle)##z z03N4er{Wo(9*J5`blx*JtV=JjpLk=-y0?x=sk$a;#k;R78rxJzWM>Xz%uIpWuPHi6 z-5N$p)fqluL|skR<-phMg0D4*-sm2CO^-(Q6n(AMO@#&?8;Hh^bXEj*M(=`s6n-wP znA9E#)z|7R*J&m*-D;Xehrc$L8jyev6Hvopq?gE;dyKNDbC=P2mZ9?*9hT21+w6{= zMw(uuy}Lekexr8%Mvbl|T5%j%4Aa#OOmMEF9;i9ab>v(}54nyi5Agx}j&zxqa~|1s z9yLi?>E3&!NhN#gK6=1^)IS%JR^&;iJ|tZg$~lpo6UjM|cIHHSAbEL!F2@B22aQE` zvcRI7X3;3T{mjKMr@jw(dYM7sLB{bYjUwKTzbJ<))`?$oo~vW>Tr~n2*7Q8}FA?2R zxRP^UxoUt%?ryOUsodM>u})WE|6HLvawfP)Nc}x@w*r=r!ah2=4lzQi6IHH9%W~MR zKZ`1*^F>tpBH|5rvSpzmz&jH@3L0=Tm!NpcN*ol>LLglUIe^(2x)lv9>bfcVT2aZl zQJfoPXXPzlu#~TDzx*iuDA(k?Ieiqp&YPob#d&j_H|KavSapf!-UuJ(6?0xO=N0Qe zOR?t_3mFYcqxX8@|5^3YpMsJW{7cRq>D-ZrZ4()^(<8Iu9n(_OoQJikhgJCSAS5g# zBUpPctAg6TyLGE3>U~~-^?Ft1HDPGXn{^&b=dm>PSax3SR%2L^dQ8sA*N&6VmJ^}U z5pJCtbOr@Qqnod}rNJaD?9Esrr50OOgX_?DNmdx|%hFh(8OIXsW)$y=uLZY{-0|iOiOsRV zKQm&op$PWW&+!^|uel>yNu2wWoxlIIU6J2wu*f>l0p%5fokpP42nIqzdvrV|5eY_w z3!`LCh@2qGd9?6t70#FNgcT&n>cKD)-AR|5mpPWO`0h-!LdOV7tH)g3jrr3o#FNZ{ zG)#v>pKBwhAd2VY0e_b*ZDm=K7Kw3uEQ|vF{5a(bi(D$~$877F!bqJWbhL`l8x3B% z&w9`X)$f(?>0Gf|ZRZV+bUGg^e6pp14E9wxejJ)>aPl}cZf6t`oRBL{dez6v>{RSC zDIb;|SG8syaHk0)-dUvlXFj-}L%p@KjFDwE>&UL@PjSOmVf1XDjA zpdVr`zFBZ`D!#*zRvdwJZmrZI3)y1+s74SOc0naJ{7) z+TTN!rDOF1Y3LUxLNx#p2NHlQ3z@3%AKSe8{(-A7r#Cpgp?$q!cEAn{rzki@!6^z( zQD{L?F!4ZqFZlEW7Zl@&&Gh1n<7*K3$wQJ~N`Y#rpO}dI-1Q-LzeUfv9QeUotDSfn zo$uR-s*YYd?2-HXh+Wr9!NJWY2n?kx6_?iqBQvfNA}z7(3*XPrSC?3R$IjWpG@6j= zK(QY2wF5i0wSW_(Qz677nk-bsmcIjJfcxdsIo4|S`vCm~eJw!;`1AbzGc@=c|Kx9f z`7d-sV>+ZhIYWQtpNv!AU&znkBa)14!5*B9u}4mupdWna&<~ERVDkq_zWq|}nZ}@8 zwy;AfTO(ycGMAAJ%ZBHC6gn?(sRIbTK3c5 zbKp6^yg@&qRgsJGd{m!twH;jxj5&rTnFS_49mNIYIvT_Y!5$c8P%PuY#&d-@tAb(f zE#dvYRpIq?uKbF{*h8JpeB4$KgJ$XKpETT9`z{>yFP-`E1go<*-l|Dc%}`e(tAOcJ zHK8jVO65=>*wv%wfBj3t9x5F7c^_q6)D~cE%MtVw0OGwR)Cgn z`uzBv6qao_1s(O|&bk9Jt8bg&eF?GxZe&oGTCZ-IwF8%$yAXxty6FL1S=#h=9KvxG3Ybec$Y~tL%ul&!%!L*4(3~dI zjWSBVJ)?m~Zu5q=qRph#D#n`qb_p*OV$GKCwoxAEBAdp?c<9(P2`VlSca^jb8c$M@zW_nJ`1%VUF{XSHKX7IN}2~N@XMl z7h68V9`V`}DI*x$$JNj}lqOCFG?f8ea_{}xfCkZNZtjYa+_aXU9G8IP)m$N2_+Kac%1tDG04LfZ*VH%ictP+ zcI}#X5eGPorz}B3G6t+<-VXnN22b*i)6j!EU?^UefEvdaFkunRGQ9ITYFk=d4nvfE zVRRw82RfVXU6r1t)~W8LvugVlOVV&zv;#`4?qy>&?(p`pi@Xb~d)QnXJiJY8vL?IP z#im;2;q74u!Fg79(1LDyc$?U0Q40IG+No*{w=W6DBFQU{Ssb#+Bhg7L%YCfhhsAtb zP9A_BTB3FW*z`**K%0{@%Yu`ktA{9=2Re&?v z2!|9nRBP)2bBdSX+yaX(VG~jCw`S}ljHfCwV@H>Daa(B3cEBY(PcQ*BYGT8=8r+8T z2xHn(IaPUBEFn|&i?4;8f;j8gH^!C?JLhaq*FTg@O~KCcr(0rZA7%57nK@?GFJ_j} z{XTOu8N5{VT1t23(z_|Ck{{vW01~){e~6;|(Cjl!bgQ=PL+B$HDDPx_+*NI?Ri#|xkW>i(ms8-GVQu2ffhicWruaz@?)~U?1FyX&8oUoJ4_KO5*AHZQm z@F#;-J7Gm-wW#axp>77;ICaA@Pbb#ZYV?lT9}%-3?i=T{kX*TgQNyi_}6?YzCfuu>1I|?z+^3wQ0VQWs32!Z)Dwd zc@WnIX+qm{DkwTjFKx)=6lQ_$D5liolW+NW9>qS^W^!&P`?izKxc}bmT4WIzFlcLG z$z=v=$5F}JR=nvlSV}0aUM8&>YS8e3irsdEZs*%mO_wIJcE2cBr+(IfQf^zSf9D%? zthB4X2R&TcZOPc_e1q)K?g5%R7e1W?>p8s{1|S2-&W(B^TWP%KZ?50H&8(U82ke`? z&FjK#B|w+TURil|aGpObAx86GimyJDHjEx8J|qMKGzKK&obeB$`~wkT&OaH7M`RRD z_7vQ(J|0Ge&&9*Vl+w+d)r%;?i?#IF@tB{{xR|l}L3|`JRf`q*7U-ATGqm{CB^SHo zViA1;G+i2Ew4?lDqJfiY1Y&4GT*xEVydf9v(^i_YkQ%ScQa4R9btfb#ZO0}h_Y8)t zI`l+;sT=sVv{e_irg4sDX`CRgOdxVgtrnK^j1QvspCK@(8n$|jF7Vuk8c&IKx^22i)*hw z_;#S>o;GLRJ&Uq$zG{`JAiG$%=DE1rr$OUnINiRsF00LR`kB0C6X)Pqd2bc;f@8jp z`8ww7nD0Z(H*t!uQ+#*BdzGNWj`2Fid$^3(X}wPCb)466UdMT>TRYrLg(v8xPjD2A z3c)PIBbqF7zKUN#$-h$?5f7m4V>TlQ1W_!C6<@wy)$(isA%G9_gB)Nr zQc47WW;CGJ3#z$4X_kS;Mn$+>2M5-8+$lwtX7_M&5UO=_S>`SjnGdztk%QaR<^vA zpQg#o-^0y3LdEV4Cy(`r>}Ti)(A7K|hdy4Q8G{EH^00Mkk+)u}4lt^l%d4APePo zValz9DX-0Q>*)b+k-T8Z^wdz{H_`Z~{Fe?jeP^P#5$gj8zY#RWF~Xu2{TUMJ9COMAC=NryC4-P7dA)jbE~qH-ydzEs)3(bfEFmCN3@rE6 zeBIPrQ;`g1I+Uh?5jahnA?8-hrNA;5Az`IgMqST24ftu|3TqjNlmRYW%|t;P3(=O# z&kh(_uQpu9J~SqCofK1{yf)TXxboY$jn^94=sN9yRQiY$Zsb|WtK&kiL-Dc8<5?cn zWBW=)Y6c+VcX>r%k)`cQH@haYkVQD6{sNHzb88`9VU*0NmrT#5L_nh4o-IyAAP8@C z4Fo3hc6<@AfSd_02-o1=ab-A-2w+`;IqvcA1}&PsLo%U3)@O%GUmMs6q%JH%$Jdq} zAsrYjjaI~fpzR-lux+TT)<*P(R0Nv#1*IWp409HJLfDT8_7*L1Sk1#Sn&Mzm8yU55 zbKW@$LftYVU7vCtx`-1TWx}B7JvUgi`IPGTshY!~bjdtW2X$H)<8;?npYMmtJuWqF1`71923|X z6HsoW!3n#!m0e_4>f4EQ*Q9ripjyR_G^!qR2rFGJmuxNb&}XBvytP`ZY+`*|*%3{6 zy5^z_L%rMgOc5^HmaEr_mHodn>6(1m$X#Ko7_=BlQ24W3|MmAIhSJE(5Iqrkl@(hm zI)%F_xwLY8S8s9eozTtvYCAkVJMcAMqG1wm=HcXZhagQ_)Eo-P96?Ve2|GT+ z-j!^>m|X%P_F%mDjD6Z1($;wF7mF3k*P+#-F(z1L3tHuBxs6oxZn%UEaDXMfTadNN zHSb-46QliY#SvoP{8mv#f5JoT&;5Tn3yn$jj_R*MJvWNY`Pis7V}nbGN=ZUS#4i@t zm7xgwWg=xFt3uzC!mCM3H4)_O9mmldf@?>a<=9`mnbb;n`tG)JTD}aX8`(C}JOwe$QRYYCrZ?8efgt@m#m4BnManBV8<>Z?$K^$wFcA{Hiuw#Pm4=t$XTaOg#3992U9*j+g)vxN{sx|NglAwgn2ul+P|C!Jm zf?j=ihgcZ0C;=p@g@m@{Rxe6JW!r1ZLXvCQw3SuXznU+N%vt(wEN+;RsqI4q8+w9X z(TI!^ghwLei|;wy9m=@2cR0Wk5+NC;b#j^`51%CX6Om|{F`f}5!p{JlIzHWoJC@OF z=Q-H%JxU`P#RmUF#F>bdi^#uI!0ChtG&J4>R|X0t@>Y|-RgS2f^(6~b6{Fw8gKL3r zFoM;%p@)z!6T&efRA6gkF+dW)@_I-r^%JYjYx{R3a4!k}I(miVb+SPPaSxL-;6Q23Iht8mF2 zOpU(}IV>KGGV}n)DO1D=BtZFJEep$S`nQ&ChNe>`9ng}P0MkM1=3CAbs?|?g2 zjOC8kC1XWo^xAXxLfky`sy-XiJUcsQNv(z7TINNm5hF5=)9h@F2Duz$u0v@30oFB? z6;1ZU9*=7`-Ni1|?6^uW_D8ADhbm2p+cP9>PW~K;)+^$GEg(Z02?;jSUNY_UK0}J+ zmLlUi;&qnUB0rQmXLg&w_02Q_dyTLv;Q_wH)%dd4< z_)9UlpMLI;dut4=xNt_S(3XNK_xz`tEN*#S^bRX7)pU+e#L_^+KXjZxZ~vfV4j!T^ zAWCiZ{aI&LhwgBdp`<0>=XZXepB4lJ(7q(>pE>OUZ4Lx&otzY^H1T~I6xLOuXr7!t zgPFq@`3H4JrXP7?Pr2_T1FJUAGLgqt-1R!lP0LWrh)Fr9rm(_l!M}cWqim+FBqy=? zjirXQAcMRiTLmHH{N9qW;u^9XHQfFjD}YzKoS0@%P@8n8(Bbx;?yi{vifvEHuED(8 zp*ksRIukYJ^-@fEs|BHDKBP{?pL|x!{55qe@~1FZmjD+rf-7mXbz_lTA;oCO4P!h( z0iKaEaEJ`%yUKzUy+lj<+01Uu-c@CO?#O_x203rpcFmTiv45^N&<<8JeQRx#HB&@$ z4{d?KX;6Z#@ZdI_FpWvL!o|GQ2?R&7LQdto)&?oLVEMHn*n_nWajxR$c3!+(R{&7CpGQH`K62i$cd13Hy0a)0Sqv zp?Hhe9(rISDyW7Uz+IHXPn7y3K3`%FCJcFy95bVV zz@1qO$V+3w4J3C0+la9l7WRc<`l!B zYO$Kvq)Y>kj5#%^z&Kl|yn480>}^hecu+#riV6Edva?<61{|A_4FrMyY{`{+N~Vk1 z757sMTCI@Y>LaEFoF8AlRu~RuCERuB%&h8oZ%V`PZM~wuap6-vyXN)80soA5`>dRf ztks6TyW4<;)=>hxBF(>((I;k;ln&3EX|K$&;+QGx9BaW)J)5!LfUKXzRR_r`9+d@E zQyLa~cO3P@*KHiuD?H}rn>(!sbXt%4pzeR_rBV<5a_5zc#bm*AbBlh5G{!SDhvcX; zG!>affRcd|G~!JSiNxSYn1Bny0TaL|c`E#}O-`@m+-D=4W3~va+%h*#TsDLDrVSZ#Il{hgZe^!=QBTH|T0FZ%+5wEHz7^DACCxx~i$H*t+L}K={5aEa{ z+lHDO3Bew8AL0o?x95uokVho^Obx#mXII_2yfntN+MRmbZ|$N3*5AlCWXlx4)h@xQ z?6ITrVx}vlNn(nH=n@I0Gzr=w{L8*%viZtXC@n{kKuWu80C4McK{fcVN+YV+OIt=u z`#^VnO}$H0$y@H6?8`YR-%58(+K}L8m;6eJq!(6Ky2mZ1>)GTtdw8K}YwB|gjMlU1#A>3v$g^f2xPy^7^U&p0Yb;`Iy|*vs1`@AmL6SA zwP_J8t*OqHJVR@`)qGHEBvbX-)f$Q#!l>G9ct8eoKg6=|*ntCF6JV;TY1y*EToz_* zf7L!>&nv&=*q;?^$;@pI_PLMbT{de+-n&|{w!An;N#1RH1rLwB+g`Drh2icud6&)F zk@v1vtR4`VGpW@yr*DcJkx{O*SQdQBotX7y(8Px6w~g0JqcTDN-4iyKw0f92OIpTt z3rlLzi(-HvXdcaVCF_$EgO`Tvc7T3}36jA?C#Qg&zY)5X*VB@*Rc!b#QDO-PbOzO# zXuJ%H3f5!8&d{xhi(1GkOhb~t<3V6nhN`54B~%7Z~@My05* z_pdZgig8^(PKlT=?<4yX0>~h?a>f@NDo(`!LmRz)g0wvt*E)6+kCG93*)$o3Vh&Y{*gk2)!XmhEH^o}B+(R1Ho$ zjHdhHt1$-F>Vm9aV>Lgb&vf!p57JHKx9zho2NU04Pmzs9Gw~HQXWGY0;7QwVy+b5$ z8;iD^^f4D&tKTKg6fPRePhU)a=i})gwYf99g9X; zeaj433mg^^2{8pfTp>lWuBSpPoJ985p|7G1t5+2Ry+^^=2b@2`6^57ag%wGrT4`m{ zy-M#`r1Tj-Vb7{hNDCLTdP>1Hoe`GS&r@o8bdQsSBQj$*#8I&gO}gI1^{=FlPNR?r z4x+k&EM9=-G?}6>Vj+nV3d#lx&jg6U8H&K6DemlsEJ@f5G!K|DC(Y~zX@;W-<;}58 zfX~1uag1V4$1&Vpg?v!NJ6oYEi0eU`WZ(!=#Tn%ly*+uKm*X_ZR!(9ft|c>@a{Edu zFR73{Uc6gdz~$1A2J)hbH|z7sogqHOVSbw_I!b4C#DF3F zDU)*@0csGS18S&Gfl{4tG}x2|E7#Fcp~_IR6SsKmL|Cr5p|%)?3|C$ z6h{|!5dJhO>;1ZG?e|Ml!tcbnOXK(Wy_G#EJAlRbFDv5nsn%Jp<_Ej4J*S%HjxVuZ zMg%9Kf?OD}+r{$MY2y~EvwN61;3cL6p_Fq(KRbxRb3Zg$=NF7j(Rfg2VN+Qj(>LI6*8GTHcACv z`jB~xikz(nQqlzI`UZ&lwaDXR2>Wyrh-*N=YG3bv?ba_~^YsC3rmR)OCc(_1y6xJ! zn_sVu1ZjMPM*3wsNRnx;MCMe}yrq20?b;y?1cSje8=;tME#a|NTkm-H_R~dXk(!oe zyL0BwN)JQpBvyp5R-ymbk(wSVT7&F6LNpRhMbl1?M zH;oohOQenbYRgaSKBsco?Roc&od}^?soAr7pi70iaZ5N1IUDXmc9~FP1C_7iV&>NM zw_3`j9$QqO1MQqCjpW_VoN1b=#69;Ms5fWl0k9CA9j_a%>{Cu2ZO4KSgQugt{ARB8B0S%Zh+HHId}C*B)o&z^8~Y%=M`ZzieuTD zgoY9c1}u#Qs2G1D((&%z%NE|_8PW1P)+OJbqnp=7_hs<`er#oleoU=Vi z*StztD3c@Okc@yvyiAc2X6Y~;4t>bQ1T`wZxb+t(jKo8a<*V6^EW+X>mFi96m36&o zvjle5ZVpOXxGPSwyW;GL2m0mTvNrKF=X~aD{`y8`M0Bo?E!VZVM{#}q?do@$Ug&Y% z7{<0%*VMzPGs)&Yh?pPTj}Z&;qzZ1QD86)Ao7QGp^5Qn2w@z2vaGX{a`$12ty-Oi0 z+R3bcEUc7&9J7?CzioP?xhSO|zolEWfY9zy{zJ@J3jdBoV;0Ro{x6#f$Y@037)J{M zlP?-lGkMsNj>tNTfbfCi=CpspIQMyWI}^?1jlKl z5v{KnyPC0`Bg((PG0B-11+Eo`K3;qguz=Vnc@ zAXu+-IDS_Etd_9#TgS!ka|nxuC|`yc>O?ha9mrk5=UKVK1vB9t4)DZ6NEZu!6dI+b zD%FuPqN{iwlGn6R%uwHLufLP52v)#P0E(&br=Fqs6AeRwat9v=>_IHJLSj#zz_Mxs z@^^yN_y6?AKN#Y}z2~i5$woRfZrZR#n)?cSV?hL(n_?oU=2L1Ze^#;3g#sy!8`D}W z{^a!{R7lM~E0gXu06fj*rHv$f3rl2;p4txSRAlD&gnfexn6fl(%EC9>sn5ng@|GMM z?-?70C~$!TrfoU1+j8p1@Y#qRDNOefgzuo}!>KaEWzZ@Q7U zhSRH${V3@9e(bggXTenvg02upeteSg1RS{!*XVZ3Hp;Ebq`mFtkbNcthz`o4v z;Wa+EZ5c0tErT3(qYhgv21|>6vz}UHj@oLkV~~zPcF7qN6h<|Ncw??<`E7zq=2XmjRVFxepKqe z*to_j+%zd}v=Ap)Axxm>;!|13mH3{|fy}~WfjoM%EhaWEr2GYvcS_!7qvnzW8t9eC z&;+LKUyxSjx(Kxw}ZS6BBS^HQbZ*sm@QR)+7<1%?@| zb``PeJfHfZjmk~iIrwns;}Ll%vQg?Ma{yK*Z6gB2~(fOA40X9#rS z^EDIqS$1di0zfj(q&qVES$^?4@UoBjPuoG9`7lIhz=DB2FXz#^WAhE~wwgb6&4I;! zG}jxanG?2SwTE;Rl?zNS6A(9%+OJK~#Wr4DWR zWNK@-9iR3V>S?7hxl$2{z>piNsL#IT1#nR~(Rk5(R3hANm z^e?SkzFOfCe}1}LYpr@l zicM%cO{dEfQmLtE@PY1?70Vnz%hu~sHW&ejYmo}jV59xpfe7r|uGnQ8tLM#%U>~BF z35TJ-xB_j^PMI487ix6g4H#L4db=0yp+EhxOt@vWS43NX`lFt6=*hB*3r-U@!wDS; zi~|WGj|8Nwh!m5Eu87M4u2fE95vMg|x6fvL^gg0-oRS!w(1K+FA(@=8lIr# z#F`xG_l|#L4NB%0xj);j?gb)(V}yk~{OR zJS5kM(yH7`TD_Aw1;@{wylBr5Y0Xe@hfd7Ue4w|{z1Pr}kQ%X;>(DEy%8u8AV|F zb~UAH7m%$fB`oY}Lc>lbG-L@kI2+ALeSP3K*D96O^S}>uAgn8!j^JH;&$aT&L=`od z_J?8Rv*8?T?|D@|7s;#~n`)g+&2TiK!J%*|Ih(^^QrTP%gGXhPIRqA!O{GH)m0zXl zyNtdKBYJ}qf?i_ZM=TZhO(Gd2W@rwTi$C#yXh3J!=j|}4F6n$iQI5TR#p(174m`i~ zlGx0xZ!;n~=41O9u@FyiMVlts0F@IpXeb^rMMV_78|)hrMN|iq>i5bU;jJ5HyD630 z!|O68${KpO^^xh3ZR5y7J7FeiLYoJKiMpSSTY+_}YRNi%RF1fvC_@d^(h-Bazb4Sm zD=B>TlOpN{km-miEeX#xA}cGWkW*PWpjl-ywFoUwbunzGR1Y4e)K6#t)v}?|aC3of zK_{r1k0GVj=2^>DtmyRSy1diR#pxYQ8-&^vB#PZlx)S&7XhxDL^CZwn5)pbsP&WB2 zpEDl7ojugioP|E*iH@eC7$+0A`ZP}Xqy7RdV)D(8wh3NubmFite}qG+7WoOo-4S{8MB!I)2QP%P*KVOW1B z0g3ozFTEnr-W5q?qVCwolRV%ORtiRdBbn$6tG^nBSS&D?#dy()Pr04!u~8~&Rl#j9 z%mE(bW;OJTCRx|n8@zQE@J{03aROCSV|Y()+r#jDWQ{yFgEo%-yiZCqJa%V++X&NM zr&@caZYRivT5v+zW;uXbR*PJ1tD%wvWiOwzY-zmC}8s?BZ+~H3?U#`(0BX$ zzP__MDZ&taHqy*Z?N8oEHCJj23Cl*Bf0qD|R;=Au77+f*IlonIt%W9|!JwNnfryOx zA)9h_V^+kKAK{pA27!DQOh|-ouur``&Ah5UfhHz=xe;KNLDvm&*vJ@Ej8u!la%!T| zM92*Uk8)!HtPWu*WSewydWL+GJdTBp0`If}PN|w!Lz{iW&uC3bHm90+S#R5hKsutO zx1pdcU0k9B`mQ$M@ECK<<<_WWv2ESmr>S9U!t8t^W%Oi|+qZ8O)WM-q!Djv00`yK) zUa`UiwnRr<3h&jB6x>67Doz&8q)_vux2b? zht%xh!1RFJY`AQV5D2w(8|U%s4g1uU^6Ht}b+IU$vCl!>8OjS$W=D5r9@2WUJ;)R$@nWJp^gsGhAi~H_Rui6FOAx%sO7>%)rvJ z;omEhbt}e@KX4vKg#YW&o9ACmqvtPKxDc6^=(7?3@k{jiU;grc(Esp;(UlMJe*<*k z`$#+jL5gzJe03lukhcRRRi6KUP)h>@6aWAK2mlBfaWw^TtOm9b007qR000yK002dH zWo~p$VQyh(WpXZRb1rCfZEWpbZFAc;68@ad zW0}JJSY*h(NlT@4*DMAB#>X*sTLKQ1|0V=q8lBRc}hAL^! z3H@z|N%}HR9@qsbNhlKj86kJ06QD8Zg@MB{2~rYwDRiz7XB(Z(txv*o;!m#F5u|B} zlBIEpb1rJoM3pMFe!FO+^I|a>pHbo*xy#7;fliG>V z0qP-oL7mbi3qsGU(l6o#fg6=qM4jy=WLGA++ReKs5ceRej^%4&VGuDY3hw0#%+&o` zOKtKtzoh;dWmsIJ=QK2G^HmtRFsP>6(a@HThaf!)1brF7G=x~J-WF_sEA3{vzRCi; z(ylV^-c33e30DT_vMBFFA8)G1X&hi)Pn@35*`~a-Bt18;Ss};ST*E}je#kiS&Dv91 z3;i=B9Esl_ru@!06+;+h>rf8*XhxODlQjpREfSo%A@;Z&?Z#y*?GWg?${TOxST{%= zE+y;$iudd_s(^M-)&v=>xNtkoym7^SAV0jwX$c3X$NNN(0pVr>U6j^)8_CSks~~l@ z*S-?nQEm%FVmt^eaRfVcJALA#;`Z@MPfL{_?b5h+C?1<&xMuebfk!$!S4n0E2#7 zA6QbGvcvx>27s2ABB<$nYwBc#F+dQ1=%Lhn3gE*REN%z|g~lVr=E%$jCU@VtX@)$t zfMt6_o(tH66dP1wF!$n!!CGwk%wbX>L%j6*KxK$&x=xsli0Ov0KUOnDR&yA!zPOQV ztkRh8nM^k2jKRzX35zd_z5eU-`O{@}U@Frus8YBan~!Y;q2HBddiuoPkf4a_26IgT z0Y2mcBf)q8`L_6Sg#Zhw=twz`zEI&*vX&QG18PPjUjW`Q4qP%`>@Y%lYB58H#m;)q zP5(@!BqJkZICuokJm`q(4FSUv_rRFK;ZQULNJ$vDKuEX~6e%Mi$w&+sg&|a!BFRzpc%5yI%H6Y&kh1!WR1*kST9z2Pm5ZP#X!jx`nDPzL z!~zaXje9Lt`ka;+wT1uK!G?^%Oc5RgezGCO2&h)C{gj6BDkBn##|}k3zBQP)$}o+2 z=9Izg2^9mE&G5-MK?avY9+L8sj8JY&nm!kdRAi0&f#Oa^+)Jy#$xN;nY5;K)Cpm#W znr13@Gf9RPzYL%%Q$u6z&{#U9vB04Sa-qtmFme~kjZv=Nf#nPB?}!Gt2LdDpFbvYk z)>8N{blsegx@GY!-9E~L=(H(V7&151+%h#^^ce0d7+bIy(Sq7jr5G!FT2f#@O@Z2->LF(fD8XFF@smxL)sTCKhfp(r#Kx zhnw0rRy1X76V5Xgmob)-)81pBZrX{h+9 zW0JP2YJh7nKUZ;WK8XBU^+xV>oyMr`IU@5Ns$h_T!ASt~gn8#Pqy?P>V6-G0c9}zQ zcmC~xD__y=uv|;MlU{(;eG^kht=&1{O+So!ly2DTAxR;@=8sQ+FUT2Y0?Gv|-rCmi z&IIWggAqpKq2Rz7v`2q7z7}jjJPN@!fxm*3` z=&(&Z=gO{YZs)}t?tZkm;m&fCv^>RPv+rysSgKe?+%6kwBFFjB#6dI#6HT?mga2yg zM=p~SA)ifxEFm02Pdd~yC}Yu0q53I<8cqrrQIue{Fm8eS!^J;oI5oXDLWnJU+sJgo z>!Uk2hM?;qVG)*nfCECl1@De@is_m)^e~@HZv&Cr(4%S7SYQN#oPY@l>D}0h7C4f* z2smKCCrk>EAr=k^L@JB|2dNa$V+8c@b)*Um0y2@a)bi2+;0%y+#Q+RB@gc{K3Op0J z$%Ds(aHw;Y4$!xmZ0?D7RDqNUBpuc^h+tM`K?PcWgd@oG`G2BYB9zG$_XMa%NX(QH zTl&V5O9I5WLq?DkzISC?2~fKFA>*R6(09J*N7Ge*pkSr>uNdEWppJ^=^jVINCW&C;t}+u6;eg{qBCpBL*cqq9?7OF*fo?J zxqnh$Q4^vNTd`g4!zBX z>gz+5RDEm-TWmgbr1}rHlZ8=9+HE4c0&It&Tx#WN1mYQtISc>2c1u_^CAuMd8^Rx^a(#D>P9N+G0Es05_y@toKr^rBwO_S%|GE zd96~a(F76Ulz8HD(C^8F9%W|+g1gR(aHaoue4=JdEUusmNk zqr5$QeOcBhYu5*rN7}U`wdY4azbRc&){fU&=zD%hi)dI~qa40Hyex~fKdc?nzRvDY z4aPrDb8RwREi^IA%OS-h$Wi5Uc-bdFE@>&>@)CSq=Fv@xXu8yFJ;1=)v8hX$lP_&? zOR5yT3%m{!@pg@5q|8#xRBqzku9Zx5S&ETL&9&RLk%21quQtjRQ)3XcvM{+)&^5>6 z&MIL}?Tc6S%A8q4k7Dmk1QrhvzTjkdyA;|2`_S{)Of*`HiDc^2=2pC}dK+>^xC%R) zh7ecG`D4{8B>h!|%vMkOYjCYVjrIiP)vcO)a78faOh-Jjk79GQCnG}W>&*$?#FsFwJAvbjH1!ym0GcPk=odqfT?puTNoHY zFGT7tgjvk$BfdX?RN}q~UfmwEtYZRhmIGu7ts4+q28cD64;azwj!_?)ev$2} z4`#n|h?^3~Yk^RNx;T*Ye|Lwvh8*$?_R+7aMIe>R4K&sQ8oyHZm{kR9?&tG2u6|A|V8(cNORgV2R@$^!>xms{4HEz(fLDS`-X+{mKxt|*_ zH2~A0=qwXFmCXmNzZPVvdz8Y7o*})SXyFWa_zHpFuD8MD_od#q|tmYut42-7C^WN*g2cUsk3wP1#IC z!v-<5G14mC9)^&LFDHg^)K(49ozno*YpY%2guadG!7g!)PPj8G{&;{rJ9lp8RFPsl zB1f26f1KvC?4GzP_GJ^f(#(}ZeeYQWuxyXbGLm^HNmWRdEyF%i6*bAd+E0zArpa1w zq{xF@UL319kMT<5xqfZl1;@i>FF4-Ozcle|)*YL5$AwnKnmgPSZ;Nz4^~BiXNPD6# zm&Jb}7G0S-9w6ia7kL~4=upDgbbE33He&tCvNjRFmueqK73vC?hNFt|q14sxbS<(n zWoQDogd5}Yos8~aS#&pN?pG6+jPt5^vX3(W0dREKJ{=+oThr!RfK-=pQpI-pGb9`d ztF%*oXDXOsqx1CH6EpUmCs6DD$fWp30Z=~3tIydNEg3C}Xn=NcuP2X+$glTCl!xJd z03ZXRUdaKDD@6aWAK2mmMiEF8*SRIv(%k(Q`-2>DQ$w^s)s~>6(+a%Q-7Z zbeJT6J$RBNr)Q_+m$To0Bj3kI_mkx5i-<&(*6qV2Su7Uu;z2CrJURO#F|)rOmoPdbxom}Xwt-84+J=C-Vq7>BvN|GK~(@cBF5B{ zNW%x66iP*;k}x}o;y96@K*we*xq=oeWVMhQN=9*7Apx2zDQzWd^hl{4i9%?SL2S}o zl*{2-C3{Z_PL(=|%&o(Pq;0f8K#TTJ3&B;CrL3M4B@4e+JZH0rELf?llj!~rXdJM4 zrQL7J*}OT4Xs&8jmK>t&+a_1-qm+6dLY88aP;`{aIpEyCb55IgQTEELK%PkkP05#O zLbEhMtA<8a_p>L)M$#u7hlX&VIR{bz=c=UzYvw1>(a=pNB(qeP!COvq;J7+1-qATc zLw@77D$K!i$xk!i+UglIKmY zf0e9drx}mmDwnJ*T)MQJUmY(^=r4(JNTbwIrjbg_4HWV1OuEkeY#k zCt5R{a-6+#%=2m`ga|p_U{xayYp8ROsOhX?%8iqXD$JvsiKA^`@<_yA|Romy+N_4V-pksxY zpOzDIH{fw>=D-aGuip9z($EHn88#uh#NdtW(25XBVXu7wD=!$C6qL3Mu^R9+QtJg&Ps98pvM2=)MCfc0>w)0Z|2VA<@Ewdv_RW zq}I4zuBtyK{UT)EBpRPL8Zf@C7BT>GFyt_4(-s^cv!d~tyfidCTx}q45DmK_pdqYx ze2~dAOuZ$l(zs4cp~TeVRSq*D!9qhwHfQK5;s9dud`6hY)>e12QDjEBf`hTxZRMsv z;hzqgV#Q72`pdwT0J<|#xqoj!xO?5u0EhW zU5%#i?R!-3WYVF7;I!xeNlWj195+)#_v$6;J|On%IQV++FMKw9Akf@ZXso#i$Xs+y zY1%r3h5~YIX(e9wcejYORMJ{)+~g}QMKjM{87aVr*qm(mu?;gio~4{+FHB#NCirVo zD(UzIOa9@SkzLl?a!7;gkDCA=;$bLMmwVutV%NZ86>;}?TQ4>pf=n*Iel~L9_#~8P zo`2kVg-LwrxAXaO)p5j^U27yWCV_sRw=)Tlwa#QEx*~#pv-nX&5T^gH_L-l6^FGyP z(RntpWgO`W*pM zP7nvVKW*ANp3%TDZ_6>Fg3h7KUEzg*np z$r6egMUBv2+4e(+##JkKTWvhga7rd^T`*nw!;ZlCTh#nW%M#aK``m`Y)1zs40=1DS z`bz7mbRuVyygtO-)oAMkz@ zJBR6?CpF*j0q@On?YhgKImfCMQ13YPj#IDBss263mHS-(qU4h7X=mNNTDf*wztY>1 zb#1qSF-NHAUqNktmPbCa;AA+TP@vCP4We_qgGn;IJAt`7fw}%_6yBX)P>ZxjCoA0% zW`Ts01L;)gehLh~^ceni*=S z=<1j}MhIFFW%^Q(?~wNFYr1N~o6O9KQH0000801z2*H5cHbvq~TU0KE1A z01N;C07r6ZWG-rRE@*UZZ0%kDbK5qu|2duM|A6}5#de!Wxz61CAxZt3*iPd2nxqrE z?Yrsp%|Id~F`)>RU+m}_|L<=XASp^VNsxpfNa9T|mPB$1EIzx~T`U&QC(+b9c|Kv( zIe8wrk;hJ62d>lm7(VaIug^W#|3m`j{csRQbB~1+#-alf&1dX~gNS{O`ol0hAd`TN zemLm$`r@XZ_-)D@m%?MifHD7|fAYL9-!tIO{N%agUX!6m!|;cLiT8L)UH{A-qkwxoLGqy&JsSiM$I-LJr(Z%kW>4`uyd%9d$gS;`0c&7rOsOuJIWQyg9jyJq|rJl!vr{t1F5&pohfukP3Arsee;5HzR9MAej#2XmA4EcQHdLCR00yd1`J~vF> ze=#C+9+NS2k$F9VxZj6#%Dg{*An)kA*=NE7^7woCH{??W&%(b-^69& zuo3*`AQL1ffSIuu$&S*1k=TdvaNJ>pxa}qVKjVV&vly9=qbVL0?E%bk8220tqY1P; zoOyKq)Cc(X$S)xy*KX(zT+fZ>Pm__5Z}c590*83lmu{+p|}KP8Rt-|5b64u6Q<6dnRD zHxqX_5%MJmM~K~kWkU-9NHk_%Qs4e^c_l>$B}_~Rs3(_Toeq3D<|CloTcMM_O#(26 z5u%X`-~dg6It-pl5h(>2%7E{y|*poB)`ErTgF*c+B^;ggPIG^5`Rb3GJ$Q`*XI5-h- zDY!3r&%sGgfe;{02N~?44mz(D=)kO7a0{9Q!8LOZPDZgW_*!t|AfUrfptcT9juaY| zA-~{WoQw}n9u>7JPbx!qdr~Rj+f!ObbtTJ=|N8o?2Ze84SbiW-fqRY91%kThiN%HA`v;Tl(zYq3NGAH<2G*uT#5s6iAHea zp8Xl~h{5&4g6p9$F%C}BnYbYt)qy166iSq8OH<>ueM?b45%}M>fg;=zP*hAUs;x+E z!!<**M8_;h+^S4zeZ)&I8}D8^UPp(ilMG(|q4drUkCk+r76cZWOjVPewUSWLBXg`p zudyL>7vTE+kE-67(^k--Qyy2C62+bJqHZ=v>_r~LwHKW{V<4!v9TUGI?KhGzW?Vj8pGg=i)i0Fp}tM} zaMn#k5>1NY|}yT;Jh03FbrcnB?Qr z5j-y_8PpWq#|h;((X0=mRqfpx=!P!PUW~|!P~mzR_aBid{rmy^ge(3w!E>UO<4~w% z;<;0)LWopkgpcGXp?8rAfw&XbM`@;egfdzlmnY;1G?jSpxVK@=zS8S;dlYq*%fuZ| zJotYk*_`2i%3)l@(1FvQt;*mJLJW^LtXm><8{c9Z-(NS5Vy{_mGauKsi4)MVSb%l{ zKEstnWb}sFC!2N#Ejxoo*~vZ(fX$>z7SPON5H;4OAt>ATp?TEKK+Y#KmT&|pOfAQt={HOENtG>IGcylZU#GFqlI&%d*$d-(MrcuO#q8M(~5T()8enpV>US3qu zbaf5+CRPwb7X3=Sn4JNm$Fy)g!fhGluQJA%d#BLF z({l~c7d;EWm|E1DNG=nqX|!bHlEtv~?ZfF6%X_)?8WPYOBHx-klQ>9ng7{Hff=Auq zr^T-rZNcZn&+_RkD+>D(NJpxdqmv{K-J1$_OIUVizr5wD3umHb4QV87eyR|`VmGY> zP2X~5oBpb*pGT^ox(7hcz$?H|dc{f@rH$JoB(?0a2`~xw)ZsV&T{LBvtb|k6x;?^E z+ddluR6HwyQ#`X5OmUI_zOztj++$-v!k}3JltetuS}^hAXxh%gsYRd70Vy{%=WdSJWtp*TYiM@p~{XtwOV(T;9!<@Sa!(CIi$#&b-YjR=u7FU`se20B5 zzC$iM7u;klww3Z?k6_%k&n7e?w()M9>t2{TJjT`GeL?FUhS4;1+XQ9-L}hq|%WKrC zrXZMha*yEGvde~`XN9&jh{8S8gYA250*f-cwhW8%j@HW1iYYnQ+dV>J`(B%xkTHe+ za|HLq<E#^ABM|jlIaf8aS5|s-TsR5WaDayTsr>?%6KrR_MA00(lQ0y-F#D!hJUe?1sf?nG`8_|2*nTNxGd)~cM zGOoMeEsMfWiqEubxvWQf1hv+kHWJ+y>P2paEJRxj%+0n- zrn~eS8hPnWFiw~Gcj}5u=lZipSkusL6KD$~8br8x?p~agvZyBR+mn0tgmZECQPEEDIkI){fh?aYmo#;wHRHz~LA7n4P2iOI zP9aLEL=hH{reZrC1`qjk=CO$FC`=P}>=8)Y_1MVP3uqofvMJmzr(&nLcRiK|{E`9D zBM-6h&r;mUZ(`dyKnY}lkHn{c(Fx~C_4cy_hvI_VJuO8lyh~q{RJbPtt`nn^binpZ zj4aPU$0owxyd151eJhj5$PGg97Xuyw{(X+;Cgf%iDSjI=+P6&{1mpKi9@_NT*t`Z_0gpHq zG^!$|Q~`pNmfl%8eoV^uDV}SEj^B`_Yge9!=hehBalX@lfr?8b7>+1wwR~t2b>`v> zn#CzQy_9%)C7`A9%i_`2;;eqW2^Pc0wypJ;1=;X#Dqo?cipaIgZmP9I+U=5YvGIfn zwNlMWCDg;8!Q3d4-8@1vUa2u_-Gf-8#;)3=X3sG$B}!SHh!|E>%fG4!!ck?_r7AJ0 zo-7w5!iuZqE!FSI-q|5;3lO&%uq8L&s?J|#P@<%I{ldfw^F`InN|~0T_u#0VS06)W zXhzn8h*GmpS$+yn+)=8xxem-I7ULVXR=ft!r>XA0de;=|Ubl9-Wgx%8^H$j%P)bN0 zg-u6m5W8N4$4Ybmw4}BA8e)q`Z7HM_cR$&KsIa`)zTv zJA_$+Fu9a1(y+D%VMFQdmq6GDY#I?Kec@(8P~6vPgq#SpE`?6D1@g$>?f zfL2nv-Bn{nv9_!|Ap9RT|GA{Wy9dJU1=d!%SAeU%a;`K_ylPAMN{y~o#^nr_RO%-@ zeqb|?4wKWY;~)^}-FT?-6!XjES<4hRpcC#ha>PE*Sl}WV>K$i9(yZvSG%xLzI8%`t zjSnu!5iI&`m*q?dvxM~2c%fz%+b*ZJ0s%7F-;MaKHv;a;I+?3d4 zS(K->T2WNU6|hkmq>&r2vePa#Zb$(r3@6ktPL|fSF{^=x*4{Qyv})G5_rRQf2(+A8 zZAs+D;qAq!k|BmPkI@|>jvL}3@KuYK%PLMi9erEa5He5EfXR2?oUm53ugl6WCz2dr zpP}4<^<3vH?>aM`;jJJ_z}vb+|7~R=_cI8e3Nx&I)8aum4BWw*Pqwe&;?BUxWUpN2 zm5co@1?1MXZOlTHcXL$X9JOMJ*)>O53a71`dFnc~3!in}_O@=P&POz#1$2B?Tpn!G zX)R8<*mlaQh=?pSV*+c&5_y$2ytRu(tW!@^M8AX@DPLr(n{R4-g-F2=Gaf}V7kgDr zTP`nvq_m8t$>MEn?W#v?Yv!_ckTnn4%5>4X9rpHkZoOjbk{*!kqFvhb_1Ag zSs8J6A*+-&+CkPRWEFFd_ZYIB`(+(sJLjwUKvZGY&R7|i^>0n&{Qx14(a_eUsw%_k z6PzU!DA23e_TCM=EdyUwpFnxUspI_Qh7qd@nRY{O%h0Qim^ua==FvIpaIjrCs55Hn zSP0mZU$YJhTLpz0gQkvzSsaWrnoZsA4hd$FP-D<)I#R;T1-yOvcP%mj?D@cNUIl!5I&ljVLhH$XDF!xK z_?Z$d(!#`y;fH4O=9( z3P$2Sh)U&>agF6d)$;$_9vkW+6J2D&RzIzCkvkW8`>hFdk(H0YvBaRT%Ma+R?tPGx z#OmHQQR!^&I%R@&EGaXDV^T6llMPti%T}&M-Batf-Kp3z&7*kqVYlYod3IKK7<=Q{ zb!*O@S7+&*0X$gmw9&bATkO(xYoE#5XD1`gThlFn5*<~u?>$lD5)TUw33FWV%f{je zi*Uw<*iVOyc(C#d3~FC;^3HJ@@8aoz1-B#}_re?C`K23b9EyRBJ(o?j%Wu>O_Jlin z9nozw?n`QXFF5df`+->y`(ul2dflpeh?e|2xLps=l_9K;=XxqxMtoMTT{Jr0OD_h0 z-<_6}1~Fb0(&5O6_P`1ljo2CU*ckqr=v<+Wt*tiJYPaNMpd3hrFY?7~dT{cOCwgp= zYCA;50BLH3@L5QxKPMEXg{aU`>wa~o0~W#W>jJJWcmkO1kbl^aU zOIbJ{mhADb*(wzrtA=0|<3KBxnJyd_9vxUq7~79hvf`*{rrJ74s^Vi%f(i$?*y!IQ z|E6V~c^1F&%{V_iqtDGy38uY75(DN?&nHsZs$dVy*UGg>9@hBO*Z z^w?wyc8c;0TSHmdaXy>AiBU=T?KsYQMg#bQtFKmYC1laB)Qi;@?X+tmMgQ~~Td84& ztBAcRx~PI@FPh88nhZ8AeLJHORkQmvc;ETJh8|=smQ4Bt&`lz_)J{T9&}kU)&mH1LVYHp1_e;NgLIwTb4{u(+>Tkt?TB8C>G8(M3&5{MGtHORA(rnF1!FR5`PW z$jyZL1o!uYMVg!=FYV2c@PK4T$dZVYWS=*2~~n5Qy3wxz?>|rxa$v zP;5XO2d;y2;gtF@z-~?gHl*G#_GrY28y$wkae+Vx7z}&lH6D#2ZbO_C_|M@!BQ%cq zlt%6lFFhjJdj@et+)+ZC#4|?_4dESs#$eVtlFF1t6Alx%>v;qt;jVmjuYQg?w&T+M zw@H81e9;mu%X4xpehcXA4Rgm6qm!gPT%gX!IE-HL;Bpvng*cI^NU7?(ZVZkm#JL0*2Frk zz?_uKXAF4Vs{N_OU1->;y2dil*^o%>oi01SZ?=+7+wGgpDpS~_n0GvT#CV8g7P!}F zRn^edVBMdq<~wc9qLQ0xh|%<}XO+xf`&9oD=HgIV&-s}i`r)A=9Zgmye%I-d3t?JI z6Q4S`Dbyig1Eh`szK1SMcZYfI)Q!ZmVCeff`uL!Xt>KeAL}Q&z!8>>X27DHD1G}C& zEPWDNnb8)O{(zAg3qm|@Z>9YM^e&hih&Rh-Wv%Jmv0pC56m=`?72rf-o=8eSb^x4$ zzx8bueDI3DLOOPtE23)`^)k%OsQ&Vn)d~NpP%`dvpxBh*!E!&L(JUbSMAK5RrMteH zNTyO36{GK?>S0onK0SxcYB?zOOhcSkX$`&Xu}m2oXU+$H zbK$hkURHVONA5PC!c|@ENA10A-Oi)AC^Sy7Ir~yvLo09;@TvGR;4xg4*4<-r$r$vu26h5d#=N03`t@luks2AE;$MymIr(~c# z0PF07h^$KUOjPj@tAR9HjV#J~vk&g6Mw`Es#A*LpT4og2YDJ_!RILV?4#v6q3(D#Y zX=_`wQtPMEvQ_)AS7RI_JKzI=ctWq)of!F1c-%|l$U?JMwM}%$JW1piQx;DKegDAWAZxYKF!c}>2Cz{=V5d?I8OJ4Xy`b8s*Vq;r; zLh%xYxxp`56|QLNCBl_bxEK*k&;cqp6nX$`5;FUUxDg2w&fpCIKWJYs=^8w>@+R?k z#;c{r;m#N7ojLIi8%cNB)VL`T*Bol!`@&^wtNvGaTosz?hY@Ca7bjw5=WYoZs76X{ zr+Cz&G*fNRxeYOwZiFkUn42z~wr|2iFDfKsF5^R;h{ybKR8+x08(Y5nu68tL-J+_0 zBe<9_^@x5;RGvYh>)S67^V!3XCYMigjC4y(WD0WA$P@b(*A0F^@3r-B3B_ z#?bgt3_;WNqBNxR5I;Pth)ez7(SJQ{L#KZCyIEOzR#wu8J20VYkcRJcO)DEv)~0NU z3M3Y9Vl$7!#}#s^P&Q({sH&x8znIXlYn?;`Hf~(}dGRu=SX1Q;eqiJC&oeD}uN+-1 zgM0iRZK&uAYIiei=l5=8n$~}UZKbj?x?gt-UGO`xGDRz^+E-HA`x}SN3s2g*_ejC! z)3H{3?<`(tLQlMMErY$OU77bRKFPHwxQ&HGRGYcGKa)I`#Y=p6E8K*|@;{V^#!)Cd`{Z>jhZ@xXqb`e4m_pO@D;XJNJA18ISjSAy^WHW6rr?N z^j?YvcCu%q>|sd|mlsyc?&R+t`NJBVRa2k1r-=aKgUgp+a_%weV*=99iyijHb%3pU zr4%=bS~x>iR)beU-V)#RO1+{#UNXaNV57-SP3vmM8EOmTX!5430ijT(t1iaxQZ|D* zZDmB=P*H}p41u20|JvlrXtpV;l)N_ntuZNBv%6gh0$Xj4dyW1rG&*eb4R*!qK-+%r ztPXPy&30NI)u8Ask2PB!l|!(TmPe_k*T%r@F+D0#V2kMiw?)#l!0jVx0CL&P@EtM{ z0zxD%8^jw88XiAEj|^7Zf9{k^sxq^&oKcyi<^qMJat0z&v*(UcJ*BTmy zO<+|PPdO&ljGi^@Fs_)zm9_&a4X#RleaSd9*j8D|q8qU4^tjlqZ6S4HDzh*S$WF47VUY$#5RiD3o%}0`Ugf5F!n}|P6G4VhQo{pJzgSoi z9_OFX2EnLG_5vzNicA$rmr0t1_Q`@^Gb3f$QmS_#OsR9dA+sdoKxdm2j>(rVExWH< zbr%=V(Xctbkrt}zd!2b%r~}J3IBZm8Y*z6)G~%m(Ps>7Vn@Y^XCY@`@&67tZpW?MG z)Q>7`C{dC1c)nv*$8+Lo~C<2NP9_S8NX0mEbwQ62C`38t#{f8Ah-qB*HUX_wQ`tFG&?qSoxI8XPz7F_aV*@FVIbzvlKA;S`z% zbV~OV$+=d0C4sH=ofNg$Vgaoqny1{q zX1>e(AtO^3O}HbLAhRQM0jnbK@aVX=e5`JGbW9#EmMZahBP>H2PO0ZT97oSe&pKMB z{kIj$w@9d;Q4$TB;s$+(ftv8boGM7=T%KsuC`zAyvqAaZm{4jvTu+U6`7ZCOApHL1 z4~t|WKj*cT2wMfho&%4yiPMCJ859(_wb4ZA4eF4h)TgRy+m_@!SsT7ew8(3g9O9Xb ziag&CbMy0A(aY2B;)uVM8=GpK3rWUS<)gUBL>q=|b7_9&kL0oDG-S)o6eXs2#}q6z zLG>V@9Xn%y_=kcO;iqI-8sAmnS7?m5>f;%JAJ0cK6kI^9e zRi`+tP*xTOb^NiZ4&8g$GnUPyi}c2cqmb@rDNMUv2EMQiEZ1qZQHhO z+qP}<#F@-o&O`67U;AaRs;DKeJjJ|*+m8s6SZ`ij8}X9C{fO7;6pgde zn`w%z6QCNJv<~j6ev!glbeW49_bm96pG&q0@NIrR_x`GSSH*Q^3GwS;^y4+cXz)Z& zJbBke7t!J*Bsr|fL%4}4L$#Y`yHaId@41wm;52zSw;>CZD<@0SB6m%9G zPr!N?IOr+HguIXJpZ;rY<$JmFnPt1i-ZDM7!7TI9_}|b`}nU zFWK;*V1H`Pp;kVT$jw2)bj1y3*EjWEW93Alvnw!8LS*$gh}Frw{v#!Ih3De8PLsv@ zgBzgcU<6A5WyaP-Z7*fQqc9XG4GRPMd{R7DjDNRabEM#5&1V+!Q(=%(SjQd#+;L+s zpSnan7gX%=?Wo{hFNqz_8F8KCSTvS2h;n;JG{xK7?`;Ue98_jNyA1q2M|TxwQJfh? zMj5D1ZPq-NSFj{-+Dyv%J5{8k=+KN*E9adcNBsyX$Bi>9Um~r@V31008bknFC>AS_{Yj;Qq9C6Bk(#d`v@r1g3$l&FS*F zojAL*O6@qHaLyRIFQwd-uA~WNQnbWp;u$}0ldWPxT4Ibe?URPw*#)nvikEL%cWZo% zy5uOLN1*$}nN@`4!+g+))1^XekKL4f=u3jO@d2N#@RuV3v;fKg6)It7z@T=@<*APW zXh5cBzy|lr+RW9wQUnF-zBQ-;*7Q)K#f}q8xYb1tgQ(@D>XS?ZL3zX(^aIVZAj58U zv0{xv)R|d*S8u}IGk_EW&6ow*f)tYY!KeYzY7ycYLnmyZ;_y@AU&VC-ZR+_q8&I>zbkuLLRj!a|jbmP^MJt39|@zKVDH6>-R@P^0fp5AQbU2N}PgA zsEW}1qQ)Nd-vK=^j(@yXweXZ#H-G%jQkqiq-=+Fq}< zD#L1|GIpb~J2I*i>8{{bfW~j)HCSk`A~{~Hm6M>+&Ppa&1)gqd@J>T2gE=ANo{ofS zR>~i8tJujC3K}MUFr7j@J=0OuNRmKgUYaBt3qe|%tQfRi!~{ixbutK*)*t;@f&{LA z=Ji%wCQ}t+U$64cOw*2bzCW*J4-OH!smMvL4^0%_dmC?AKEhLgQMR)6mjbTzfMTMp zNYbW5>PX`^riW1yXCf@()J4!ZuKAW{B1W2CTwx?Gqe}d|+8NTy_cvuHt-v8vVhuPx zUwSfn9W1QYPy*f%K9G>`I;$G@!bY%eh!GBpPckJd**3fWiOTeSiSpl@N|N28--T^t zg*lzc(q2z^-&yB!aJl>&bas`&YHQZ&yZTZZ}fIsVY@LHI91B<6JEQQ$|sC7}KoRzyf-0tl?V!gxJKhJjs1YpW^6#I1(KG&#kVp>;lr=MiDh6eDxtIF$&ko6mIi;_Fu9^vv4~$vI=s0mx zczo|(dY!RwGLB{@&4|*5{9Pb2OiC^7xZDhRtSu?OevP6Pe9;&*yF^~?)AV(@)H;tW zC`4omcP;c?Ug;l!HJd(I5-XCR%dJOvxK}ASK$3rQEv44+=s7lG?|O0b$TemKMI!3VZI3 z4!yse%wXsX}_`0X0-VaNB{mm>UkIP$V4O!aH<=V)vMuHXR6S=imaqt>#m$DYhWe*iU$v=u@LG9O05Pt#nm0wzPFW}|9nF#Z= z)yLnqz<^)GS=K_ElN;Z(Jp7p4qLCAPQ*}I7meiv7RzRpZ_-CB@$}KLLmR#&8MK6!+ z#EH|9I+_#Lv^MMU!*AYYm=+IXKK|6am-Xh#_rm`J4D!sP^5MuFpP&)vig-O@$q`y+ z-TjlIGv;o{=DK7)JxqMck7`p@@gPrzs>)X#;btYDC*5ZVe;W6~Z;!y=pDqqfJ7ud7 z6pR9^3g-=m1P9LU3Xi~B>8i604mY-MG&*Firv3T!6yBSJOCZ0QkMSHkdpKOAb4aEFo_nDeMYdG@bV;awmW9c;x%PL=@>4+(T>IAG#m~01%7?0zmjr z5mhlacKvS|<@vw<2pPGX>EGbYT&Wu})WzHDA9KVuhpAQ$iOe{g*E=$$tNDM&41^Fl z6B??2n{jvmk?;i2J%W3L0&Eu-P00fMJ$K*HNO{(n7@epxbnNc20qO#=AE|-8)wrFf zZzV$kYPY!|cln;8mDOgFuc)008Movsv_j@J8_=^;aO zqnOxNU|?+zG5C?#8|K@;N;W*+r&l-+Rjo&sb(jJe=!m-}j42x~NNI?8Asqkajg-N?j0# z2Dd*V8zMPeT=2e3p3`3al&4a`E!o_dk#wIym@UAZ$ldZhAjameHKpohy9`G0iRKyg z_v49H1G14 zz@yA=5=6G5z_1|G%wbXMd=5)JCXoD$+$=;YjpZ-#EYXYRg1)eeb_nw^HQRH|h;Jh# zH&Q7mxNXkiNR(%pX7a0Gj zTb+!yFYHP7&GEt@L(K`+#OH20+@8tFCQ2N;`BqD^nxnG#Zvl-70tJ?S{`h!fZL$<9 z@n3CvJ>wXPLhtg-pGfaz8N4>PG;WFj8hs3Ddi*pau37z`tRSdON2=?OM+cRy`mO z+m9dKQjjYr2K?Y-_GwgfZQzg`m$9f(o-?>QdxJotlH$vMPu)u4WXAVa>D zcyKz>ne|(p(I2I~b#CaO(6cw*>uL1*2$$-I9k4}usGWze?Vf*1E2@bhAPubTMx{C@ z>YGTpPy9Cg$Y5TZsZo`=I9r~kP~M~+I7gErO2gls)-xPUmQwgu$>NIIOUon*UhfDK zf|Pu!B~VHg0L`u9hsj-rNne-RRv0HRXSHx3i5FF1AjdCu`2b)6LYd7*LgYDqq#x2w z<{G02OEor66fEdZ!lZ;k+=y8@0x3C$p#{{+=3GLF`*kgCvuxkZSe~p)oyKSx8^bTy zSU(72XbdiblQ@FEIV4BDQpyUnuE=I*|Vq|5U0>QLpQ}6Z3 z3Q+44;7ruym1k;{GGtyqPq5Dc*G9hbfuV73o2IyeAOQ}<5l|PT3-N#)KnSLj$P){wy?CS}uMmOV=5 zwRX1?!R2gWWz@U7h_-OXA2(a|648qIs{l@Fs8-NlkMPMr7D2U9c_s1{3E@=Tz&H2c zR5Ma0#_fCuZt4*H*uK|fcK1VGeNbIz~8x4-xP-8 z2qRlUlIT=F?Dt5vQoLWp;ny)+lzizleCZ$ixjNwk`& zMy-eqi4A(tt@rqa5wY3rO!2Llh+LcYj3fSmd7;rGdhQH7khQ#sZeEes>KW z%tSg(dgqQxQoRIutj3YWTp~i?_96i~vnmj!v>_Fu^H}}bTI|di~Y3V`8YjpF(Htc%}5Q!1_676CfmXKKxk#nSAeB z13YtR9k_c_d(_?+zLIb8%Sn*q9HMZsl`;=4AJJK0k66 z1Y4)u$`J##?YX(+rXATvV93nI3VtUspH7sFoPf8bd9{SssQB2tDYIgiIDIbYz{bt9+m%d)I)?Mj_LtoL913zoWw?%wPsQAHzd)tit^ahLx- z`d*y2Q?u*R!$L_>KN1BLq|Q~zB6D1Xd>-EP*K_aA3#Rs_VC;d!Ss>n*+;L-y_n0Wx z{yYxXMPwR`9#C60O}!N%!Bf!)9$cf(f3)>eRtfRRpuyzjm;e(Zvg9kOiBD3z2ou=v-^WjmZ z5az*}kIkm?!L|`TM>>xo7~}`J+Wc$uU&89rlxs3dou=)9AYc&o7=Q#^NDn3aMJ_W; z6*MM*L-41I!xd+LIS?N=w1q>kFNigU?spY4+rAHNVa6}MESw|$15(9@iKr*_jcC9d z;Nc~Te)pe3jUl%@;^;FPrc~`or(l9Mxj~*_8*gDn0EQbwxit+%*>Fg2oM;WtHrbsL zfRV6y=zInuHY{r!o4k*ohhj%p#8v zXEI*(JUl>rKy@Uik{QIAM@QDhytdf|qa3`;BudsGeM^y6p}*eWRb+5cyAPQ0i)d%P zU@0G%T7#6iV8Q|8L^O&5+RyFa-p)H$^zWO2-D+6h!A@Q2XfFDnv=37XZ%g}1S{G&( zIzR>-8FMyTkM=54Vtxl0(5E84Y!4wi$W(RExF)~Dk2K@-d_Xj8B!-2UhWKhsr_*Ft zvwU*1pLl8j3rM_X)i&p@ws5PtHN?NcT+136xsd6V@e&IJ2k={7CVkr`s{Qlbd2k{C z83+Bb0|?v={&ijC@M1`Wn=wf(@jd|L>{|q9_!HwEGZvow^Tx)NCdQV~VA>+ORt{)E>KM8N`&i2%*I>4K{tiRFZCJ+J)Aw$#j~WdkM9P!&-sT%> zY<0z0YXSSJ&cK>c_!nR;+(G^{a=@kDitme7CgfuP?M;7^K-9!A*MiZQq?8(|^w@Y@ zKmaMFMj)lqP6wQp=BQbu3glwPvh&IkfQ# zGhz+JD(O;2y?s{V>89a2ePl-`Y_`LUNhOyy%+^E}c%cDn_0DT_Q6S zZ$8RxNLG>1(Y(QYGIJMADnR`z`jJ9xqF?y8%$8LlLmJnNJ!bsZ<3`Z$CH8ut~p*kSu%M$rpi)+ew=d<%;4TOm{Z_a@I{H#mtDEm9`PT?TT9`|=E@UL z(8$zFZ1cWj?+;b&3eP@W&4wvpnxu{Z`#>X!Xx)a1YGW03>j`Zw;fVFA@hEN7pr{u- zQQiiZp6wq#fY(kLP{9mI%^WahgYN7e?Nb@&8>Lg3^O)71MdzEP(=!?W!ZB)CmW@G1 zLb&Z zP=n5edDeH0IszJZscWc+T9sPbD~0C^W_q^?X+~q1@%Al1fX(bK>fB_IQ|8ZK*1i}B&5PPzB}@J3%n;}*%2MF!B3><)i~#B9 z$XaT$WADq1Or*ecL*~PGFuZ%;7oS(&*spNO19V>;5BZnXgJg-YG@l|)wXB#MnUj-H zDiyHlnGkD~`YwNU$6)}a>U-%cfts|zkC7A54!0p>A4X_UQ%9WSMbTnV15URcs$ z)%cG3@MLmH}XlFu08+sYGVBwrY8N?(^T8gy6+kxpG<2WNVap}aYf>7dB@nxH= z%PP@7Iiwp`sr})KS!}8LFWyFB)9oQM(rh%HFl%P1OlDy}HcaMtAqdRbL-Dze2gGy# zY(0=vv;MPaVW@q1+q&h*6H1wT=ZHCmA5kpExNeApCBUTUf|TqQu$^&At!$ccRF6Jx zGR9e@uRKZqV+K@<-@U^gOUtrSJYqrAX!BIiMogjituzJIe7YXwz;;1hkg+`V1QU%F z)@n&Rzol$S>eL3I*BLQqgDk3jR{LF!XK*&FT}A>gz%Kd%R+DS$4JK?LzosP72` z>dh~SX+Y5C0k~bykbY)i37p_1Lcj57_gcS2nzGj<<^ftqpx1rw9wFyCgPXZyG{A8y z%x(Zn)W`rsox8hWCt`>WVqsPoKKAMIfNY(`V!rU%nR|ID1tEo8An|9>8~}pZQ}Fr& zKoj}S1qgOI;0)AOS2OC}D5RZSdv4TtZqzUOW!Q_|9r;cUqZ>Yk{aUnJ3HaZI*+d&v zBueKD;X@#ef@IrK?z;9wF{^F{M%F=GztPSgs#`$9`sysEM=&@iPbLj%qAjlO7SL{! zAu(tctmuM4DIU`D@+>f*Q-e@V<~2*o8OWnYOWE5>AgcX-7T2~%qdPALJ(`)?gYRP1 zXJa|08ICphk>H*jy=`#vIJ$7a`t-xiu<0ucnyymph(Y=i%5m@}ZGB{LfYWk5f%2e7 z6A=QGrUqX&+#=*nKRPLtK&p(a&}<*Nc6S80ltArN7_L#8k6G?;5E&Nj za2Wo`vo6s>#3&UmJ4nq*p^a{wY>w?1hiXGSj7JAY?A8k>0B9IQJWRs70a;51)45}= za{qC5&ri!HG@JAoS+1GI!oX}!eP|tC7r1OBlEBE zt(`v?aF5eHvp05TtEpy3fXFwo)_0V?CYI=J@z6rQ|KHy-wLl@B-O>Q2+~Ak^so|mTCiD;efvd0eH7GFo53S_GBK- z{#BVwW~{{q_dCB=qg=wd@EaWp!Rd`fg1oc+PcT>DT2X98Sx|Ut(NlG>dRHU{NC{$( z@-d=Cn}pxyeDsjw^FRO&;W*II?s;kRO1DjqL<3>|I&*lqP@R=~-giuM@bZ*zE1BmZ zVR+B=k!&Xv=x3P6c!L7K-iTl^f)Ye}bVH5U+&YW6OR)Ax1@BzGMv3oz`5=n-KmpuQ z_Gzk_GboMd(T##Yq~RoGtrADR%wozkvZ2s5pvWV0P5Ws{eMR|>S$pZ>It2!++|%z} z&)(3{zYX4!8rx;4A{c<`_GDI$KHFHAy<;jIdYINiGE zMK~313sU!fCIA5DZO8D;vNIHEBxGle_x6ZhoQahIa=w<<^xF>89V7_cA%YkjV6hm9 z<-jtwQoOq5@stQ*fI3y1rU%Vy#JyFdM2i#n($MI2#NdzN< z$EEjO8l<`F7|4x^#?d-ESab&%h7Nv^oi?Z0V}hR>CnLmtXlooU_G)WinZqSKP)Fyi zvBb8c&AP_6L~N`g(V1KTh*R#3F3GAa+fxjUJgwvBpQjiY8ms5cjrxIbrmTw!t9NT#@{YfecRg3>?Slt`<70+=Wc#spb) zBWHs7AwQ-I5NseMev6M?fpEdP$PtAx^bjzYLUc5>?|8OBQzm>f!CFapGS3zy`&WPc zy4GCBhWr+i5Sk;H+jHiJ$i37pqxb%3yu{KI`tOrU^SREe)7$*=hS^E`2c}%VP#%@P0|=44Wsy45D6h` zf9&k;q3tvW=aZk}*_ z0x(Y!h7l6wp4(!8{fB%y-;yV2wnF*>BUu~TTW7VmBoBMV-4-B`y2pBlLzUZl_jt+-kb24d-;&!zpOPj3=-s%BWM93mzG)U(dK3 znjTWm8JmAA0zG+!Ocb@Jr$>`d58^$c5B>y)3l!sg+|;7zsb+Doq2+lU&%-}`Tc=1W`tNMbvj+9;c z04(UTRnY>TfWmZ;87ITPR$Q{8Fd1Zkf2BN0*v74$y`y1wymL%?qx zY;@Tbd>wf(ZkzX@&~x!!l(y0pG<2{!S-LFs*0o+8&gbmCRB3bxe5iIB$$dI3tSO?m ziUZGv_nD8pHSH5xX@sB0qEy1vj2a&|w)?l26Ha3^nYFqpF>T|7n9oNm<`@5riurck zIm5fuzs@13-2bAjPG_QpZR%|udHOU{Y4#v1?o|5w2*{9&aq@Js*K;Gi0U8nohP~lg zyB0{*w4~G9BfeJ*nm%fI&blLLxYXz$iZgd}(j*zFw}KruB*Bh!2gR(jc%zqK9-~=o z2P8dHzH5zcQVy3=%^>Kq`W9Ag{o(MZr~8aY*VWI~bAR+NL=F?hiE)nz3G`wZB^whn zG{n*8Fx%Wm{G$glN`_DYcnRC**neH$HF0rqdFEzZL2 zb~>Uogl)G>@Ap+YqG-9g7OEtR%_$!WF`HbB@}?O0B%c3!O2dp^@31)(T_EOQe;Dgh zegxIOz16LXeW*KWXrcmZ0XxzNb&_bEOrh^-;T-=t(T@M$&1jjj8y!uun3t2~^ymry zO2S+8wB>I~0bjm`one=fiVd_ucf5c@(p{Ev@XMe68qu$5F=TeSia^W0dKv618jKr?wOe9nHd(ScRnSsVHTE z3M@H4Ww1G-ZR@FKJFO~XN(plef_O6*wCTZvOX6-~%<+QT?zPT?07W}Wm0xExwCCvv zks64@1$nXRwIwKBVZO>L-evT^(-fXf=}oH&>Hp5~e^kVPrW5-7K$$Gtg8KhSGS!Y& z3mgV7zRysLVfD(k1)>h%SdnfWCw3DCcdE94sZ20P>`wL)TDgBizeOImr9?;B(_!`I zdx&~<(OVOrcBSa5P0TmLXH}00zRMqGV3;pd6!FN(2B~ zi?Bw;1qZ&K`HP3fzbQQZ3E&Y6dYu(D3I};wFp94kuE%#HKwa=v_#x6P?efX(;voVo zG}i`6g3pd8|NQ&Liezh*MhJ7U-i0{qA}>sMp{=ME&Q)g5V8Eaq9B6NC2A;s(@p9w` zwdeP?Sl^M}D!5$jWIp2{EBah%R^7ibsM1FKn2!>+U)U_o^4rVZ0O*H z+SS{o8V9y0)&#>k_gGJ=%k$N)gG2r3K@K$rJbNm4{+{^21wWt%>WXX8A@fP0w-jmA ze`LDajbJC)C9%1CNJMk4sHIcG_$k`|sw$R&jTxBnN9f^pztps1o+Zr`nUg#JJv?>- zIAzU32=*K}KTZSOQIshZ?Vhg^Ii{h0XRV&Mpp0pD$XMP8e>*ibc9<=fZ}LY-_;_Xr z8tD5fMD{h~yIU4l*VtusKmL~(EDlyHZiG^bpqW4)Kd8-nmGn~m{5s#{x^K|!N}+og z)$r;_Hk`tnm?xCrgagiam!#h2+C8Cj-?(kUCH*2v`Jh_6mFx($!YxRY1V;3s$_;c$)hVIsj{Kxi)03+!vl2pi`j@bUjyNop$ z$sI}?*R3zyAl>}YH7d^ISrg|?3`14(j~W2PKX)Wzo*Zot)eL%G9ZumcZO3phTfPQx z6H!~HcxEyF>KNfEEgkYA+h{61t+`N`;ez>k7P(J2@Ce;D(EUm@fxBBSZ~@=-m1qEw z?vm;X<1El(g3GXaMs^i=11&s|krvoAXvO(gfX*na(f9SG!`p=Ss5g!=1;}nBX%}|V zLL$N~c0|P0fhfT!ibV+Z=oAjoTzr=;IN^SRgmLvLO)(q0NL<`!2QzU3h6MNQh5H`z zul7I-DOREOB}0$Tq|lpo(4efFRvP1)0_@KMRCyW8?y#E}v{%Z%Y+LE=%`Tye1YCgv zM`HTd;pC`GeIC8}-L}M+C^B8-f7~X3_2BMRK-2Z@U7Hxzl9v+I?S!P;1*D%F2T82Z z1Abz7urqf8(y1_z0VpF&L$Is`KGra)`_VmIU*3^cZv)8rfDN0uC63O546nCKm1R!f zZMv@eB8P9+n-|V1_gqm7Q7j_)kHTOxfpr+YMUfvF7;1Lxe1eDJG-gVztni8;1CZ|l zV+NW{3&jU)l$D+Sg1O;#jgh?Or|sk~7{V44^9fN>iPHFrDv@#*RR&2Lid#$=kV?AF zvZHitn<(kk(*2B;zJFQ`kq_xsxbBvKV3;8EvZ&fDTruC*%qVS^E54cnsgQx{E6ni| ztvpcm`s8DlD>J+Wx@|6CZI?eWls*{PxEB4X0iaW40GYVld6AowxX#3lYes&mIX^vN zj&v_Cu0l=RjGjz-0#*7##;!y`8TevS^@=&>C6nha<4ml!nusWknJTrf}9&PO=C$3vrP7AY#QsJ%3+-eR}D)Dy58=i=nkZInoPYRMTIWGP#uW^DYK!O;2xizO2HjmtUjc)L+Ijh^Y3CEM-y4uP@yr_4jNXdW$nx#{n8)`jB@J zk}TCcoB#af>Nb;{zelu!C{5C(F%W5eobaP(gyM6J*2D19?73O>U_d{LKq-ylsusWP$P-;~OF6xEL=C}2 zJ3MU_w(14Yoj6(5fo*UXVd5UJ=R7dtmRh(;=JGZ|+a2_S2@s35G3+#Jgv|ixM&2?O%vs$fOuV3#D z1r+P#ajx*1wz)$Yi`0kGy4gqQG`mvJr$U&BXXR?=VbTeD`C)beoWD;&LBj-~_ktDX zR0;ZxU?phJj{?T#Hj9DF?$kzF@xC5HFLw6q{YpVB9SuD_^A_BOvX1flGwBqy6 z-`TWKrq?yTM_sGSR36vQ^nrS^=_7&O?j`&#D5m}HtjJAKfji$Tb{#J4zT!EP2JI~F zv!@#%17c}pz1-!@Wtkb8nBCyajFR{I5%$3seE)eqQr^L7fV5F~>IXm8`}@@KVY|`v z7cP&im82y+ksalEpo|FfA|?TaWm4ynVluOW&7c_=6h!NT3UHeIHv z@SuAy)&T_s(wKWKA{n@0n0VoCHa!PXE`P!Y%G^B$;{2JXr>E_%AJ1LqH&{=$Pfwd& zF^CPN-2r9$^Qq&X1BgNdDa6AxBz~g1_!3nIgx5YZJ7jq@R*trlq`xBmVfg?AB3aDA zCiJ2SA25+>K7xA&PSHSsq)|{6O<)-%mlPDaV;K!a^RdBc*zP-4td7svN!sqKTgoM@ zFq-9Q=c5em5^;IL-5$2P7^3@fG4d4+qPkdv{OAP`CE-Um8uSS-Re{kC;y7MOs*|sN zIpa7m_CqD)R!@)_{^TV7ae(^xxC|Iu`2ASkrOsqDbh!#Giepm3mMeQ_Oh@QUi%Wp8 z^6|K_1=~C*4Rs9WRU~hb^NKZRfwh+x5uXk0H~+l^yXHA3ig@ZJt+P-!+cc>1X(t zS^Nm30XT&`2yX_f>)g+-LSoC2%GDrbj2p9_tletG1;IQATAI4QR#aT{#0sKTQt}C_ zw@CI@20{z>f9u(=uF}FMAB zt+TIVDcv{E$`;oWYV->HoQxN1ifmO-lK6-uVOSW+rT^`cWEbUKSG zAk_+s*DPC=SO6~@l|oP}pYPD=RbdTQ^cofHb!odMM9QG&mm*CNkalOGzRf~3zL-1YSs4_-KR4WH}(6?Hp1cyD<~Z6g{-fPN674aIrKEtR5W z4=Xvj#8yV|4E`A`$*%A;o`sr}k3i0s>7B_Bqv|A=AZMvo&q?=HcJ1xo|45-S3n9RH zGhmED_S4NluoWH)#D>jK7qUF*IbJYF#FHcxpUsVNSKItheC8JFD2?iGpDHvab2RJe zAm=3Sh06#$se=`@_S?jd_myK4IFcB$rr$A`kH&p{+uv>Z~itcl|bbAJgBbt*E40EMG!-R$j=~6F(;QNn zJxHq2YXaGu87rHA@V_BGu3xlbVN}xKTDV?xE zBbaGYW`6$LA)6g+O|Twkap+vWeiv>M=@)XtGCXAd>)vGWN`x|oF(BI**rEE@D`CP{ zD2{{k_j@)SoPdPHkaHCY4W!-8gldlLH8LJ78IDae7<=$}DB}SWl~VAy4kS_JkZ8jr zDFuq3(|XeKa1V$5y!3e%XAbz0j8dUp20JTz;*)73!;M7>2t}nrq!b*?Iu}k|p?i?W z_SO#E1_PEkdPGVLhp|H%7SOz+<0s%?#2|qJXd8+$c3SL;w62qXpxD%N%9|9_m#Ou}>i1HzF*Dorzaf#UjuU8XhJQKo zX%|(_`LG2L0fUTj>U*#+BCih5AX!bo#Dbv(P(K?H5QV;6l~i-5xwgwyb?i?kCJT~a zOuh0`U$_S15f6f}WGc`F9P8zx&0(g>Qkb;k_M5077^pSCCU8r?6vKzy{HR!RAMo4O{S43%ZFeGy6{#Xh&wqp?S9&`L(n)Cof*NQZs4^9g_4O3RaOQqz5}Rv(gTH< zF;$QL6D()lmw@4CF;yHSW1<$9P7>buBbh~cOVQuJu_Ozg^5FJ@Hw6B5@obi}q>n0O zh%&79_9wNiq~BP9V7ZqJ-Fsg4>Sg)ZQo0CFf}EF5hD+bPM2tN&8VYb@?)ah~L#R|9}_V1Tzr0NK84uJbFg#xlC%+TN`p8B#wqlRNj2rn+K zt$6X;4_#VBKe*q{4hzd=PP4)T9g;~&AG{;s#P4E4k|XX=U{K1Cvk-WQ5;m-ffy0{E;C9$%cv}K;ZX({i(i?_(n;#9 zq47P@9JH&XN>eWhzz@yb#=HTJ&9a<${AlF~+ZVQ{=hGeoPZ#^=^Y;Vo@<0@cA4iI( zb#e^o*`-B~^JBBvU4`ll1@V+1Nzk{TrXoc<5IRTMvm{ZM->@y+zf1rh(-xJBC7RI4 z4gIIB3?@!V-PF@5;%pJpyQr2G-^R82a0We1jIbhpKwXg4`ly~T3t2#2BtTL8BjCu~ zDez2!Ob394b)6L=zJQb;=ziH4VPSttw2(j{v>YRZuYjH^MLzNpa$(_nV+nS&Pc@Y= zchn!q1Ao1t&`{DyY~l7M)-q5mO*}Md>!$YQa}}m!mzL%>?k`BxvzW-If&`n$>R;!Q zl`Qna>qjkOWi!^Mt+A*7OMv4qFp@+U*L4KYl zwr-(cd(l_e4qOQ$%cG~)WXK2^aB;-TX&BUh6XLnl5QoKS-9R`;d&N5{w-`$UV#Ze! z_c??wI<)50d6hQZ+*h=$`{=aqJW^P-k&&-MGPoN*<1z~z6=C>kn1-eO&w$sognBxQ z(%0iH_S8=-+IWkg{XUnK36&GF^A+A`$a@{GLt zx=U?8vxxRugSGZ$h;Z4~cG0pNfznmEYz>htb)vSqp;ug4+%}IwP`w&UL!A>oqBYCr zuELv3v{la&oAP@1xEJgRjKJr35ao1;a>8zr$>@u&@Y*LvL205_l{r3^89-AqW$@(b z;o7@1;46_puct?_NiXi;*1T>$oM%#AV8iVDo?9I}kv|{}m%?>NI9>%3wkiPFX zYa}b@>Ti-sD|{FogOX4D4Fo7;!Tg2gEIOIh4)J5FpA3n-;u$bVFxTV+MBi{YXFiTs zW5-3=@Ni&WAH|A1cP)5C5-6E~oir-KQx_(2AamLtDTT?+SSmSxUeuF;L9JAR&yZTu zRhJcm$1DFPtGQdRs!P(!%D1GWm!YaN$+5c7wINAOG@hr-Q!;GQG}+<`-zoved`IDB z3x}|l8l`rKXd3M=CQ!bb;T-{)$hNkdO&8^Oec=tV(msClu_)!D&tnfd+h;UMFrZr% zNK8PRL$||j9_p;Ggc+BW1a&%YQFdM&uLc>nG`Xa!VtI>h+IjVBbJDb|L%WVB2KTh& zv_fD!LSh?)Sn-J0Zl8)L)x&=-TqiPY$l1EW=2Et>nEK7Y%M0=0CJ2vqDGp-S$0Wm+ zS(>JFm6P#{U{p;L5|Ue5VZ9+Jw>f zzQoGkQul`-s}xHFhks*o8$*;f&ZKpa{4v-mRx{4~gh`SSj7h^J_f_xL$RI<{gNje4 zbHnW>?sz5d>jJU(PUR35<&R2pQBS3YjloOZUbHMgPArV-S8iqxWYzUfBl+nu9Y3Ae z4_JPue$%RyvjIz<-#u#&T~lQ`->F&*AZ_fqzclsnJT^LA5t(L7Yb|O z#9ha{FhmNdp$w_RN`Sj{l##~aQkUHjao>AbQn_OO5X-ENrsrLeF?rhgc-(WlCEQMF zhJEa}$gc3a^DBFwpn9RUccpgckPtraiWz)qiAZt<1etfpUqJ$z4qOIMZVY+I-(L)c zOaYt(ofaE7PhJ%*`fLkY1ai5F1lSiqA2aY=z?4IKNKOKsBu9PBK6dWo4+(uxhTI0<%tK0iS&;FUU3k}c>Z-JyIgm^fR&8pQP()dj3%t`sX)+dIuJ zGjJF_l;HYCB?f=<_QROY^{DtjY3Lp-fxv;N)z~|Fh3Fz383m($mzVS${gAxnSE(c z(3cN2uqC|pSaB(TIb$;7wZrmW)dkk!V9TB@*73nuf^xY(0FL+P<{zsY>=eWQ2p9X6_dB4xgTT=9&<9gH%K&qYGW-&kPqon2E^Sx!K zO(~$}Qhfl`h-J4-Vg~qS~?fy%*HdNvf6pz&7n$Y9>?k>%Hu^PV~xm=}T za4fkKHGsf9twu$^WkF{`;`~zvg7^o&Sh+{?i57 zI}fXYMCw`}!qprz&oUtob;U@u-J-t?K%GOxl6VxKtVMhE!;_HsZV*MHnP`pfkgFBO ziF4b@iN%vU`=EpY^TC6}dHkaU2)CVt5w`-4l)#0uHP^T!Rr>;rx)s#FTS&A*&3{Hz z30J;>PR9w=SDs5|0`4796eZiX`TOd5)(lTZ{7NT7D3Z0Czac?}w-Z$=#omhLl5au(MoRZQYL&xsjEvB3(RLkPi#d@E?CJcL_OaXGL-l88_>gBwL;z)i$MuQ?6d+AjzwX@=aU zC4?wR1Kp^^-timLF6jNSnf1vTRCiv(m`+@K^3Z@up0EPjsZxQ87SD%<9tmKyh=fgV z48O0SEh7E^Cpbi0;!v*x(#;Zt+IGavM>VUA+2Y_*IY?T$8m(02E5Cmj$K9pAm0hDA zalBV+0T~_Y=CK-#_}=PIM9RTI?7_B$>k|p5-H>zJD^DL3Z5*f4_?|@sWlB#(i%6R{sUhZ9X7?} z?l8z*1=~REn^Z0F5MSyYtd7M!Q>!RM=P`?D!{&O+?Q^;y<{LXyFi_-rQX{d8_mn)^ z!kWdG$5`pz6(CHgVi&2H6A*VftM+U;9CGiaD0h@+4L)P#${F~Mz<+gzk8hL#e*rT> z8bAxS7V5l|u4V2jyhV@?*LPZ0j&<7Dpkt18$~Y67UKP>ttNx_4JzyY_^y+-(9lq|j ztggzLE_||58YYaxcJ+mI@PM^ClC?^yXlAmkRu=z<>Ye?|OGyoH7-p=&VsJ_hD zNssvK;VypG?BQCLuA+5dcvL5AhadKL;A{A@I6F!sQf95atL=)4yjj-+NUKVp4Sd9g zdW;ix!{%G_a!~vhft*bqzhVCbQc;>@>hjI@-dp^7CS1OZhZPP1qNE>I1K}PrkYhA4 z>%h4DVt!n(B$#mvPyVk;T*|{>$>}=hqVq&Sd%p|)Sq#{1!(E){q_w~)7ISD7yEKO^ z^r(xabBEF7J(4iDfMepB>MSH`wMF8lzLW8}{00Xt&hn(Hw(hUCdNk(+Th_{`Xfjle z)T@=I?Q)hSgt~{xL(%prWw}ur=cy_BK@llI%S+ALh=*J9H8)Fe(L-*7v>@Uf?bj%_ zGg!=G2!x}ND@xu*I*Xbu-Rrc*l3Kr+cIPTD&XbBnD>V!9Hy!0$uHoNwhRm0_ZRwrq zrg<+VuQhw1N1wj!A@wPLgSJanR-?5iv=tWm>-e|q8B02ScJ6@KP)|s?x2z1XkT}q$ zmOuv@R)WsbupQeNdVU80I$VOKSpVd#2ZLEBS1SFX-mFkhC;-G4wv-8OOU(0`EJx98 zZCKudlGCPzK?<=bzP%R)uJzQ2l)LR?YoA=>?`y~KJ}(IhWf!M%N8RAA-p$fXFnCH* z5?ov2WvMKEUvi0? z*a6c?e+IO3rGS8cTB=->dWRqTItd}FIeW{?hpB*)W40)*w9vHh66}1{Xlq)u z;?-a-GU`?}p)|IV{QbC)sx=`5ITVa`CySOzzl2Fl~q37})cfPT+|=3+BBS zUHkq{dL7=f@9uFF|)9<{Xc~$kCxkSa(-^p=^YP&&-s!xb@6(d_i#UB zc-FdciIq2|t;@^voj)NyIGB)w*jOy-wT})!veg^#HUL0C-gMRiQws&c`-Mw)`izjr zlVME3@i7o7bH6CBP^GuHZy#f#X<_Vqr2YFTD%m(sK4K}&>yJ)Jd!~`}3xdv{*CX7K zyfgONN*-pqyT_w#b7oZdnBf~#b^^o?O>M*MtC%?5=!+Mbdt;YJLV^==*`i9%4mLS> zG{lMLSX~qnFC!JeWpjhy6s*+K0_{a8@nFgz%Nv@ ziDxD$$;E{aiIAxW^F+hD^^I)hr>J$njVh|=Oem2{@LnWBj1M=;RnaK&DARWAyPKH4 zuj7$)yZc#Hi9uC-rNF5kqC3k8C&*mUsbm}r5cTk@?GeUJ{>7RwUBU?>Z1E!w+2`2O zDeBVu7E%)wzrp6eTz|o>Z5gOYaXEUWRXwgB#9_vT1$Zx<2H;4=(l-WXi;(U+jjsVPDDMEm3bk4L*Vre} z>>M=pvG&(f7h2S7OvsVzJVZ0B$4CY#j_30G9JU%rGIpx{=8h`)-iIoHi7m+i8{^8! z(@XCOg>n2r8-)|;GADK~mV5!bLq#nWex#o>{b-#cH>AFa-?|G)CQL7}54-oENI9ug zk{X{VR9gU@#(765I`5VWR_^8x=$S`YRThh6+$u|#y|II{nFF4)izOmfsCbqVPi|W3_x%F%mA@}=h*yLtUx2W4 zqr{^B@~pcp6uRfiRPK8Wh4h#9vlzfJwn`1oIGu69+UpoS#NE#H!Cf-NGbG)GpF&nZ zh34mNtUao#W{J|HnYB^xwVCn#EEm9fkGd|e!@;4PaXuh7jwUDn;W-`^lF~W|-(eV4 z=(7teZ=kCD*n-Eue%S z7j#<8LGG^-0)h^Hpn-L`^(uKq0N*)6hb8m=c%2qP9(v7QOJG4k(^9U9QQWSK-u&Eq zvh#)xH$G92L^2&DW8?kiG9VL0bIK;*9Lqv#v(P2Sb4GQq#G{F-)y&V%8#12RQwTMb6^9^x`akDuN)352V&oWIuJ5K63b@*;#DCzC% zUDeM#HGqenB^y*D?q#S*c8|{qOgH*Ex~-e|88i zldQEDeOBSX8t+hSZ0-->%^b{KdW7(}L>;olfeYPb!NP*=?nAiJiw~X^A;u8-}+&5j(^0RJOaC0}LHO#EDa+ekzjNTlwl~M^ZY)2rRSf zgoqq3xRiipz>W(f4eNQeg2=(Yk`E~pZ}FkU{x_GPFq18rJK27W=-s);oGi3nR+(2tH(tGmmms zuOHdZ*l|dthOoejRk#U^v!w#v-8-j@Q4&!z*+<4L#?T9d$vCsfIjGn|?1a zwy*EaPM&INzr_<{SSa(C`Lidin8wj<0Ca{*+D{3!I4tKS)Lj=)sRzqZUHB;4n6`AV zOAyaoOs@|N6u&j6%Yd%^>{5br;GFi*8c?OKyJbbP>s_dhF8(%Ek1PIDMZ^G~5;(-b z$)zKc*}tQsZP$W{%g76!BDYeCw>j%|!55k2W=i#@@JmM8QIdsM%_x|k>U+M)7a9f*&bB zG)YNrWyujPSfhIT?hlQ{Hvz4a41AuNx4;Vs;{NXTb1vviGyOTIDOmdf2s-TtzZ&WQ zBl*ca$}{r}UG@4JC-Bh1U;7AEK`Twofq25G001u`|ED7mf`ojdJ8B`N9wv=0MJ!dw zz91*0iYaS?8fBZS8KeoQr+*mCdaY{g$71Cjo$V`o(K$J4#I^dfbp8$y53R7P*Ta)r ziPCxLVA`{=8d1g=v~N5Id#@^#w_0g+9&>}FQ;a~y1>A#ZtwbG~|3G|1e`;fSJ>Zd) zDL&4K+1;_Mp#dKGen_bEf&C9*{^lCuU;U{SFH3W=ski79jM*2>NnTlxW9=}5czZcr ztBTlnccKEF8Ie;7FoNqAjt0Oh=sO`XtYsi^NY-^pyIxD`_Xz11;K8So^-(;W&{;F-EP~c3SiZe2!EQjoZH)MW zN<~QthQT)8u5a?shVpC>xRWLAzU4X+w9K?Gp#~1yg$%5=sffRpC92)Kc$m!X z1N)7#0Q9s;zS)L5&wA%6Ybk6K#Do@pu{niny2Y>tQLdM<^Bkt>yr%OPm!`Lt+hxE$ zf@>G{j+^5PoDi$uQl))%)*u9d>Epkb9UP;PXI3-5t^?pva6=v$Vk(!Ai-pw{UM)EZ zmBrVXzaBN%Jod)-^tY2)<+q4doxUr6C1f5C?guPmCPJ3xpZ4XbhTWV9CM2+lTeh!H zVyALAWuXOx-aQzXOkaAy<9l9$CWvZuEB1Rbg?T1zuZ=LocH)@c7B^%*_xYxH!`vjS zF;hx>rNWT|j-JV+zt-DX6f+K#=ve$|x6(t!w6kz$L8z)6`e4m|#8jaj!sYf!X~g*` zsnf@*#!*GHDA@xBtmw*A&LKWu4=q_3o(#6hm*inJ=w!V?BZ;wArhd_9jx&ae%UXt<~dIBxadsz9Yd~8xB#d=n77|Lhg<$j|j39 z!Pg|==jnufx-8fYBVP@(yBXM8tV9G$y7MG0A;v&*@|wJqB&BoZlcp0Amy^JpjiQyL z=aZX-^p}QHXnUF7dST3X)fQByinNT+v zlZ2@{+pD$MJ3TXPR3B}Sm&6{;rlkvA=U%z;wA&?ik`RX_y~n&gwKjAcl%*!__v_=? z67SzMI0T+)FP~G|!+w2V`s4l~ZTA*-Z66Zg2Mb@N2LI6U# z(IGy>^3I4V<>Yr96KN`)f=?t6u+z39;Wq=9xYM=(88EBrQJouH z|2`_S{yfNntzhR{y0Yb!Qq6e(`7tKjlY9$}t(EVlmU_l1%~~V&m4kS6$t`1_#024$ zc)|*Ha3y+$OhDY4)`(c@9vq`Eh_WI*d|Zr#DwiIggS&9R?g>t_LhffMsm&rmgvC_FCD8d6U&lwkqGM+UE&|^8FCOg+AN#dA&I|bt1PwK%C;+)-IkQ1BQu*xjnpzsmkU8d54v968-ybb9rfr6WLGty8%*zo z4a8N~WU>Cc5-u>T!Or@C&Y617aZeT9b?$0DX{MV`8(`ivW z3$!JR?pd0s+`VYy6U2wp46sY^Rp)OXtvA^8jCqB~1I}^=QSU?-3QPS?8K~a3X?JAXox{kty7ha+k1FCO3|a@pG3|4-n-h}BRExxu6UPIJ`116f2Zc5=}%X0><1BWGUu-M*8ovFUrIw+gd^C6wSvN1 zdleuzbs}3rh2CZqRdHtmG8_y2u%Gi()Xapvj#DUXVqU(mQnX7W*mndIyZ=DJ&_H@3Yhi$M_W3G-1r{O z^_|#QxJ&p_2Mp_bt0j5(=JHwD^8GPi)l={4V(VM+F}Sj3a^wvPVZCeX^i04v-H-fK zy`H`mP<^&#k_F~U#5UsmAYsfzBFd&K`X^)!XK$T7Kfe$#zfn1yChzan3Sg=oP6*vj zUj2jkPTF8Vkyd~f}c$CbJxPH20>Zp z;Jiiak=S}!`jhXI{LN&!RwaH_B8jzzV!%1`DNWHZB@wcXm#H*r?GoozwZz(L&D`d< z7I?NL=p0bR#N#2ZdvY`d$|_E{t`EjD)wdm^3KEcpODWAfkJjwabW`b${RAf9%O+&j z+h1;*jwfNJI3c+o)N>*9Z;&41Fk(>#Aa z5dLF&g?3?3@~qgH_1fRK`{X&ut-wJKC<*~Hj0f6b%9B$A+LMVsfjrnLxFNuwJXzFmA*q^jVE~2kf)UwDZS~qm+zaGx>7R-b_Dgh4_H8CCA3q%)OC#f2NWyDRF=kzd{7jj?& znvqQzwE!nw7%A80N`XbR{RwO6==+jd3NecIc;#7ljBs?J&bZ9C*z%4< zgfou2?@ycsk>FYRD6g;hb-b;T)SN=B=0O4cFujW*t)*LPBn@3mGYlCsfJSQXRC*#{ z?<^{E(7=l=@1%XZq6n@kn8#=SlV<_&CHgeC*>PCmn9E*ZU~+!Q;vmIrBmO$G1P;ou zm%q!MWBhu3Q>9rj7c5hjp6-yjJgC#CLy z?!1J}Lzd2-_OrYk>%J&))`BsigvqW`zc$a|zRPs`;8?qSAZtQran{pP#c<^4Ue7n~)-{ho2XcWeH z*GLDH(a~RY?4THEZK+q*JJVfK6qy=fR&Q@HeXmP(U77Y2L3G6>PbrnNgN;~GY&)kg zsIX6@!VfA_V^6!3^-OPr8giEM>>-u|z}4v3v)y*#6K4nOdvahdzdAQmt9w{M3)XJg zEBY5cxnzsQlG-*6Zf4I@uUUZgNG3Rol~vdUHbu95U0&dtuja&x7C5y@s{6F`j?xN5 ztna>5dW9X5BiQmqbnmrpHsU-&;ispk-c_t+TIGC$G;>R+dZXKEWIsCxNGvbCgixSc zo656kH~=@ClB*`iQKeCj0XgUi1B5g(XN?0?LIVeXDx8~>BqpNN76D2SS@KmdhDmoF z>eI&Jo|L0)6Yl!n7Q7wzPE{SX>z=zn+3VEaiZ-*%BbCW4S(>I9&%DM|l68fvBF#Dt9=5q6&^l7_4X)<%r`#md+zQ69pxvin7VGxO|LlMHhfB9XCwrVV7Ux1}LfR;Re{s$! zVVk5KOB8r0=fFM9T$6>KT4*3@0`7=0zJ(iQ1T&TIycV7WGH6m$MUtwq*d@i$Fnf2N zbAnOMx%rEWlm(G_X@S>`Haf>f4UDVBO9$$DET;&1Oz~?$zRgN6yGT?RQ#VVYTOC|rl?c(V0U6h9#hG?d0LJA4p~Htt_QMki*w||Njp`ovwi!vM(jRNs9Pd} zEk{fl#bqsBe7dFP9xM^yPmM&eC)POa<8yvbAZ3nHS^pI^+x#|gxh`mYdn~3Fl>U$# z>h!7AytjE!5a6My_@5{?*-{5E-N`2SoS7bw)FZ~9qs=xC=~ zSj;pJppy2H7|~{ge-ay5VyyT9$*+gOeez93ZY~!+g>!kBo*gT7_*=jF{cDipm}cB% zLP#@c{fw_ZQ4!FZ4?n@;{ROqZNdAZ+#p_{;s^OMaAD^^mmo64Werp2zblON|`h`zv z3-R4s)1b6}im3Xp=z&yk3hIPxwr=$P-i!YR1iBP=!on$r?es0?XKBfO=-Ku?r<^$_kyvh-z>PlLsHo}!CDrLh;( zSszxUvjpo`Z?DsMWp~xl+g?G@%IER7R`=qBRvR8@SjY@pUuc{@s3X13=(pt^?rlvXb*4~qR zVEw0oNH64r-DG0#VLun+-9q0hJOgs{-ZGhV9okEaFZNW`bhE0GedM9<8D-)797Ng! z(0DUq=NEx$n%nZ++|QU9alFl>?i5Y0SS^u&!Le$UeHhioPE&u`iMdqm0x)cd3R;lB zS#6RtDn9PP75gAlDlf%)p;WzSKH@wC5^}HS^y1$&r$~6(%k@-GNdIy_cN~!8}OKyX)YTc+dwaxudaDG z1@*8P_?)o>DqKj+ag3)3gKLOOW#`OWLo6~GH-C&KW zdpC`Bfm;#4<2ivVQ)tW?A1K7S@ept#&N+hW3KeoD;I==8f#R~tKZb=9k zftUTVR!;N)0I2`ZbnAZz7PNGJK`Rs=vA@5d6@7aCOfU#Mbqw=(aR7hLE-3ESYb%2j zZ+(vWO7l-_(sdECd4VPk=;5>AkikN;Q$$Kf;1RmAbcL;G*D@7NVUbdkX!jd1Kzt)qrNj{+wWAM0(Bqi zV}Oj4uz)^Hhtwn!bOgc*6j}siHz#AkVA)z%KBC0N{nizajfRS+4nTp?=>(YsqRy-iLh3O@8k{;mdUA9 zR|1Y1R7#2Fzl?)hi?FGPP1lhPx+94!Ak2z2{h~S}NA@bsutk|77)eWDpw@LVnJf8g ztzOK8!=^^KP$#BcHCjgYx`DdzoMIejY3k|1i1=lou@%c7ajcdzlg_GPn0=cT@9z}$ zSnk+GSL7+GtTL+w``k(*s-ui;Xglalth5UUM!^5D7_9x)6AsU6FCy0jpX0F zQuIl3PuPiIIO(r$)h&4&j{hE8hdtW?OSC!LQV#mo@hnq3lqL0eCz6hY*X2$hWpub> zXvu-b!Lh91^tW})ban-u6WC;dNTEG{Kd_!HRX!0;RKU6<6S1A(9uQqqMl!^Q3~R&5 zZ?h%eEb;npAWgrhbxJNP^AhEvc?CB@T5V9(L;!9Umr_p4gsPzH@VDKppCm!B$?l;N z?O>xcNXnx4Xmc`t(Q3Cc0Acg+u?UP4$VMd{hY?M8lr>(A#hH7u%)p)#Nu3fJoOjt6 zUSL{7k)#C|8kh!^^?f-3t5b-8qCI_OE+s$Pm0&M+FYeG}+=^l$wB~n`Y1gN>E5L;9lj5a+ZZN#r z%I=M7``+%4?lr0Rc|h-wHA4jjhvnTHPF$oE45@#425#fx^@-^%kIloY_9<|QmPHqo zM)A9`t7&NUoZPVeSl^=k--GMqGhJC85CDL2HUNO%`St(CD3zQIoK5~;yh}^rzwj>j z_@Dmsf{V@(%J=#(4ODp);7|jhC{r)=P#*fljeWr+ObITRu&yPX~F5rPzl4`9tr3gWJQW}*~A5M8?cznonv`MOFJqQfAK|bsZEVKh^K ziq)jzeKe;@;Y72RMyB)3$QY@R>^XsSV!6D$yo8g(8bc}Q6nX=G$jQwDW6G2e2`N(3 z;K;=J&f}^lv>sJ!A2Uzi)Do*b_)`6n9Df;%a^jz_l{mX?_R$pj5@_3kXoSFO8^dsq z)0}u^MuJ!ZDCTmKWC>oK@IiVCY~VT+n%aR=V!u%Tajb9w1-&1mp89X6=x#S>N!t_x z`ns9(B4{4Aohnnx(j2B_|0YkSBDKiP$rsEWip$U*j7wXNlKz!s>WBVhqFLRY}Ya-38aVYIs9j1{&mP zIh_5&SpuXt8)tpyCNQ19H?$|#8c5Hn>%jAZ9X(Cu4&b0^$_0&%aV-^0zR@yf2)ds{ z3-G{UDY}R|?6u!L@nF=8b=Yey3a#1F_fe?FA#<<<8d!)3F+A3oBapl;t>CuOwmb4) zS~`kGG&li!4G@0@n+*(_`S3Q&u7c$X*Z*C)9V((tAga+D6%JsUnxn{BCoALdm~AfP z=&W&A)*6KDCZ2Y+UkV428*h^XS!a-z-7&ubn{DT3^L?G2M=OR4VF<9co z_?(v2iJ5h0(TmrB(yZzo-D%jR-QK0IXgpvuz(P-O)UdpA2{8&>W@ELmBZ=-%;1rz; zQhd1!!vKNA&O1TK2E06HMuqBV6QX8&EwH`ZhQN9E-jyX{1=VSAa4 z;=nEKspHHe=o4Hyr^k54R58k9XN8GvaXC#;xCG}rB{Er`y_zGNtIEgYnir*Phd~oj zz~e#g8`9Zp7;=tdr^A)h2f}>CGN_O+|%NBo|Mdaj`CEh)5yx_f$4-euf z6kLb$@O)6U43(bzW~$5OTGr8&>dFrK1Q>+rrMXxo z&I{^NmoM5PSeDK^;{2GNtN5a^nTEW4Vz!q?eGOJTV`XD8k?NsZ@!3+X7CA#Hl#BYj z!{G6@KjL;sMwO}Us6l;9bRX%o2(xfFtGo(#73E~{0Jif#va~n9F(E7PoF+JA008~v z|IKdO85kQFTATd;qe41*cAM--ezpO=;H==xt{0p(c-I6!wLPs}n?ha`iPZB#3E&!q zMy@6kQi>8iHoYG+@rg2Asp1-u)@C^)tPLWt6B&DPOo#UF?D0dlulD>syRY($7>fsS z4QTE?@x2elFBEX*>tCdBFON+_@gjZ*vO`5U1Y-n$fF+OM5)Ke~{w6$j{d)*mCjgfH z5aZgq&ZS&d*@3m_=XRetNfzbu8VmF4T-3#mj)Mnw75SV;-ZwWx;KlQ#{>#CO?NF`| z-97GpI5tEOb2xjqy;K&5n^<<(;wk$5a@>}bMBAM2HK8%zvjVB|?A;$+Dw0ne10=A$ z(3=+Qs2J<6z~2p!I}S+VJ56y$mO!V0?Lm-aL}-KrNLIjodPkOa zum7HAtEal84Shl-%Y`f^ct4!Ru%;KyeGNMi$26hg>``RN18%GJvH5j>W;CXI{`r;W zg!J$h_`|{Vc2g84_kzpA{Z9z+9}+M$KScE$`3{Hb&2cicGo4#(7hG`uJLkAQ{CU1p zloo5@VfZ1+p0d2JNKnp!bcQ3;bNk7UK*>6XEk`r`5*Ss(GyFX1YX!LsUc0GfO87O32xFl(Po?xE`qheshk@?Sr6kLW93+Cqda7(Ll8n`x=K?LULw-twJc&#; zSs%SQeh2P+xVtcMuUyC}Spk?~@S{6BR7EkMhwQujGtTFY6yf?2uZ2O}-%eT(We$-! z;l}z8RzybJ-oC)e@n&UygZn!k;o>Ap2~`L4H$ur-XJn?iC~eQ>1dtAqP=| zx_T#)^&GNy-9f>KCS&Y^NVG-!fs$}twlKKy*GXZR0h*c@KT>+1p@*&P6G53St}z4N zC>vrJ1Xm1{lCU65V4t`ULb*4tU`N~sx&209uqbrE)A^+BwhuN^>8tsn{V%t?Sg6v? ztJiWn?{#;b2Yw61401+>xM+r(8sJH7Wz{Fq<6^`1P3gBMbG*+HmV|xOdQ2ph6bm1w zC+rPTE1{1+K&y>lLK@)5PvK2e^x2s#0n}B%tlz1mN45jCp?LZ|vF_2U7SmA`M@%Em zj%-;N4e>EfLkVPF#)mqE-~)xe)jI-hC*Ad*qixR3xvOyXSjA(^!uK@QGgA4QYnY=hpR9Ty8~j zqLFybh&syHfh9vcL;CW#F;7IJ_sZArS+8gJ#A>_CUhJ)+U}D9!5IGMnc1nguhqwksh!E z61T@XONa2kn}S zX0P+BeE`XPLCx;LUADyo8(9#)XjNBAHK>*PuI_7wfkh3-4Xjg-3ulx)Y#dy^6BAZQx2$@XG@@o-qtPKlm)Wl zhNKU;HM+9yxxI;Q)IP(uu$Ms!Dx#v3THUuw#!dm&hD_9L*B4mtx>pakTqkg7wFCiX zFGMlT%TU?Ba@Tpe^OQK^hYtwmXb1kc<=s34R@y6`WLo1>gsAn#ZdqRtRzrC4S| za5dM22PSKaCDgWR3(Q~}WyY6vv9pVwiPQO2Xqfmxu-v^d&{%9C{bGd-{9Wi{K=Qts z5E_rC8P_ydT1toL@XFlLw=3ngUWjqCRH)Q}VnbZjQ1T#fSA^V;{smwsm~12O_`u>5 z6Q%#D>yhB1EjrVA;|xvS^}T>K$Nj32yu>v=(x6eH;4RzJaWXYxeUaq_F2nZnqHl*G zSK@l|Km&UY@y%h0K*%oGaNcogfw6*{zd=j=6P}ZlIx{T{@*Kaz*~6!HUd{a_keipV zOM}R5=H=GR7=>H&^?Tqk1f_mS@2qM*sIF`MWh*L5`N$s{JZdVR@!YYkz;u90N%lOg z(O0%_48xHvqW{(q5!Q90Z~U5egAM910kpt8^9-CB$<=LX@GP1sbLAO{Gcb!|y(#2< zuZ-#kC!PkU=Vul~v^Rs2aB(5y9s>L#1EeI2-a<4^nL&xlOr_xht8;y&45xs{1{tNk zhXz@dlj1Gbm$!*0ef23e^brZG1m4cKXQeO7HEh}v>oZ*k%)&&*=etoRcXn@$cOZS_ z-84T&7|V_sYK%ftPFaGu2vIsf5JymO!~+2R)*WtprogtwK9fdYv*?@ZPu&HnpBg2a=wft3?3!C)DzJwK_KkpOdF!Qe!f%-ITanjdBE_fU9A7^P&d2=A zC71a6nO}N@U}W^z?=6FY_CkTcTzIsKVdc!!J|FZ260E`4y4uRIXJ^HhZ1JXnqz9PU z%ho)+t>@G%vtZ2z$jvyXlQ0UGM7#$1(9Kf7Gb9HNFZBQ=TDUVtcBr}%&W+%FaN$?T za71S5!v@dB_8IQ~m7MEwqXIFcfDR@l!ig!yTbXhs@@spAA}L(8zK?qp9Ciw#nUDQ5 z9I5#Z1OC(Ils#$~0gYuoP;j_BuyWR!jk_77Fa-C(O>kOLeD zJpDkI`*A4aE;w24K2l6Q1>nNtICAw1f6vSP=@GIWJ7@pT3R+#P?%7znHSDQ-QV=iS zBlO3i2~=p^^F&qF$mbVH&Vcs&Y-ER9hE&1f{CGA}muMFVu_<$<7_zsE%YgnKHIHKB zAIF}Rbp-7O2oUO&FC#g0p6; z*Zd40TITH=Jx(012g=LUv}LBkYVN1FA=!4P@?NQ#I4bZnXf&%W65$<^qA_|zq%Clp zr_^=!u@VUI)Tc!5g0-CC;fj^7f6=uj)a+xu2ePR?@`tvMTvprr^WbE@%-*Xb4Oku# z^~dQ}B}NhkDn8}g6CRjRx0BJdWL>0)9tOlm_8MJVeR;m_(6QRsDj7SIP@V3MmEMM* z<`XYc>6C86-KF6FaG(WePTlM#*`o)w6m&*Mvykrtr36i`Jp(uK>B#yy`w5E|N=VKx zJ!X}(sB@^SH_JX6Nwbz9mpI#BXiTR*tdPHYH<#0nhW_Bx5cH{SAW*xVGRuhTsbBaS zalola_AN2bxG_kko|BZK%TaUPz`iWfXqa`_Lh-d$cP}qUm@fr!^R51lmuR}RgC=cA zIcUNTS6eDWQjlgSnXL z$1^;Fv6RlPc%^4VH4d~GyW3TyjITPZxO#*yr1}e@N{&3?(^g(9HXP}V`lz`0Txy4E z^W3#*CNUH7MMM+;Wp?QH$|bHZJ9hTnOsd*V7xjEKx;C)zY>hg6=vH2Wm-hEov+LzQ z?H;H&RK(Da}owZU_n($@{la ztp$U|E^(%@y0UT?m<7+;TyffmiR5B|8c+v!4p){N-Kg_`$$6&xDu_wxD$w>{4YE)C zcm%QgO8frs%hSy62Y)2zYcqsm+4T*BZd-3)i03-75)-U|3*}qhg3lnW&g#IcpT^%7 zp{m$-fpn;$^BUVFX+f@}TSz+Z_k^bBFCbhjg zX>qQw=j)KZEwCA%wI)!P$|`>#=)4z1HAk7aZ9oxUMtM<(A5$@Zo4BXR#PLN{+jNbK zxY(t^4MZQ(6Z(s97ECYWi+iGbq7kVC-BJy;R}v;Vv3KXoo@lgqPLe3xKrH=I)PwU& zfTwlign5olDbQ%Nree~@c#fxPRs1XMXwjluvEY=DBa6^r_?LZQoXO1f?{{e` zRvD`hDaFg6Z5x-_=@1)AJS0z8_8cO1gY)8t>$%RFK9^xrRzRMl z@FFcw)kO7diBhFl>!*FoZbj7M8e`YlIqq74|Apam_X+nghzd6N!+A_zjP|ihaMsnn zbt$~7PJJBUPF3RoGw`j+m^l+=WEsj-$z}QC#=CT*;@@5RZ7g2GBb2gwTQxwQ`N=aR z&I{|_Z4*M!HmZs#3&o0&GH|xd7(#GNt4;;y?{6vH;0xEK_D|i#Rr(4Xm`i@+BE_6R zR!&#Yd1Wu>>P>@OF9h5!Q_+WJgLD-4oa*B)-Q#vVz#1%zF)i-tnB&(_Pt;o5k^7}P zS6`ip&vQhsi6vc$#4f$nN|nZVn3X*zO}*6Y{33reD^xT##`2!34SQh9qR%>O@^lv z81NJr17y);B2K_Jl1F>&U35VZKBUbdy@_~YYROe;DQ(H4$#Y3>_h&?qhI&_u&29cI zvHl^p$rXfIU}{)bVj0mp*wdRJVwMc&Har!-=8?x@R*X#5E6EzB&g$7T&2Shk0Ch0{ z@tlf246uJc1AV;L$yC0lP4Co+$uB(ifs0XNc}Z>Wz0&{a7ysqz(p5EJ<35l6dKde0 z_Mz1w@e_KZQ1$&q0XtYABG88=&=Eq>ybP6`q40ESdNW?474HvNbQ!F*mto=7f=6Q* z-SYJwyTXi1hr4MGYp4!2;E1asPJpzcFne?DL&gwqr&n1`>kAxArZUs{5VVEFdf^{5 z&$1o-s7}Fy7b)-u;w(r1u1w z!5ZDg8ztY-@4^f$|7UGA@pQHPe``^|2fxWPcVq9@x1?_GyZsOi=To1x7gM~1ORocp zky9?fxoBXhF795`$B%Fa%*#X{q=k!R-{C3lPCI0Rg94~cs~HrVvX?P_8n#Ft5uF=Z zm_myqT?Fr7j4aV)p%y2*pU59+-E&NnrK#9vs#9tGR(DAwqSz+h#DpxN9rcd_!o{U%)`3i|UR$%@&`K)PIf4-$bVL|B%u203c zi^V{l97M!k-{)!@%THi$5`VSDKs^o8$TOu^PAsu^us5^djF4n@vJ%>Sb^0H5_+wgK zsK1%X)>tLB$LN;PTXMPByC=9K}9a?k)$vnCrV<=szza z*}WZq9UMHk*Sk%3=Hp98{0U^dZ*KfL-R@ViH+aEYjqt8yoqJN42uecnW66Q+)u)M9W8ZU||WdYQX^o0Fc500D%5a=ibgt#>wozROee7|J|ymtN*cI@-GB6 zWsr&FEpGIunOKFLL9GUSW|v2zX($j5DBi~$`u>P5G@pt!=88!JnGzyQa2xBo=_QI& zc(fr^YAVM-DMgWIi`bgUpya+503; zrX*YQL#X;nH7|0v9Go^5_?(Fvhuhcd&nwqwzR2Bl8;a4t6U)#$=O(JVvJVOZ@Mzo23xYcgPhmGpcC`#<&jF=B zO#eE5X1JVV@4D%)GoW(Smi$RO4>d^D5&Ei;bo%1V(SoKF%#$Jv6jPX%KdBI#J0bU} ztnhplvsE(Gg@Z>C1@hi$QGfGp7X+`y2mE;u%!n|Gq`|colU3fB*iS;vf|Rk+$3%aa z4S?24&tPXZC>F_@mhR>RNtN5x0x3VxEp)Up)R7$Lhi#qE^k4`Vm|nf^GfGVHg1Tbz znlS3r!TOY`KBkxAfF)UrYmO-*1f{MSOKESZ?rKrimk zg9)sBmiYyYXc?ML0g?2qrj^?@ZIg(gRxP6iMWjs6sH{q1%u<(6z4VUQdmX!0RumyR zT)6#j>BqdCNvM#6%Tq82x8r*TsjPD4tO1!qo{L%HTAZyf3ZEdU22nO?k~LW=O|~Z) zC-~sbV&%=ZW^f%Oa}8(tC*BsDYCCBl!BprA`x_^<>Nj(CW_zV73_6sf@So*asqCTh z>`&_M9jbJaFKQnnXY4|!_(z2rt*u=KJ`mutPN&^PD5Y=N$x|@Nq_8&pLT7LVYV7Zi z+WwS|1(ZUwxccQKa?hHsU+Xi~HV1SlV=R-0t&CCSW5UdGaP&LXQDEej%tc$x_Bff6 zqv5K)JZrD70j9Uea&-TpqNua)0_JeSZ74G-eQtkRe_)MwRLxnlp7LUkfhuL@j1;!Z4zFP|{;J{2Q-0?`sp5{W z?c;rHwkomGb{!oo%@r+x^H5gVpW|r0a4A#B3>&Txx}2d$j=&tDpC+I+1w#=S%)Us) zj0W}Gamx`W7{9LA$Gq_7!#cbKCpc4#u3^Gm(Z(oM{UD<+)s{pgG16v79s6yU5|A6R zl&4j#HtDlYc{`JKhS3%;feoDMmyxSX>7DmBkjwL8}!X~6l*=>6_WOsh`sNJ1cAmg zT9W

    4bZhjN=nCD%)G^{*j7yWRbPa(mP!Wa~9a}?-LbkG<-SO-dl7$ZJ^%cZnS^8 z=l&RP8zWA7$axYY-cp|Nof@}ReS|@}&wC!;OTDhU&D3yW{m@1_s7xuTo6SBwdZGM2@h(x*;vtZysMe7sYclr29ESM}T5 zqxnk%!J!(;i5zb;`pRBKUfC)J&R&nuOe&`XhBF| z0}d3FSFI_n2Qh^-?lYUQ=?DWZpg#C9?Y}kjOuUj`2F$HkF_3-~97)fD>v8yZjKia^ z_TJ7|9(iXwQc^hfB4qj`v#H&qgKpM_-I^%(-G^pP27H&V--o# zbzsMaZ5Gzr5-&_GJ~%;r-L(^sY$Tp+MV^dpwBQ>;t-*jb%f;wDQy}w$(ZIK33M9-J zBA+Z{fQfgy^3c=G@!VNo#_)7{{>J&(@%jGyIK#(27EwH<>$PLpV2@U(J#xCUOeQDc zcMCCYfxj&u8vBz*hO`Wx2mUQX7&v&))tjn3GUPXUlD7x;mn_$!d<$Xm3DW^Fk6mzQ zL|8aj9E?Is4qKvEk`Df_00LPP(x?lMEO0`t<)iCdq1}R}yr5vD0QFvQF&D)&yNroU zg{?!iU3a7tsS@gr>L=tm45T6TP(+b0r>=cAhm~zSHCJl%@ZWnf<_w~Nph7w~Su7;-3+;j=$)ejEV)Um0EO~jS3j6d6tUAKV1zo!=9j6Im1EY+jXH<#Y7pP$XWi-F zqJZln`>w}k#-d7yg>C1Gei(J>)2G3BVaA!W+q=OLnY-pJ2AVA(v?|0a{M5wp@XSfc zCDVJ_BE}dxPJ9#WT?P0-ynP~x0yBH?j{M-@Y5W`c@-07)Wo&3@wEal>$GwZLol;(z z@(1OqG3X`i1dwOcMB0jldvHNjk=;*xnF}us-4J)LjU>R=?9GF6;*2187hW6v>!oy! ze*73IOOS*9Ls@D+xv ziG}Hj$O*)P1?7K47QD7flG;|MhnIF1Fb|eaBeX0kA!fK zH5OfrB55OJgjL0`f`2F-Jf?epw_$&kS^#_3n-|~;Q)m=+D}72o`r=kxs+RFu0Cj8a zqqrJ!I+X`4bcWoP0ucpFtrA!`^q6t7O$BwV&l`cqCNM_JYO_|5$aCgTH`1+KI$FGJJU7>)-Nym0Cy@-;rf>7zp)~Y!bIX z#f?@+{g(Isg>Fm<-~t4VId)NeB=ty}5zy^I5p&H)TIuJrU0!BZt0&4FrtqEvB}nDL z0Y)==8kqbz`ZrUSRjJV^rLUV$O8hc0psuwD{bNIfdJdg4BR zVUfCs0|hT&^QDsV=qetONO$XXtUO&NrkVdS-Agk~Kzoz@qQa(^)2RE*dbEIFqf#rP z2n)Z#k9pyf7DlO@bpvOY+N_3bHq_?cj}>Bl{2MWE%O1a9xf$;%gM>Kc58M6I?N6?| zWWf*gb>SNE#0)1!dG>qlJl-I zqBYomh0`d-cGhVc{oi zr{ZdLam3)QkP~u}8U`57Q6~<7(OH7QAkSc}lWJ>mgotTSOyZ53y;F57%tK(~!*R^1 zb#gdD*D!h~XU5IInR*OOg<;_vZlW`4bFoGCRL_`$igzi=%Jc|yQg-!du0WNV=JTKkQa8*XLf$LXd5UymkBI1%w%*Lk*A#5n>^hGSD>tMQ!7I==1klyo|X6j zaBW?2fGbs1p^d^fgT`3JYunlneAGl>{{7TIxz2%DVIej0=NG`(>=y0`gr2v=>oaPPyGtV3i52!>t!ZVWPGl^ z>-_J{GOUBxWQI9U!0R9-DXTixV^5fnHc8{n~I{)VNe2FC_Bgwh+GUwyg=lYFZ8^49V z_hKiKD4#{W7?k7VV9k{`@o*KoWG^}TTR~%$!&+;TW5j;@rnRzMT;h9WVfwY2DXJOA zg-&kKXm6Zczh)KTsaM{yWiBx;ox()8v;-9YQ*Ru*%X7YgXU| zCM-9?bO>~+d9ZJ5u6a+3m*>D+v)7by?5f3Et;9@MV_=%D9Xiz|OHb2chbM9|I)zC5 zu;^ua0<4kV2x}K(#7K(%Yh-?AF~!5A!cH+@&R=Oc_Lh=m*(b{l*Flqd7ZWR#S-ID9 zg-N7(FW#$6XNTX4@-vl~XSR>e&3pb<&fB={{B?SRG{NWeKG~!#)bm3JK+jK@E|2f$ z&le8Z>KUV{KyLe489VEhvWOc(@L=j7&64}D9~|F37dL`!~G* zCrs5GEu8{-aC8(7(`Prn={+iSjG`1$q$<=c_MbF^2PKR9M5QGWUTOEk55r(qKnMRN1t;xkh zNPwEjOf)3oAurms&rW?9QGYf{X62*?G#MuXT1_%`o zCj6P`ohA=ciGsz#rO3%Y;p`N&_HP5y0lulxs1SM}ybwTmTaGqifYxCyEp!r9e5u0iF({k)@Btp@4h){T1u2A)8xyn-;ol^i61tq}r&~NE~H4!)t9Mg;?G?Pc&|Sgy%JclZDaFY5Jcq)A@^5IfEp3AvWXM*X%)lT zTI9oRZ*?%P%*?9rwrj19#Ag21FgteTmnV0q8DmN%)jsl?#Drfa0|nbP$!Qih4`qzh z^7_vjp=4TR5EpS&UOSk%1T;GsQYh;{0cmbCec@ArNV&h0xXYeP;T+zIukd6YVV)Vq z(FG(r{#j}u@pG8Cd^1xw&0e^f)B%(_%$utNHR{85o7dY!Ue$`c3OAW;@u!y27c04{ z4(V8PZEL^2r}I*=!RkPIp)&AGW4%~sfZ8x*p*WnaqzMDFS!O%Qb+s(5c`l3fYqh1{ zW)qHUI{&%-V#WP+o#WCv#>WpUFK5c~uY1p~5E>1>R%0X!@oT#;{mS1btO-pY_i79z zn^H`a$=uF0{XM4W=&@yJTf~;~$TjB1%i&*3UiZ`X;Ao2A<`c(Ps)Z=w$WnsCA1RXX zw*#!0yxnF7eR?febXbVJC6u*WK)rvMRDTskMMMVNOosuFBt$@CFX(?1}z9r_`cWy(;D&vS*S}lV)dk-_33uiSJ{gxT;8g4|(RZFPlnzWY+wi_)Z z;M&&TrR<-$3rSSX$>!ZezL8NE+zQ(v^i^JUmQwv-Hw4(rP>+H>qsls%a#z+5A7$Z8~)fe^IOiU z2<;6UrZt-JmSvl^Oqq9*&eZf!Zd4$T-df@vpMLwsA!>zfw}@-z>oTaVM=VyQPYHDI zDegkd0oG@0b~V{zqn(fV?j&g!@A>UmpX$9W*U~lIKOv*tj}@HHmEBhFx(7U4V>X^$ zYnrhQHEFRzZHdPYRG#Sl2NF(hcK29cl6w%&L&91|xSj*-WkSddxc!GjQr*wW%J)L- zx0%0ZfSgk1iR16)se&Tp%22D$4$LgWGR~QTVC;m3BL`INE9W7s7GM?DI>rIQ%XzU?Yj56J}ims%`F8R zvZ9T-nHerSi#k=9%kQ!YkTJ48g>JpbK$A%cbf@shROXkIHgC5M>QJ7wE zxuZ%-k=$>^sH&F3dV(Mzy~Xy^+i_-6NyIw3o(m~2h_%&Jz!mPu0W0Y`%taYUA9I<^ zUH6i6EelTYeSR}n&HHiEDZv3}oGnY4JHUjL@Iu9g7pPxP@sdQ#mnd9amK0Comw2Sf zY+5F3Pm@JU+p_JY=w&;O@vS{;wHbcWy-u54{Z7e6$Z93bts&gKRE^umOftr#4rg*M zbaJrm!YY;~Ek6)QV_wNQ+$h-+!66#KVJy|KFbuXl(ny)Js_aXDfT&oYT+Idm) zr1fV8Bgj^2^BK`!p410s(9i4D2Wi(OUhdZ*E5ZhJ>oteqgqZ931A+D7M>hZ{tYT~& zTjerv!Z%L9DPj$r$YT;=3W2LB2qWN5_XlP-mL%w8qEl`;4$wjjJl7L!4X6HUN7RDy zb)x>d6ygbR*tQU`#k-b*V58E#-Plq{cCgDU0%wiL9-%U1>s4GfsGPiTy7so=#{CI{ z(IRvU^K7dLeQ6X0?j=)!v#dsw{UG1!n(yoH2 zlNCOQo&+UGRH5dK{9;RUa9OEV)d^_^zWVsx$q3E_4o7hr5zBdyo?+q8BXa0YfPY7c zrN5FbaSa10kgM}Jwo*n(xp|wU4phK~GKc&|b0VSZmDR%D>oY0Mpi?R=*sAY1KgMdO z^At#~2QQsKMu8xbWpCXzuoE9Wfc((ACQd_Cqc&`IO$53HVM6HcW+eha1e*ZUj3Kvh ze4^#}V*| zhnkmLb`~3p^Ce&n%rK9*6FFl1^N%+>o{Y1V3$7pskG@OSn!2qfEbDopP@LHF0@^TR z$IQv4Ni`9q&u+soE03l!;}|H-mkoJcY=Us73s&U!Uo<}~$OsOFQ$5yeLC`25pm^p1&9?@6>DB@yc zWnh6ZBa96z?rm;*NLJ0u@dGmjaKvaYb9z|N2(NFP5t}%d#QE*A`9I7DZ%kP;OHbK| zJz_6298AgBhlT-bN%ZFX=aTe4Dm{k#f zLi)8u556uF-EeSmJ>A#%xUY(CwxD*LY+qo9XNZskH(i5c-t?cr-DlD^xtuo2=tf8J zalv5uLF3Q>J=ISQaxAx{;MF`zl8+hWa}cnbSZ;;5Vb^9?p;(NP9hfbh$>p!n@0`Ws zf6I(x;3B@H8-p;g8jvn%GYn>lwW!^@Kq$Lni&&%AF+5!-l;%vo&gccL0E9EwSFWX) z!0v2#ZVDOS99I(mi=d=!-GOX)X-liCt8*!) zm-gpM`M^x509MlBFcm(9=?XfcJjKq0{u_SOIVPejWCv*|HP;B`R+EmV&j)Bt9SJekG^+9&Y{`@QF(U1Bysaysym!1#9c zcvN}f(U{<@N_f2A_g}vT@v8xb7Tfo-e!*awNdW)50aVt-#?Zu3#Mr{w?!Q&^I95)Z z?e|`$4|wp?#J<{3_8X-=Yx7H|V>Y!hIUJviZi}wA_=t!INdQp(smt2mUTF9gVK|BT z!t;qWQ|zfC`VDKZfKYd1N&&k(58$p{Vv&@2&a;L2a>BDEkx?sV9!s%(yblyzf`M;# zSc)+|ggk=EKot(+JFLhZ3N~UBpbx+p-8RjdHjCvZy-?v&49-r#1l995xGjhGA6qzX zaoV0S*mzR!t^4oO07@%oxFLX|$pofMaoD)P!4;xyJ$*k<5F28CEVFZUqkepRc7H%? z3i55OP=DGnxCy6v7Vm=Jd^fI&_Ewij5Dk#^Jw&vHr;wQa@lZj8<-v4}_y`+Ac9`CT zb(}>;<^mx*y*aWC~9WtGY4zFp8i zBx&@%*$pih$dyF$^`KV{wnxZ4n|+OY_hVjh9n1lID*A1*>J^c8A|vcE(HC*i3mgH! z@OaC_W3kDZ8F&us_i+d>{0j_5k3TWAO-6$2bw)<$a)hIZh2{kxO_Bvmv{2h@;Dvmn z37~f}(t$VW2Ym|#RiOWaS6U+##OHD%<}L=BoRDsS-~=6}uLwIO`GZQl$Ilm!6;M`G zs3WO)2BfNMwdX{uJCX+ym!9SA3jT~RHk&R6c#n|9ze^>&4*wJlEudX1!5bu_6rsMb zmfDy2Hl%QRmCQBICJcUp(?$0AGSLzgl67D;1|HmYc+3=CbqE*p! z&2lbx#!`5(0wrjK4I>{ZLIaT5B#r)=D<0*vx3HizQOe}(@IIOI-aJ_b3|R0vLKU7R zr*68s5(D$K$Tg)-Gt(17mj0Ai+!wymf#9t-G+SywhY)y<0AKNd zVEvO+LOBqbd6ooc8RNFhZEAp>PSy2K^QnpmB$ggqmNK2@!w|sQ;ecz@XKB z=8JU!t}A!3IsBv_u>gQeKVibrAB9}ksgVn%gD#}079JsYfE}1%wNU-r{SK_SH^k~f zMTfq2A7MqP>WI?qPy(v2JY1wI;CYV*Fi(s;`!t|E-sBe%04=~dyKqOYheJMD7M+e* zUUUGs#QwkmYO=H8P|ZW>_?xK1J8IReqSn~D8)1!vJ1iZ!iaVJu9?Tfcyap$ba&~<- zd;qIBq7C2W^KM(WUOPPJjWrj8W>dbxUQ5N5C87(uMDp?qcO>vFY@@hGQ{gO9(!@P2Cf@ zE(f(kQ;tJmU|PV`;|p4YmDVeDfDd}h4SRV82P!3)R!%B2isA3^;M+*_tkI|OQQ1}L z>wJqF$5e9|55yhrqTu;39AbD-8fo%)qO-$CaKlB|l>`@y;=v!yJ%qSmRMNsgDn|b{vciNqTlb`ouT4~i z{^8I<#kvZ}J`!m!sgBPxnY>7Y*sSjnCx#^OrkPN045+4T12VglB8k=a0q)Tqv?eit zi)LSxsR&6iRXu8h!c2w2WW5s{K$#uKmHJZ@UAe>ZFUQ10t$9W988Skdo7;@1RJ@mQ zwbxKNJE5ewo)Bz$!lQDaQn;4z4LqK)v5C2!ijg;91SEUXSf_>Qv%>BDQO>Mn&2+f) zulxul5CF&RaMh-Yuo_`wyj&JP2b~;kbZjX&g5HHsc1?7hyJ=5Uk_(D`;S{SUPDc<7 zul5{)$y%Gxgr-_6>fnswkWCZxD0aUkP^7V!*ML5uPQcXmp)?vJ7g*i*-6&tr_oH5~ z9%$xtrwECI@bCkNny{)!y>e#MuEtPsiuAK9!zN;OcM)OM$bECA^)$O}*ZZ7y{g0)) zmBk`H@H=?U14sKgMj{DKHb{iL4K^#WBwE7>aA*_9W1?-#19hW+=&U8-0o*9rPy3s@ z_rj#uDG2Oep+`Lx*CE@0VG_2}s70^FNp}P4*@ZV~V7Mz0TL^-5grANqL-Ijb_(L=P5DmI_t zOq(>?plCW6l3EoIpLqx~76Q5ZC&mh9oHM-^OB2t)0{EIAWMM0<J;H+e0d)}&053`NQ83JFascwMs}!4^M)F)_2AC5Kz$dXN?mPS>KwkB6b+h8 z`DG0AnNr(~kUhd?8j?nUG|ZQm2?Ap#n!NgghX;%5I0aLgswqHy)adgR92=jrlu8_* zP^6}+43t3?MHiG$vy-iM5SbG+kxN8VCymL#NEQg&>X$jo+S2lgx#2dC>@zbeIAXKe zP8JJqtEoVIv}$Jx)0rs_U#otoF!RS}(-3`D`7p}Vk8u@5ICY|iOWWo9R8Cm?R$uDE zxbcx?(h-J4{e9zMhL^tyF3ZA{*gvj)TJV82)YbZ3&-WNZN4ABKfBol1XD;My_-?CB zNyb%YE306(J>x!~a8tNowel2HM&Lkgd8oz1Lx?9;I_t#WFCHdCs>ifY%hR#Wd;GQ9 z)PzfGHoN4`H#ui(9<}S5{v1<()bmE=YL9ldoQW83Xg+-=_tuE){(hyx05kL&6|!(L zx8VM%Hx&rVa!>MN>9)R@G;!-4UkNp<6my0+CgZ(cc~LAi=X z*?jGjF5yYW#YOIIDP8YtV#IN+H zIyCtH@~eW0RXf)+`s3Sb>uPQ{@~nAU=b}^1ei=-8$464t1GT?wKXI1u5wtl!N{Qms zG|N3b+|dfD4d-U6+=Si)B5Sy0Squ7P`f#%25^-}=7COgjM4k${_(b)O+ov&O{pG3sK(&jd$75GRYzO@A}nIoJw73CX`Fdg3)@j*V`L5sVjJd&aRB;Xb{>Y zjhj(wO7>Pmu27I_{Oxo%cH-+OFaeE+u<*1B^SJJOazE-a9~wrv5QFT<7HI7Vt-P0PYG|D=qsGq58?Mse_!>&rZvG*+b%kJ98UvzR6&u90A!&(wt| z`AQCN&ZC%Ticz0*?ag5n`pH?5UB5xX2)wC7y@3Wy|9ABG_M{aO0F{#rl(YByk~?F~3G5bY51LEL*ejjQk2 z5eE9&UDPnIPtWL8N$$G#(r>%n2h9)1nbX)4V_I_lezTL7!Fe!PmxLDBLI4>0qvN^F z^C0{h9A+dCmMchy{pKF7>%v(#AE!Sx7Xo*H**w>9OSC9lxWwasee2`~ZO@JJw*5Z~ zUl4!I%wMr`R80r~0J!4+!~2mpFf%b0bF?s4wJ>q}e>?-7-*6Nw{I_oYPXJSW%{6A% zroX{&vO+7f25X~Pyvbm&9g@v%|xK%&@~!i2ZDwmN&P>r~gH zxKygcu<1N;&z?0!nUT>e2#xrk!rYyjB<-kQ$)bdV&xE;m0I-2rk+LniL|X6|LSj}h zb_}rx8JR$4?3`l!nK?7A+(XvLdkYE#g{mJaxZuIOF>4MoT=t_qQ NlsI(p$-LPZ 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 z
    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
    rHYT3y;L;*0s&#Z8#Iq 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

    %vp=)cAsDOKu{(Z@u$f{iD{E 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

    r5%FQxmHwB-w?z4zJf!Q%PU7n39tW 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 z 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

    @~@Go43BofN# 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 z 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

    FDf*;<9tN}YhfnVQg|#Sj(d6#&WaOO@H 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
    ^A`a*QzL|OD)S>R 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 j+&cYnF&>VwNp#)V + + + YAHOO.util.AnimMgr + + + + + +

    + +

    Class YAHOO.util.AnimMgr

    + + + + + +
    Package:YAHOO.util
    Class:AnimMgr
    Extends:Object
    Defined In:animation.js
    +
    + Handles animation queueing and threading. +Used by Anim and subclasses.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     delay : IntAnimMgr
    Interval delay in milliseconds, defaults to fastest possible.
     fps : IntAnimMgr
    Base frame rate (frames per second). +Arbitrarily high for better x-browser calibration (slower browsers drop more fra...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     registerElement(object tween) : voidAnimMgr
    Adds an animation instance to the animation queue. +All animation instances must be registered in order to animate.
     run() : voidAnimMgr
    Called per Interval to handle each animation frame.
     start() : voidAnimMgr
    Starts the animation thread. +Only one thread can run at a time.
     stop([object tween]) : voidAnimMgr
    Stops the animation thread or a specific animation instance.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    delay

    + public Int delay +
    + Interval delay in milliseconds, defaults to fastest possible.
    +
    This property is defined by AnimMgr.
    +
    + +
    +

    fps

    + public Int fps +
    + Base frame rate (frames per second). +Arbitrarily high for better x-browser calibration (slower browsers drop more frames).
    +
    This property is defined by AnimMgr.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    registerElement

    + public function registerElement(object tween) +
    + Adds an animation instance to the animation queue. +All animation instances must be registered in order to animate. +
    + Parameters: +
    • tween : object
      The Anim instance to be be registered
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AnimMgr.
    +
    + +
    +

    run

    + public function run() +
    + Called per Interval to handle each animation frame. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AnimMgr.
    +
    + +
    +

    start

    + public function start() +
    + Starts the animation thread. +Only one thread can run at a time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AnimMgr.
    +
    + +
    +

    stop

    + public function stop([object tween]) +
    + Stops the animation thread or a specific animation instance. +
    + Parameters: +
    • tween : object
      A specific Anim instance to stop (optional) If no instance given, Manager stops thread and all animations.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AnimMgr.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Attribute.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Attribute.html new file mode 100644 index 000000000..855c327a0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Attribute.html @@ -0,0 +1,343 @@ + + + + YAHOO.util.Attribute + + + + + +
    + +

    Class YAHOO.util.Attribute

    + + + + + +
    Package:YAHOO.util
    Class:Attribute
    Extends:Object
    Defined In:tabview.js
    +
    + Provides Attribute configurations.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     method : FunctionAttribute
    The method to use when setting the attribute's value. +The method recieves the new value as the only argument.
     name : StringAttribute
    The name of the attribute.
     owner : YAHOO.util.AttributeProviderAttribute
    The owner of the attribute.
     readOnly : BooleanAttribute
    Whether or not the attribute is read only.
     validator : FunctionAttribute
    The validator to use when setting the attribute's value.
     value : StringAttribute
    The value of the attribute.
     writeOnce : BooleanAttribute
    Whether or not the attribute can only be written once.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Attribute(hash {Object}, YAHOO.util.AttributeProvider The)Attribute
     configure(Object map, Boolean init) : voidAttribute
    Allows for configuring the Attribute's properties.
     getValue() : anyAttribute
    Retrieves the current value of the attribute.
     refresh() : BooleanAttribute
    Resets the value to the current value. +Useful when values may have gotten out of sync with actual properties.
     resetConfig() : voidAttribute
    Resets the attribute config to the initial config state.
     resetValue() : BooleanAttribute
    Resets the value to the initial config value.
     setValue(Any value, Boolean silent) : BooleanAttribute
    Sets the value of the attribute and fires beforeChange and change events.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    method

    + public Function method +
    + The method to use when setting the attribute's value. +The method recieves the new value as the only argument.
    +
    This property is defined by Attribute.
    +
    + +
    +

    name

    + public String name +
    + The name of the attribute.
    +
    This property is defined by Attribute.
    +
    + +
    +

    owner

    + public YAHOO.util.AttributeProvider owner +
    + The owner of the attribute.
    +
    This property is defined by Attribute.
    +
    + +
    +

    readOnly

    + public Boolean readOnly +
    + Whether or not the attribute is read only.
    +
    This property is defined by Attribute.
    +
    + +
    +

    validator

    + public Function validator +
    + The validator to use when setting the attribute's value.
    +
    This property is defined by Attribute.
    +
    + +
    +

    value

    + public String value +
    + The value of the attribute.
    +
    This property is defined by Attribute.
    +
    + +
    +

    writeOnce

    + public Boolean writeOnce +
    + Whether or not the attribute can only be written once.
    +
    This property is defined by Attribute.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Attribute

    + public function Attribute(hash {Object}, YAHOO.util.AttributeProvider The) +
    +
    + Parameters: +
    • {Object} : hash
      The intial Attribute.
    • The : YAHOO.util.AttributeProvider
      owner of the Attribute instance.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    configure

    + public function configure(Object map, Boolean init) +
    + Allows for configuring the Attribute's properties. +
    + Parameters: +
    • map : Object
      A key-value map of Attribute properties.
    • init : Boolean
      Whether or not this should become the initial config.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    + +
    +

    getValue

    + public function getValue() +
    + Retrieves the current value of the attribute. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • any
      The current value of the attribute.
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Resets the value to the current value. +Useful when values may have gotten out of sync with actual properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the value was set.
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    + +
    +

    resetConfig

    + public function resetConfig() +
    + Resets the attribute config to the initial config state. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    + +
    +

    resetValue

    + public function resetValue() +
    + Resets the value to the initial config value. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the value was set.
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    + +
    +

    setValue

    + public function setValue(Any value, Boolean silent) +
    + Sets the value of the attribute and fires beforeChange and change events. +
    + Parameters: +
    • value : Any
      The value to apply to the attribute.
    • silent : Boolean
      If true the change events will not be fired.
    + Returns: +
      +
    • Boolean
      Whether or not the value was set.
    • +
    +
    +
    +
    This method is defined by Attribute.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.AttributeProvider.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.AttributeProvider.html new file mode 100644 index 000000000..0a34287cf --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.AttributeProvider.html @@ -0,0 +1,297 @@ + + + + YAHOO.util.AttributeProvider + + + + + +
    + +

    Class YAHOO.util.AttributeProvider

    + + + + + +
    Package:YAHOO.util
    Class:AttributeProvider
    Extends:Object
    Defined In:tabview.js
    +
    + Provides and manages YAHOO.util.Attribute instances +@uses YAHOO.util.EventProvider
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     configureAttribute(String key, Object map, Boolean init) : voidAttributeProvider
    Sets or updates an Attribute instance's properties.
     fireBeforeChangeEvent(String key, Obj e) : voidAttributeProvider
    Fires the attribute's beforeChange event.
     fireChangeEvent(String key, Obj e) : voidAttributeProvider
    Fires the attribute's change event.
     get(String key) : voidAttributeProvider
    Returns the current value of the attribute.
     getAttributeKeys() : ArrayAttributeProvider
    Returns an array of attribute names.
     refresh(String |, Boolean silent) : voidAttributeProvider
    Sets the attribute's value to its current value.
     register(String key, Object map) : voidAttributeProvider
    Adds an Attribute to the AttributeProvider instance.
     resetValue(String key, Boolean silent) : BooleanAttributeProvider
    Resets the specified attribute's value to its initial value.
     set(String key, Any value, Boolean silent) : BooleanAttributeProvider
    Sets the value of a config.
     setAttributes(Object map, Boolean silent) : voidAttributeProvider
    Sets multiple attribute values.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    configureAttribute

    + public function configureAttribute(String key, Object map, Boolean init) +
    + Sets or updates an Attribute instance's properties. +
    + Parameters: +
    • key : String
      The attribute's name.
    • map : Object
      A key-value map of attribute properties
    • init : Boolean
      Whether or not this should become the intial config.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    fireBeforeChangeEvent

    + public function fireBeforeChangeEvent(String key, Obj e) +
    + Fires the attribute's beforeChange event. +
    + Parameters: +
    • key : String
      The attribute's name.
    • e : Obj
      The event object to pass to handlers.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    fireChangeEvent

    + public function fireChangeEvent(String key, Obj e) +
    + Fires the attribute's change event. +
    + Parameters: +
    • key : String
      The attribute's name.
    • e : Obj
      The event object to pass to the handlers.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    get

    + public function get(String key) +
    + Returns the current value of the attribute. +
    + Parameters: +
    • key : String
      The attribute whose value will be returned.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    getAttributeKeys

    + public function getAttributeKeys() +
    + Returns an array of attribute names. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
      An array of attribute names.
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    refresh

    + public function refresh(String |, Boolean silent) +
    + Sets the attribute's value to its current value. +
    + Parameters: +
    • | : String
      Array} key The attribute(s) to refresh
    • silent : Boolean
      Whether or not to suppress change events
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    register

    + public function register(String key, Object map) +
    + Adds an Attribute to the AttributeProvider instance. +
    + Parameters: +
    • key : String
      The attribute's name
    • map : Object
      A key-value map containing the attribute's properties.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    resetValue

    + public function resetValue(String key, Boolean silent) +
    + Resets the specified attribute's value to its initial value. +
    + Parameters: +
    • key : String
      The name of the attribute
    • silent : Boolean
      Whether or not to suppress change events
    + Returns: +
      +
    • Boolean
      Whether or not the value was set
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    set

    + public function set(String key, Any value, Boolean silent) +
    + Sets the value of a config. +
    + Parameters: +
    • key : String
      The name of the attribute
    • value : Any
      The value to apply to the attribute
    • silent : Boolean
      Whether or not to suppress change events
    + Returns: +
      +
    • Boolean
      Whether or not the value was set.
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    + +
    +

    setAttributes

    + public function setAttributes(Object map, Boolean silent) +
    + Sets multiple attribute values. +
    + Parameters: +
    • map : Object
      A key-value map of attributes
    • silent : Boolean
      Whether or not to suppress change events
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AttributeProvider.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Bezier.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Bezier.html new file mode 100644 index 000000000..2c6b5ed24 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Bezier.html @@ -0,0 +1,76 @@ + + + + YAHOO.util.Bezier + + + + + +
    + +

    Class YAHOO.util.Bezier

    + + + + + +
    Package:YAHOO.util
    Class:Bezier
    Extends:Object
    Defined In:animation.js
    +
    + Used to calculate Bezier splines for any number of control points.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     getPosition(Array points, Number t) : ArrayBezier
    Get the current position of the animated element based on t. +Each point is an array of "x" and "y" values (0 = x, 1 =...
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    getPosition

    + public function getPosition(Array points, Number t) +
    + Get the current position of the animated element based on t. +Each point is an array of "x" and "y" values (0 = x, 1 = y) +At least 2 points are required (start and end). +First point is start. Last point is end. +Additional control points are optional. +
    + Parameters: +
    • points : Array
      An array containing Bezier points
    • t : Number
      A number between 0 and 1 which is the basis for determining current position
    + Returns: +
      +
    • Array
      An array containing int x and y member data
    • +
    +
    +
    +
    This method is defined by Bezier.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.ColorAnim.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.ColorAnim.html new file mode 100644 index 000000000..ebabbe25d --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.ColorAnim.html @@ -0,0 +1,95 @@ + + + + YAHOO.util.ColorAnim + + + + + +
    + +

    Class YAHOO.util.ColorAnim

    + + + + + +
    Package:YAHOO.util
    Class:ColorAnim
    Extends:YAHOO.util.Anim
    Defined In:animation.js
    +
    + Anim subclass for color transitions. +

    Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, +[255,255,255], or rgb(255,255,255)

    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     ColorAnim(HTMLElement |, Object attributes, Number duration, Function method)ColorAnim
     parseColor(String s) : ArrayColorAnim
    Attempts to parse the given string and return a 3-tuple.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    ColorAnim

    + public function ColorAnim(HTMLElement |, Object attributes, Number duration, Function method) +
    +
    + Parameters: +
    • | : HTMLElement
      String} el Reference to the element that will be animated
    • attributes : Object
      The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
    • duration : Number
      (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    • method : Function
      (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    parseColor

    + public function parseColor(String s) +
    + Attempts to parse the given string and return a 3-tuple. +
    + Parameters: +
    • s : String
      The string to parse.
    + Returns: +
      +
    • Array
      The 3-tuple of rgb values.
    • +
    +
    +
    +
    This method is defined by ColorAnim.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Config.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Config.html new file mode 100644 index 000000000..36555270b --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Config.html @@ -0,0 +1,1575 @@ + + + + YAHOO.util.Config + + + + + +
    + +

    Class YAHOO.util.Config

    + + + + + +
    Package:YAHOO.util
    Class:Config
    Extends:Object
    Defined In:container_core.js
    +
    + Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_BODY<static> : StringConfig
    <static> Constant representing the module body
     CSS_FOOTER<static> : StringConfig
    <static> Constant representing the module footer
     CSS_HEADER<static> : StringConfig
    <static> Constant representing the module header
     CSS_MODULE<static> : StringConfig
    <static> Constant for the default CSS class name that represents a Module
     body : HTMLElementConfig
    The body element, denoted with CSS class "bd"
     browser : StringConfig
    String representing the current user-agent browser
     cfg : YAHOO.util.ConfigConfig
    The Module's Config object used for monitoring configuration properties.
     contructor : FunctionConfig
    The class's constructor function
     element : HTMLElementConfig
    The main module element that contains the header, body, and footer
     footer : HTMLElementConfig
    The footer element, denoted with CSS class "ft"
     header : HTMLElementConfig
    The header element, denoted with CSS class "hd"
     http : StringConfig
    <static> Constant representing the prefix path to use for non-secure images
     https : StringConfig
    <static> Constant representing the prefix path to use for securely served images
     id : StringConfig
    The id of the element
     imageRoot : StringConfig
    The String representing the image root
     isSecure : BooleanConfig
    Boolean representing whether or not the current browsing context is secure (https)
     javascript : StringConfig
    <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the bro...
     owner : ObjectConfig
    Object reference to the owner of this Config Object
     platform : StringConfig
    String representing the current user-agent platform
     queueInProgress : BooleanConfig
    Boolean flag that specifies whether a queue is currently being executed
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Config(Object owner)Config
     addProperty(String key, Object propertyObject) : voidConfig
    Adds a property to the Config Object's private config hash.
     alreadySubscribed<static>(YAHOO.util.CustomEvent evt, Function fn, Object obj) : BooleanConfig
    <static> Checks to determine if a particular function/Object pair are already subscribed to the specified Custo...
     appendToBody(HTMLElement element) : voidConfig
    Appends the passed element to the body. If no body is present, one will be automatically created.
     appendToFooter(HTMLElement element) : voidConfig
    Appends the passed element to the footer. If no footer is present, one will be automatically created.
     appendToHeader(HTMLElement element) : voidConfig
    Appends the passed element to the header. If no header is present, one will be automatically created.
     applyConfig(Object userConfig, Boolean init) : voidConfig
    Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property eve...
     checkBoolean(Object val) : BooleanConfig
    Validates that the value passed in is a Boolean.
     checkNumber(Object val) : BooleanConfig
    Validates that the value passed in is a number.
     configMonitorResize(String type, Object[] args, Object obj) : voidConfig
    Default event handler for the "monitorresize" configuration property
     configVisible(String type, Object[] args, Object obj) : voidConfig
    Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the...
     destroy() : voidConfig
    Removes the Module element from the DOM and sets all child elements to null.
     fireQueue() : voidConfig
    Fires the normalized list of queued property change events
     getConfig() : ObjectConfig
    Returns a key-value configuration map of the values currently set in the Config Object.
     getProperty(String key) : ObjectConfig
    Returns the value of specified property.
     hide() : voidConfig
    Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEve...
     init(String el, HTMLElement el, Object userConfig) : voidConfig
    The Module class's initialization method, which is executed for Module and all of its subclasses. This method is auto...
     initDefaultConfig() : voidConfig
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initEvents() : voidConfig
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     initResizeMonitor() : voidConfig
    Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize.
     onDomResize(DOMEvent e, Object obj) : voidConfig
    Event handler fired when the resize monitor element is resized.
     outputEventQueue() : StringConfig
    Returns a string representation of the Config object's current CustomEvent queue
     queueProperty(String key, String value) : BooleanConfig
    Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is +mov...
     refireEvent(String key) : voidConfig
    Fires the event for a property using the property's current value.
     refresh() : voidConfig
    Refires the events for all configuration properties using their current values.
     render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) : BooleanConfig
    Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optio...
     resetProperty(String key) : BooleanConfig
    Resets the specified property's value to its initial value.
     setBody(String bodyContent, HTMLElement bodyContent) : voidConfig
    Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is presen...
     setFooter(String footerContent, HTMLElement footerContent) : voidConfig
    Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is ...
     setHeader(String headerContent, HTMLElement headerContent) : voidConfig
    Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is ...
     setProperty(String key, String value, Boolean silent) : BooleanConfig
    Sets the value of a property. If the silent property is passed as true, the property's event will not be fired.
     show() : voidConfig
    Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEven...
     subscribeToConfigEvent(String key, Function handler, Object obj, Boolean override) : BooleanConfig
    Subscribes an external handler to the change event for any given property.
     toString() : StringConfig
    Returns a String representation of the Object.
     unsubscribeFromConfigEvent(String key, Function handler, Object obj) : BooleanConfig
    Unsubscribes an external handler from the change event for any given property.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     appendEvent : ()Config
    CustomEvent fired when the Module is appended to the DOM
     beforeHideEvent : ()Config
    CustomEvent fired before the Module is hidden
     beforeInitEvent : (class classRef)Config
    CustomEvent fired prior to class initalization.
     beforeRenderEvent : ()Config
    CustomEvent fired before the Module is rendered
     beforeShowEvent : ()Config
    CustomEvent fired before the Module is shown
     changeBodyEvent : (String/HTMLElement content)Config
    CustomEvent fired when the body content of the Module is modified
     changeContentEvent : ()Config
    CustomEvent fired when the content of the Module is modified
     changeFooterEvent : (String/HTMLElement content)Config
    CustomEvent fired when the footer content of the Module is modified
     changeHeaderEvent : (String/HTMLElement content)Config
    CustomEvent fired when the header content of the Module is modified
     configChangedEvent : ()Config
    Object reference to the owner of this Config Object
     destroyEvent : ()Config
    CustomEvent fired when the Module is destroyed
     hideEvent : ()Config
    CustomEvent fired after the Module is hidden
     initEvent : (class classRef)Config
    CustomEvent fired after class initalization.
     renderEvent : ()Config
    CustomEvent fired after the Module is rendered
     showEvent : ()Config
    CustomEvent fired after the Module is shown
    + +

    Property Details

    +
    + +
    +

    CSS_BODY<static>

    + public String CSS_BODY<static> +
    + <static> Constant representing the module body
    +
    This property is defined by Config.
    +
    + +
    +

    CSS_FOOTER<static>

    + public String CSS_FOOTER<static> +
    + <static> Constant representing the module footer
    +
    This property is defined by Config.
    +
    + +
    +

    CSS_HEADER<static>

    + public String CSS_HEADER<static> +
    + <static> Constant representing the module header
    +
    This property is defined by Config.
    +
    + +
    +

    CSS_MODULE<static>

    + public String CSS_MODULE<static> +
    + <static> Constant for the default CSS class name that represents a Module
    +
    This property is defined by Config.
    +
    + +
    +

    body

    + public HTMLElement body +
    + The body element, denoted with CSS class "bd"
    +
    This property is defined by Config.
    +
    + +
    +

    browser

    + public String browser +
    + String representing the current user-agent browser
    +
    This property is defined by Config.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The Module's Config object used for monitoring configuration properties.
    +
    This property is defined by Config.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by Config.
    +
    + +
    +

    element

    + public HTMLElement element +
    + The main module element that contains the header, body, and footer
    +
    This property is defined by Config.
    +
    + +
    +

    footer

    + public HTMLElement footer +
    + The footer element, denoted with CSS class "ft"
    +
    This property is defined by Config.
    +
    + +
    +

    header

    + public HTMLElement header +
    + The header element, denoted with CSS class "hd"
    +
    This property is defined by Config.
    +
    + +
    +

    http

    + public String http +
    + <static> Constant representing the prefix path to use for non-secure images
    +
    This property is defined by Config.
    +
    + +
    +

    https

    + public String https +
    + <static> Constant representing the prefix path to use for securely served images
    +
    This property is defined by Config.
    +
    + +
    +

    id

    + public String id +
    + The id of the element
    +
    This property is defined by Config.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + The String representing the image root
    +
    This property is defined by Config.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + Boolean representing whether or not the current browsing context is secure (https)
    +
    This property is defined by Config.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> Constant representing the url for the "src" attribute of the iframe used to monitor changes to the browser's base font size
    +
    This property is defined by Config.
    +
    + +
    +

    owner

    + public Object owner +
    + Object reference to the owner of this Config Object
    +
    This property is defined by Config.
    +
    + +
    +

    platform

    + public String platform +
    + String representing the current user-agent platform
    +
    This property is defined by Config.
    +
    + +
    +

    queueInProgress

    + public Boolean queueInProgress +
    + Boolean flag that specifies whether a queue is currently being executed
    +
    This property is defined by Config.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Config

    + public function Config(Object owner) +
    +
    + Parameters: +
    • owner : Object
      The owner Object to which this Config Object belongs
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addProperty

    + public function addProperty(String key, Object propertyObject) +
    + Adds a property to the Config Object's private config hash. +
    + Parameters: +
    • key : String
      The configuration property's name
    • propertyObject : Object
      The Object containing all of this property's arguments
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    alreadySubscribed<static>

    + public function alreadySubscribed<static>(YAHOO.util.CustomEvent evt, Function fn, Object obj) +
    + <static> Checks to determine if a particular function/Object pair are already subscribed to the specified CustomEvent +
    + Parameters: +
    • evt : YAHOO.util.CustomEvent
      The CustomEvent for which to check the subscriptions
    • fn : Function
      The function to look for in the subscribers list
    • obj : Object
      The execution scope Object for the subscription
    + Returns: +
      +
    • Boolean
      true, if the function/Object pair is already subscribed to the CustomEvent passed in
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    appendToBody

    + public function appendToBody(HTMLElement element) +
    + Appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    appendToFooter

    + public function appendToFooter(HTMLElement element) +
    + Appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    appendToHeader

    + public function appendToHeader(HTMLElement element) +
    + Appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • element : HTMLElement
      The element to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    applyConfig

    + public function applyConfig(Object userConfig, Boolean init) +
    + Applies a key-value Object literal to the configuration, replacing any existing values, and queueing the property events. +Although the values will be set, fireQueue() must be called for their associated events to execute. +
    + Parameters: +
    • userConfig : Object
      The configuration Object literal
    • init : Boolean
      When set to true, the initialConfig will be set to the userConfig passed in, so that calling a reset will reset the properties to the passed values.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    checkBoolean

    + public function checkBoolean(Object val) +
    + Validates that the value passed in is a Boolean. +
    + Parameters: +
    • val : Object
      The value to validate
    + Returns: +
      +
    • Boolean
      true, if the value is valid
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    checkNumber

    + public function checkNumber(Object val) +
    + Validates that the value passed in is a number. +
    + Parameters: +
    • val : Object
      The value to validate
    + Returns: +
      +
    • Boolean
      true, if the value is valid
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    configMonitorResize

    + public function configMonitorResize(String type, Object[] args, Object obj) +
    + Default event handler for the "monitorresize" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + Default event handler for changing the visibility property of a Module. By default, this is achieved by switching the "display" style between "block" and "none". +This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Module element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    fireQueue

    + public function fireQueue() +
    + Fires the normalized list of queued property change events +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    getConfig

    + public function getConfig() +
    + Returns a key-value configuration map of the values currently set in the Config Object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      The current config, represented in a key-value map
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    getProperty

    + public function getProperty(String key) +
    + Returns the value of specified property. +
    + Parameters: +
    • key : String
      The name of the property
    + Returns: +
      +
    • Object
      The value of the specified property
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Module element by setting the visible configuration property to false. Also fires two events: beforeHideEvent prior to the visibility change, and hideEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Module class's initialization method, which is executed for Module and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Module OR
    • el : HTMLElement
      The element representing the Module
    • userConfig : Object
      The configuration Object literal containing the configuration that should be set for this module. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    initResizeMonitor

    + public function initResizeMonitor() +
    + Initialized an empty IFRAME that is placed out of the visible area that can be used to detect text resize. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    • obj : Object
      The scope object passed to the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    outputEventQueue

    + public function outputEventQueue() +
    + Returns a string representation of the Config object's current CustomEvent queue +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string list of CustomEvents currently queued for execution
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    queueProperty

    + public function queueProperty(String key, String value) +
    + Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is +moved from its current position to the end of the queue. +
    + Parameters: +
    • key : String
      The name of the property
    • value : String
      The value to set the property to
    + Returns: +
      +
    • Boolean
      true, if the set was successful, false if it failed.
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    refireEvent

    + public function refireEvent(String key) +
    + Fires the event for a property using the property's current value. +
    + Parameters: +
    • key : String
      The name of the property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Refires the events for all configuration properties using their current values. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode, HTMLElement moduleElement) +
    + Renders the Module by inserting the elements that are not already in the main Module into their correct places. Optionally appends the Module to the specified node prior to the render's execution. NOTE: For Modules without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    • moduleElement : HTMLElement
      OPTIONAL. The element that represents the actual Standard Module container.
    + Returns: +
      +
    • Boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    resetProperty

    + public function resetProperty(String key) +
    + Resets the specified property's value to its initial value. +
    + Parameters: +
    • key : String
      The name of the property
    + Returns: +
      +
    • Boolean
      True is the property was reset, false if not
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    setBody

    + public function setBody(String bodyContent, HTMLElement bodyContent) +
    + Sets the Module's body content to the HTML specified, or appends the passed element to the body. If no body is present, one will be automatically created. +
    + Parameters: +
    • bodyContent : String
      The HTML used to set the body OR
    • bodyContent : HTMLElement
      The HTMLElement to append to the body
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    setFooter

    + public function setFooter(String footerContent, HTMLElement footerContent) +
    + Sets the Module's footer content to the HTML specified, or appends the passed element to the footer. If no footer is present, one will be automatically created. +
    + Parameters: +
    • footerContent : String
      The HTML used to set the footer OR
    • footerContent : HTMLElement
      The HTMLElement to append to the footer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    setHeader

    + public function setHeader(String headerContent, HTMLElement headerContent) +
    + Sets the Module's header content to the HTML specified, or appends the passed element to the header. If no header is present, one will be automatically created. +
    + Parameters: +
    • headerContent : String
      The HTML used to set the header OR
    • headerContent : HTMLElement
      The HTMLElement to append to the header
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    setProperty

    + public function setProperty(String key, String value, Boolean silent) +
    + Sets the value of a property. If the silent property is passed as true, the property's event will not be fired. +
    + Parameters: +
    • key : String
      The name of the property
    • value : String
      The value to set the property to
    • silent : Boolean
      Whether the value should be set silently, without firing the property event.
    + Returns: +
      +
    • Boolean
      True, if the set was successful, false if it failed.
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Module element by setting the visible configuration property to true. Also fires two events: beforeShowEvent prior to the visibility change, and showEvent after. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    subscribeToConfigEvent

    + public function subscribeToConfigEvent(String key, Function handler, Object obj, Boolean override) +
    + Subscribes an external handler to the change event for any given property. +
    + Parameters: +
    • key : String
      The property name
    • handler : Function
      The handler function to use subscribe to the property's event
    • obj : Object
      The Object to use for scoping the event handler (see CustomEvent documentation)
    • override : Boolean
      Optional. If true, will override "this" within the handler to map to the scope Object passed into the method.
    + Returns: +
      +
    • Boolean
      True, if the subscription was successful, otherwise false.
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the Object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Module
    • +
    +
    +
    +
    This method is defined by Config.
    +
    + +
    +

    unsubscribeFromConfigEvent

    + public function unsubscribeFromConfigEvent(String key, Function handler, Object obj) +
    + Unsubscribes an external handler from the change event for any given property. +
    + Parameters: +
    • key : String
      The property name
    • handler : Function
      The handler function to use subscribe to the property's event
    • obj : Object
      The Object to use for scoping the event handler (see CustomEvent documentation)
    + Returns: +
      +
    • Boolean
      True, if the unsubscription was successful, otherwise false.
    • +
    +
    +
    +
    This method is defined by Config.
    +
    +
    + +

    Event Details

    +
    + +
    +

    appendEvent

    + public event appendEvent +
    + CustomEvent fired when the Module is appended to the DOM +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    beforeHideEvent

    + public event beforeHideEvent +
    + CustomEvent fired before the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    beforeInitEvent

    + public event beforeInitEvent +
    + CustomEvent fired prior to class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + CustomEvent fired before the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    beforeShowEvent

    + public event beforeShowEvent +
    + CustomEvent fired before the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    changeBodyEvent

    + public event changeBodyEvent +
    + CustomEvent fired when the body content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new body content
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    changeContentEvent

    + public event changeContentEvent +
    + CustomEvent fired when the content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    changeFooterEvent

    + public event changeFooterEvent +
    + CustomEvent fired when the footer content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new footer content
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    changeHeaderEvent

    + public event changeHeaderEvent +
    + CustomEvent fired when the header content of the Module is modified +
    + Subscribers will be called with the following parameters: +
    • content : String/HTMLElement
      String/element representing the new header content
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    configChangedEvent

    + public event configChangedEvent +
    + Object reference to the owner of this Config Object +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + CustomEvent fired when the Module is destroyed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    hideEvent

    + public event hideEvent +
    + CustomEvent fired after the Module is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    initEvent

    + public event initEvent +
    + CustomEvent fired after class initalization. +
    + Subscribers will be called with the following parameters: +
    • classRef : class
      class reference of the initializing class, such as this.beforeInitEvent.fire(YAHOO.widget.Module)
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + CustomEvent fired after the Module is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    + +
    +

    showEvent

    + public event showEvent +
    + CustomEvent fired after the Module is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Config.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.CustomEvent.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.CustomEvent.html new file mode 100644 index 000000000..0028b7f3e --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.CustomEvent.html @@ -0,0 +1,390 @@ + + + + YAHOO.util.CustomEvent + + + + + +
    + +

    Class YAHOO.util.CustomEvent

    + + + + + +
    Package:YAHOO.util
    Class:CustomEvent
    Extends:Object
    Defined In:event.js
    +
    + The CustomEvent class lets you define events for your application +that can be subscribed to by one or more independent component.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     FLAT<static> : intCustomEvent
    <static> Subscriber listener sigature constant. The FLAT type returns two +parameters: the first argument passe...
     LIST<static> : intCustomEvent
    <static> Subscriber listener sigature constant. The LIST type returns three +parameters: the event type, the ar...
     scope : objectCustomEvent
    The scope the the event will fire from by default. Defaults to the window +obj
     signature : intCustomEvent
    Custom events support two styles of arguments provided to the event +subscribers. + +YAHOO.util.CustomEvent.LIST: + +pa...
     silent : booleanCustomEvent
    By default all custom events are logged in the debug build, set silent +to true to disable logging for this event.
     subscribers : Subscriber[]CustomEvent
    The subscribers to this event
     type : stringCustomEvent
    The type of event, returned to subscribers when the event fires
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     CustomEvent()CustomEvent
     fire(Object* arguments) : voidCustomEvent
    Notifies the subscribers. The callback functions will be executed +from the scope specified when the event was create...
     subscribe(Function fn, Object obj, boolean|Object override) : voidCustomEvent
    Subscribes the caller to this event
     toString() : voidCustomEvent
     unsubscribe(Function fn, [Object obj]) : booleanCustomEvent
    Unsubscribes the caller from this event
     unsubscribeAll() : voidCustomEvent
    Removes all listeners
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     subscribeEvent : (Function fn, Object obj, boolean|Object override)CustomEvent
    Custom events provide a custom event that fires whenever there is +a new subscriber to the event. This provides an op...
    + +

    Property Details

    +
    + +
    +

    FLAT<static>

    + public int FLAT<static> +
    + <static> Subscriber listener sigature constant. The FLAT type returns two +parameters: the first argument passed to fire and the optional +custom object
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    LIST<static>

    + public int LIST<static> +
    + <static> Subscriber listener sigature constant. The LIST type returns three +parameters: the event type, the array of args passed to fire, and +the optional custom object
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    scope

    + public object scope +
    + The scope the the event will fire from by default. Defaults to the window +obj
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    signature

    + public int signature +
    + Custom events support two styles of arguments provided to the event +subscribers. +
      +
    • YAHOO.util.CustomEvent.LIST: +
        +
      • param1: event name
      • +
      • param2: array of arguments sent to fire
      • +
      • param3: a custom object supplied by the subscriber
      • +
      +
    • +
    • YAHOO.util.CustomEvent.FLAT +
        +
      • param1: the first argument passed to fire. If you need to +pass multiple parameters, use and array or object literal
      • +
      • param2: a custom object supplied by the subscriber
      • +
      +
    • +
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    silent

    + public boolean silent +
    + By default all custom events are logged in the debug build, set silent +to true to disable logging for this event.
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    subscribers

    + public Subscriber[] subscribers +
    + The subscribers to this event
    +
    This property is defined by CustomEvent.
    +
    + +
    +

    type

    + public string type +
    + The type of event, returned to subscribers when the event fires
    +
    This property is defined by CustomEvent.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    CustomEvent

    + public function CustomEvent() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    fire

    + public function fire(Object* arguments) +
    + Notifies the subscribers. The callback functions will be executed +from the scope specified when the event was created, and with the +following parameters: +
      +
    • The type of event
    • +
    • All of the arguments fire() was executed with as an array
    • +
    • The custom object (if any) that was passed into the subscribe() +method
    • +
    +
    + Parameters: +
    • arguments : Object*
      an arbitrary set of parameters to pass to the handler.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CustomEvent.
    +
    + +
    +

    subscribe

    + public function subscribe(Function fn, Object obj, boolean|Object override) +
    + Subscribes the caller to this event +
    + Parameters: +
    • fn : Function
      The function to execute
    • obj : Object
      An object to be passed along when the event fires
    • override : boolean|Object
      If true, the obj passed in becomes the execution scope of the listener. if an object, that object becomes the the execution scope.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CustomEvent.
    +
    + +
    +

    toString

    + public function toString() +
    + +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CustomEvent.
    +
    + +
    +

    unsubscribe

    + public function unsubscribe(Function fn, [Object obj]) +
    + Unsubscribes the caller from this event +
    + Parameters: +
    • fn : Function
      The function to execute
    • obj : Object
      The custom object passed to subscribe (optional)
    + Returns: +
      +
    • boolean
      True if the subscriber was found and detached.
    • +
    +
    +
    +
    This method is defined by CustomEvent.
    +
    + +
    +

    unsubscribeAll

    + public function unsubscribeAll() +
    + Removes all listeners +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CustomEvent.
    +
    +
    + +

    Event Details

    +
    + +
    +

    subscribeEvent

    + public event subscribeEvent +
    + Custom events provide a custom event that fires whenever there is +a new subscriber to the event. This provides an opportunity to +handle the case where there is a non-repeating event that has +already fired has a new subscriber. +
    + Subscribers will be called with the following parameters: +
    • fn : Function
      The function to execute
    • obj : Object
      An object to be passed along when the event fires
    • override : boolean|Object
      If true, the obj passed in becomes the execution scope of the listener. if an object, that object becomes the the execution scope.
    +
    +
    +
    This event is defined by CustomEvent.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.DD.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.DD.html new file mode 100644 index 000000000..dc580ccf0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.DD.html @@ -0,0 +1,1574 @@ + + + + YAHOO.util.DD + + + + + +
    + +

    Class YAHOO.util.DD

    + + + + + + +
    Package:YAHOO.util
    Class:DD
    Extends:DragDrop
    Subclasses:DDProxy, SliderThumb
    Defined In:dragdrop.js
    +
    + A DragDrop implementation where the linked element follows the +mouse cursor during a drag.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : boolean +@defaultDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     scroll : booleanDD
    When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DD(String id, String sGroup, object config)DD
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
    Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     autoOffset(int iPageX, int iPageY) : voidDD
    Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
     cachePosition(iPageX the, iPageY the) : voidDD
    Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidDragDrop
    Clears any tick interval defined for this instance
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDelta(int iDeltaX, int iDeltaY) : voidDD
    Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setDragElPos(int iPageX, int iPageY) : voidDD
    Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringDragDrop
    toString method
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean +@default hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    scroll

    + public boolean scroll +
    + When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
    +
    This property is defined by DD.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DD

    + public function DD(String id, String sGroup, object config) +
    +
    + Parameters: +
    • id : String
      the id of the linked element
    • sGroup : String
      the group of related DragDrop items
    • config : object
      an object containing configurable attributes Valid properties for DD: scroll
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    alignElWithMouse

    + public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
    + Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • el : HTMLElement
      the element to move
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    autoOffset

    + public function autoOffset(int iPageX, int iPageY) +
    + Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
    + Parameters: +
    • iPageX : int
      the X coordinate of the click
    • iPageY : int
      the Y coordinate of the click
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    cachePosition

    + public function cachePosition(iPageX the, iPageY the) +
    + Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
    + Parameters: +
    • the : iPageX
      current x position (optional, this just makes it so we don't have to look it up again)
    • the : iPageY
      current y position (optional, this just makes it so we don't have to look it up again)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clears any tick interval defined for this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDelta

    + public function setDelta(int iDeltaX, int iDeltaY) +
    + Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
    + Parameters: +
    • iDeltaX : int
      the distance from the left
    • iDeltaY : int
      the distance from the top
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElPos

    + public function setDragElPos(int iPageX, int iPageY) +
    + Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + toString method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the dd obj
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.DDProxy.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.DDProxy.html new file mode 100644 index 000000000..691bd8739 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.DDProxy.html @@ -0,0 +1,1685 @@ + + + + YAHOO.util.DDProxy + + + + + +
    + +

    Class YAHOO.util.DDProxy

    + + + + + +
    Package:YAHOO.util
    Class:DDProxy
    Extends:DD
    Defined In:dragdrop.js
    +
    + A DragDrop implementation that inserts an empty, bordered div into +the document that follows the cursor during drag operations. At the time of +the click, the frame div is resized to the dimensions of the linked html +element, and moved to the exact location of the linked element. +References to the "frame" element refer to the single proxy element that +was created to be dragged in place of all DDProxy elements on the +page.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     centerFrame : booleanDDProxy
    By default the frame is positioned exactly where the drag element is, so +we use the cursor offset provided by YAHOO.u...
     config : objectDragDrop
    Configuration attributes passed into the constructor
     dragElId<static> : StringDDProxy
    <static> The default drag frame div id
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : boolean +@defaultDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     resizeFrame : booleanDDProxy
    By default we resize the drag frame to be the same size as the element +we want to drag (this is to get the frame effe...
     scroll : booleanDD
    When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DDProxy(String id, String sGroup, object config)DDProxy
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
    Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     autoOffset(int iPageX, int iPageY) : voidDD
    Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
     cachePosition(iPageX the, iPageY the) : voidDD
    Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidDragDrop
    Clears any tick interval defined for this instance
     createFrame() : voidDDProxy
    Creates the proxy element if it does not yet exist
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initFrame() : voidDDProxy
    Initialization for the drag frame element. Must be called in the +constructor of all subclasses
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDelta(int iDeltaX, int iDeltaY) : voidDD
    Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setDragElPos(int iPageX, int iPageY) : voidDD
    Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringDragDrop
    toString method
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    centerFrame

    + public boolean centerFrame +
    + By default the frame is positioned exactly where the drag element is, so +we use the cursor offset provided by YAHOO.util.DD. Another option that works only if +you do not have constraints on the obj is to have the drag frame centered +around the cursor. Set centerFrame to true for this effect.
    +
    This property is defined by DDProxy.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    dragElId<static>

    + public String dragElId<static> +
    + <static> The default drag frame div id
    +
    This property is defined by DDProxy.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean +@default hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    resizeFrame

    + public boolean resizeFrame +
    + By default we resize the drag frame to be the same size as the element +we want to drag (this is to get the frame effect). We can turn it off +if we want a different behavior.
    +
    This property is defined by DDProxy.
    +
    + +
    +

    scroll

    + public boolean scroll +
    + When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
    +
    This property is defined by DD.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DDProxy

    + public function DDProxy(String id, String sGroup, object config) +
    +
    + Parameters: +
    • id : String
      the id of the linked html element
    • sGroup : String
      the group of related DragDrop objects
    • config : object
      an object containing configurable attributes Valid properties for DDProxy in addition to those in DragDrop: resizeFrame, centerFrame, dragElId
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    alignElWithMouse

    + public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
    + Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • el : HTMLElement
      the element to move
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    autoOffset

    + public function autoOffset(int iPageX, int iPageY) +
    + Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
    + Parameters: +
    • iPageX : int
      the X coordinate of the click
    • iPageY : int
      the Y coordinate of the click
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    cachePosition

    + public function cachePosition(iPageX the, iPageY the) +
    + Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
    + Parameters: +
    • the : iPageX
      current x position (optional, this just makes it so we don't have to look it up again)
    • the : iPageY
      current y position (optional, this just makes it so we don't have to look it up again)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clears any tick interval defined for this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    createFrame

    + public function createFrame() +
    + Creates the proxy element if it does not yet exist +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DDProxy.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initFrame

    + public function initFrame() +
    + Initialization for the drag frame element. Must be called in the +constructor of all subclasses +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DDProxy.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDelta

    + public function setDelta(int iDeltaX, int iDeltaY) +
    + Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
    + Parameters: +
    • iDeltaX : int
      the distance from the left
    • iDeltaY : int
      the distance from the top
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElPos

    + public function setDragElPos(int iPageX, int iPageY) +
    + Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + toString method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the dd obj
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.DDTarget.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.DDTarget.html new file mode 100644 index 000000000..b8863f741 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.DDTarget.html @@ -0,0 +1,1415 @@ + + + + YAHOO.util.DDTarget + + + + + +
    + +

    Class YAHOO.util.DDTarget

    + + + + + +
    Package:YAHOO.util
    Class:DDTarget
    Extends:DragDrop
    Defined In:dragdrop.js
    +
    + A DragDrop implementation that does not move, but can be a drop +target. You would get the same result by simply omitting implementation +for the event callbacks, but this way we reduce the processing cost of the +event listener and the callbacks.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : boolean +@defaultDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DDTarget(String id, String sGroup, object config)DDTarget
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidDragDrop
    Clears any tick interval defined for this instance
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringDragDrop
    toString method
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean +@default hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DDTarget

    + public function DDTarget(String id, String sGroup, object config) +
    +
    + Parameters: +
    • id : String
      the id of the element that is a drop target
    • sGroup : String
      the group of related DragDrop objects
    • config : object
      an object containing configurable attributes Valid properties for DDTarget in addition to those in DragDrop: none
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clears any tick interval defined for this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + toString method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the dd obj
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Dom.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Dom.html new file mode 100644 index 000000000..cdc204fd6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Dom.html @@ -0,0 +1,712 @@ + + + + YAHOO.util.Dom + + + + + +
    + +

    Class YAHOO.util.Dom

    + + + + + +
    Package:YAHOO.util
    Class:Dom
    Extends:Object
    Defined In:dom.js
    +
    + Provides helper methods for DOM elements.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addClass(String |, String className) : voidDom
    Adds a class name to a given element or collection of elements.
     batch([String |], Function method, [Any o], [Boolean override]) : HTMLElementDom
    Returns an array of elements that have had the supplied method applied. +The method is called with the element(s) as t...
     generateId([String |], [String prefix]) : StringDom
    Generates a unique ID
     get(String |) : HTMLElementDom
    Returns an HTMLElement reference.
     getClientHeight() : IntDom
    Deprecated. Returns the height of the client (viewport).
     getClientWidth() : IntDom
    Deprecated. Returns the width of the client (viewport).
     getDocumentHeight() : IntDom
    Returns the height of the document.
     getDocumentWidth() : IntDom
    Returns the width of the document.
     getElementsBy(Function method, [String tag], [String |]) : voidDom
    Returns a array of HTMLElements that pass the test applied by supplied boolean method. +For optimized performance, inc...
     getElementsByClassName(String className, [String tag], [String |]) : ArrayDom
    Returns a array of HTMLElements with the given class. +For optimized performance, include a tag and/or root node when ...
     getRegion(String |) : RegionDom
    Returns the region position of the given element. +The element must be part of the DOM tree to have a region (display:...
     getStyle(String |, String property) : StringDom
    Normalizes currentStyle and ComputedStyle.
     getViewportHeight() : IntDom
    Returns the current height of the viewport.
     getViewportWidth() : IntDom
    Returns the current width of the viewport.
     getX(String |) : StringDom
    Gets the current X position of an element based on page coordinates. The element must be part of the DOM tree to hav...
     getXY(String |) : ArrayDom
    Gets the current position of an element based on page coordinates. Element must be part of the DOM tree to have page...
     getY(String |) : StringDom
    Gets the current Y position of an element based on page coordinates. Element must be part of the DOM tree to have pa...
     hasClass(String |, String className) : BooleanDom
    Determines whether an HTMLElement has the given className.
     inDocument(String |) : BooleanDom
    Determines whether an HTMLElement is present in the current document.
     isAncestor(String |, String |) : BooleanDom
    Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy.
     removeClass(String |, String className) : voidDom
    Removes a class name from a given element or collection of elements.
     replaceClass(String |, String oldClassName, String newClassName) : voidDom
    Replace a class with another class for a given element or collection of elements. +If no oldClassName is present, the ...
     setStyle(String |, String property, String val) : voidDom
    Wrapper for setting style properties of HTMLElements. Normalizes "opacity" across modern browsers.
     setX(String |, Int x) : voidDom
    Set the X position of an html element in page coordinates, regardless of how the element is positioned. +The element m...
     setXY(String |, Array pos, Boolean noRetry) : voidDom
    Set the position of an html element in page coordinates, regardless of how the element is positioned. +The element(s) ...
     setY(String |, Int x) : voidDom
    Set the Y position of an html element in page coordinates, regardless of how the element is positioned. +The element m...
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    addClass

    + public function addClass(String |, String className) +
    + Adds a class name to a given element or collection of elements. +
    + Parameters: +
    • | : String
      HTMLElement | Array} el The element or collection to add the class to
    • className : String
      the class name to add to the class attribute
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    batch

    + public function batch([String |], Function method, [Any o], [Boolean override]) +
    + Returns an array of elements that have had the supplied method applied. +The method is called with the element(s) as the first arg, and the optional param as the second ( method(el, o) ). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el (optional) An element or array of elements to apply the method to
    • method : Function
      The method to apply to the element(s)
    • o : Any
      (optional) An optional arg that is passed to the supplied method
    • override : Boolean
      (optional) Whether or not to override the scope of "method" with "o"
    + Returns: +
      +
    • HTMLElement
      | Array} The element(s) with the method applied
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    generateId

    + public function generateId([String |], [String prefix]) +
    + Generates a unique ID +
    + Parameters: +
    • | : String
      HTMLElement | Array} el (optional) An optional element array of elements to add an ID to (no ID is added if one is already present).
    • prefix : String
      (optional) an optional prefix to use (defaults to "yui-gen").
    + Returns: +
      +
    • String
      | Array} The generated ID, or array of generated IDs (or original ID if already present on an element)
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    get

    + public function get(String |) +
    + Returns an HTMLElement reference. +
    + Parameters: +
    • | : String
      HTMLElement |Array} el Accepts a string to use as an ID for getting a DOM reference, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    + Returns: +
      +
    • HTMLElement
      | Array} A DOM reference to an HTML element or an array of HTMLElements.
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getClientHeight

    + public function getClientHeight() +
    + Deprecated. Returns the height of the client (viewport). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The height of the viewable area of the page.
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getClientWidth

    + public function getClientWidth() +
    + Deprecated. Returns the width of the client (viewport). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The width of the viewable area of the page.
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getDocumentHeight

    + public function getDocumentHeight() +
    + Returns the height of the document. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The height of the actual document (which includes the body and its margin).
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getDocumentWidth

    + public function getDocumentWidth() +
    + Returns the width of the document. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The width of the actual document (which includes the body and its margin).
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getElementsBy

    + public function getElementsBy(Function method, [String tag], [String |]) +
    + Returns a array of HTMLElements that pass the test applied by supplied boolean method. +For optimized performance, include a tag and/or root node when possible. +
    + Parameters: +
    • method : Function
      - A boolean method for testing elements which receives the element as its only argument.
    • tag : String
      (optional) The tag name of the elements being collected
    • | : String
      HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getElementsByClassName

    + public function getElementsByClassName(String className, [String tag], [String |]) +
    + Returns a array of HTMLElements with the given class. +For optimized performance, include a tag and/or root node when possible. +
    + Parameters: +
    • className : String
      The class name to match against
    • tag : String
      (optional) The tag name of the elements being collected
    • | : String
      HTMLElement} root (optional) The HTMLElement or an ID to use as the starting point
    + Returns: +
      +
    • Array
      An array of elements that have the given class name
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getRegion

    + public function getRegion(String |) +
    + Returns the region position of the given element. +The element must be part of the DOM tree to have a region (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    + Returns: +
      +
    • Region
      | Array} A Region or array of Region instances containing "top, left, bottom, right" member data.
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getStyle

    + public function getStyle(String |, String property) +
    + Normalizes currentStyle and ComputedStyle. +
    + Parameters: +
    • | : String
      HTMLElement |Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    • property : String
      The style property whose value is returned.
    + Returns: +
      +
    • String
      | Array} The current value of the style property for the element(s).
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getViewportHeight

    + public function getViewportHeight() +
    + Returns the current height of the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The height of the viewable area of the page (excludes scrollbars).
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getViewportWidth

    + public function getViewportWidth() +
    + Returns the current width of the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      The width of the viewable area of the page (excludes scrollbars).
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getX

    + public function getX(String |) +
    + Gets the current X position of an element based on page coordinates. The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    + Returns: +
      +
    • String
      | Array} The X position of the element(s)
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getXY

    + public function getXY(String |) +
    + Gets the current position of an element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    + Returns: +
      +
    • Array
      The XY position of the element(s)
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    getY

    + public function getY(String |) +
    + Gets the current Y position of an element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    + Returns: +
      +
    • String
      | Array} The Y position of the element(s)
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    hasClass

    + public function hasClass(String |, String className) +
    + Determines whether an HTMLElement has the given className. +
    + Parameters: +
    • | : String
      HTMLElement | Array} el The element or collection to test
    • className : String
      the class name to search for
    + Returns: +
      +
    • Boolean
      | Array} A boolean value or array of boolean values
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    inDocument

    + public function inDocument(String |) +
    + Determines whether an HTMLElement is present in the current document. +
    + Parameters: +
    • | : String
      HTMLElement} el The element to search for
    + Returns: +
      +
    • Boolean
      Whether or not the element is present in the current document
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    isAncestor

    + public function isAncestor(String |, String |) +
    + Determines whether an HTMLElement is an ancestor of another HTML element in the DOM hierarchy. +
    + Parameters: +
    • | : String
      HTMLElement} haystack The possible ancestor
    • | : String
      HTMLElement} needle The possible descendent
    + Returns: +
      +
    • Boolean
      Whether or not the haystack is an ancestor of needle
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    removeClass

    + public function removeClass(String |, String className) +
    + Removes a class name from a given element or collection of elements. +
    + Parameters: +
    • | : String
      HTMLElement | Array} el The element or collection to remove the class from
    • className : String
      the class name to remove from the class attribute
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    replaceClass

    + public function replaceClass(String |, String oldClassName, String newClassName) +
    + Replace a class with another class for a given element or collection of elements. +If no oldClassName is present, the newClassName is simply added. +
    + Parameters: +
    • | : String
      HTMLElement | Array} el The element or collection to remove the class from
    • oldClassName : String
      the class name to be replaced
    • newClassName : String
      the class name that will be replacing the old class name
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    setStyle

    + public function setStyle(String |, String property, String val) +
    + Wrapper for setting style properties of HTMLElements. Normalizes "opacity" across modern browsers. +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    • property : String
      The style property to be set.
    • val : String
      The value to apply to the given property.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    setX

    + public function setX(String |, Int x) +
    + Set the X position of an html element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    • x : Int
      The value to use as the X coordinate for the element(s).
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    setXY

    + public function setXY(String |, Array pos, Boolean noRetry) +
    + Set the position of an html element in page coordinates, regardless of how the element is positioned. +The element(s) must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements
    • pos : Array
      Contains X & Y values for new position (coordinates are page-based)
    • noRetry : Boolean
      By default we try and set the position a second time if the first fails
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    + +
    +

    setY

    + public function setY(String |, Int x) +
    + Set the Y position of an html element in page coordinates, regardless of how the element is positioned. +The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). +
    + Parameters: +
    • | : String
      HTMLElement | Array} el Accepts a string to use as an ID, an actual DOM reference, or an Array of IDs and/or HTMLElements.
    • x : Int
      To use as the Y coordinate for the element(s).
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dom.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDrop.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDrop.html new file mode 100644 index 000000000..0720d0d99 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDrop.html @@ -0,0 +1,1447 @@ + + + + YAHOO.util.DragDrop + + + + + +
    + +

    Class YAHOO.util.DragDrop

    + + + + + + +
    Package:YAHOO.util
    Class:DragDrop
    Extends:Object
    Subclasses:DD, DDTarget
    Defined In:dragdrop.js
    +
    + Defines the interface and base operation of items that that can be +dragged or can be drop targets. It was designed to be extended, overriding +the event handlers for startDrag, onDrag, onDragOver, onDragOut. +Up to three html elements can be associated with a DragDrop instance: +
      +
    • linked element: the element that is passed into the constructor. +This is the element which defines the boundaries for interaction with +other DragDrop objects.
    • +
    • handle element(s): The drag operation only occurs if the element that +was clicked matches a handle element. By default this is the linked +element, but there are times that you will want only a portion of the +linked element to initiate the drag operation, and the setHandleElId() +method provides a way to define this.
    • +
    • drag element: this represents an the element that would be moved along +with the cursor during a drag operation. By default, this is the linked +element itself as in YAHOO.util.DD. setDragElId() lets you define +a separate element that would be moved, as in YAHOO.util.DDProxy +
    • +
    +This class should not be instantiated until the onload event to ensure that +the associated elements are available. +The following would define a DragDrop obj that would interact with any +other DragDrop obj in the "group1" group: +
    +dd = new YAHOO.util.DragDrop("div1", "group1");
    +
    +Since none of the event handlers have been implemented, nothing would +actually happen if you were to run the code above. Normally you would +override this class or one of the default implementations, but you can +also override the methods you want on an instance of the class... +
    +dd.onDragDrop = function(e, id) {
    +  alert("dd was dropped on " + id);
    +}
    +
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : boolean +@defaultDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     DragDrop(String id, String sGroup, object config)DragDrop
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidDragDrop
    Clears any tick interval defined for this instance
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringDragDrop
    toString method
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean +@default hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    DragDrop

    + public function DragDrop(String id, String sGroup, object config) +
    +
    + Parameters: +
    • id : String
      of the element that is linked to this instance
    • sGroup : String
      the group of related DragDrop objects
    • config : object
      an object containing configurable attributes Valid properties for DragDrop: padding, isTarget, maintainOffset, primaryButtonOnly
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clears any tick interval defined for this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + toString method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the dd obj
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDropMgr.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDropMgr.html new file mode 100644 index 000000000..8304ac3ad --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.DragDropMgr.html @@ -0,0 +1,1055 @@ + + + + YAHOO.util.DragDropMgr + + + + + +
    + +

    Class YAHOO.util.DragDropMgr

    + + + + + +
    Package:YAHOO.util
    Class:DragDropMgr
    Extends:Object
    Defined In:dragdrop.js
    +
    + DragDropMgr is a singleton that tracks the element interaction for +all DragDrop items in the window. Generally, you will not call +this class directly, but it does have helper methods that could +be useful in your DragDrop implementations.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     INTERSECT : intDragDropMgr
    <static> In intersect mode, drag and drop interactio nis defined by the +overlap of two or more drag and drop ob...
     POINT : intDragDropMgr
    <static> In point mode, drag and drop interaction is defined by the +location of the cursor during the drag/drop
     clickPixelThresh : intDragDropMgr
    <static> The number of pixels that the mouse needs to move after the +mousedown before the drag is initiated. D...
     clickTimeThresh : intDragDropMgr
    <static> The number of milliseconds after the mousedown event to initiate the +drag if we don't get a mouseup ev...
     css : ObjectDragDropMgr
    A reference to the style property
     el : ObjectDragDropMgr
    The element
     id : ObjectDragDropMgr
    The element id
     mode : intDragDropMgr
    <static> The current drag and drop mode. Default: POINT
     preventDefault : booleanDragDropMgr
    <static> Flag to determine if we should prevent the default behavior of the +events we define. By default this i...
     stopPropagation : booleanDragDropMgr
    <static> Flag to determine if we should stop the propagation of the events +we generate. This is true by default...
     useCache : booleanDragDropMgr
    <static> Set useCache to false if you want to force object the lookup of each +drag and drop linked element cons...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     getBestMatch(DragDrop[] dds) : DragDropDragDropMgr
    <static> Helper function for getting the best match from the list of drag +and drop objects returned by the drag...
     getClientHeight() : intDragDropMgr
    Deprecated. <static> Gets the client height
     getClientWidth() : intDragDropMgr
    Deprecated. <static> Gets the client width
     getCss(String id) : ObjectDragDropMgr
    Deprecated. <static> Returns the style property for the DOM element (i.e., +document.getElById(id).style)
     getDDById(String id) : DragDropDragDropMgr
    <static> Returns the DragDrop instance for a given id
     getElement(String id) : ObjectDragDropMgr
    Deprecated. <static> Returns the actual DOM element
     getLocation(DragDrop oDD) : YAHOO.util.RegionDragDropMgr
    <static> Returns a Region object containing the drag and drop element's position +and size, including the paddin...
     getPosX(el the) : intDragDropMgr
    Deprecated. <static> Returns the X position of an html element
     getPosY(el the) : intDragDropMgr
    Deprecated. <static> Returns the Y position of an html element
     getRelated(DragDrop p_oDD, boolean bTargetsOnly) : DragDrop[]DragDropMgr
    <static> Returns the drag and drop instances that are in all groups the +passed in instance belongs to.
     getScrollLeft() : intDragDropMgr
    <static> Gets the scrollLeft
     getScrollTop() : intDragDropMgr
    <static> Gets the scrollTop
     getStyle(HTMLElement el, string styleProp) : stringDragDropMgr
    Deprecated. <static> Returns the specified element style property
     handleWasClicked(node the) : voidDragDropMgr
    <static> Recursively searches the immediate parent and all child nodes for +the handle element in order to deter...
     isDragDrop(String id) : booleanDragDropMgr
    <static> Utility function to determine if a given element has been +registered as a drag drop item.
     isHandle(String id) : booleanDragDropMgr
    <static> Utility function to determine if a given element has been +registered as a drag drop handle for the giv...
     isLegalTarget(DragDrop the, DragDrop the) : booleanDragDropMgr
    <static> Returns true if the specified dd target is a legal target for +the specifice drag obj
     isLocked() : booleanDragDropMgr
    <static> Is drag and drop locked?
     isTypeOfDD(Object the) : booleanDragDropMgr
    <static> My goal is to be able to transparently determine if an object is +typeof DragDrop, and the exact subcla...
     lock() : voidDragDropMgr
    <static> Lock all drag and drop functionality
     moveToEl(HTMLElement moveEl, HTMLElement targetEl) : voidDragDropMgr
    <static> Sets the x/y position of an element to the location of the +target element.
     numericSort() : voidDragDropMgr
    <static> Numeric array sort function
     refreshCache(Object groups) : voidDragDropMgr
    <static> Refreshes the cache of the top-left and bottom-right points of the +drag and drop objects in the specif...
     regDragDrop(DragDrop oDD, String sGroup) : voidDragDropMgr
    <static> Each DragDrop instance must be registered with the DragDropMgr. +This is executed in DragDrop.init()
     regHandle(String sDDId, String sHandleId) : voidDragDropMgr
    <static> Each DragDrop handle element must be registered. This is done +automatically when executing DragDrop.s...
     startDrag(x {int}, y {int}) : voidDragDropMgr
    <static> Fired when either the drag pixel threshol or the mousedown hold +time threshold has been met.
     stopEvent(Event e) : voidDragDropMgr
    <static> Utility to stop event propagation and event default, if these +features are turned on.
     swapNode(n1 the, n2 the) : voidDragDropMgr
    <static> Swap two nodes. In IE, we use the native method, for others we +emulate the IE behavior
     unlock() : voidDragDropMgr
    <static> Unlock all drag and drop functionality
     verifyEl(HTMLElement el) : booleanDragDropMgr
    <static> This checks to make sure an element exists and is in the DOM. The +main purpose is to handle cases whe...
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    INTERSECT

    + public int INTERSECT +
    + <static> In intersect mode, drag and drop interactio nis defined by the +overlap of two or more drag and drop objects.
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    POINT

    + public int POINT +
    + <static> In point mode, drag and drop interaction is defined by the +location of the cursor during the drag/drop
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    clickPixelThresh

    + public int clickPixelThresh +
    + <static> The number of pixels that the mouse needs to move after the +mousedown before the drag is initiated. Default=3;
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    clickTimeThresh

    + public int clickTimeThresh +
    + <static> The number of milliseconds after the mousedown event to initiate the +drag if we don't get a mouseup event. Default=1000
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    css

    + public Object css +
    + A reference to the style property
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    el

    + public Object el +
    + The element
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    id

    + public Object id +
    + The element id
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    mode

    + public int mode +
    + <static> The current drag and drop mode. Default: POINT
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    preventDefault

    + public boolean preventDefault +
    + <static> Flag to determine if we should prevent the default behavior of the +events we define. By default this is true, but this can be set to +false if you need the default behavior (not recommended)
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    stopPropagation

    + public boolean stopPropagation +
    + <static> Flag to determine if we should stop the propagation of the events +we generate. This is true by default but you may want to set it to +false if the html element contains other features that require the +mouse click.
    +
    This property is defined by DragDropMgr.
    +
    + +
    +

    useCache

    + public boolean useCache +
    + <static> Set useCache to false if you want to force object the lookup of each +drag and drop linked element constantly during a drag.
    +
    This property is defined by DragDropMgr.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    getBestMatch

    + public function getBestMatch(DragDrop[] dds) +
    + <static> Helper function for getting the best match from the list of drag +and drop objects returned by the drag and drop events when we are +in INTERSECT mode. It returns either the first object that the +cursor is over, or the object that has the greatest overlap with +the dragged element. +
    + Parameters: +
    • dds : DragDrop[]
      The array of drag and drop objects targeted
    + Returns: +
      +
    • DragDrop
      The best single match
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getClientHeight

    + public function getClientHeight() +
    + Deprecated. <static> Gets the client height +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      client height in px
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getClientWidth

    + public function getClientWidth() +
    + Deprecated. <static> Gets the client width +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      client width in px
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getCss

    + public function getCss(String id) +
    + Deprecated. <static> Returns the style property for the DOM element (i.e., +document.getElById(id).style) +
    + Parameters: +
    • id : String
      the id of the elment to get
    + Returns: +
      +
    • Object
      The style property of the element
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getDDById

    + public function getDDById(String id) +
    + <static> Returns the DragDrop instance for a given id +
    + Parameters: +
    • id : String
      the id of the DragDrop object
    + Returns: +
      +
    • DragDrop
      the drag drop object, null if it is not found
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getElement

    + public function getElement(String id) +
    + Deprecated. <static> Returns the actual DOM element +
    + Parameters: +
    • id : String
      the id of the elment to get
    + Returns: +
      +
    • Object
      The element
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getLocation

    + public function getLocation(DragDrop oDD) +
    + <static> Returns a Region object containing the drag and drop element's position +and size, including the padding configured for it +
    + Parameters: +
    • oDD : DragDrop
      the drag and drop object to get the location for
    + Returns: +
      +
    • YAHOO.util.Region
      a Region object representing the total area the element occupies, including any padding the instance is configured for.
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getPosX

    + public function getPosX(el the) +
    + Deprecated. <static> Returns the X position of an html element +
    + Parameters: +
    • the : el
      element for which to get the position
    + Returns: +
      +
    • int
      the X coordinate @for DragDropMgr
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getPosY

    + public function getPosY(el the) +
    + Deprecated. <static> Returns the Y position of an html element +
    + Parameters: +
    • the : el
      element for which to get the position
    + Returns: +
      +
    • int
      the Y coordinate
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getRelated

    + public function getRelated(DragDrop p_oDD, boolean bTargetsOnly) +
    + <static> Returns the drag and drop instances that are in all groups the +passed in instance belongs to. +
    + Parameters: +
    • p_oDD : DragDrop
      the obj to get related data for
    • bTargetsOnly : boolean
      if true, only return targetable objs
    + Returns: +
      +
    • DragDrop[]
      the related instances
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getScrollLeft

    + public function getScrollLeft() +
    + <static> Gets the scrollLeft +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the document's scrollTop
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getScrollTop

    + public function getScrollTop() +
    + <static> Gets the scrollTop +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the document's scrollTop
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    getStyle

    + public function getStyle(HTMLElement el, string styleProp) +
    + Deprecated. <static> Returns the specified element style property +
    + Parameters: +
    • el : HTMLElement
      the element
    • styleProp : string
      the style property
    + Returns: +
      +
    • string
      The value of the style property
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    handleWasClicked

    + public function handleWasClicked(node the) +
    + <static> Recursively searches the immediate parent and all child nodes for +the handle element in order to determine wheter or not it was +clicked. +
    + Parameters: +
    • the : node
      html element to inspect
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    isDragDrop

    + public function isDragDrop(String id) +
    + <static> Utility function to determine if a given element has been +registered as a drag drop item. +
    + Parameters: +
    • id : String
      the element id to check
    + Returns: +
      +
    • boolean
      true if this element is a DragDrop item, false otherwise
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    isHandle

    + public function isHandle(String id) +
    + <static> Utility function to determine if a given element has been +registered as a drag drop handle for the given Drag Drop object. +
    + Parameters: +
    • id : String
      the element id to check
    + Returns: +
      +
    • boolean
      true if this element is a DragDrop handle, false otherwise
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    isLegalTarget

    + public function isLegalTarget(DragDrop the, DragDrop the) +
    + <static> Returns true if the specified dd target is a legal target for +the specifice drag obj +
    + Parameters: +
    • the : DragDrop
      drag obj
    • the : DragDrop
      target
    + Returns: +
      +
    • boolean
      true if the target is a legal target for the dd obj
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + <static> Is drag and drop locked? +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      True if drag and drop is locked, false otherwise.
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    isTypeOfDD

    + public function isTypeOfDD(Object the) +
    + <static> My goal is to be able to transparently determine if an object is +typeof DragDrop, and the exact subclass of DragDrop. typeof +returns "object", oDD.constructor.toString() always returns +"DragDrop" and not the name of the subclass. So for now it just +evaluates a well-known variable in DragDrop. +
    + Parameters: +
    • the : Object
      object to evaluate
    + Returns: +
      +
    • boolean
      true if typeof oDD = DragDrop
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    lock

    + public function lock() +
    + <static> Lock all drag and drop functionality +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    moveToEl

    + public function moveToEl(HTMLElement moveEl, HTMLElement targetEl) +
    + <static> Sets the x/y position of an element to the location of the +target element. +
    + Parameters: +
    • moveEl : HTMLElement
      The element to move
    • targetEl : HTMLElement
      The position reference element
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    numericSort

    + public function numericSort() +
    + <static> Numeric array sort function +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    refreshCache

    + public function refreshCache(Object groups) +
    + <static> Refreshes the cache of the top-left and bottom-right points of the +drag and drop objects in the specified group(s). This is in the +format that is stored in the drag and drop instance, so typical +usage is: + +YAHOO.util.DragDropMgr.refreshCache(ddinstance.groups); + +Alternatively: + +YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true}); + +@TODO this really should be an indexed array. Alternatively this +method could accept both. +
    + Parameters: +
    • groups : Object
      an associative array of groups to refresh
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    regDragDrop

    + public function regDragDrop(DragDrop oDD, String sGroup) +
    + <static> Each DragDrop instance must be registered with the DragDropMgr. +This is executed in DragDrop.init() +
    + Parameters: +
    • oDD : DragDrop
      the DragDrop object to register
    • sGroup : String
      the name of the group this element belongs to
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    regHandle

    + public function regHandle(String sDDId, String sHandleId) +
    + <static> Each DragDrop handle element must be registered. This is done +automatically when executing DragDrop.setHandleElId() +
    + Parameters: +
    • sDDId : String
      the DragDrop id this element is a handle for
    • sHandleId : String
      the id of the element that is the drag handle
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    startDrag

    + public function startDrag(x {int}, y {int}) +
    + <static> Fired when either the drag pixel threshol or the mousedown hold +time threshold has been met. +
    + Parameters: +
    • {int} : x
      the X position of the original mousedown
    • {int} : y
      the Y position of the original mousedown
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    stopEvent

    + public function stopEvent(Event e) +
    + <static> Utility to stop event propagation and event default, if these +features are turned on. +
    + Parameters: +
    • e : Event
      the event as returned by this.getEvent()
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    swapNode

    + public function swapNode(n1 the, n2 the) +
    + <static> Swap two nodes. In IE, we use the native method, for others we +emulate the IE behavior +
    + Parameters: +
    • the : n1
      first node to swap
    • the : n2
      other node to swap
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    unlock

    + public function unlock() +
    + <static> Unlock all drag and drop functionality +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    + +
    +

    verifyEl

    + public function verifyEl(HTMLElement el) +
    + <static> This checks to make sure an element exists and is in the DOM. The +main purpose is to handle cases where innerHTML is used to remove +drag and drop objects from the DOM. IE provides an 'unspecified +error' when trying to access the offsetParent of such an element +
    + Parameters: +
    • el : HTMLElement
      the element to check
    + Returns: +
      +
    • boolean
      true if the element looks usable
    • +
    +
    +
    +
    This method is defined by DragDropMgr.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Easing.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Easing.html new file mode 100644 index 000000000..cf5861085 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Easing.html @@ -0,0 +1,448 @@ + + + + YAHOO.util.Easing + + + + + +
    + +

    Class YAHOO.util.Easing

    + + + + + +
    Package:YAHOO.util
    Class:Easing
    Extends:Object
    Defined In:animation.js
    +
    + Singleton that determines how an animation proceeds from start to end.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     backBoth(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
    Backtracks slightly, then reverses direction, overshoots end, +then reverses and comes back to end.
     backIn(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
    Backtracks slightly, then reverses direction and moves to end.
     backOut(Number t, Number b, Number c, Number d, [Number s]) : NumberEasing
    Overshoots end, then reverses and comes back to end.
     bounceBoth(Number t, Number b, Number c, Number d) : NumberEasing
    Bounces off start and end.
     bounceIn(Number t, Number b, Number c, Number d) : NumberEasing
    Bounce off of start.
     bounceOut(Number t, Number b, Number c, Number d) : NumberEasing
    Bounces off end.
     easeBoth(Number t, Number b, Number c, Number d) : NumberEasing
    Begins slowly and decelerates towards end. (quadratic)
     easeBothStrong(Number t, Number b, Number c, Number d) : NumberEasing
    Begins slowly and decelerates towards end. (quartic)
     easeIn(Number t, Number b, Number c, Number d) : NumberEasing
    Begins slowly and accelerates towards end. (quadratic)
     easeInStrong(Number t, Number b, Number c, Number d) : NumberEasing
    Begins slowly and accelerates towards end. (quartic)
     easeNone(Number t, Number b, Number c, Number d) : NumberEasing
    Uniform speed between points.
     easeOut(Number t, Number b, Number c, Number d) : NumberEasing
    Begins quickly and decelerates towards end. (quadratic)
     easeOutStrong(Number t, Number b, Number c, Number d) : NumberEasing
    Begins quickly and decelerates towards end. (quartic)
     elasticBoth(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
    Snap both elastic effect.
     elasticIn(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
    Snap in elastic effect.
     elasticOut(Number t, Number b, Number c, Number d, [Number p]) : NumberEasing
    Snap out elastic effect.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    backBoth

    + public function backBoth(Number t, Number b, Number c, Number d, [Number s]) +
    + Backtracks slightly, then reverses direction, overshoots end, +then reverses and comes back to end. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • s : Number
      Overshoot (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    backIn

    + public function backIn(Number t, Number b, Number c, Number d, [Number s]) +
    + Backtracks slightly, then reverses direction and moves to end. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • s : Number
      Overshoot (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    backOut

    + public function backOut(Number t, Number b, Number c, Number d, [Number s]) +
    + Overshoots end, then reverses and comes back to end. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • s : Number
      Overshoot (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    bounceBoth

    + public function bounceBoth(Number t, Number b, Number c, Number d) +
    + Bounces off start and end. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    bounceIn

    + public function bounceIn(Number t, Number b, Number c, Number d) +
    + Bounce off of start. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    bounceOut

    + public function bounceOut(Number t, Number b, Number c, Number d) +
    + Bounces off end. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeBoth

    + public function easeBoth(Number t, Number b, Number c, Number d) +
    + Begins slowly and decelerates towards end. (quadratic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeBothStrong

    + public function easeBothStrong(Number t, Number b, Number c, Number d) +
    + Begins slowly and decelerates towards end. (quartic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeIn

    + public function easeIn(Number t, Number b, Number c, Number d) +
    + Begins slowly and accelerates towards end. (quadratic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeInStrong

    + public function easeInStrong(Number t, Number b, Number c, Number d) +
    + Begins slowly and accelerates towards end. (quartic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeNone

    + public function easeNone(Number t, Number b, Number c, Number d) +
    + Uniform speed between points. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeOut

    + public function easeOut(Number t, Number b, Number c, Number d) +
    + Begins quickly and decelerates towards end. (quadratic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    easeOutStrong

    + public function easeOutStrong(Number t, Number b, Number c, Number d) +
    + Begins quickly and decelerates towards end. (quartic) +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    elasticBoth

    + public function elasticBoth(Number t, Number b, Number c, Number d, [Number p]) +
    + Snap both elastic effect. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • p : Number
      Period (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    elasticIn

    + public function elasticIn(Number t, Number b, Number c, Number d, [Number p]) +
    + Snap in elastic effect. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • p : Number
      Period (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    + +
    +

    elasticOut

    + public function elasticOut(Number t, Number b, Number c, Number d, [Number p]) +
    + Snap out elastic effect. +
    + Parameters: +
    • t : Number
      Time value used to compute current value
    • b : Number
      Starting value
    • c : Number
      Delta between start and end values
    • d : Number
      Total length of animation
    • p : Number
      Period (optional)
    + Returns: +
      +
    • Number
      The computed value for the current animation frame
    • +
    +
    +
    +
    This method is defined by Easing.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Element.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Element.html new file mode 100644 index 000000000..f467a1d78 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Element.html @@ -0,0 +1,633 @@ + + + + YAHOO.util.Element + + + + + +
    + +

    Class YAHOO.util.Element

    + + + + + + +
    Package:YAHOO.util
    Class:Element
    Extends:Object
    Subclasses:Tab
    Defined In:tabview.js
    +
    + Element provides an interface to an HTMLElement's attributes and common +methods. Other commonly used attributes are added as well. +@uses YAHOO.util.AttributeProvider
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     DOM_EVENTS : ObjectElement
    Dom events supported by the Element instance.
     register : HTMLElementElement
    The HTMLElement the Element instance refers to. +@config element
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Element(el {HTMLElement, Object map)Element
     addClass(String className) : voidElement
    Wrapper for Dom method.
     addListener(String type, Function fn, Any obj, Object scope) : voidElement
    Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEve...
     appendChild(Boolean deep) : voidElement
    Wrapper for HTMLElement method.
     appendTo(HTMLElement |, HTMLElement |) : voidElement
    Appends the HTMLElement into either the supplied parentNode.
     fireQueue() : voidElement
    Apply any queued set calls.
     getElementsByClassName(String className, [String tag]) : ArrayElement
    Wrapper for Dom method.
     getElementsByTagName(String tag) : voidElement
    Wrapper for HTMLElement method.
     getStyle(String property) : StringElement
    Wrapper for Dom method.
     hasChildNodes() : BooleanElement
    Wrapper for HTMLElement method.
     hasClass(String className) : BooleanElement
    Wrapper for Dom method.
     initAttributes(Object map) : voidElement
    Registers Element specific attributes.
     insertBefore(HTMLElement element, HTMLElement before) : voidElement
    Wrapper for HTMLElement method.
     on(String type, Function fn, Any obj, Object scope) : voidElement
    Alias for addListener
     removeChild(HTMLElement child) : voidElement
    Wrapper for HTMLElement method.
     removeClass(String className) : voidElement
    Wrapper for Dom method.
     removeListener(String type, Function fn) : voidElement
    Remove an event listener
     replaceChild(HTMLElement newNode, HTMLElement oldNode) : voidElement
    Wrapper for HTMLElement method.
     replaceClass(String oldClassName, String newClassName) : voidElement
    Wrapper for Dom method.
     setStyle(String property, String value) : voidElement
    Wrapper for Dom method.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     available : ()Element
    Fires when the Element's HTMLElement can be retrieved by Id. +See: Element.addListener +Event fields: +<String> ty...
    + +

    Property Details

    +
    + +
    +

    DOM_EVENTS

    + public Object DOM_EVENTS +
    + Dom events supported by the Element instance.
    +
    This property is defined by Element.
    +
    + +
    +

    register

    + public HTMLElement register +
    + The HTMLElement the Element instance refers to. +@config element
    +
    This property is defined by Element.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Element

    + public function Element(el {HTMLElement, Object map) +
    +
    + Parameters: +
    • {HTMLElement : el
      | String} The html element that represents the Element.
    • map : Object
      A key-value map of initial config names and values
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addClass

    + public function addClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addListener

    + public function addListener(String type, Function fn, Any obj, Object scope) +
    + Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEvent +can be listened for. All handlers receive an event object. +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The handler to call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendChild

    + public function appendChild(Boolean deep) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • deep : Boolean
      Whether or not to do a deep clone
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendTo

    + public function appendTo(HTMLElement |, HTMLElement |) +
    + Appends the HTMLElement into either the supplied parentNode. +
    + Parameters: +
    • | : HTMLElement
      Element} parentNode The node to append to
    • | : HTMLElement
      Element} before An optional node to insert before
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    fireQueue

    + public function fireQueue() +
    + Apply any queued set calls. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByClassName

    + public function getElementsByClassName(String className, [String tag]) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to collect
    • tag : String
      (optional) The tag to use in conjunction with class name
    + Returns: +
      +
    • Array
      Array of HTMLElements
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByTagName

    + public function getElementsByTagName(String tag) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • tag : String
      The tagName to collect
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getStyle

    + public function getStyle(String property) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to retrieve
    + Returns: +
      +
    • String
      The current value of the property
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasChildNodes

    + public function hasChildNodes() +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the element has childNodes
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasClass

    + public function hasClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • Boolean
      Whether or not the element has the class name
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    initAttributes

    + public function initAttributes(Object map) +
    + Registers Element specific attributes. +
    + Parameters: +
    • map : Object
      A key-value map of initial attribute configs
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    insertBefore

    + public function insertBefore(HTMLElement element, HTMLElement before) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • element : HTMLElement
      The HTMLElement to insert
    • before : HTMLElement
      The HTMLElement to insert the element before.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    on

    + public function on(String type, Function fn, Any obj, Object scope) +
    + Alias for addListener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeChild

    + public function removeChild(HTMLElement child) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • child : HTMLElement
      The HTMLElement to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeClass

    + public function removeClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeListener

    + public function removeListener(String type, Function fn) +
    + Remove an event listener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceChild

    + public function replaceChild(HTMLElement newNode, HTMLElement oldNode) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • newNode : HTMLElement
      The HTMLElement to insert
    • oldNode : HTMLElement
      The HTMLElement to replace
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceClass

    + public function replaceClass(String oldClassName, String newClassName) +
    + Wrapper for Dom method. +
    + Parameters: +
    • oldClassName : String
      The className to replace
    • newClassName : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    setStyle

    + public function setStyle(String property, String value) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to set
    • value : String
      The value to apply to the style property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    +
    + +

    Event Details

    +
    + +
    +

    available

    + public event available +
    + Fires when the Element's HTMLElement can be retrieved by Id. +

    See: Element.addListener

    +

    Event fields:
    +<String> type available
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('available', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Event.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Event.html new file mode 100644 index 000000000..31f0a1c1e --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Event.html @@ -0,0 +1,858 @@ + + + + YAHOO.util.Event + + + + + +
    + +

    Class YAHOO.util.Event

    + + + + + +
    Package:YAHOO.util
    Class:Event
    Extends:Object
    Defined In:event.js
    +
    + The event utility provides functions to add and remove event listeners, +event cleansing. It also tries to automatically remove listeners it +registers during the unload event.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ADJ_SCOPE : intEvent
    <static> Adjusted scope, either the element we are registering the event +on or the custom object passed in by t...
     EL : intEvent
    <static> Element to bind, int constant
     FN : intEvent
    <static> Function to execute, int constant
     OBJ : intEvent
    <static> Object passed in by the user that will be returned as a +parameter to the callback, int constant
     POLL_INTERVAL : intEvent
    <static> The poll interval in milliseconds
     POLL_RETRYS : intEvent
    <static> The number of times we should look for elements that are not +in the DOM at the time the event is reque...
     TYPE : intEvent
    <static> Type of event, int constant
     WFN : intEvent
    <static> Function wrapped for scope correction and cleanup, int constant
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addListener(Object el, String sType, Function fn, Object obj, boolean override) : booleanEvent
    <static> Appends an event handler
     createEvent(p_type {string}, p_config {object}) : CustomEventEvent
    Creates a new custom event of the specified type. If a custom event +by that name already exists, it will not be re-c...
     fireEvent(p_type {string}, arguments {Object*}) : booleanEvent
    Fire a custom event by name. The callback functions will be executed +from the scope specified when the event was cre...
     generateId(el the) : stringEvent
    <static> Generates an unique ID for the element if it does not already +have one.
     getCharCode(Event ev) : intEvent
    <static> Returns the charcode for an event
     getEvent(Event e) : EventEvent
    <static> Finds the event in the window object, the caller's arguments, or +in the arguments of another method in...
     getListeners(el {HTMLElement}, sType {string}) : ObjectEvent
    <static> Returns all listeners attached to the given element via addListener. +Optionally, you can specify a spe...
     getPageX(Event ev) : intEvent
    <static> Returns the event's pageX
     getPageY(Event ev) : intEvent
    <static> Returns the event's pageY
     getRelatedTarget(Event ev) : HTMLElementEvent
    <static> Returns the event's related target
     getTarget(Event ev, boolean resolveTextNode) : HTMLElementEvent
    Deprecated. <static> Returns the event's target element
     getTime(Event ev) : DateEvent
    <static> Returns the time of the event. If the time is not included, the +event is modified using the current t...
     getXY() : voidEvent
    <static> Returns the pageX and pageY properties as an indexed array.
     hasEvent(type {string}) : voidEvent
    Returns true if the custom event of the provided type has been created +with createEvent.
     on() : voidEvent
    <static> YAHOO.util.Event.on is an alias for addListener
     onAvailable(string p_id, function p_fn, object p_obj, boolean p_override) : voidEvent
    <static> Executes the supplied callback when the item with the supplied +id is found. This is meant to be used ...
     onContentReady(string p_id, function p_fn, object p_obj, boolean p_override) : voidEvent
    <static> Works the same way as onAvailable, but additionally checks the +state of sibling elements to determine ...
     preventDefault(Event ev) : voidEvent
    <static> Prevents the default behavior of the event
     purgeElement(HTMLElement el, boolean recurse, string sType) : voidEvent
    <static> Removes all listeners attached to the given element via addListener. +Optionally, the node's children c...
     removeListener(Object el, String sType, Function fn) : booleanEvent
    <static> Removes an event handler
     resolveTextNode(HTMLElement node) : HTMLElementEvent
    <static> In some cases, some browsers will return a text node inside +the actual element that was targeted. Thi...
     stopEvent(Event ev) : voidEvent
    <static> Convenience method for stopPropagation + preventDefault
     stopPropagation(Event ev) : voidEvent
    <static> Stops event propagation
     subscribe(p_type {string}, p_fn {function}, p_obj , p_obj {Object}, p_override {boolean}) : voidEvent
    Subscribe to a CustomEvent by event type
     unsubscribe(p_type {string}, p_fn {Function}, [p_obj {Object}]) : booleanEvent
    Unsubscribes the from the specified event
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    ADJ_SCOPE

    + public int ADJ_SCOPE +
    + <static> Adjusted scope, either the element we are registering the event +on or the custom object passed in by the listener, int constant
    +
    This property is defined by Event.
    +
    + +
    +

    EL

    + public int EL +
    + <static> Element to bind, int constant
    +
    This property is defined by Event.
    +
    + +
    +

    FN

    + public int FN +
    + <static> Function to execute, int constant
    +
    This property is defined by Event.
    +
    + +
    +

    OBJ

    + public int OBJ +
    + <static> Object passed in by the user that will be returned as a +parameter to the callback, int constant
    +
    This property is defined by Event.
    +
    + +
    +

    POLL_INTERVAL

    + public int POLL_INTERVAL +
    + <static> The poll interval in milliseconds
    +
    This property is defined by Event.
    +
    + +
    +

    POLL_RETRYS

    + public int POLL_RETRYS +
    + <static> The number of times we should look for elements that are not +in the DOM at the time the event is requested after the document +has been loaded. The default is 200@amp;50 ms, so it will poll +for 10 seconds or until all outstanding handlers are bound +(whichever comes first).
    +
    This property is defined by Event.
    +
    + +
    +

    TYPE

    + public int TYPE +
    + <static> Type of event, int constant
    +
    This property is defined by Event.
    +
    + +
    +

    WFN

    + public int WFN +
    + <static> Function wrapped for scope correction and cleanup, int constant
    +
    This property is defined by Event.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    addListener

    + public function addListener(Object el, String sType, Function fn, Object obj, boolean override) +
    + <static> Appends an event handler +
    + Parameters: +
    • el : Object
      The html element to assign the event to
    • sType : String
      The type of event to append
    • fn : Function
      The method the event invokes
    • obj : Object
      An arbitrary object that will be passed as a parameter to the handler
    • override : boolean
      If true, the obj passed in becomes the execution scope of the listener
    + Returns: +
      +
    • boolean
      True if the action was successful or defered, false if one or more of the elements could not have the event bound to it.
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    createEvent

    + public function createEvent(p_type {string}, p_config {object}) +
    + Creates a new custom event of the specified type. If a custom event +by that name already exists, it will not be re-created. In either +case the custom event is returned. +
    + Parameters: +
    • {string} : p_type
      the type, or name of the event
    • {object} : p_config
      optional config params. Valid properties are:
      • scope: defines the default execution scope. If not defined the default scope will be this instance.
      • silent: if true, the custom event will not generate log messages. This is false by default.
      • onSubscribeCallback: specifies a callback to execute when the event has a new subscriber. This will fire immediately for each queued subscriber if any exist prior to the creation of the event.
    + Returns: +
      +
    • CustomEvent
      the custom event
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    fireEvent

    + public function fireEvent(p_type {string}, arguments {Object*}) +
    + Fire a custom event by name. The callback functions will be executed +from the scope specified when the event was created, and with the +following parameters: +
      +
    • The first argument fire() was executed with
    • +
    • The custom object (if any) that was passed into the subscribe() +method
    • +
    +
    + Parameters: +
    • {string} : p_type
      the type, or name of the event
    • {Object*} : arguments
      an arbitrary set of parameters to pass to the handler.
    + Returns: +
      +
    • boolean
      the return value from CustomEvent.fire, or null if the custom event does not exist.
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    generateId

    + public function generateId(el the) +
    + <static> Generates an unique ID for the element if it does not already +have one. +
    + Parameters: +
    • the : el
      element to create the id for
    + Returns: +
      +
    • string
      the resulting id of the element
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getCharCode

    + public function getCharCode(Event ev) +
    + <static> Returns the charcode for an event +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • int
      the event's charCode
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getEvent

    + public function getEvent(Event e) +
    + <static> Finds the event in the window object, the caller's arguments, or +in the arguments of another method in the callstack. This is +executed automatically for events registered through the event +manager, so the implementer should not normally need to execute +this function at all. +
    + Parameters: +
    • e : Event
      the event parameter from the handler
    + Returns: +
      +
    • Event
      the event
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getListeners

    + public function getListeners(el {HTMLElement}, sType {string}) +
    + <static> Returns all listeners attached to the given element via addListener. +Optionally, you can specify a specific type of event to return. +
    + Parameters: +
    • {HTMLElement} : el
      the element to inspect
    • {string} : sType
      optional type of listener to return. If left out, all listeners will be returned
    + Returns: +
      +
    • Object
      the listener. Contains the following fields:   type: (string) the type of event   fn: (function) the callback supplied to addListener   obj: (object) the custom object supplied to addListener   adjust: (boolean) whether or not to adjust the default scope   index: (int) its position in the Event util listener cache
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getPageX

    + public function getPageX(Event ev) +
    + <static> Returns the event's pageX +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • int
      the event's pageX
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getPageY

    + public function getPageY(Event ev) +
    + <static> Returns the event's pageY +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • int
      the event's pageY
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getRelatedTarget

    + public function getRelatedTarget(Event ev) +
    + <static> Returns the event's related target +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • HTMLElement
      the event's relatedTarget
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getTarget

    + public function getTarget(Event ev, boolean resolveTextNode) +
    + Deprecated. <static> Returns the event's target element +
    + Parameters: +
    • ev : Event
      the event
    • resolveTextNode : boolean
      when set to true the target's parent will be returned if the target is a text node.
    + Returns: +
      +
    • HTMLElement
      the event's target
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getTime

    + public function getTime(Event ev) +
    + <static> Returns the time of the event. If the time is not included, the +event is modified using the current time. +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • Date
      the time of the event
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    getXY

    + public function getXY() +
    + <static> Returns the pageX and pageY properties as an indexed array. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    hasEvent

    + public function hasEvent(type {string}) +
    + Returns true if the custom event of the provided type has been created +with createEvent. +
    + Parameters: +
    • {string} : type
      the type, or name of the event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    on

    + public function on() +
    + <static> YAHOO.util.Event.on is an alias for addListener +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    onAvailable

    + public function onAvailable(string p_id, function p_fn, object p_obj, boolean p_override) +
    + <static> Executes the supplied callback when the item with the supplied +id is found. This is meant to be used to execute behavior as +soon as possible as the page loads. If you use this after the +initial page load it will poll for a fixed time for the element. +The number of times it will poll and the frequency are +configurable. By default it will poll for 10 seconds. +
    + Parameters: +
    • p_id : string
      the id of the element to look for.
    • p_fn : function
      what to execute when the element is found.
    • p_obj : object
      an optional object to be passed back as a parameter to p_fn.
    • p_override : boolean
      If set to true, p_fn will execute in the scope of p_obj
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    onContentReady

    + public function onContentReady(string p_id, function p_fn, object p_obj, boolean p_override) +
    + <static> Works the same way as onAvailable, but additionally checks the +state of sibling elements to determine if the content of the +available element is safe to modify. +
    + Parameters: +
    • p_id : string
      the id of the element to look for.
    • p_fn : function
      what to execute when the element is ready.
    • p_obj : object
      an optional object to be passed back as a parameter to p_fn.
    • p_override : boolean
      If set to true, p_fn will execute in the scope of p_obj
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    preventDefault

    + public function preventDefault(Event ev) +
    + <static> Prevents the default behavior of the event +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    purgeElement

    + public function purgeElement(HTMLElement el, boolean recurse, string sType) +
    + <static> Removes all listeners attached to the given element via addListener. +Optionally, the node's children can also be purged. +Optionally, you can specify a specific type of event to remove. +
    + Parameters: +
    • el : HTMLElement
      the element to purge
    • recurse : boolean
      recursively purge this element's children as well. Use with caution.
    • sType : string
      optional type of listener to purge. If left out, all listeners will be removed
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    removeListener

    + public function removeListener(Object el, String sType, Function fn) +
    + <static> Removes an event handler +
    + Parameters: +
    • el : Object
      the html element or the id of the element to assign the event to.
    • sType : String
      the type of event to remove.
    • fn : Function
      the method the event invokes. If fn is undefined, then all event handlers for the type of event are removed.
    + Returns: +
      +
    • boolean
      true if the unbind was successful, false otherwise.
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    resolveTextNode

    + public function resolveTextNode(HTMLElement node) +
    + <static> In some cases, some browsers will return a text node inside +the actual element that was targeted. This normalizes the +return value for getTarget and getRelatedTarget. +
    + Parameters: +
    • node : HTMLElement
      node to resolve
    + Returns: +
      +
    • HTMLElement
      the normized node
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    stopEvent

    + public function stopEvent(Event ev) +
    + <static> Convenience method for stopPropagation + preventDefault +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    stopPropagation

    + public function stopPropagation(Event ev) +
    + <static> Stops event propagation +
    + Parameters: +
    • ev : Event
      the event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    subscribe

    + public function subscribe(p_type {string}, p_fn {function}, p_obj , p_obj {Object}, p_override {boolean}) +
    + Subscribe to a CustomEvent by event type +
    + Parameters: +
    • {string} : p_type
      the type, or name of the event
    • {function} : p_fn
      the function to exectute when the event fires
    • : p_obj
    • {Object} : p_obj
      An object to be passed along when the event fires
    • {boolean} : p_override
      If true, the obj passed in becomes the execution scope of the listener
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Event.
    +
    + +
    +

    unsubscribe

    + public function unsubscribe(p_type {string}, p_fn {Function}, [p_obj {Object}]) +
    + Unsubscribes the from the specified event +
    + Parameters: +
    • {string} : p_type
      The type, or name of the event
    • {Function} : p_fn
      The function to execute
    • {Object} : p_obj
      The custom object passed to subscribe (optional)
    + Returns: +
      +
    • boolean
      true if the subscriber was found and detached.
    • +
    +
    +
    +
    This method is defined by Event.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.KeyListener.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.KeyListener.html new file mode 100644 index 000000000..d48139832 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.KeyListener.html @@ -0,0 +1,251 @@ + + + + YAHOO.util.KeyListener + + + + + +
    + +

    Class YAHOO.util.KeyListener

    + + + + + +
    Package:YAHOO.util
    Class:KeyListener
    Extends:Object
    Defined In:container_core.js
    +
    + KeyListener is a utility that provides an easy interface for listening for keydown/keyup events fired against DOM elements.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     KEYDOWN<static> : StringKeyListener
    <static> Constant representing the DOM "keydown" event.
     KEYUP<static> : StringKeyListener
    <static> Constant representing the DOM "keyup" event.
     enabled : BooleanKeyListener
    Boolean indicating the enabled/disabled state of the Tooltip
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     KeyListener(HTMLElement attachTo, String attachTo, Object keyData, Function handler, Object handler, String event)KeyListener
     disable() : voidKeyListener
    Disables the KeyListener by removing the DOM event listeners from the target DOM element
     enable() : voidKeyListener
    Enables the KeyListener by attaching the DOM event listeners to the target DOM element
     toString() : StringKeyListener
    Returns a String representation of the object.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     disabledEvent : (Object keyData)KeyListener
    The CustomEvent fired when the KeyListener is disabled via the disable() function
     enabledEvent : (Object keyData)KeyListener
    The CustomEvent fired when the KeyListener is enabled via the enable() function
    + +

    Property Details

    +
    + +
    +

    KEYDOWN<static>

    + public String KEYDOWN<static> +
    + <static> Constant representing the DOM "keydown" event.
    +
    This property is defined by KeyListener.
    +
    + +
    +

    KEYUP<static>

    + public String KEYUP<static> +
    + <static> Constant representing the DOM "keyup" event.
    +
    This property is defined by KeyListener.
    +
    + +
    +

    enabled

    + public Boolean enabled +
    + Boolean indicating the enabled/disabled state of the Tooltip
    +
    This property is defined by KeyListener.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    KeyListener

    + public function KeyListener(HTMLElement attachTo, String attachTo, Object keyData, Function handler, Object handler, String event) +
    +
    + Parameters: +
    • attachTo : HTMLElement
      The element or element ID to which the key event should be attached
    • attachTo : String
      The element or element ID to which the key event should be attached
    • keyData : Object
      The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    • handler : Function
      The CustomEvent handler to fire when the key event is detected
    • handler : Object
      An object literal representing the handler.
    • event : String
      Optional. The event (keydown or keyup) to listen for. Defaults automatically to keydown.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    disable

    + public function disable() +
    + Disables the KeyListener by removing the DOM event listeners from the target DOM element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by KeyListener.
    +
    + +
    +

    enable

    + public function enable() +
    + Enables the KeyListener by attaching the DOM event listeners to the target DOM element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by KeyListener.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the KeyListener
    • +
    +
    +
    +
    This method is defined by KeyListener.
    +
    +
    + +

    Event Details

    +
    + +
    +

    disabledEvent

    + public event disabledEvent +
    + The CustomEvent fired when the KeyListener is disabled via the disable() function +
    + Subscribers will be called with the following parameters: +
    • keyData : Object
      The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +
    +
    +
    This event is defined by KeyListener.
    +
    + +
    +

    enabledEvent

    + public event enabledEvent +
    + The CustomEvent fired when the KeyListener is enabled via the enable() function +
    + Subscribers will be called with the following parameters: +
    • keyData : Object
      The object literal representing the key(s) to detect. Possible attributes are shift(boolean), alt(boolean), ctrl(boolean) and keys(either an int or an array of ints representing keycodes).
    +
    +
    +
    This event is defined by KeyListener.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Motion.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Motion.html new file mode 100644 index 000000000..c56869809 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Motion.html @@ -0,0 +1,67 @@ + + + + YAHOO.util.Motion + + + + + +
    + +

    Class YAHOO.util.Motion

    + + + + + +
    Package:YAHOO.util
    Class:Motion
    Extends:YAHOO.util.Anim
    Defined In:animation.js
    +
    + Anim subclass for moving elements along a path defined by the "points" +member of "attributes". All "points" are arrays with x, y coordinates. +

    Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     Motion(String |, Object attributes, Number duration, Function method)Motion
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    Motion

    + public function Motion(String |, Object attributes, Number duration, Function method) +
    +
    + Parameters: +
    • | : String
      HTMLElement} el Reference to the element that will be animated
    • attributes : Object
      The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
    • duration : Number
      (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    • method : Function
      (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    +
    +
    +
    +
    + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Point.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Point.html new file mode 100644 index 000000000..39d11b46e --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Point.html @@ -0,0 +1,342 @@ + + + + YAHOO.util.Point + + + + + +
    + +

    Class YAHOO.util.Point

    + + + + + +
    Package:YAHOO.util
    Class:Point
    Extends:Region
    Defined In:dom.js
    +
    + A point is a region that is special in that it represents a single point on +the grid.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     1 : IntRegion
    The region's top extent as index, for symmetry with set/getXY
     bottom : IntRegion
    The region's bottom extent
     left : IntRegion
    The region's left extent
     right : intRegion
    The region's right extent
     top : IntRegion
    The region's top extent
     x : IntPoint
    The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry)
     y : IntPoint
    The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry)
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Point()Point
     contains(Region region) : BooleanRegion
    Returns true if this region contains the region passed in
     getArea() : IntRegion
    Returns the area of the region
     getRegion(HTMLElement el) : RegionRegion
    <static> Returns a region that is occupied by the DOM element
     intersect(Region region) : RegionRegion
    Returns the region where the passed in region overlaps with this one
     toString() : stringRegion
    toString
     union(Region region) : RegionRegion
    Returns the region representing the smallest region that can contain both +the passed in region and this region.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    1

    + public Int 1 +
    + The region's top extent as index, for symmetry with set/getXY
    +
    This property is defined by Region.
    +
    + +
    +

    bottom

    + public Int bottom +
    + The region's bottom extent
    +
    This property is defined by Region.
    +
    + +
    +

    left

    + public Int left +
    + The region's left extent
    +
    This property is defined by Region.
    +
    + +
    +

    right

    + public int right +
    + The region's right extent
    +
    This property is defined by Region.
    +
    + +
    +

    top

    + public Int top +
    + The region's top extent
    +
    This property is defined by Region.
    +
    + +
    +

    x

    + public Int x +
    + The X position of the point, which is also the right, left and index zero (for Dom.getXY symmetry)
    +
    This property is defined by Point.
    +
    + +
    +

    y

    + public Int y +
    + The Y position of the point, which is also the top, bottom and index one (for Dom.getXY symmetry)
    +
    This property is defined by Point.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Point

    + public function Point() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    contains

    + public function contains(Region region) +
    + Returns true if this region contains the region passed in +
    + Parameters: +
    • region : Region
      The region to evaluate
    + Returns: +
      +
    • Boolean
      True if the region is contained with this region, else false
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    getArea

    + public function getArea() +
    + Returns the area of the region +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      the region's area
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    getRegion

    + public function getRegion(HTMLElement el) +
    + <static> Returns a region that is occupied by the DOM element +
    + Parameters: +
    • el : HTMLElement
      The element
    + Returns: +
      +
    • Region
      The region that the element occupies
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    intersect

    + public function intersect(Region region) +
    + Returns the region where the passed in region overlaps with this one +
    + Parameters: +
    • region : Region
      The region that intersects
    + Returns: +
      +
    • Region
      The overlap region, or null if there is no overlap
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the region properties
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    union

    + public function union(Region region) +
    + Returns the region representing the smallest region that can contain both +the passed in region and this region. +
    + Parameters: +
    • region : Region
      The region that to create the union with
    + Returns: +
      +
    • Region
      The union region
    • +
    +
    +
    +
    This method is defined by Region.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Region.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Region.html new file mode 100644 index 000000000..34dbf09a5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Region.html @@ -0,0 +1,312 @@ + + + + YAHOO.util.Region + + + + + +
    + +

    Class YAHOO.util.Region

    + + + + + + +
    Package:YAHOO.util
    Class:Region
    Extends:Object
    Subclasses:Point
    Defined In:dom.js
    +
    + A region is a representation of an object on a grid. It is defined +by the top, right, bottom, left extents, so is rectangular by default. If +other shapes are required, this class could be extended to support it.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     bottom : IntRegion
    The region's bottom extent
     left : IntRegion
    The region's left extent
     right : intRegion
    The region's right extent
     1 : IntRegion
    The region's top extent as index, for symmetry with set/getXY
     top : IntRegion
    The region's top extent
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Region()Region
     contains(Region region) : BooleanRegion
    Returns true if this region contains the region passed in
     getArea() : IntRegion
    Returns the area of the region
     getRegion(HTMLElement el) : RegionRegion
    <static> Returns a region that is occupied by the DOM element
     intersect(Region region) : RegionRegion
    Returns the region where the passed in region overlaps with this one
     toString() : stringRegion
    toString
     union(Region region) : RegionRegion
    Returns the region representing the smallest region that can contain both +the passed in region and this region.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    bottom

    + public Int bottom +
    + The region's bottom extent
    +
    This property is defined by Region.
    +
    + +
    +

    left

    + public Int left +
    + The region's left extent
    +
    This property is defined by Region.
    +
    + +
    +

    right

    + public int right +
    + The region's right extent
    +
    This property is defined by Region.
    +
    + +
    +

    1

    + public Int 1 +
    + The region's top extent as index, for symmetry with set/getXY
    +
    This property is defined by Region.
    +
    + +
    +

    top

    + public Int top +
    + The region's top extent
    +
    This property is defined by Region.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Region

    + public function Region() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    contains

    + public function contains(Region region) +
    + Returns true if this region contains the region passed in +
    + Parameters: +
    • region : Region
      The region to evaluate
    + Returns: +
      +
    • Boolean
      True if the region is contained with this region, else false
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    getArea

    + public function getArea() +
    + Returns the area of the region +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Int
      the region's area
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    getRegion

    + public function getRegion(HTMLElement el) +
    + <static> Returns a region that is occupied by the DOM element +
    + Parameters: +
    • el : HTMLElement
      The element
    + Returns: +
      +
    • Region
      The region that the element occupies
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    intersect

    + public function intersect(Region region) +
    + Returns the region where the passed in region overlaps with this one +
    + Parameters: +
    • region : Region
      The region that intersects
    + Returns: +
      +
    • Region
      The overlap region, or null if there is no overlap
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the region properties
    • +
    +
    +
    +
    This method is defined by Region.
    +
    + +
    +

    union

    + public function union(Region region) +
    + Returns the region representing the smallest region that can contain both +the passed in region and this region. +
    + Parameters: +
    • region : Region
      The region that to create the union with
    + Returns: +
      +
    • Region
      The union region
    • +
    +
    +
    +
    This method is defined by Region.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Scroll.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Scroll.html new file mode 100644 index 000000000..b6895a007 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Scroll.html @@ -0,0 +1,67 @@ + + + + YAHOO.util.Scroll + + + + + +
    + +

    Class YAHOO.util.Scroll

    + + + + + +
    Package:YAHOO.util
    Class:Scroll
    Extends:YAHOO.util.Anim
    Defined In:animation.js
    +
    + Anim subclass for scrolling elements to a position defined by the "scroll" +member of "attributes". All "scroll" members are arrays with x, y scroll positions. +

    Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     Scroll(String or, Object attributes, Number duration, Function method)Scroll
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    Scroll

    + public function Scroll(String or, Object attributes, Number duration, Function method) +
    +
    + Parameters: +
    • or : String
      HTMLElement} el Reference to the element that will be animated
    • attributes : Object
      The attribute(s) to be animated. Each attribute is an object with at minimum a "to" or "by" member defined. Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). All attribute names use camelCase.
    • duration : Number
      (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based
    • method : Function
      (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method)
    +
    +
    +
    +
    + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.util.Subscriber.html b/www/extras/yui-ext/docs/output/output/YAHOO.util.Subscriber.html new file mode 100644 index 000000000..20804f9f3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.util.Subscriber.html @@ -0,0 +1,212 @@ + + + + YAHOO.util.Subscriber + + + + + +
    + +

    Class YAHOO.util.Subscriber

    + + + + + +
    Package:YAHOO.util
    Class:Subscriber
    Extends:Object
    Defined In:event.js
    +
    + Stores the subscriber information to be used when the event fires.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     fn : functionSubscriber
    The callback that will be execute when the event fires
     obj : objectSubscriber
    An optional custom object that will passed to the callback when +the event fires
     override : boolean|objectSubscriber
    The default execution scope for the event listener is defined when the +event is created (usually the object which con...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Subscriber()Subscriber
     contains(Function fn, Object obj) : booleanSubscriber
    Returns true if the fn and obj match this objects properties. +Used by the unsubscribe method to match the right subsc...
     getScope(Object defaultScope) : voidSubscriber
    Returns the execution scope for this listener. If override was set to true +the custom obj will be the scope. If ove...
     toString() : voidSubscriber
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    fn

    + public function fn +
    + The callback that will be execute when the event fires
    +
    This property is defined by Subscriber.
    +
    + +
    +

    obj

    + public object obj +
    + An optional custom object that will passed to the callback when +the event fires
    +
    This property is defined by Subscriber.
    +
    + +
    +

    override

    + public boolean|object override +
    + The default execution scope for the event listener is defined when the +event is created (usually the object which contains the event). +By setting override to true, the execution scope becomes the custom +object passed in by the subscriber. If override is an object, that +object becomes the scope.
    +
    This property is defined by Subscriber.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Subscriber

    + public function Subscriber() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    contains

    + public function contains(Function fn, Object obj) +
    + Returns true if the fn and obj match this objects properties. +Used by the unsubscribe method to match the right subscriber. +
    + Parameters: +
    • fn : Function
      the function to execute
    • obj : Object
      an object to be passed along when the event fires
    + Returns: +
      +
    • boolean
      true if the supplied arguments match this subscriber's signature.
    • +
    +
    +
    +
    This method is defined by Subscriber.
    +
    + +
    +

    getScope

    + public function getScope(Object defaultScope) +
    + Returns the execution scope for this listener. If override was set to true +the custom obj will be the scope. If override is an object, that is the +scope, otherwise the default scope will be used. +
    + Parameters: +
    • defaultScope : Object
      the scope to use if this listener does not override it.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Subscriber.
    +
    + +
    +

    toString

    + public function toString() +
    + +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Subscriber.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.AutoComplete.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.AutoComplete.html new file mode 100644 index 000000000..052a4e4e4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.AutoComplete.html @@ -0,0 +1,1616 @@ + + + + YAHOO.widget.AutoComplete + + + + + +
    + +

    Class YAHOO.widget.AutoComplete

    + + + + + +
    Package:YAHOO.widget
    Class:AutoComplete
    Extends:Object
    Defined In:autocomplete.js
    +
    + The AutoComplete class provides the customizable functionality of a plug-and-play DHTML +auto completion widget. Some key features: +
      +
    • Navigate with up/down arrow keys and/or mouse to pick a selection
    • +
    • The drop down container can "roll down" or "fly out" via configurable +animation
    • +
    • UI look-and-feel customizable through CSS, including container +attributes, borders, position, fonts, etc
    • +
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ERROR_DATANULL : StringAutoComplete
    <static> Error message for null data responses.
     ERROR_DATAPARSE : StringAutoComplete
    <static> Error message for data responses with parsing errors.
     ERROR_DATAXHR : StringAutoComplete
    <static> Error message for XHR failure.
     TYPE_FLAT : NumberAutoComplete
    <static> Flat-file data type.
     TYPE_JSON : NumberAutoComplete
    <static> JSON data type.
     TYPE_XML : NumberAutoComplete
    <static> XML data type.
     allowBrowserAutocomplete : Boolean +@defaultAutoComplete
    Whether or not to allow browsers to cache user-typed input in the input +field. Disabling this feature will prevent th...
     alwaysShowContainer : Boolean +@defaultAutoComplete
    Whether or not the results container should always be displayed. +Enabling this feature displays the container when th...
     animHoriz : Boolean +@defaultAutoComplete
    Whether or not to animate the expansion/collapse of the results container in the +horizontal direction.
     animSpeed : Number +@defaultAutoComplete
    Speed of container expand/collapse animation, in seconds..
     animVert : Boolean +@defaultAutoComplete
    Whether or not to animate the expansion/collapse of the results container in the +vertical direction.
     autoHighlight : Boolean +@defaultAutoComplete
    Whether or not the first item in results container should be automatically highlighted +on expand.
     connMgr : Object +@defaultAutoComplete
    Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager ut...
     connTimeout : Number +@defaultAutoComplete
    Number of milliseconds the XHR connection will wait for a server response. A +a value of zero indicates the XHR connec...
     data : ArrayAutoComplete
    In-memory Javascript array of strings.
     dataFunction : HTMLFunctionAutoComplete
    In-memory Javascript function that returns query results.
     dataSource : ObjectAutoComplete
    The DataSource object that encapsulates the data used for auto completion. +This object should be an inherited object ...
     delimChar : StringAutoComplete
    Query delimiter. A single character separator for multiple delimited +selections. Multiple delimiter characteres may b...
     forceSelection : Boolean +@defaultAutoComplete
    Whether or not to force the user's selection to match one of the query +results. Enabling this feature essentially tra...
     highlighClassName : String +@defaultAutoComplete
    Class name of a highlighted item within results container.
     maxCacheEntries : Number +@defaultAutoComplete
    Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connect...
     maxResultsDisplayed : Number +@defaultAutoComplete
    Maximum number of results to display in results container.
     minQueryLength : Number +@defaultAutoComplete
    Number of characters that must be entered before querying for results. A negative value +effectively turns off the wid...
     prehighlightClassName : StringAutoComplete
    Class name of a pre-highlighted item within results container.
     queryDelay : Number +@defaultAutoComplete
    Number of seconds to delay before submitting a query request. If a query +request is received before a previous one h...
     queryMatchCase : Boolean +@defaultAutoComplete
    Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return result...
     queryMatchContains : Boolean +@defaultAutoComplete
    Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and query...
     queryMatchSubset : Boolean +@defaultAutoComplete
    Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return match...
     responseStripAfter : String +@defaultAutoComplete
    String after which to strip results. If the results from the XHR are sent +back as HTML, the gzip HTML comment appears...
     responseType : String +@defaultAutoComplete
    XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML +and YAHOO.widget.DS_XHR.TYPE...
     scriptQueryAppend : String +@defaultAutoComplete
    String of key/value pairs to append to requests made to scriptURI. Define +this string when you want to send additiona...
     scriptQueryParam : String +@defaultAutoComplete
    Query string parameter name sent to scriptURI. For instance, queries will be +sent to <scriptURI>?<scriptQ...
     scriptURI : StringAutoComplete
    Absolute or relative URI to script that returns query results. For instance, +queries will be sent to <scriptURI&#...
     typeAhead : Boolean +@defaultAutoComplete
    Whether or not the input field should be automatically updated +with the first query result as the user types, auto-se...
     useIFrame : Boolean +@defaultAutoComplete
    Whether or not to use an iFrame to layer over Windows form elements in +IE. Set to true only when the results containe...
     useShadow : Boolean +@defaultAutoComplete
    Whether or not the results container should have a shadow.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     AutoComplete(elInput {HTMLElement}, elInput {String}, elContainer {HTMLElement}, elContainer {String}, oDataSource {Object}, [oConfigs {Object}])AutoComplete
     doBeforeExpandContainer() : BooleanAutoComplete
    Overridable method called before container expands allows implementers to access data +and DOM elements.
     doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidAutoComplete
    Queries the live data source defined by data for results. Results are passed +back to a callback function.
     flushCache() : voidAutoComplete
    Flushes cache.
     formatResult(oResultItem {Object}, sQuery {String}) : StringAutoComplete
    Overridable method that converts a result item object into HTML markup +for display. Return data values are accessible...
     getListItemData() : ObjectAutoComplete
    Public accessor to the data held in an <li> element of the +results container.
     getListItems() : HTMLElement[]AutoComplete
    Public accessor to the internal array of DOM <li> elements that +display query results within the results contai...
     getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) : voidAutoComplete
    Retrieves query results, first checking the local cache, then making the +query request to the live data source as def...
     isContainerOpen() : BooleanAutoComplete
    Returns true if container is in an expanded state, false otherwise.
     parseResponse(sQuery {String}, oResponse {Object}, oParent {Object}) : sAutoComplete
    Parses raw response data into an array of result objects. The result data key +is always stashed in the [0] element of...
     sendQuery(sQuery {String}) : voidAutoComplete
    Makes query request to the DataSource.
     setBody(sHeader {String}) : voidAutoComplete
    Sets HTML markup for the results container body. This markup will be +inserted within a <div> tag with a class o...
     setFooter(sFooter {String}) : voidAutoComplete
    Sets HTML markup for the results container footer. This markup will be +inserted within a <div> tag with a class...
     setHeader(sHeader {String}) : voidAutoComplete
    Sets HTML markup for the results container header. This markup will be +inserted within a <div> tag with a class...
     toString() : StringAutoComplete
    Public accessor to the unique name of the DataSource instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     cacheFlushEvent : (oSelf {Object})AutoComplete
    Fired when the local cache is flushed.
     cacheQueryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})AutoComplete
    Fired when a query is made to the local cache.
     containerCollapseEvent : (oSelf {Object})AutoComplete
    Fired when the results container is collapsed.
     containerExpandEvent : (oSelf {Object})AutoComplete
    Fired when the results container is expanded.
     dataErrorEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, sMsg {String})AutoComplete
    Fired when an error is encountered with the live data source.
     dataRequestEvent : (oSelf {Object}, sQuery {String})AutoComplete
    Fired when the AutoComplete instance makes a query to the DataSource.
     dataReturnEvent : (oSelf {Object}, sQuery {String}, aResults {Array})AutoComplete
    Fired when the AutoComplete instance receives query results from the data +source.
     getCachedResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})AutoComplete
    Fired when data is retrieved from the local cache.
     getResultsEvent : (oSelf {Object}, oParent {Object}, sQuery {String}, aResults {Object[]})AutoComplete
    Fired when data is retrieved from the live data source.
     itemArrowFromEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
    Fired when result item has been arrowed away from.
     itemArrowToEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
    Fired when result item has been arrowed to.
     itemMouseOutEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
    Fired when result item has been moused out.
     itemMouseOverEvent : (oSelf {Object}, elItem {HTMLElement})AutoComplete
    Fired when result item has been moused over.
     itemSelectEvent : (oSelf {Object}, elItem {HTMLElement}, oData {Object})AutoComplete
    Fired when an item is selected via mouse click, ENTER key, or TAB key.
     queryEvent : (oSelf {Object}, oParent {Object}, sQuery {String})AutoComplete
    Fired when a query is made to the live data source.
     selectionEnforceEvent : (oSelf {Object})AutoComplete
    Fired if forceSelection is enabled and the user's input has been cleared +because it did not match one of the returned...
     textboxBlurEvent : (oSelf {Object})AutoComplete
    Fired when the input field loses focus.
     textboxFocusEvent : (oSelf {Object})AutoComplete
    Fired when the input field receives focus.
     textboxKeyEvent : (oSelf {Object}, nKeycode {Number})AutoComplete
    Fired when the input field receives key input.
     typeAheadEvent : (oSelf {Object}, sQuery {String}, sPrefill {String})AutoComplete
    Fired when the input field has been prefilled by the type-ahead +feature.
     unmatchedItemSelectEvent : (oSelf {Object}, sQuery {String})AutoComplete
    Fired when a user selection does not match any of the displayed result items. +Note that this event may not behave as ...
    + +

    Property Details

    +
    + +
    +

    ERROR_DATANULL

    + public String ERROR_DATANULL +
    + <static> Error message for null data responses.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    ERROR_DATAPARSE

    + public String ERROR_DATAPARSE +
    + <static> Error message for data responses with parsing errors.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    ERROR_DATAXHR

    + public String ERROR_DATAXHR +
    + <static> Error message for XHR failure.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    TYPE_FLAT

    + public Number TYPE_FLAT +
    + <static> Flat-file data type.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    TYPE_JSON

    + public Number TYPE_JSON +
    + <static> JSON data type.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    TYPE_XML

    + public Number TYPE_XML +
    + <static> XML data type.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    allowBrowserAutocomplete

    + public Boolean +@default allowBrowserAutocomplete +
    + Whether or not to allow browsers to cache user-typed input in the input +field. Disabling this feature will prevent the widget from setting the +autocomplete="off" on the input field. When autocomplete="off" +and users click the back button after form submission, user-typed input can +be prefilled by the browser from its cache. This caching of user input may +not be desired for sensitive data, such as credit card numbers, in which +case, implementers should consider setting allowBrowserAutocomplete to false.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    alwaysShowContainer

    + public Boolean +@default alwaysShowContainer +
    + Whether or not the results container should always be displayed. +Enabling this feature displays the container when the widget is instantiated +and prevents the toggling of the container to a collapsed state.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    animHoriz

    + public Boolean +@default animHoriz +
    + Whether or not to animate the expansion/collapse of the results container in the +horizontal direction.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    animSpeed

    + public Number +@default animSpeed +
    + Speed of container expand/collapse animation, in seconds..
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    animVert

    + public Boolean +@default animVert +
    + Whether or not to animate the expansion/collapse of the results container in the +vertical direction.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    autoHighlight

    + public Boolean +@default autoHighlight +
    + Whether or not the first item in results container should be automatically highlighted +on expand.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    connMgr

    + public Object +@default connMgr +
    + Alias to YUI Connection Manager. Allows implementers to specify their own +subclasses of the YUI Connection Manager utility.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    connTimeout

    + public Number +@default connTimeout +
    + Number of milliseconds the XHR connection will wait for a server response. A +a value of zero indicates the XHR connection will wait forever. Any value +greater than zero will use the Connection utility's Auto-Abort feature.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    data

    + public Array data +
    + In-memory Javascript array of strings.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    dataFunction

    + public HTMLFunction dataFunction +
    + In-memory Javascript function that returns query results.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    dataSource

    + public Object dataSource +
    + The DataSource object that encapsulates the data used for auto completion. +This object should be an inherited object from YAHOO.widget.DataSource.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    delimChar

    + public String delimChar +
    + Query delimiter. A single character separator for multiple delimited +selections. Multiple delimiter characteres may be defined as an array of +strings. A null value or empty string indicates that query results cannot +be delimited. This feature is not recommended if you need forceSelection to +be true.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    forceSelection

    + public Boolean +@default forceSelection +
    + Whether or not to force the user's selection to match one of the query +results. Enabling this feature essentially transforms the input field into a +<select> field. This feature is not recommended with delimiter character(s) +defined.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    highlighClassName

    + public String +@default highlighClassName +
    + Class name of a highlighted item within results container.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    maxCacheEntries

    + public Number +@default maxCacheEntries +
    + Max size of the local cache. Set to 0 to turn off caching. Caching is +useful to reduce the number of server connections. Recommended only for data +sources that return comprehensive results for queries or when stale data is +not an issue.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    maxResultsDisplayed

    + public Number +@default maxResultsDisplayed +
    + Maximum number of results to display in results container.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    minQueryLength

    + public Number +@default minQueryLength +
    + Number of characters that must be entered before querying for results. A negative value +effectively turns off the widget. A value of 0 allows queries of null or empty string +values.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    prehighlightClassName

    + public String prehighlightClassName +
    + Class name of a pre-highlighted item within results container.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    queryDelay

    + public Number +@default queryDelay +
    + Number of seconds to delay before submitting a query request. If a query +request is received before a previous one has completed its delay, the +previous request is cancelled and the new request is set to the delay.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    queryMatchCase

    + public Boolean +@default queryMatchCase +
    + Enables query case-sensitivity matching. If caching is on and +queryMatchCase is true, queries will only return results for case-sensitive +matches.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    queryMatchContains

    + public Boolean +@default queryMatchContains +
    + Use this to equate cache matching with the type of matching done by your live +data source. If caching is on and queryMatchContains is true, the cache +returns results that "contain" the query string. By default, +queryMatchContains is set to false, meaning the cache only returns results +that "start with" the query string.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    queryMatchSubset

    + public Boolean +@default queryMatchSubset +
    + Enables query subset matching. If caching is on and queryMatchSubset is +true, substrings of queries will return matching cached results. For +instance, if the first query is for "abc" susequent queries that start with +"abc", like "abcd", will be queried against the cache, and not the live data +source. Recommended only for DataSources that return comprehensive results +for queries with very few characters.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    responseStripAfter

    + public String +@default responseStripAfter +
    + String after which to strip results. If the results from the XHR are sent +back as HTML, the gzip HTML comment appears at the end of the data and should +be ignored.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    responseType

    + public String +@default responseType +
    + XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML +and YAHOO.widget.DS_XHR.TYPE_FLAT.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    scriptQueryAppend

    + public String +@default scriptQueryAppend +
    + String of key/value pairs to append to requests made to scriptURI. Define +this string when you want to send additional query parameters to your script. +When defined, queries will be sent to +<scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend>
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    scriptQueryParam

    + public String +@default scriptQueryParam +
    + Query string parameter name sent to scriptURI. For instance, queries will be +sent to <scriptURI>?<scriptQueryParam>=userinput
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    scriptURI

    + public String scriptURI +
    + Absolute or relative URI to script that returns query results. For instance, +queries will be sent to <scriptURI>?<scriptQueryParam>=userinput
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    typeAhead

    + public Boolean +@default typeAhead +
    + Whether or not the input field should be automatically updated +with the first query result as the user types, auto-selecting the substring +that the user has not typed.
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    useIFrame

    + public Boolean +@default useIFrame +
    + Whether or not to use an iFrame to layer over Windows form elements in +IE. Set to true only when the results container will be on top of a +<select> field in IE and thus exposed to the IE z-index bug (i.e., +5.5 < IE < 7).
    +
    This property is defined by AutoComplete.
    +
    + +
    +

    useShadow

    + public Boolean +@default useShadow +
    + Whether or not the results container should have a shadow.
    +
    This property is defined by AutoComplete.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    AutoComplete

    + public function AutoComplete(elInput {HTMLElement}, elInput {String}, elContainer {HTMLElement}, elContainer {String}, oDataSource {Object}, [oConfigs {Object}]) +
    +
    + Parameters: +
    • {HTMLElement} : elInput
      DOM element reference of an input field
    • {String} : elInput
      String ID of an input field
    • {HTMLElement} : elContainer
      DOM element reference of an existing DIV
    • {String} : elContainer
      String ID of an existing DIV
    • {Object} : oDataSource
      Instance of YAHOO.widget.DataSource for query/results
    • {Object} : oConfigs
      (optional) Object literal of configuration params
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    doBeforeExpandContainer

    + public function doBeforeExpandContainer() +
    + Overridable method called before container expands allows implementers to access data +and DOM elements. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Return true to continue expanding container, false to cancel the expand.
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    doQuery

    + public function doQuery(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Queries the live data source defined by data for results. Results are passed +back to a callback function. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    flushCache

    + public function flushCache() +
    + Flushes cache. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    formatResult

    + public function formatResult(oResultItem {Object}, sQuery {String}) +
    + Overridable method that converts a result item object into HTML markup +for display. Return data values are accessible via the oResultItem object, +and the key return value will always be oResultItem[0]. Markup will be +displayed within <li> element tags in the container. +
    + Parameters: +
    • {Object} : oResultItem
      Result item representing one query result. Data is held in an array.
    • {String} : sQuery
      The current query string.
    + Returns: +
      +
    • String
      HTML markup of formatted result data.
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    getListItemData

    + public function getListItemData() +
    + Public accessor to the data held in an <li> element of the +results container. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      | Array} Object or array of result data or null
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    getListItems

    + public function getListItems() +
    + Public accessor to the internal array of DOM <li> elements that +display query results within the results container. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement[]
      Array of <li> elements within the results container.
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    getResults

    + public function getResults(oCallbackFn {HTMLFunction}, sQuery {String}, oParent {Object}) +
    + Retrieves query results, first checking the local cache, then making the +query request to the live data source as defined by the function doQuery. +
    + Parameters: +
    • {HTMLFunction} : oCallbackFn
      Callback function defined by oParent object to which to return results.
    • {String} : sQuery
      Query string.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    isContainerOpen

    + public function isContainerOpen() +
    + Returns true if container is in an expanded state, false otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Returns true if container is in an expanded state, false otherwise.
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    parseResponse

    + public function parseResponse(sQuery {String}, oResponse {Object}, oParent {Object}) +
    + Parses raw response data into an array of result objects. The result data key +is always stashed in the [0] element of each result object. +
    + Parameters: +
    • {String} : sQuery
      Query string.
    • {Object} : oResponse
      The raw response data to parse.
    • {Object} : oParent
      The object instance that has requested data.
    + Returns: +
      +
    • s
      {Object[]} Array of result objects.
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    sendQuery

    + public function sendQuery(sQuery {String}) +
    + Makes query request to the DataSource. +
    + Parameters: +
    • {String} : sQuery
      Query string.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    setBody

    + public function setBody(sHeader {String}) +
    + Sets HTML markup for the results container body. This markup will be +inserted within a <div> tag with a class of "ac_bd". +
    + Parameters: +
    • {String} : sHeader
      HTML markup for results container body.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    setFooter

    + public function setFooter(sFooter {String}) +
    + Sets HTML markup for the results container footer. This markup will be +inserted within a <div> tag with a class of "ac_ft". +
    + Parameters: +
    • {String} : sFooter
      HTML markup for results container footer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    setHeader

    + public function setHeader(sHeader {String}) +
    + Sets HTML markup for the results container header. This markup will be +inserted within a <div> tag with a class of "ac_hd". +
    + Parameters: +
    • {String} : sHeader
      HTML markup for results container header.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    + +
    +

    toString

    + public function toString() +
    + Public accessor to the unique name of the DataSource instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      Unique name of the DataSource instance
    • +
    +
    +
    +
    This method is defined by AutoComplete.
    +
    +
    + +

    Event Details

    +
    + +
    +

    cacheFlushEvent

    + public event cacheFlushEvent +
    + Fired when the local cache is flushed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    cacheQueryEvent

    + public event cacheQueryEvent +
    + Fired when a query is made to the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    containerCollapseEvent

    + public event containerCollapseEvent +
    + Fired when the results container is collapsed. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    containerExpandEvent

    + public event containerExpandEvent +
    + Fired when the results container is expanded. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    dataErrorEvent

    + public event dataErrorEvent +
    + Fired when an error is encountered with the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {String} : sMsg
      Error message string
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    dataRequestEvent

    + public event dataRequestEvent +
    + Fired when the AutoComplete instance makes a query to the DataSource. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    dataReturnEvent

    + public event dataReturnEvent +
    + Fired when the AutoComplete instance receives query results from the data +source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {String} : sQuery
      The query string.
    • {Array} : aResults
      Results array.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    getCachedResultsEvent

    + public event getCachedResultsEvent +
    + Fired when data is retrieved from the local cache. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    getResultsEvent

    + public event getResultsEvent +
    + Fired when data is retrieved from the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    • {Object[]} : aResults
      Array of result objects.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    itemArrowFromEvent

    + public event itemArrowFromEvent +
    + Fired when result item has been arrowed away from. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {HTMLElement} : elItem
      The <li> element item arrowed from.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    itemArrowToEvent

    + public event itemArrowToEvent +
    + Fired when result item has been arrowed to. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {HTMLElement} : elItem
      The <li> element item arrowed to.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    itemMouseOutEvent

    + public event itemMouseOutEvent +
    + Fired when result item has been moused out. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {HTMLElement} : elItem
      The <li> element item moused from.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    itemMouseOverEvent

    + public event itemMouseOverEvent +
    + Fired when result item has been moused over. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {HTMLElement} : elItem
      The <li> element item moused to.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    itemSelectEvent

    + public event itemSelectEvent +
    + Fired when an item is selected via mouse click, ENTER key, or TAB key. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {HTMLElement} : elItem
      The selected <li> element item.
    • {Object} : oData
      The data returned for the item, either as an object, or mapped from the schema into an array.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    queryEvent

    + public event queryEvent +
    + Fired when a query is made to the live data source. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The DataSource instance.
    • {Object} : oParent
      The requesting object.
    • {String} : sQuery
      The query string.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    selectionEnforceEvent

    + public event selectionEnforceEvent +
    + Fired if forceSelection is enabled and the user's input has been cleared +because it did not match one of the returned query results. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    textboxBlurEvent

    + public event textboxBlurEvent +
    + Fired when the input field loses focus. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    textboxFocusEvent

    + public event textboxFocusEvent +
    + Fired when the input field receives focus. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    textboxKeyEvent

    + public event textboxKeyEvent +
    + Fired when the input field receives key input. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {Number} : nKeycode
      The keycode number.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    typeAheadEvent

    + public event typeAheadEvent +
    + Fired when the input field has been prefilled by the type-ahead +feature. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {String} : sQuery
      The query string.
    • {String} : sPrefill
      The prefill string.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    + +
    +

    unmatchedItemSelectEvent

    + public event unmatchedItemSelectEvent +
    + Fired when a user selection does not match any of the displayed result items. +Note that this event may not behave as expected when delimiter characters +have been defined. +
    + Subscribers will be called with the following parameters: +
    • {Object} : oSelf
      The AutoComplete instance.
    • {String} : sQuery
      The user-typed query string.
    +
    +
    +
    This event is defined by AutoComplete.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.CalendarGroup.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.CalendarGroup.html new file mode 100644 index 000000000..4bf5fc064 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.CalendarGroup.html @@ -0,0 +1,1331 @@ + + + + YAHOO.widget.CalendarGroup + + + + + +
    + +

    Class YAHOO.widget.CalendarGroup

    + + + + + + +
    Package:YAHOO.widget
    Class:CalendarGroup
    Extends:Object
    Subclasses:Calendar2up
    Defined In:calendar.js
    +
    + YAHOO.widget.CalendarGroup is a special container class for YAHOO.widget.Calendar. This class facilitates +the ability to have multi-page calendar views that share a single dataset and are +dependent on each other. +The calendar group instance will refer to each of its elements using a 0-based index. +For example, to construct the placeholder for a calendar group widget with id "cal1" and +containerId of "cal1Container", the markup would be as follows: + +<div id="cal1Container_0"></div> +<div id="cal1Container_1"></div> + +The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_2UPCLOSE<static> : StringCalendarGroup
    <static> CSS class representing the close icon for the 2-up calendar
     CSS_2UPTITLE<static> : StringCalendarGroup
    <static> CSS class representing the title for the 2-up calendar
     CSS_CONTAINER<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     CSS_MULTI_UP<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     Locale : ObjectCalendarGroup
    The local object which contains the CalendarGroup's locale settings
     Options : ObjectCalendarGroup
    The local object which contains the CalendarGroup's options
     cfg : Number +@defaultCalendarGroup
    The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
     containerId : StringCalendarGroup
    The unique id associated with the CalendarGroup container
     id : StringCalendarGroup
    The unique id associated with the CalendarGroup
     oDomContainer : HTMLElementCalendarGroup
    The outer containing element for the CalendarGroup
     pages : YAHOO.widget.Calendar[]CalendarGroup
    The collection of Calendar pages contained within the CalendarGroup
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     CalendarGroup(String id, String containerId, Object config)CalendarGroup
     addMonthRenderer(Number month, Function fnRender) : voidCalendarGroup
    Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
     addMonths(Number count) : voidCalendarGroup
    Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
     addRenderer(String sDates, Function fnRender) : voidCalendarGroup
    Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
     addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendarGroup
    Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
     addYears(Number count) : voidCalendarGroup
    Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
     callChildFunction(String fnName, Array args) : voidCalendarGroup
    Calls a function within all child Calendars within this CalendarGroup.
     clear() : voidCalendarGroup
    Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
     configPageDate(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pagedate" property
     configPages(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pages" property
     constructChild(String id, String containerId, Object config) : YAHOO.widget.CalendarCalendarGroup
    Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be u...
     delegateConfig(String type, Object[] args, Object obj) : voidCalendarGroup
    Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
     deselect(String/Date/Date[] date) : Date[]CalendarGroup
    Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
     deselectAll() : Date[]CalendarGroup
    Deselects all dates on the current calendar.
     deselectCell(Number cellIndex) : Date[]CalendarGroup
    Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
     getSelectedDates() : AnCalendarGroup
    Gets the list of currently selected dates from the calendar.
     init(String id, String containerId, Object config) : voidCalendarGroup
    Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly.
     initEvents() : voidCalendarGroup
    Initializes CalendarGroup's built-in CustomEvents
     nextMonth() : voidCalendarGroup
    Navigates to the next month page in the calendar widget.
     nextYear() : voidCalendarGroup
    Navigates to the next year in the currently selected month in the calendar widget.
     previousMonth() : voidCalendarGroup
    Navigates to the previous month page in the calendar widget.
     previousYear() : voidCalendarGroup
    Navigates to the previous year in the currently selected month in the calendar widget.
     render() : voidCalendarGroup
    Calls the render function of all child calendars within the group.
     renderFooter() : voidCalendarGroup
    Renders a footer for the 2-up calendar container. By default, this method is +unimplemented.
     renderHeader() : voidCalendarGroup
    Renders the header for the CalendarGroup.
     reset() : voidCalendarGroup
    Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
     select(String/Date/Date[] date) : Date[]CalendarGroup
    Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
     selectCell(Number cellIndex) : Date[]CalendarGroup
    Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
     setChildFunction(String fnName, Function fn) : voidCalendarGroup
    Adds a function to all child Calendars within this CalendarGroup.
     setMonth(Number month) : voidCalendarGroup
    Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, an...
     setYear(Number year) : voidCalendarGroup
    Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and ...
     subtractMonths(Number count) : voidCalendarGroup
    Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
     subtractYears(Number count) : voidCalendarGroup
    Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
     toString() : StringCalendarGroup
    Returns a string representation of the object.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     beforeDeselectEvent : ()CalendarGroup
    Fired before a selection is made
     beforeRenderEvent : ()CalendarGroup
    Fired before the Calendar is rendered
     beforeSelectEvent : ()CalendarGroup
    Fired before a selection is made
     changePageEvent : ()CalendarGroup
    Fired when the Calendar page is changed
     clearEvent : ()CalendarGroup
    Fired when the Calendar is cleared
     deselectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
     renderEvent : ()CalendarGroup
    Fired when the Calendar is rendered
     resetEvent : ()CalendarGroup
    Fired when the Calendar is reset
     selectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
    + +

    Property Details

    +
    + +
    +

    CSS_2UPCLOSE<static>

    + public String CSS_2UPCLOSE<static> +
    + <static> CSS class representing the close icon for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_2UPTITLE<static>

    + public String CSS_2UPTITLE<static> +
    + <static> CSS class representing the title for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_CONTAINER<static>

    + public String CSS_CONTAINER<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_MULTI_UP<static>

    + public String CSS_MULTI_UP<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Locale

    + public Object Locale +
    + The local object which contains the CalendarGroup's locale settings
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Options

    + public Object Options +
    + The local object which contains the CalendarGroup's options
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    cfg

    + public Number +@default cfg +
    + The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    containerId

    + public String containerId +
    + The unique id associated with the CalendarGroup container
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    id

    + public String id +
    + The unique id associated with the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    oDomContainer

    + public HTMLElement oDomContainer +
    + The outer containing element for the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    pages

    + public YAHOO.widget.Calendar[] pages +
    + The collection of Calendar pages contained within the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    CalendarGroup

    + public function CalendarGroup(String id, String containerId, Object config) +
    +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addMonthRenderer

    + public function addMonthRenderer(Number month, Function fnRender) +
    + Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
    + Parameters: +
    • month : Number
      The month (1-12) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addMonths

    + public function addMonths(Number count) +
    + Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addRenderer

    + public function addRenderer(String sDates, Function fnRender) +
    + Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
    + Parameters: +
    • sDates : String
      A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addWeekdayRenderer

    + public function addWeekdayRenderer(Number weekday, Function fnRender) +
    + Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
    + Parameters: +
    • weekday : Number
      The weekday (0-6) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addYears

    + public function addYears(Number count) +
    + Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    callChildFunction

    + public function callChildFunction(String fnName, Array args) +
    + Calls a function within all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • args : Array
      The arguments to pass to the function
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    clear

    + public function clear() +
    + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPageDate

    + public function configPageDate(String type, Object[] args, Object obj) +
    + The default Config handler for the "pagedate" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPages

    + public function configPages(String type, Object[] args, Object obj) +
    + The default Config handler for the "pages" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    constructChild

    + public function constructChild(String id, String containerId, Object config) +
    + Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be used. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • YAHOO.widget.Calendar
      The YAHOO.widget.Calendar instance that is constructed
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    delegateConfig

    + public function delegateConfig(String type, Object[] args, Object obj) +
    + Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselect

    + public function deselect(String/Date/Date[] date) +
    + Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectAll

    + public function deselectAll() +
    + Deselects all dates on the current calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectCell

    + public function deselectCell(Number cellIndex) +
    + Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to deselect in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    getSelectedDates

    + public function getSelectedDates() +
    + Gets the list of currently selected dates from the calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • An
      array of currently selected JavaScript Date objects.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    init

    + public function init(String id, String containerId, Object config) +
    + Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes CalendarGroup's built-in CustomEvents +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextMonth

    + public function nextMonth() +
    + Navigates to the next month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextYear

    + public function nextYear() +
    + Navigates to the next year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousMonth

    + public function previousMonth() +
    + Navigates to the previous month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousYear

    + public function previousYear() +
    + Navigates to the previous year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    render

    + public function render() +
    + Calls the render function of all child calendars within the group. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderFooter

    + public function renderFooter() +
    + Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderHeader

    + public function renderHeader() +
    + Renders the header for the CalendarGroup. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    select

    + public function select(String/Date/Date[] date) +
    + Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    selectCell

    + public function selectCell(Number cellIndex) +
    + Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to select in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setChildFunction

    + public function setChildFunction(String fnName, Function fn) +
    + Adds a function to all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • fn : Function
      The function to apply to each Calendar page object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setMonth

    + public function setMonth(Number month) +
    + Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • month : Number
      The numeric month, from 0 (January) to 11 (December)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setYear

    + public function setYear(Number year) +
    + Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • year : Number
      The numeric 4-digit year
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractMonths

    + public function subtractMonths(Number count) +
    + Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractYears

    + public function subtractYears(Number count) +
    + Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      A string representation of the CalendarGroup object.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    +
    + +

    Event Details

    +
    + +
    +

    beforeDeselectEvent

    + public event beforeDeselectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + Fired before the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeSelectEvent

    + public event beforeSelectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    changePageEvent

    + public event changePageEvent +
    + Fired when the Calendar page is changed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    clearEvent

    + public event clearEvent +
    + Fired when the Calendar is cleared +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    deselectEvent

    + public event deselectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + Fired when the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    resetEvent

    + public event resetEvent +
    + Fired when the Calendar is reset +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    selectEvent

    + public event selectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Calendar_Core.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Calendar_Core.html new file mode 100644 index 000000000..ae2ac228f --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Calendar_Core.html @@ -0,0 +1,37 @@ + + + + YAHOO.widget.Calendar_Core + + + + + +
    + +

    Class YAHOO.widget.Calendar_Core

    + + + + + +
    Package:YAHOO.widget
    Class:Calendar_Core
    Extends:YAHOO.widget.Calendar
    Defined In:calendar.js
    +
    +
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    +
    This class has no public methods.
    +

    Public Events

    +
    This class has no public events.
    + + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContainerEffect.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContainerEffect.html new file mode 100644 index 000000000..ef44853d5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContainerEffect.html @@ -0,0 +1,457 @@ + + + + YAHOO.widget.ContainerEffect + + + + + +
    + +

    Class YAHOO.widget.ContainerEffect

    + + + + + +
    Package:YAHOO.widget
    Class:ContainerEffect
    Extends:Object
    Defined In:container_core.js
    +
    + ContainerEffect encapsulates animation transitions that are executed when an Overlay is shown or hidden.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     animClass : classContainerEffect
    The animation class to use for animating the overlay
     attrIn : ObjectContainerEffect
    The animation attributes to use when transitioning into view
     attrOut : ObjectContainerEffect
    The animation attributes to use when transitioning out of view
     overlay : YAHOO.widget.OverlayContainerEffect
    The overlay to animate
     targetElement : HTMLElementContainerEffect
    The target element to be animated
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     ContainerEffect(YAHOO.widget.Overlay overlay, Object attrIn, Object attrOut, HTMLElement targetElement, class Optional.)ContainerEffect
     FADE(Overlay The, Number The) : ContainerEffectContainerEffect
    <static> A pre-configured ContainerEffect instance that can be used for fading an overlay in and out.
     SLIDE(Overlay The, Number The) : ContainerEffectContainerEffect
    <static> A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out.
     animateIn() : voidContainerEffect
    Triggers the in-animation.
     animateOut() : voidContainerEffect
    Triggers the out-animation.
     handleCompleteAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
    The default onComplete handler for the in-animation.
     handleCompleteAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
    The default onComplete handler for the out-animation.
     handleStartAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
    The default onStart handler for the in-animation.
     handleStartAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
    The default onStart handler for the out-animation.
     handleTweenAnimateIn(String type, Object[] args, Object obj) : voidContainerEffect
    The default onTween handler for the in-animation.
     handleTweenAnimateOut(String type, Object[] args, Object obj) : voidContainerEffect
    The default onTween handler for the out-animation.
     init() : voidContainerEffect
    Initializes the animation classes and events.
     toString() : StringContainerEffect
    Returns a string representation of the object.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    animClass

    + public class animClass +
    + The animation class to use for animating the overlay
    +
    This property is defined by ContainerEffect.
    +
    + +
    +

    attrIn

    + public Object attrIn +
    + The animation attributes to use when transitioning into view
    +
    This property is defined by ContainerEffect.
    +
    + +
    +

    attrOut

    + public Object attrOut +
    + The animation attributes to use when transitioning out of view
    +
    This property is defined by ContainerEffect.
    +
    + +
    +

    overlay

    + public YAHOO.widget.Overlay overlay +
    + The overlay to animate
    +
    This property is defined by ContainerEffect.
    +
    + +
    +

    targetElement

    + public HTMLElement targetElement +
    + The target element to be animated
    +
    This property is defined by ContainerEffect.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    ContainerEffect

    + public function ContainerEffect(YAHOO.widget.Overlay overlay, Object attrIn, Object attrOut, HTMLElement targetElement, class Optional.) +
    +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      The Overlay that the animation should be associated with
    • attrIn : Object
      The object literal representing the animation arguments to be used for the animate-in transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    • attrOut : Object
      The object literal representing the animation arguments to be used for the animate-out transition. The arguments for this literal are: attributes(object, see YAHOO.util.Anim for description), duration(Number), and method(i.e. YAHOO.util.Easing.easeIn).
    • targetElement : HTMLElement
      Optional. The target element that should be animated during the transition. Defaults to overlay.element.
    • Optional. : class
      The animation class to instantiate. Defaults to YAHOO.util.Anim. Other options include YAHOO.util.Motion.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    FADE

    + public function FADE(Overlay The, Number The) +
    + <static> A pre-configured ContainerEffect instance that can be used for fading an overlay in and out. +
    + Parameters: +
    • The : Overlay
      Overlay object to animate
    • The : Number
      duration of the animation
    + Returns: +
      +
    • ContainerEffect
      The configured ContainerEffect object
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    SLIDE

    + public function SLIDE(Overlay The, Number The) +
    + <static> A pre-configured ContainerEffect instance that can be used for sliding an overlay in and out. +
    + Parameters: +
    • The : Overlay
      Overlay object to animate
    • The : Number
      duration of the animation
    + Returns: +
      +
    • ContainerEffect
      The configured ContainerEffect object
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    animateIn

    + public function animateIn() +
    + Triggers the in-animation. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    animateOut

    + public function animateOut() +
    + Triggers the out-animation. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleCompleteAnimateIn

    + public function handleCompleteAnimateIn(String type, Object[] args, Object obj) +
    + The default onComplete handler for the in-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleCompleteAnimateOut

    + public function handleCompleteAnimateOut(String type, Object[] args, Object obj) +
    + The default onComplete handler for the out-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleStartAnimateIn

    + public function handleStartAnimateIn(String type, Object[] args, Object obj) +
    + The default onStart handler for the in-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleStartAnimateOut

    + public function handleStartAnimateOut(String type, Object[] args, Object obj) +
    + The default onStart handler for the out-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleTweenAnimateIn

    + public function handleTweenAnimateIn(String type, Object[] args, Object obj) +
    + The default onTween handler for the in-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    handleTweenAnimateOut

    + public function handleTweenAnimateOut(String type, Object[] args, Object obj) +
    + The default onTween handler for the out-animation. +
    + Parameters: +
    • type : String
      The CustomEvent type
    • args : Object[]
      The CustomEvent arguments
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    init

    + public function init() +
    + Initializes the animation classes and events. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the ContainerEffect
    • +
    +
    +
    +
    This method is defined by ContainerEffect.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenu.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenu.html new file mode 100644 index 000000000..946583e98 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenu.html @@ -0,0 +1,1958 @@ + + + + YAHOO.widget.ContextMenu + + + + + +
    + +

    Class YAHOO.widget.ContextMenu

    + + + + + +
    Package:YAHOO.widget
    Class:ContextMenu
    Extends:Menu
    Defined In:menu.js
    +
    + Creates a list of options or commands which are made visible in response to +an HTML element's "contextmenu" event ("mousedown" for Opera).
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_CLASS_NAME : StringMenu
    @description String representing the CSS class(es) to be applied to the +menu's <div> element. +@default "yuime...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     GROUP_TITLE_TAG_NAME : StringMenu
    @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@f...
     ITEM_TYPE : YAHOO.widget.MenuItemMenu
    @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either &#...
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     activeItem : YAHOO.widget.MenuItemMenu
    @description Object reference to the item in the menu that has focus. +@default null
     cfg : String| + ContextMenu
    @config trigger +@description The HTML element(s) whose "contextmenu" event ("mousedown" +for Opera) trigger the displa...
     contextEventTarget : + ContextMenu
    @description Object reference for the HTML element that was the target of the +"contextmenu" DOM event ("mousedown" fo...
     itemData : ArrayMenu
    @description Array of items to be added to the menu. The array can contain +strings representing the text for each it...
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     lazyLoad : BooleanMenu
    @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and r...
     parent : YAHOO.widget.MenuItemMenu
    @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor us...
     srcElement : + Menu
    @description Object reference to the HTML element (either +<select> or <div>) used to +create the menu....
     value : ArrayMenu
    @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu item. The fo...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     ContextMenu()ContextMenu
     _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "click" event handler for the menu. +@protected
     _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "keydown" event handler for the menu. +@protected
     _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseout" event handler for the menu. +@protected
     _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseover" event handler for the menu. +@protected
     addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Appends an item to the menu.
     addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
    @description Adds an array of items to the menu.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     clearActiveItem(Boolean p_bBlur) : voidMenu
    @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's sub...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "container" configuration property +of the menu changes.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "hidedelay" configuration property +of the menu changes.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "position" configuration property +of the menu changes.
     configTrigger(String p_sType, Array p_aArgs, YAHOO.widget.ContextMenu p_oMenu) : voidContextMenu
    @description Event handler for when the value of the "trigger" configuration +property changes.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidContextMenu
    @description Removes the context menu's <div> element +(and accompanying child nodes) from the document.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Returns the item at the specified index.
     getItemGroups() : ArrayMenu
    @description Returns a multi-dimensional array of all of the items in the menu.
     getRoot() : voidMenu
    @description Finds the menu's root menu.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String p_oElement, String p_oElement, , Object p_oConfig) : voidContextMenu
    @description The ContextMenu class's initialization method. This method is +automatically called by the constructor, a...
     initDefaultConfig() : voidContextMenu
    @description Initializes the class's configurable properties which can be +changed using the context menu's Config obj...
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Inserts an item into the menu at the specified index.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Removes the specified item from the menu.
     setInitialFocus() : voidMenu
    @description Sets focus to the menu's first enabled item.
     setInitialSelection() : voidMenu
    @description Sets the "selected" configuration property of the menu's first +enabled item to "true."
     setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
    @description Sets the title of a group of menu items.
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringContextMenu
    @description Returns a string representing the context menu.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     clickEvent : ()Menu
    @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
     itemAddedEvent : ()Menu
    @description Fires when an item is added to the menu.
     itemRemovedEvent : ()Menu
    @description Fires when an item is removed to the menu.
     keyDownEvent : ()Menu
    @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event obj...
     keyPressEvent : ()Menu
    @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the...
     keyUpEvent : ()Menu
    @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event ob...
     mouseDownEvent : ()Menu
    @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
     mouseOutEvent : ()Menu
    @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
     mouseOverEvent : ()Menu
    @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
     mouseUpEvent : ()Menu
    @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event...
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the +menu's <div> element. +@default "yuimenu" +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    GROUP_TITLE_TAG_NAME

    + public String GROUP_TITLE_TAG_NAME +
    + @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    ITEM_TYPE

    + public YAHOO.widget.MenuItem ITEM_TYPE +
    + @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element. +@default YAHOO.widget.MenuItem +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    activeItem

    + public YAHOO.widget.MenuItem activeItem +
    + @description Object reference to the item in the menu that has focus. +@default null
    +
    This property is defined by Menu.
    +
    + + + + + +
    +

    itemData

    + public Array itemData +
    + @description Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    lazyLoad

    + public Boolean lazyLoad +
    + @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal. +@default false
    +
    This property is defined by Menu.
    +
    + +
    +

    parent

    + public YAHOO.widget.MenuItem parent +
    + @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + + + +
    +

    value

    + public Array value +
    + @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu item. The format is: [itemCorner, submenuCorner]. By default +a submenu's top left corner is aligned to its parent menu item's top +right corner. +@default ["tl","tr"]
    +
    This property is defined by Menu.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    ContextMenu

    + public function ContextMenu() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    _onClick

    + public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "click" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onKeyDown

    + public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "keydown" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOut

    + public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseout" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOver

    + public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseover" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItem

    + public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
    + @description Appends an item to the menu. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItems

    + public function addItems(Array p_aItems, Number p_nGroupIndex) +
    + @description Adds an array of items to the menu. +
    + Parameters: +
    • p_aItems : Array
      Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the items belongs.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    clearActiveItem

    + public function clearActiveItem(Boolean p_bBlur) +
    + @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
    + Parameters: +
    • p_bBlur : Boolean
      Boolean indicating if the menu's active item should be blurred.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "container" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHideDelay

    + public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "hidedelay" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configPosition

    + public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "position" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configTrigger

    + public function configTrigger(String p_sType, Array p_aArgs, YAHOO.widget.ContextMenu p_oMenu) +
    + @description Event handler for when the value of the "trigger" configuration +property changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.ContextMenu
      Object representing the context menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + @description Removes the context menu's <div> element +(and accompanying child nodes) from the document. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    getItem

    + public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Returns the item at the specified index. +
    + Parameters: +
    • p_nItemIndex : Number
      Number indicating the ordinal position of the item to be retrieved.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItemGroups

    + public function getItemGroups() +
    + @description Returns a multi-dimensional array of all of the items in the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + @description Finds the menu's root menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the context menu. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes the class's configurable properties which can be +changed using the context menu's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + @description Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + @description Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + @description Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + @description Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the context menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by ContextMenu.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + @description Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + @description Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenuItem.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenuItem.html new file mode 100644 index 000000000..21c6df406 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.ContextMenuItem.html @@ -0,0 +1,1385 @@ + + + + YAHOO.widget.ContextMenuItem + + + + + +
    + +

    Class YAHOO.widget.ContextMenuItem

    + + + + + +
    Package:YAHOO.widget
    Class:ContextMenuItem
    Extends:MenuItem
    Defined In:menu.js
    +
    + Creates an item for a context menu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
     CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuc...
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Col...
     CSS_CLASS_NAME : StringMenuItem
    @description String representing the CSS class(es) to be applied to the +<li> element of the menu item. +@defau...
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image when the item is disable...
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/...
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu ...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item ...
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the subme...
     IMG_ROOT : StringMenuItem
    @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yim...
     IMG_ROOT_SSL : StringMenuItem
    @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.n...
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/...
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item ...
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +menu item's submenu arrow indicator. +@defau...
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu ite...
     browser : StringMenuItem
    @description String representing the browser.
     configHelpText : String| + MenuItem
    @config helptext +@description String specifying additional instructional text to +accompany the text for the nenu item...
     configSubmenu : Menu|String|Object| + MenuItem
    @config submenu +@description Object specifying the submenu to be appended to the +menu item. The value can be one of ...
     constructor : YAHOO.widget.MenuItemMenuItem
    @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
     element : + MenuItem
    @description Object reference to the menu item's +<li> element. +@default HTMLLIElement
     groupIndex : NumberMenuItem
    @description Number indicating the index of the group to which the menu +item belongs. +@default null
     imageRoot : StringMenuItem
    @description String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    @description Number indicating the ordinal position of the menu item in +its group. +@default null
     isSecure : BooleanMenuItem
    @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    @description Object reference to the menu item's parent menu. +@default null
     srcElement : + MenuItem
    @description Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used ...
     submenuIndicator : + MenuItem
    @description Object reference to the <img> element +used to create the submenu indicator for the menu item. +@d...
     value : ObjectMenuItem
    @description Object reference to the menu item's value. +@default null
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     ContextMenuItem()ContextMenuItem
     blur() : voidMenuItem
    @description Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    @description Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    @description Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's previous enabled sibling.
     init(String p_oObject, , ContextMenuItem
    @description The ContextMenuItem class's initialization method. This method +is automatically called by the constructo...
     initDefaultConfig() : voidMenuItem
    @description Initializes an item's configurable properties.
     toString() : StringContextMenuItem
    @description Returns a string representing the context menu item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    @description Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    @description Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    @description Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an ...
     keyPressEvent : ()MenuItem
    @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event...
     keyUpEvent : ()MenuItem
    @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an...
     mouseDownEvent : ()MenuItem
    @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Collapsed. Click to expand." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the +<li> element of the menu item. +@default "yuimenuitem" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image when the item is disabled. +@default "Checked. (Item disabled.)" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/bsc/menuchk8_dim_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled. +@default "Disabled." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled. +@default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible. +@default "Expanded. Click to collapse." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.net/sec.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/bsc/menuchk8_hov_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected. +@default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +menu item's submenu arrow indicator. +@default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element. +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + @description String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    configSubmenu

    + public Menu|String|Object| + +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + @description Number indicating the index of the group to which the menu +item belongs. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + @description String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + @description Number indicating the ordinal position of the menu item in +its group. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + @description Object reference to the menu item's parent menu. +@default null
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + @description Object reference to the menu item's value. +@default null
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    ContextMenuItem

    + public function ContextMenuItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + @description Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + @description Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + @description Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + @description Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + @description Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + @description The ContextMenuItem class's initialization method. This method +is automatically called by the constructor, and sets up all DOM references +for pre-existing markup, and creates required markup if it is not +already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the context menu item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the context menu item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the context menu item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by ContextMenuItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the context menu item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by ContextMenuItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + @description Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + @description Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + @description Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.DateMath.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.DateMath.html new file mode 100644 index 000000000..a06b88b91 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.DateMath.html @@ -0,0 +1,3369 @@ + + + + YAHOO.widget.DateMath + + + + + +
    + +

    Class YAHOO.widget.DateMath

    + + + + + +
    Package:YAHOO.widget
    Class:DateMath
    Extends:Object
    Defined In:calendar.js
    +
    + YAHOO.widget.DateMath is used for simple date manipulation. The class is a static utility +used for adding, subtracting, and comparing dates.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_CALENDAR : ObjectDateMath
     CSS_CELL : ObjectDateMath
     CSS_CELL_BOTTOM : ObjectDateMath
     CSS_CELL_HIGHLIGHT1 : ObjectDateMath
     CSS_CELL_HIGHLIGHT2 : ObjectDateMath
     CSS_CELL_HIGHLIGHT3 : ObjectDateMath
     CSS_CELL_HIGHLIGHT4 : ObjectDateMath
     CSS_CELL_HOVER : ObjectDateMath
     CSS_CELL_LEFT : ObjectDateMath
     CSS_CELL_OOB : ObjectDateMath
     CSS_CELL_OOM : ObjectDateMath
     CSS_CELL_RESTRICTED : ObjectDateMath
     CSS_CELL_RIGHT : ObjectDateMath
     CSS_CELL_SELECTABLE : ObjectDateMath
     CSS_CELL_SELECTED : ObjectDateMath
     CSS_CELL_TODAY : ObjectDateMath
     CSS_CELL_TOP : ObjectDateMath
     CSS_CONTAINER : ObjectDateMath
     CSS_FOOTER : ObjectDateMath
     CSS_HEADER : ObjectDateMath
     CSS_HEADER_TEXT : ObjectDateMath
     CSS_NAV_LEFT : ObjectDateMath
     CSS_NAV_RIGHT : ObjectDateMath
     CSS_ROW_FOOTER : ObjectDateMath
     CSS_ROW_HEADER : ObjectDateMath
     CSS_SINGLE : ObjectDateMath
     CSS_WEEKDAY_CELL : ObjectDateMath
     CSS_WEEKDAY_ROW : ObjectDateMath
     DATE<static> : StringDateMath
    <static> Type constant used for renderers to represent an individual date (M/D/Y)
     DAY : StringDateMath
    <static> Constant field representing Day
     DISPLAY_DAYS<static> : NumberDateMath
    <static> Constant that represents the total number of date cells that are displayed in a given month
     Locale : ObjectDateMath
    The local object which contains the Calendar's locale settings
     MONTH : StringDateMath
    <static> Constant field representing Month
     MONTH<static> : StringDateMath
    <static> Type constant used for renderers to represent a month across any year
     MONTH_DAY<static> : StringDateMath
    <static> Type constant used for renderers to represent an individual date across any year (M/D)
     ONE_DAY_MS : NumberDateMath
    <static> Constant field representing one day, in milliseconds
     Options : ObjectDateMath
    The local object which contains the Calendar's options
     RANGE<static> : StringDateMath
    <static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
     STOP_RENDER<static> : StringDateMath
    <static> Constant used for halting the execution of the remainder of the render stack
     Style : ObjectDateMath
    Collection of Style constants for the Calendar
     WEEK : StringDateMath
    <static> Constant field representing Week
     WEEKDAY<static> : StringDateMath
    <static> Type constant used for renderers to represent a weekday
     YEAR : StringDateMath
    <static> Constant field representing Year
     browser : StringDateMath
    Returns a string representing the current browser.
     cellDates : Array[](Number[])DateMath
    The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays...
     cells : HTMLTableCellElement[]DateMath
    The collection of calendar table cells
     cfg : Number +@defaultDateMath
    The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
     domEventMap : ObjectDateMath
    A map of DOM event handlers to attach to cells associated with specific CSS class names
     https : StringDateMath
    <static> The path to be used for images loaded for the Calendar
     id : StringDateMath
    The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
     index : NumberDateMath
    The index of this item in the parent group
     oDomContainer : HTMLElementDateMath
    The DOM element reference that points to this calendar's container element. The calendar will be inserted into this e...
     parent : CalendarGroupDateMath
    The parent CalendarGroup, only to be set explicitly by the parent group
     renderStack : Array[]DateMath
    The list of render functions, along with required parameters, used to render cells.
     today : DateDateMath
    A Date object representing today's date.
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     add(Date date, String field, Number amount) : DateDateMath
    Adds the specified amount of time to the this instance.
     addMonthRenderer(Number month, Function fnRender) : voidDateMath
    Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
     addMonths(Number count) : voidDateMath
    Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
     addRenderer(String sDates, Function fnRender) : voidDateMath
    Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
     addWeekdayRenderer(Number weekday, Function fnRender) : voidDateMath
    Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
     addYears(Number count) : voidDateMath
    Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
     after(Date date, Date compareTo) : BooleanDateMath
    Determines whether a given date is after another date on the calendar.
     applyListeners() : voidDateMath
    Applies the Calendar's DOM listeners to applicable elements.
     before(Date date, Date compareTo) : BooleanDateMath
    Determines whether a given date is before another date on the calendar.
     between(Date date, Date dateBegin, Date dateEnd) : BooleanDateMath
    Determines whether a given date is between two other dates on the calendar.
     buildDayLabel(Date workingDate) : StringDateMath
    Builds the date digit that will be displayed in calendar cells
     buildMonthLabel() : StringDateMath
    Builds the date label that will be displayed in the calendar header or +footer, depending on configuration.
     buildWeekdays(Array html) : ArrayDateMath
    Renders the Calendar's weekday headers.
     clear() : voidDateMath
    Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
     clearAllBodyCellStyles(style The) : voidDateMath
    Removes all styles from all body cells in the current calendar table.
     clearElement(HTMLTableCellElement The) : voidDateMath
    Clears the inner HTML, CSS class and style information from the specified cell.
     clearTime(Date date) : DateDateMath
    Clears the time fields from a given date, effectively setting the time to midnight.
     configClose() : voidDateMath
    Default handler for the "close" property
     configIframe() : voidDateMath
    Renders the built-in IFRAME shim for the IE6 and below
     configLocale() : voidDateMath
    The default handler for all configuration locale properties
     configLocaleValues() : voidDateMath
    The default handler for all configuration locale field length properties
     configMaxDate() : voidDateMath
    The default handler for the "maxdate" property
     configMinDate() : voidDateMath
    The default handler for the "mindate" property
     configOptions() : voidDateMath
    The default handler for all configuration options properties
     configPageDate() : voidDateMath
    The default handler for the "pagedate" property
     configSelected() : voidDateMath
    The default handler for the "selected" property
     configTitle() : voidDateMath
    Default handler for the "title" property
     deselect(String/Date/Date[] date) : Date[]DateMath
    Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
     deselectAll() : Date[]DateMath
    Deselects all dates on the current calendar.
     deselectCell(Number cellIndex) : Date[]DateMath
    Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
     doCellMouseOut(DOMEvent e, Calendar cal) : voidDateMath
    The event that is executed when the user moves the mouse out of a cell
     doCellMouseOver(DOMEvent e, Calendar cal) : voidDateMath
    The event that is executed when the user hovers over a cell
     doSelectCell(DOMEvent e, Calendar cal) : voidDateMath
    The default event function that is attached to a date link within a calendar cell +when the calendar is rendered.
     findMonthEnd(Date date) : DateDateMath
    Gets the last day of a month containing a given date.
     findMonthStart(Date date) : DateDateMath
    Gets the first day of a month containing a given date.
     getDateByCellId(String id) : DateDateMath
    Retrieves the Date object for the specified Calendar cell
     getDateFieldsByCellId(String id) : ArrayDateMath
    Retrieves the Date object for the specified Calendar cell
     getDayOffset(Date date, Number calendarYear) : NumberDateMath
    Calculates the number of days the specified date is from January 1 of the specified calendar year. +Passing January 1 ...
     getJan1(Number calendarYear) : DateDateMath
    Retrieves a JavaScript Date object representing January 1 of any given year.
     getSelectedDates() : Date[]DateMath
    Gets the list of currently selected dates from the calendar.
     getWeekNumber(Date date, Number calendarYear, Number weekStartsOn) : NumberDateMath
    Calculates the week number for the given date. This function assumes that week 1 is the +week in which January 1 appea...
     hide() : voidDateMath
    Hides the Calendar's outer container from view.
     init(String id, String containerId, Object config) : voidDateMath
    Initializes the Calendar widget.
     initEvents() : voidDateMath
    Initializes Calendar's built-in CustomEvents
     initStyles() : voidDateMath
    Defines the style constants for the Calendar
     isDateOOM(Date date) : BooleanDateMath
    Determines whether a given date is OOM (out of month).
     isMonthOverlapWeek(Date weekBeginDate) : BooleanDateMath
    Determines if a given week overlaps two different months.
     isYearOverlapWeek(Date weekBeginDate) : BooleanDateMath
    Determines if a given week overlaps two different years.
     nextMonth() : voidDateMath
    Navigates to the next month page in the calendar widget.
     nextYear() : voidDateMath
    Navigates to the next year in the currently selected month in the calendar widget.
     onBeforeDeselect() : voidDateMath
    Deprecated. Event executed before a date is deselected in the calendar widget.
     onBeforeSelect() : voidDateMath
    Deprecated. Event executed before a date is selected in the calendar widget.
     onChangePage() : voidDateMath
    Deprecated. Event executed when the user navigates to a different calendar page.
     onDeselect(Array selected) : voidDateMath
    Deprecated. Event executed when a date is deselected in the calendar widget.
     onRender() : voidDateMath
    Deprecated. Event executed when the calendar widget is rendered.
     onSelect(Array selected) : voidDateMath
    Deprecated. Event executed when a date is selected in the calendar widget.
     previousMonth() : voidDateMath
    Navigates to the previous month page in the calendar widget.
     previousYear() : voidDateMath
    Navigates to the previous year in the currently selected month in the calendar widget.
     render() : voidDateMath
    Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections.
     renderBody(Date workingDate, Array html) : ArrayDateMath
    Renders the calendar body.
     renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) : StringDateMath
    Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style.
     renderCellDefault(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard defaul...
     renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) : StringDateMath
    Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing th...
     renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Renders a single standard calendar cell using the CSS hightlight1 style
     renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Renders a single standard calendar cell using the CSS hightlight2 style
     renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Renders a single standard calendar cell using the CSS hightlight3 style
     renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Renders a single standard calendar cell using the CSS hightlight4 style
     renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) : StringDateMath
    Applies the default style used for rendering selected dates to the current calendar cell
     renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Applies the default style used for rendering today's date to the current calendar cell
     renderFooter(Array html) : ArrayDateMath
    Renders the calendar footer. In the default implementation, there is +no footer.
     renderHeader(Array html) : ArrayDateMath
    Renders the calendar header.
     renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) : StringDateMath
    Renders a cell that falls before the minimum date or after the maximum date. +widget class.
     renderRowFooter(Number weekNum, Array cell) : voidDateMath
    Renders the row footer for a week.
     renderRowHeader(Number weekNum, Array cell) : voidDateMath
    Renders the row header for a week.
     reset() : voidDateMath
    Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
     resetRenderers() : voidDateMath
    Resets the render stack of the current calendar to its original pre-render value.
     select(String/Date/Date[] date) : Date[]DateMath
    Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
     selectCell(Number cellIndex) : Date[]DateMath
    Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
     setMonth(Number month) : voidDateMath
    Sets the calendar's month explicitly
     setYear(Number year) : voidDateMath
    Sets the calendar's year explicitly.
     show() : voidDateMath
    Shows the Calendar's outer container.
     styleCellDefault(Date workingDate, HTMLTableCellElement cell) : voidDateMath
    Styles a selectable cell.
     subtract(Date date, Number field, Number amount) : DateDateMath
    Subtracts the specified amount of time from the this instance.
     subtractMonths(Number count) : voidDateMath
    Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
     subtractYears(Number count) : voidDateMath
    Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
     toString() : StringDateMath
    Returns a string representation of the object.
     validate() : ShouldDateMath
    Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     beforeDeselectEvent : ()DateMath
    Fired before a selection is made
     beforeRenderEvent : ()DateMath
    Fired before the Calendar is rendered
     beforeSelectEvent : ()DateMath
    Fired before a selection is made
     changePageEvent : ()DateMath
    Fired when the Calendar page is changed
     clearEvent : ()DateMath
    Fired when the Calendar is cleared
     deselectEvent : (Array Array)DateMath
    Fired when a selection is made
     renderEvent : ()DateMath
    Fired when the Calendar is rendered
     resetEvent : ()DateMath
    Fired when the Calendar is reset
     selectEvent : (Array Array)DateMath
    Fired when a selection is made
    + +

    Property Details

    +
    + +
    +

    CSS_CALENDAR

    + public Object CSS_CALENDAR +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL

    + public Object CSS_CELL +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_BOTTOM

    + public Object CSS_CELL_BOTTOM +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_HIGHLIGHT1

    + public Object CSS_CELL_HIGHLIGHT1 +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_HIGHLIGHT2

    + public Object CSS_CELL_HIGHLIGHT2 +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_HIGHLIGHT3

    + public Object CSS_CELL_HIGHLIGHT3 +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_HIGHLIGHT4

    + public Object CSS_CELL_HIGHLIGHT4 +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_HOVER

    + public Object CSS_CELL_HOVER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_LEFT

    + public Object CSS_CELL_LEFT +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_OOB

    + public Object CSS_CELL_OOB +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_OOM

    + public Object CSS_CELL_OOM +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_RESTRICTED

    + public Object CSS_CELL_RESTRICTED +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_RIGHT

    + public Object CSS_CELL_RIGHT +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_SELECTABLE

    + public Object CSS_CELL_SELECTABLE +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_SELECTED

    + public Object CSS_CELL_SELECTED +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_TODAY

    + public Object CSS_CELL_TODAY +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CELL_TOP

    + public Object CSS_CELL_TOP +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_CONTAINER

    + public Object CSS_CONTAINER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_FOOTER

    + public Object CSS_FOOTER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_HEADER

    + public Object CSS_HEADER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_HEADER_TEXT

    + public Object CSS_HEADER_TEXT +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_NAV_LEFT

    + public Object CSS_NAV_LEFT +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_NAV_RIGHT

    + public Object CSS_NAV_RIGHT +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_ROW_FOOTER

    + public Object CSS_ROW_FOOTER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_ROW_HEADER

    + public Object CSS_ROW_HEADER +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_SINGLE

    + public Object CSS_SINGLE +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_WEEKDAY_CELL

    + public Object CSS_WEEKDAY_CELL +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    CSS_WEEKDAY_ROW

    + public Object CSS_WEEKDAY_ROW +
    +
    +
    This property is defined by DateMath.
    +
    + +
    +

    DATE<static>

    + public String DATE<static> +
    + <static> Type constant used for renderers to represent an individual date (M/D/Y)
    +
    This property is defined by DateMath.
    +
    + +
    +

    DAY

    + public String DAY +
    + <static> Constant field representing Day
    +
    This property is defined by DateMath.
    +
    + +
    +

    DISPLAY_DAYS<static>

    + public Number DISPLAY_DAYS<static> +
    + <static> Constant that represents the total number of date cells that are displayed in a given month
    +
    This property is defined by DateMath.
    +
    + +
    +

    Locale

    + public Object Locale +
    + The local object which contains the Calendar's locale settings
    +
    This property is defined by DateMath.
    +
    + +
    +

    MONTH

    + public String MONTH +
    + <static> Constant field representing Month
    +
    This property is defined by DateMath.
    +
    + +
    +

    MONTH<static>

    + public String MONTH<static> +
    + <static> Type constant used for renderers to represent a month across any year
    +
    This property is defined by DateMath.
    +
    + +
    +

    MONTH_DAY<static>

    + public String MONTH_DAY<static> +
    + <static> Type constant used for renderers to represent an individual date across any year (M/D)
    +
    This property is defined by DateMath.
    +
    + +
    +

    ONE_DAY_MS

    + public Number ONE_DAY_MS +
    + <static> Constant field representing one day, in milliseconds
    +
    This property is defined by DateMath.
    +
    + +
    +

    Options

    + public Object Options +
    + The local object which contains the Calendar's options
    +
    This property is defined by DateMath.
    +
    + +
    +

    RANGE<static>

    + public String RANGE<static> +
    + <static> Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y)
    +
    This property is defined by DateMath.
    +
    + +
    +

    STOP_RENDER<static>

    + public String STOP_RENDER<static> +
    + <static> Constant used for halting the execution of the remainder of the render stack
    +
    This property is defined by DateMath.
    +
    + +
    +

    Style

    + public Object Style +
    + Collection of Style constants for the Calendar
    +
    This property is defined by DateMath.
    +
    + +
    +

    WEEK

    + public String WEEK +
    + <static> Constant field representing Week
    +
    This property is defined by DateMath.
    +
    + +
    +

    WEEKDAY<static>

    + public String WEEKDAY<static> +
    + <static> Type constant used for renderers to represent a weekday
    +
    This property is defined by DateMath.
    +
    + +
    +

    YEAR

    + public String YEAR +
    + <static> Constant field representing Year
    +
    This property is defined by DateMath.
    +
    + +
    +

    browser

    + public String browser +
    + Returns a string representing the current browser.
    +
    This property is defined by DateMath.
    +
    + +
    +

    cellDates

    + public Array[](Number[]) cellDates +
    + The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D].
    +
    This property is defined by DateMath.
    +
    + +
    +

    cells

    + public HTMLTableCellElement[] cells +
    + The collection of calendar table cells
    +
    This property is defined by DateMath.
    +
    + +
    +

    cfg

    + public Number +@default cfg +
    + The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
    +
    This property is defined by DateMath.
    +
    + +
    +

    domEventMap

    + public Object domEventMap +
    + A map of DOM event handlers to attach to cells associated with specific CSS class names
    +
    This property is defined by DateMath.
    +
    + +
    +

    https

    + public String https +
    + <static> The path to be used for images loaded for the Calendar
    +
    This property is defined by DateMath.
    +
    + +
    +

    id

    + public String id +
    + The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page.
    +
    This property is defined by DateMath.
    +
    + +
    +

    index

    + public Number index +
    + The index of this item in the parent group
    +
    This property is defined by DateMath.
    +
    + +
    +

    oDomContainer

    + public HTMLElement oDomContainer +
    + The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered.
    +
    This property is defined by DateMath.
    +
    + +
    +

    parent

    + public CalendarGroup parent +
    + The parent CalendarGroup, only to be set explicitly by the parent group
    +
    This property is defined by DateMath.
    +
    + +
    +

    renderStack

    + public Array[] renderStack +
    + The list of render functions, along with required parameters, used to render cells.
    +
    This property is defined by DateMath.
    +
    + +
    +

    today

    + public Date today +
    + A Date object representing today's date.
    +
    This property is defined by DateMath.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    add

    + public function add(Date date, String field, Number amount) +
    + Adds the specified amount of time to the this instance. +
    + Parameters: +
    • date : Date
      The JavaScript Date object to perform addition on
    • field : String
      The field constant to be used for performing addition.
    • amount : Number
      The number of units (measured in the field constant) to add to the date.
    + Returns: +
      +
    • Date
      The resulting Date object
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    addMonthRenderer

    + public function addMonthRenderer(Number month, Function fnRender) +
    + Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
    + Parameters: +
    • month : Number
      The month (1-12) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    addMonths

    + public function addMonths(Number count) +
    + Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    addRenderer

    + public function addRenderer(String sDates, Function fnRender) +
    + Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
    + Parameters: +
    • sDates : String
      A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    addWeekdayRenderer

    + public function addWeekdayRenderer(Number weekday, Function fnRender) +
    + Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
    + Parameters: +
    • weekday : Number
      The weekday (0-6) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    addYears

    + public function addYears(Number count) +
    + Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    after

    + public function after(Date date, Date compareTo) +
    + Determines whether a given date is after another date on the calendar. +
    + Parameters: +
    • date : Date
      The Date object to compare with the compare argument
    • compareTo : Date
      The Date object to use for the comparison
    + Returns: +
      +
    • Boolean
      true if the date occurs after the compared date; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    applyListeners

    + public function applyListeners() +
    + Applies the Calendar's DOM listeners to applicable elements. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    before

    + public function before(Date date, Date compareTo) +
    + Determines whether a given date is before another date on the calendar. +
    + Parameters: +
    • date : Date
      The Date object to compare with the compare argument
    • compareTo : Date
      The Date object to use for the comparison
    + Returns: +
      +
    • Boolean
      true if the date occurs before the compared date; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    between

    + public function between(Date date, Date dateBegin, Date dateEnd) +
    + Determines whether a given date is between two other dates on the calendar. +
    + Parameters: +
    • date : Date
      The date to check for
    • dateBegin : Date
      The start of the range
    • dateEnd : Date
      The end of the range
    + Returns: +
      +
    • Boolean
      true if the date occurs between the compared dates; false if not.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    buildDayLabel

    + public function buildDayLabel(Date workingDate) +
    + Builds the date digit that will be displayed in calendar cells +
    + Parameters: +
    • workingDate : Date
      The current working date
    + Returns: +
      +
    • String
      The formatted day label
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    buildMonthLabel

    + public function buildMonthLabel() +
    + Builds the date label that will be displayed in the calendar header or +footer, depending on configuration. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The formatted calendar month label
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    buildWeekdays

    + public function buildWeekdays(Array html) +
    + Renders the Calendar's weekday headers. +
    + Parameters: +
    • html : Array
      The current working HTML array
    + Returns: +
      +
    • Array
      The current working HTML array
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    clear

    + public function clear() +
    + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    clearAllBodyCellStyles

    + public function clearAllBodyCellStyles(style The) +
    + Removes all styles from all body cells in the current calendar table. +
    + Parameters: +
    • The : style
      CSS class name to remove from all calendar body cells
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    clearElement

    + public function clearElement(HTMLTableCellElement The) +
    + Clears the inner HTML, CSS class and style information from the specified cell. +
    + Parameters: +
    • The : HTMLTableCellElement
      cell to clear
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    clearTime

    + public function clearTime(Date date) +
    + Clears the time fields from a given date, effectively setting the time to midnight. +
    + Parameters: +
    • date : Date
      The JavaScript Date for which the time fields will be cleared
    + Returns: +
      +
    • Date
      The JavaScript Date cleared of all time fields
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configClose

    + public function configClose() +
    + Default handler for the "close" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configIframe

    + public function configIframe() +
    + Renders the built-in IFRAME shim for the IE6 and below +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configLocale

    + public function configLocale() +
    + The default handler for all configuration locale properties +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configLocaleValues

    + public function configLocaleValues() +
    + The default handler for all configuration locale field length properties +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configMaxDate

    + public function configMaxDate() +
    + The default handler for the "maxdate" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configMinDate

    + public function configMinDate() +
    + The default handler for the "mindate" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configOptions

    + public function configOptions() +
    + The default handler for all configuration options properties +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configPageDate

    + public function configPageDate() +
    + The default handler for the "pagedate" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configSelected

    + public function configSelected() +
    + The default handler for the "selected" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    configTitle

    + public function configTitle() +
    + Default handler for the "title" property +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    deselect

    + public function deselect(String/Date/Date[] date) +
    + Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    deselectAll

    + public function deselectAll() +
    + Deselects all dates on the current calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    deselectCell

    + public function deselectCell(Number cellIndex) +
    + Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to deselect in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    doCellMouseOut

    + public function doCellMouseOut(DOMEvent e, Calendar cal) +
    + The event that is executed when the user moves the mouse out of a cell +
    + Parameters: +
    • e : DOMEvent
      The event
    • cal : Calendar
      A reference to the calendar passed by the Event utility
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    doCellMouseOver

    + public function doCellMouseOver(DOMEvent e, Calendar cal) +
    + The event that is executed when the user hovers over a cell +
    + Parameters: +
    • e : DOMEvent
      The event
    • cal : Calendar
      A reference to the calendar passed by the Event utility
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    doSelectCell

    + public function doSelectCell(DOMEvent e, Calendar cal) +
    + The default event function that is attached to a date link within a calendar cell +when the calendar is rendered. +
    + Parameters: +
    • e : DOMEvent
      The event
    • cal : Calendar
      A reference to the calendar passed by the Event utility
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    findMonthEnd

    + public function findMonthEnd(Date date) +
    + Gets the last day of a month containing a given date. +
    + Parameters: +
    • date : Date
      The JavaScript Date used to calculate the month end
    + Returns: +
      +
    • Date
      The JavaScript Date representing the last day of the month
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    findMonthStart

    + public function findMonthStart(Date date) +
    + Gets the first day of a month containing a given date. +
    + Parameters: +
    • date : Date
      The JavaScript Date used to calculate the month start
    + Returns: +
      +
    • Date
      The JavaScript Date representing the first day of the month
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getDateByCellId

    + public function getDateByCellId(String id) +
    + Retrieves the Date object for the specified Calendar cell +
    + Parameters: +
    • id : String
      The id of the cell
    + Returns: +
      +
    • Date
      The Date object for the specified Calendar cell
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getDateFieldsByCellId

    + public function getDateFieldsByCellId(String id) +
    + Retrieves the Date object for the specified Calendar cell +
    + Parameters: +
    • id : String
      The id of the cell
    + Returns: +
      +
    • Array
      The array of Date fields for the specified Calendar cell
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getDayOffset

    + public function getDayOffset(Date date, Number calendarYear) +
    + Calculates the number of days the specified date is from January 1 of the specified calendar year. +Passing January 1 to this function would return an offset value of zero. +
    + Parameters: +
    • date : Date
      The JavaScript date for which to find the offset
    • calendarYear : Number
      The calendar year to use for determining the offset
    + Returns: +
      +
    • Number
      The number of days since January 1 of the given year
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getJan1

    + public function getJan1(Number calendarYear) +
    + Retrieves a JavaScript Date object representing January 1 of any given year. +
    + Parameters: +
    • calendarYear : Number
      The calendar year for which to retrieve January 1
    + Returns: +
      +
    • Date
      January 1 of the calendar year specified.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getSelectedDates

    + public function getSelectedDates() +
    + Gets the list of currently selected dates from the calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date[]
      An array of currently selected JavaScript Date objects.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    getWeekNumber

    + public function getWeekNumber(Date date, Number calendarYear, Number weekStartsOn) +
    + Calculates the week number for the given date. This function assumes that week 1 is the +week in which January 1 appears, regardless of whether the week consists of a full 7 days. +The calendar year can be specified to help find what a the week number would be for a given +date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or +week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction +easily. +
    + Parameters: +
    • date : Date
      The JavaScript date for which to find the week number
    • calendarYear : Number
      OPTIONAL - The calendar year to use for determining the week number. Default is the calendar year of parameter "date".
    • weekStartsOn : Number
      OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday).
    + Returns: +
      +
    • Number
      The week number of the given date.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    hide

    + public function hide() +
    + Hides the Calendar's outer container from view. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    init

    + public function init(String id, String containerId, Object config) +
    + Initializes the Calendar widget. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes Calendar's built-in CustomEvents +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    initStyles

    + public function initStyles() +
    + Defines the style constants for the Calendar +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    isDateOOM

    + public function isDateOOM(Date date) +
    + Determines whether a given date is OOM (out of month). +
    + Parameters: +
    • date : Date
      The JavaScript Date object for which to check the OOM status
    + Returns: +
      +
    • Boolean
      true if the date is OOM
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    isMonthOverlapWeek

    + public function isMonthOverlapWeek(Date weekBeginDate) +
    + Determines if a given week overlaps two different months. +
    + Parameters: +
    • weekBeginDate : Date
      The JavaScript Date representing the first day of the week.
    + Returns: +
      +
    • Boolean
      true if the date overlaps two different months.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    isYearOverlapWeek

    + public function isYearOverlapWeek(Date weekBeginDate) +
    + Determines if a given week overlaps two different years. +
    + Parameters: +
    • weekBeginDate : Date
      The JavaScript Date representing the first day of the week.
    + Returns: +
      +
    • Boolean
      true if the date overlaps two different years.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    nextMonth

    + public function nextMonth() +
    + Navigates to the next month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    nextYear

    + public function nextYear() +
    + Navigates to the next year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onBeforeDeselect

    + public function onBeforeDeselect() +
    + Deprecated. Event executed before a date is deselected in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onBeforeSelect

    + public function onBeforeSelect() +
    + Deprecated. Event executed before a date is selected in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onChangePage

    + public function onChangePage() +
    + Deprecated. Event executed when the user navigates to a different calendar page. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onDeselect

    + public function onDeselect(Array selected) +
    + Deprecated. Event executed when a date is deselected in the calendar widget. +
    + Parameters: +
    • selected : Array
      An array of date field arrays representing which date or dates were deselected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onRender

    + public function onRender() +
    + Deprecated. Event executed when the calendar widget is rendered. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    onSelect

    + public function onSelect(Array selected) +
    + Deprecated. Event executed when a date is selected in the calendar widget. +
    + Parameters: +
    • selected : Array
      An array of date field arrays representing which date or dates were selected. Example: [ [2006,8,6],[2006,8,7],[2006,8,8] ]
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    previousMonth

    + public function previousMonth() +
    + Navigates to the previous month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    previousYear

    + public function previousYear() +
    + Navigates to the previous year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    render

    + public function render() +
    + Deprecated. Event executed when the calendar widget is completely cleared to the current month with no selections. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderBody

    + public function renderBody(Date workingDate, Array html) +
    + Renders the calendar body. +
    + Parameters: +
    • workingDate : Date
      The current working Date being used for the render process
    • html : Array
      The current working HTML array
    + Returns: +
      +
    • Array
      The current working HTML array
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderBodyCellRestricted

    + public function renderBodyCellRestricted(Date workingDate, HTMLTableCellElement cell) +
    + Renders the current calendar cell as a non-selectable "black-out" date using the default +restricted style. +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • String
      YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellDefault

    + public function renderCellDefault(Date workingDate, HTMLTableCellElement cell) +
    + Renders a single standard calendar cell in the calendar widget table. +All logic for determining how a standard default cell will be rendered is +encapsulated in this method, and must be accounted for when extending the +widget class. +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellNotThisMonth

    + public function renderCellNotThisMonth(Date workingDate, HTMLTableCellElement cell) +
    + Applies the default style used for rendering dates that are not a part of the current +month (preceding or trailing the cells for the current month) +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • String
      YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleHighlight1

    + public function renderCellStyleHighlight1(Date workingDate, HTMLTableCellElement cell) +
    + Renders a single standard calendar cell using the CSS hightlight1 style +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleHighlight2

    + public function renderCellStyleHighlight2(Date workingDate, HTMLTableCellElement cell) +
    + Renders a single standard calendar cell using the CSS hightlight2 style +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleHighlight3

    + public function renderCellStyleHighlight3(Date workingDate, HTMLTableCellElement cell) +
    + Renders a single standard calendar cell using the CSS hightlight3 style +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleHighlight4

    + public function renderCellStyleHighlight4(Date workingDate, HTMLTableCellElement cell) +
    + Renders a single standard calendar cell using the CSS hightlight4 style +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleSelected

    + public function renderCellStyleSelected(Date workingDate, HTMLTableCellElement cell) +
    + Applies the default style used for rendering selected dates to the current calendar cell +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • String
      YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderCellStyleToday

    + public function renderCellStyleToday(Date workingDate, HTMLTableCellElement cell) +
    + Applies the default style used for rendering today's date to the current calendar cell +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderFooter

    + public function renderFooter(Array html) +
    + Renders the calendar footer. In the default implementation, there is +no footer. +
    + Parameters: +
    • html : Array
      The current working HTML array
    + Returns: +
      +
    • Array
      The current working HTML array
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderHeader

    + public function renderHeader(Array html) +
    + Renders the calendar header. +
    + Parameters: +
    • html : Array
      The current working HTML array
    + Returns: +
      +
    • Array
      The current working HTML array
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderOutOfBoundsDate

    + public function renderOutOfBoundsDate(Date workingDate, HTMLTableCellElement cell) +
    + Renders a cell that falls before the minimum date or after the maximum date. +widget class. +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • String
      YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering should not be terminated
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderRowFooter

    + public function renderRowFooter(Number weekNum, Array cell) +
    + Renders the row footer for a week. +
    + Parameters: +
    • weekNum : Number
      The week number of the current row
    • cell : Array
      The current working HTML array
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    renderRowHeader

    + public function renderRowHeader(Number weekNum, Array cell) +
    + Renders the row header for a week. +
    + Parameters: +
    • weekNum : Number
      The week number of the current row
    • cell : Array
      The current working HTML array
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    resetRenderers

    + public function resetRenderers() +
    + Resets the render stack of the current calendar to its original pre-render value. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    select

    + public function select(String/Date/Date[] date) +
    + Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    selectCell

    + public function selectCell(Number cellIndex) +
    + Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to select in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    setMonth

    + public function setMonth(Number month) +
    + Sets the calendar's month explicitly +
    + Parameters: +
    • month : Number
      The numeric month, from 0 (January) to 11 (December)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    setYear

    + public function setYear(Number year) +
    + Sets the calendar's year explicitly. +
    + Parameters: +
    • year : Number
      The numeric 4-digit year
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    show

    + public function show() +
    + Shows the Calendar's outer container. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    styleCellDefault

    + public function styleCellDefault(Date workingDate, HTMLTableCellElement cell) +
    + Styles a selectable cell. +
    + Parameters: +
    • workingDate : Date
      The current working Date object being used to generate the calendar
    • cell : HTMLTableCellElement
      The current working cell in the calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    subtract

    + public function subtract(Date date, Number field, Number amount) +
    + Subtracts the specified amount of time from the this instance. +
    + Parameters: +
    • date : Date
      The JavaScript Date object to perform subtraction on
    • field : Number
      The this field constant to be used for performing subtraction.
    • amount : Number
      The number of units (measured in the field constant) to subtract from the date.
    + Returns: +
      +
    • Date
      The resulting Date object
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    subtractMonths

    + public function subtractMonths(Number count) +
    + Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    subtractYears

    + public function subtractYears(Number count) +
    + Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      A string representation of the Calendar object.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    + +
    +

    validate

    + public function validate() +
    + Validates the calendar widget. This method has no default implementation +and must be extended by subclassing the widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Should
      return true if the widget validates, and false if it doesn't.
    • +
    +
    +
    +
    This method is defined by DateMath.
    +
    +
    + +

    Event Details

    +
    + +
    +

    beforeDeselectEvent

    + public event beforeDeselectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + Fired before the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    beforeSelectEvent

    + public event beforeSelectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    changePageEvent

    + public event changePageEvent +
    + Fired when the Calendar page is changed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    clearEvent

    + public event clearEvent +
    + Fired when the Calendar is cleared +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    deselectEvent

    + public event deselectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + Fired when the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    resetEvent

    + public event resetEvent +
    + Fired when the Calendar is reset +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by DateMath.
    +
    + +
    +

    selectEvent

    + public event selectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by DateMath.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Dialog.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Dialog.html new file mode 100644 index 000000000..9dce3a2d6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Dialog.html @@ -0,0 +1,2019 @@ + + + + YAHOO.widget.Dialog + + + + + +
    + +

    Class YAHOO.widget.Dialog

    + + + + + + +
    Package:YAHOO.widget
    Class:Dialog
    Extends:Panel
    Subclasses:SimpleDialog
    Defined In:container.js
    +
    + Dialog is an implementation of Panel that can be used to submit form data. Built-in functionality for buttons with event handlers is included, and button sets can be build dynamically, or the preincluded ones for Submit/Cancel and OK/Cancel can be utilized. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_DIALOG<static> : StringDialog
    <static> Constant representing the default CSS class used for a Dialog
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     argument : ObjectDialog
    The arbitraty argument or arguments to pass to the Connection callback functions
     callback : ObjectDialog
    The internally maintained callback object for use with the Connection utility
     cfg : Object[] +@defaultDialog
    Object literal(s) defining the buttons for the Dialog's footer. +@config buttons
     failure : FunctionDialog
    The function to execute upon failure of the Connection submission
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     success : FunctionDialog
    The function to execute upon success of the Connection submission
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Dialog(String el, HTMLElement el, Object userConfig)Dialog
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     blurButtons() : voidDialog
    Blurs all the html buttons
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     cancel() : voidDialog
    Executes the cancel of the Dialog followed by a hide.
     center() : voidOverlay
    Centers the container in the viewport.
     cfg() : voidDialog
    The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual". +@config postmethod
     configButtons(String type, Object[] args, Object obj) : voidDialog
    The default event handler for the "buttons" configuration property
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doSubmit() : voidDialog
    Performs the submission of the Dialog form depending on the value of "postmethod" property.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     focusDefaultButton() : voidDialog
    Sets the focus to the button that is designated as the default. By default, his handler is executed when the show eve...
     focusFirst() : voidDialog
    The default event handler used to focus the first field of the form when the Dialog is shown.
     focusFirstButton() : voidDialog
    Sets the focus to the first button in the button list
     focusLast() : voidDialog
    Sets the focus to the last button in the button or form element in the Dialog
     focusLastButton() : voidDialog
    Sets the focus to the first button in the button list
     getData() : ObjectDialog
    Returns a JSON-compatible data structure representing the data currently contained in the form.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidDialog
    The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automaticall...
     initDefaultConfig() : voidDialog
    Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg).
     initEvents() : voidDialog
    Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     registerForm() : voidDialog
    Prepares the Dialog's internal FORM object, creating one if one is not currently present.
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode) : booleanPanel
    Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optiona...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     submit() : voidDialog
    Executes a submit of the Dialog followed by a hide, if validation is successful.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringDialog
    Returns a string representation of the object.
     validate() : voidDialog
    Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. T...
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     asyncSubmitEvent : ()Dialog
    CustomEvent fired prior to asynchronous submission
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeSumitEvent : ()Dialog
    CustomEvent fired prior to submission
     cancelEvent : ()Dialog
    CustomEvent fired after cancel
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     formSubmitEvent : ()Dialog
    CustomEvent fired prior to form-based submission
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     manualSubmitEvent : ()Dialog
    CustomEvent fired prior to manual submission
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
     submitEvent : ()Dialog
    CustomEvent fired after submission
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_DIALOG<static>

    + public String CSS_DIALOG<static> +
    + <static> Constant representing the default CSS class used for a Dialog
    +
    This property is defined by Dialog.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    argument

    + public Object argument +
    + The arbitraty argument or arguments to pass to the Connection callback functions
    +
    This property is defined by Dialog.
    +
    + +
    +

    callback

    + public Object callback +
    + The internally maintained callback object for use with the Connection utility
    +
    This property is defined by Dialog.
    +
    + +
    +

    cfg

    + public Object[] +@default cfg +
    + Object literal(s) defining the buttons for the Dialog's footer. +@config buttons
    +
    This property is defined by Dialog.
    +
    + +
    +

    failure

    + public Function failure +
    + The function to execute upon failure of the Connection submission
    +
    This property is defined by Dialog.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    success

    + public Function success +
    + The function to execute upon success of the Connection submission
    +
    This property is defined by Dialog.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Dialog

    + public function Dialog(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Dialog OR
    • el : HTMLElement
      The element representing the Dialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    blurButtons

    + public function blurButtons() +
    + Blurs all the html buttons +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    cancel

    + public function cancel() +
    + Executes the cancel of the Dialog followed by a hide. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    cfg

    + public function cfg() +
    + The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual". +@config postmethod +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configButtons

    + public function configButtons(String type, Object[] args, Object obj) +
    + The default event handler for the "buttons" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doSubmit

    + public function doSubmit() +
    + Performs the submission of the Dialog form depending on the value of "postmethod" property. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    focusDefaultButton

    + public function focusDefaultButton() +
    + Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirst

    + public function focusFirst() +
    + The default event handler used to focus the first field of the form when the Dialog is shown. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirstButton

    + public function focusFirstButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLast

    + public function focusLast() +
    + Sets the focus to the last button in the button or form element in the Dialog +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLastButton

    + public function focusLastButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    getData

    + public function getData() +
    + Returns a JSON-compatible data structure representing the data currently contained in the form. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      A JSON object reprsenting the data of the current form.
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Dialog initialization method, which is executed for Dialog and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Dialog OR
    • el : HTMLElement
      The element representing the Dialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Dialog. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Dialog's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Dialog which are fired automatically at appropriate times by the Dialog class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerForm

    + public function registerForm() +
    + Prepares the Dialog's internal FORM object, creating one if one is not currently present. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode) +
    + Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optionally appends the Panel to the specified node prior to the render's execution. NOTE: For Panels without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    + Returns: +
      +
    • boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    submit

    + public function submit() +
    + Executes a submit of the Dialog followed by a hide, if validation is successful. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Dialog
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    validate

    + public function validate() +
    + Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    asyncSubmitEvent

    + public event asyncSubmitEvent +
    + CustomEvent fired prior to asynchronous submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeSumitEvent

    + public event beforeSumitEvent +
    + CustomEvent fired prior to submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    cancelEvent

    + public event cancelEvent +
    + CustomEvent fired after cancel +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    formSubmitEvent

    + public event formSubmitEvent +
    + CustomEvent fired prior to form-based submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    manualSubmitEvent

    + public event manualSubmitEvent +
    + CustomEvent fired prior to manual submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    submitEvent

    + public event submitEvent +
    + CustomEvent fired after submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.HTMLNode.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.HTMLNode.html new file mode 100644 index 000000000..d1e44fc6a --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.HTMLNode.html @@ -0,0 +1,1438 @@ + + + + YAHOO.widget.HTMLNode + + + + + +
    + +

    Class YAHOO.widget.HTMLNode

    + + + + + +
    Package:YAHOO.widget
    Class:HTMLNode
    Extends:Node
    Defined In:treeview.js
    +
    + This implementation takes either a string or object for the +oData argument. If is it a string, we will use it for the display +of this node (and it can contain any html code). If the parameter +is an object, we look for a parameter called "html" that will be +used for this node's display.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     content : stringHTMLNode
    The HTML content to use for this node's display
     contentElId : stringHTMLNode
    The generated id that will contain the data passed in by the implementer.
     contentStyle : stringHTMLNode
    The CSS class for the html content container. Defaults to ygtvhtml, but +can be overridden to provide a custom prese...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     initContent : ObjectHTMLNode
    Sets up the node label
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     HTMLNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}, hasIcon {boolean})HTMLNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getContentEl() : HTMLElementHTMLNode
    Returns the outer html element for this node's content
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    content

    + public string content +
    + The HTML content to use for this node's display
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    contentElId

    + public string contentElId +
    + The generated id that will contain the data passed in by the implementer.
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    contentStyle

    + public string contentStyle +
    + The CSS class for the html content container. Defaults to ygtvhtml, but +can be overridden to provide a custom presentation for a specific node.
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    initContent

    + public Object initContent +
    + Sets up the node label
    +
    This property is defined by HTMLNode.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    HTMLNode

    + public function HTMLNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}, hasIcon {boolean}) +
    +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {YAHOO.widget.Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    • {boolean} : hasIcon
      specifies whether or not leaf nodes should have an icon
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getContentEl

    + public function getContentEl() +
    + Returns the outer html element for this node's content +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the element
    • +
    +
    +
    +
    This method is defined by HTMLNode.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Logger.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Logger.html new file mode 100644 index 000000000..46278cca3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Logger.html @@ -0,0 +1,301 @@ + + + + YAHOO.widget.Logger + + + + + +
    + +

    Class YAHOO.widget.Logger

    + + + + + +
    Package:YAHOO.widget
    Class:Logger
    Extends:Object
    Defined In:logger.js
    +
    + The singleton Logger class provides core log management functionality. Saves +logs written through the global YAHOO.log function or written by a LogWriter +instance. Provides access to logs for reading by a LogReader instance or +native browser console such as the Firebug extension to Firefox or Safari's +JavaScript console through integration with the console.log() method.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     disableBrowserConsole() : voidLogger
    Disables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as ...
     enableBrowserConsole() : voidLogger
    Enables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as w...
     getStack() : Object[]Logger
    Public accessor to internal stack of log message objects.
     getStartTime() : DateLogger
    Public accessor to internal start time.
     log(sMsg {String}, sCategory {String}, sSource {String}) : voidLogger
    Saves a log message to the stack and fires newLogEvent. If the log message is +assigned to an unknown category, create...
     reset() : voidLogger
    Resets internal stack and startTime, enables Logger, and fires logResetEvent.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     categoryCreateEvent : (sCategory {String})Logger
    Fired when a new category has been created.
     logResetEvent : ()Logger
    Fired when the Logger has been reset has been created.
     newLogEvent : (sMsg {String})Logger
    Fired when a new log message has been created.
     sourceCreateEvent : (sSource {String})Logger
    Fired when a new source has been named.
    + + + +

    Method Details

    +
    + +
    +

    disableBrowserConsole

    + public function disableBrowserConsole() +
    + Disables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    enableBrowserConsole

    + public function enableBrowserConsole() +
    + Enables output to the browser's global console.log() function, which is used +by the Firebug extension to Firefox as well as Safari. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    getStack

    + public function getStack() +
    + Public accessor to internal stack of log message objects. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object[]
      Array of log message objects.
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    getStartTime

    + public function getStartTime() +
    + Public accessor to internal start time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date
      Internal date of when Logger singleton was initialized.
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    log

    + public function log(sMsg {String}, sCategory {String}, sSource {String}) +
    + Saves a log message to the stack and fires newLogEvent. If the log message is +assigned to an unknown category, creates a new category. If the log message is +from an unknown source, creates a new source. If browser console is enabled, +outputs the log message to browser console. +
    + Parameters: +
    • {String} : sMsg
      The log message.
    • {String} : sCategory
      Category of log message, or null.
    • {String} : sSource
      Source of LogWriter, or null if global.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets internal stack and startTime, enables Logger, and fires logResetEvent. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Logger.
    +
    +
    + +

    Event Details

    +
    + +
    +

    categoryCreateEvent

    + public event categoryCreateEvent +
    + Fired when a new category has been created. +
    + Subscribers will be called with the following parameters: +
    • {String} : sCategory
      Category name.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    logResetEvent

    + public event logResetEvent +
    + Fired when the Logger has been reset has been created. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    newLogEvent

    + public event newLogEvent +
    + Fired when a new log message has been created. +
    + Subscribers will be called with the following parameters: +
    • {String} : sMsg
      Log message.
    +
    +
    +
    This event is defined by Logger.
    +
    + +
    +

    sourceCreateEvent

    + public event sourceCreateEvent +
    + Fired when a new source has been named. +
    + Subscribers will be called with the following parameters: +
    • {String} : sSource
      Source name.
    +
    +
    +
    This event is defined by Logger.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menu.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menu.html new file mode 100644 index 000000000..e1f4de37a --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menu.html @@ -0,0 +1,1917 @@ + + + + YAHOO.widget.Menu + + + + + +
    + +

    Class YAHOO.widget.Menu

    + + + + + + +
    Package:YAHOO.widget
    Class:Menu
    Extends:Overlay
    Subclasses:ContextMenu, Menubar
    Defined In:menu.js
    +
    + The Menu class creates a container that holds a vertical list representing +a set of options or commands. Menu is the base class for all +menu containers.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_CLASS_NAME : StringMenu
    @description String representing the CSS class(es) to be applied to the +menu's <div> element. +@default "yuime...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     GROUP_TITLE_TAG_NAME : StringMenu
    @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@f...
     ITEM_TYPE : YAHOO.widget.MenuItemMenu
    @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either &#...
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     activeItem : YAHOO.widget.MenuItemMenu
    @description Object reference to the item in the menu that has focus. +@default null
     cfg : + Menu
    @config container +@description HTML element reference or string specifying the id +attribute of the HTML element that ...
     itemData : ArrayMenu
    @description Array of items to be added to the menu. The array can contain +strings representing the text for each it...
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     lazyLoad : BooleanMenu
    @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and r...
     parent : YAHOO.widget.MenuItemMenu
    @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor us...
     srcElement : + Menu
    @description Object reference to the HTML element (either +<select> or <div>) used to +create the menu....
     value : ArrayMenu
    @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu item. The fo...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Menu()Menu
     _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "click" event handler for the menu. +@protected
     _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "keydown" event handler for the menu. +@protected
     _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseout" event handler for the menu. +@protected
     _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseover" event handler for the menu. +@protected
     addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Appends an item to the menu.
     addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
    @description Adds an array of items to the menu.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     clearActiveItem(Boolean p_bBlur) : voidMenu
    @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's sub...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "container" configuration property +of the menu changes.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "hidedelay" configuration property +of the menu changes.
     configIframe(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "iframe" configuration property of +the menu changes.
     configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "position" configuration property +of the menu changes.
     configVisible(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "visible" configuration property +the menu changes.
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidMenu
    @description Removes the menu's <div> element +(and accompanying child nodes) from the document.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Array args, Array obj) : voidMenu
    @description The default event handler executed when the moveEvent is fired, +if the "constraintoviewport" configurati...
     getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Returns the item at the specified index.
     getItemGroups() : ArrayMenu
    @description Returns a multi-dimensional array of all of the items in the menu.
     getRoot() : voidMenu
    @description Finds the menu's root menu.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String p_oElement, String p_oElement, , Object p_oConfig) : voidMenu
    @description The Menu class's initialization method. This method is +automatically called by the constructor, and sets...
     initDefaultConfig() : voidMenu
    @description Initializes the class's configurable properties which can be +changed using the menu's Config object ("cf...
     initEvents() : voidMenu
    @description Initializes the custom events for the menu.
     insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Inserts an item into the menu at the specified index.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize() : voidMenu
    Event handler called when the resize monitor element's "resize" evet is fired.
     removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Removes the specified item from the menu.
     setInitialFocus() : voidMenu
    @description Sets focus to the menu's first enabled item.
     setInitialSelection() : voidMenu
    @description Sets the "selected" configuration property of the menu's first +enabled item to "true."
     setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
    @description Sets the title of a group of menu items.
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringMenu
    @description Returns a string representing the menu.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     clickEvent : ()Menu
    @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
     itemAddedEvent : ()Menu
    @description Fires when an item is added to the menu.
     itemRemovedEvent : ()Menu
    @description Fires when an item is removed to the menu.
     keyDownEvent : ()Menu
    @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event obj...
     keyPressEvent : ()Menu
    @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the...
     keyUpEvent : ()Menu
    @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event ob...
     mouseDownEvent : ()Menu
    @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
     mouseOutEvent : ()Menu
    @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
     mouseOverEvent : ()Menu
    @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
     mouseUpEvent : ()Menu
    @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event...
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the +menu's <div> element. +@default "yuimenu" +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    GROUP_TITLE_TAG_NAME

    + public String GROUP_TITLE_TAG_NAME +
    + @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    ITEM_TYPE

    + public YAHOO.widget.MenuItem ITEM_TYPE +
    + @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element. +@default YAHOO.widget.MenuItem +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    activeItem

    + public YAHOO.widget.MenuItem activeItem +
    + @description Object reference to the item in the menu that has focus. +@default null
    +
    This property is defined by Menu.
    +
    + + + +
    +

    itemData

    + public Array itemData +
    + @description Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    lazyLoad

    + public Boolean lazyLoad +
    + @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal. +@default false
    +
    This property is defined by Menu.
    +
    + +
    +

    parent

    + public YAHOO.widget.MenuItem parent +
    + @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + + + +
    +

    value

    + public Array value +
    + @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu item. The format is: [itemCorner, submenuCorner]. By default +a submenu's top left corner is aligned to its parent menu item's top +right corner. +@default ["tl","tr"]
    +
    This property is defined by Menu.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Menu

    + public function Menu() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    _onClick

    + public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "click" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onKeyDown

    + public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "keydown" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOut

    + public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseout" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOver

    + public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseover" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItem

    + public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
    + @description Appends an item to the menu. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItems

    + public function addItems(Array p_aItems, Number p_nGroupIndex) +
    + @description Adds an array of items to the menu. +
    + Parameters: +
    • p_aItems : Array
      Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the items belongs.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    clearActiveItem

    + public function clearActiveItem(Boolean p_bBlur) +
    + @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
    + Parameters: +
    • p_bBlur : Boolean
      Boolean indicating if the menu's active item should be blurred.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "container" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHideDelay

    + public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "hidedelay" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configIframe

    + public function configIframe(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "iframe" configuration property of +the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configPosition

    + public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "position" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configVisible

    + public function configVisible(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "visible" configuration property +the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + @description Removes the menu's <div> element +(and accompanying child nodes) from the document. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Array args, Array obj) +
    + @description The default event handler executed when the moveEvent is fired, +if the "constraintoviewport" configuration property is set to true. +
    + Parameters: +
    • type : String
      The name of the event that was fired.
    • args : Array
      Collection of arguments sent when the event was fired.
    • obj : Array
      Array containing the current Menu instance and the item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItem

    + public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Returns the item at the specified index. +
    + Parameters: +
    • p_nItemIndex : Number
      Number indicating the ordinal position of the item to be retrieved.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItemGroups

    + public function getItemGroups() +
    + @description Returns a multi-dimensional array of all of the items in the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + @description Finds the menu's root menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes the class's configurable properties which can be +changed using the menu's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + @description Initializes the custom events for the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize() +
    + Event handler called when the resize monitor element's "resize" evet is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + @description Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + @description Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + @description Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + @description Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + @description Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + @description Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuBarItem.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuBarItem.html new file mode 100644 index 000000000..4b750adf4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuBarItem.html @@ -0,0 +1,1384 @@ + + + + YAHOO.widget.MenuBarItem + + + + + +
    + +

    Class YAHOO.widget.MenuBarItem

    + + + + + +
    Package:YAHOO.widget
    Class:MenuBarItem
    Extends:MenuItem
    Defined In:menu.js
    +
    + Creates an item for a menu bar.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
     CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuc...
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Col...
     CSS_CLASS_NAME : StringMenuBarItem
    @description String representing the CSS class(es) to be applied to the +<li> element of the menu bar item. +@d...
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image when the item is disable...
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/...
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu ...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu bar i...
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the subme...
     IMG_ROOT : StringMenuItem
    @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yim...
     IMG_ROOT_SSL : StringMenuItem
    @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.n...
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/...
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu bar i...
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuBarItem
    @description String representing the path to the image to be used for the +menu bar item's submenu arrow indicator. +@d...
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu ite...
     browser : StringMenuItem
    @description String representing the browser.
     configHelpText : String| + MenuItem
    @config helptext +@description String specifying additional instructional text to +accompany the text for the nenu item...
     configSubmenu : Menu|String|Object| + MenuItem
    @config submenu +@description Object specifying the submenu to be appended to the +menu item. The value can be one of ...
     constructor : YAHOO.widget.MenuItemMenuItem
    @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
     element : + MenuItem
    @description Object reference to the menu item's +<li> element. +@default HTMLLIElement
     groupIndex : NumberMenuItem
    @description Number indicating the index of the group to which the menu +item belongs. +@default null
     imageRoot : StringMenuItem
    @description String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    @description Number indicating the ordinal position of the menu item in +its group. +@default null
     isSecure : BooleanMenuItem
    @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    @description Object reference to the menu item's parent menu. +@default null
     srcElement : + MenuItem
    @description Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used ...
     submenuIndicator : + MenuItem
    @description Object reference to the <img> element +used to create the submenu indicator for the menu item. +@d...
     value : ObjectMenuItem
    @description Object reference to the menu item's value. +@default null
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuBarItem()MenuBarItem
     blur() : voidMenuItem
    @description Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    @description Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    @description Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's previous enabled sibling.
     init(String p_oObject, , MenuBarItem
    @description The MenuBarItem class's initialization method. This method is +automatically called by the constructor, a...
     initDefaultConfig() : voidMenuItem
    @description Initializes an item's configurable properties.
     toString() : StringMenuBarItem
    @description Returns a string representing the menu bar item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    @description Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    @description Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    @description Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an ...
     keyPressEvent : ()MenuItem
    @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event...
     keyUpEvent : ()MenuItem
    @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an...
     mouseDownEvent : ()MenuItem
    @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Collapsed. Click to expand." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the +<li> element of the menu bar item. +@default "yuimenubaritem" +@final
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image when the item is disabled. +@default "Checked. (Item disabled.)" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/bsc/menuchk8_dim_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled. +@default "Disabled." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is disabled. +@default "nt/ic/ut/alt1/menuarodwn8_dim_1.gif" +@final
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible. +@default "Expanded. Click to collapse." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.net/sec.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/bsc/menuchk8_hov_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu bar item is selected. +@default "nt/ic/ut/alt1/menuarodwn8_hov_1.gif" +@final
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +menu bar item's submenu arrow indicator. +@default "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif" +@final
    +
    This property is defined by MenuBarItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element. +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + @description String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    configSubmenu

    + public Menu|String|Object| + +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + @description Number indicating the index of the group to which the menu +item belongs. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + @description String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + @description Number indicating the ordinal position of the menu item in +its group. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + @description Object reference to the menu item's parent menu. +@default null
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + @description Object reference to the menu item's value. +@default null
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuBarItem

    + public function MenuBarItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + @description Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + @description Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + @description Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + @description Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + @description Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + @description The MenuBarItem class's initialization method. This method is +automatically called by the constructor, and sets up all DOM references for +pre-existing markup, and creates required markup if it is not already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the menu bar item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the menu bar item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu bar item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by MenuBarItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the menu bar item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuBarItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + @description Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + @description Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + @description Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuItem.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuItem.html new file mode 100644 index 000000000..860cef3c1 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuItem.html @@ -0,0 +1,1386 @@ + + + + YAHOO.widget.MenuItem + + + + + +
    + +

    Class YAHOO.widget.MenuItem

    + + + + + + +
    Package:YAHOO.widget
    Class:MenuItem
    Extends:Object
    Subclasses:ContextMenuItem, MenuBarItem
    Defined In:menu.js
    +
    + Creates an item for a menu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
     CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuc...
     COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Col...
     CSS_CLASS_NAME : StringMenuItem
    @description String representing the CSS class(es) to be applied to the +<li> element of the menu item. +@defau...
     DISABLED_CHECKED_IMAGE_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the checked image when the item is disable...
     DISABLED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/...
     DISABLED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu ...
     DISABLED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item ...
     EXPANDED_SUBMENU_INDICATOR_ALT_TEXT : StringMenuItem
    @description String representing the alt text for the image to be used +for the submenu arrow indicator when the subme...
     IMG_ROOT : StringMenuItem
    @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yim...
     IMG_ROOT_SSL : StringMenuItem
    @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.n...
     SELECTED_CHECKED_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/...
     SELECTED_SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item ...
     SUBMENU_INDICATOR_IMAGE_PATH : StringMenuItem
    @description String representing the path to the image to be used for the +menu item's submenu arrow indicator. +@defau...
     SUBMENU_TYPE : YAHOO.widget.MenuMenuItem
    @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu ite...
     browser : StringMenuItem
    @description String representing the browser.
     configHelpText : String| + MenuItem
    @config helptext +@description String specifying additional instructional text to +accompany the text for the nenu item...
     configSubmenu : Menu|String|Object| + MenuItem
    @config submenu +@description Object specifying the submenu to be appended to the +menu item. The value can be one of ...
     constructor : YAHOO.widget.MenuItemMenuItem
    @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
     element : + MenuItem
    @description Object reference to the menu item's +<li> element. +@default HTMLLIElement
     groupIndex : NumberMenuItem
    @description Number indicating the index of the group to which the menu +item belongs. +@default null
     imageRoot : StringMenuItem
    @description String representing the root path for all of the menu +item's images.
     index : NumberMenuItem
    @description Number indicating the ordinal position of the menu item in +its group. +@default null
     isSecure : BooleanMenuItem
    @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
     parent : YAHOO.widget.MenuMenuItem
    @description Object reference to the menu item's parent menu. +@default null
     srcElement : + MenuItem
    @description Object reference to the HTML element (either +<li>, <optgroup> or +<option>) used ...
     submenuIndicator : + MenuItem
    @description Object reference to the <img> element +used to create the submenu indicator for the menu item. +@d...
     value : ObjectMenuItem
    @description Object reference to the menu item's value. +@default null
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuItem()MenuItem
     blur() : voidMenuItem
    @description Causes the menu item to lose focus and fires the +onblur event.
     configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "checked" configuration property +of the menu item changes.
     configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "disabled" configuration property +of the menu item changes.
     configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "emphasis" configuration property +of the menu item changes.
     configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "helptext" configuration property +of the menu item changes.
     configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "selected" configuration property +of the menu item changes.
     configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "strongemphasis" configuration +property of the menu item changes.
     configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "submenu" configuration property +of the menu item changes.
     configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "target" configuration property +of the menu item changes.
     configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "text" configuration property of +the menu item changes.
     configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) : voidMenuItem
    @description Event handler for when the "url" configuration property of +the menu item changes.
     destroy() : voidMenuItem
    @description Removes the menu item's <li> element +from its parent <ul> element.
     focus() : voidMenuItem
    @description Causes the menu item to receive the focus and fires the +focus event.
     getNextEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's next enabled sibling.
     getPreviousEnabledSibling() : YAHOO.widget.MenuItemMenuItem
    @description Finds the menu item's previous enabled sibling.
     init(String p_oObject, , MenuItem
    @description The MenuItem class's initialization method. This method is +automatically called by the constructor, and ...
     initDefaultConfig() : voidMenuItem
    @description Initializes an item's configurable properties.
     toString() : StringMenuItem
    @description Returns a string representing the menu item.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     blurEvent : ()MenuItem
    @description Fires when the menu item loses the input focus.
     clickEvent : ()MenuItem
    @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument.
     destroyEvent : ()MenuItem
    @description Fires when the menu item's <li> +element is removed from its parent <ul> element.
     focusEvent : ()MenuItem
    @description Fires when the menu item receives focus.
     keyDownEvent : ()MenuItem
    @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an ...
     keyPressEvent : ()MenuItem
    @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event...
     keyUpEvent : ()MenuItem
    @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an...
     mouseDownEvent : ()MenuItem
    @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument.
     mouseOutEvent : ()MenuItem
    @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument.
     mouseOverEvent : ()MenuItem
    @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument.
     mouseUpEvent : ()MenuItem
    @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM ...
    + +

    Property Details

    +
    + +
    +

    CHECKED_IMAGE_ALT_TEXT

    + public String CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image. +@default "Checked." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CHECKED_IMAGE_PATH

    + public String CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the checked state. +@default "nt/ic/ut/bsc/menuchk8_nrm_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT

    + public String COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator. +@default "Collapsed. Click to expand." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the +<li> element of the menu item. +@default "yuimenuitem" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_ALT_TEXT

    + public String DISABLED_CHECKED_IMAGE_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the checked image when the item is disabled. +@default "Checked. (Item disabled.)" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_CHECKED_IMAGE_PATH

    + public String DISABLED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the disabled checked state. +@default "nt/ic/ut/bsc/menuchk8_dim_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_ALT_TEXT

    + public String DISABLED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the menu item is disabled. +@default "Disabled." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String DISABLED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item is disabled. +@default "nt/ic/ut/alt1/menuarorght8_dim_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT

    + public String EXPANDED_SUBMENU_INDICATOR_ALT_TEXT +
    + @description String representing the alt text for the image to be used +for the submenu arrow indicator when the submenu is visible. +@default "Expanded. Click to collapse." +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT

    + public String IMG_ROOT +
    + @description String representing the prefix path to use for +non-secure images. +@default "http://us.i1.yimg.com/us.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    IMG_ROOT_SSL

    + public String IMG_ROOT_SSL +
    + @description String representing the prefix path to use for securely +served images. +@default "https://a248.e.akamai.net/sec.yimg.com/i/"
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_CHECKED_IMAGE_PATH

    + public String SELECTED_CHECKED_IMAGE_PATH +
    + @description String representing the path to the image to be used for +the selected checked state. +@default "nt/ic/ut/bsc/menuchk8_hov_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH

    + public String SELECTED_SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +submenu arrow indicator when the menu item is selected. +@default "nt/ic/ut/alt1/menuarorght8_hov_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_INDICATOR_IMAGE_PATH

    + public String SUBMENU_INDICATOR_IMAGE_PATH +
    + @description String representing the path to the image to be used for the +menu item's submenu arrow indicator. +@default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif" +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    SUBMENU_TYPE

    + public YAHOO.widget.Menu SUBMENU_TYPE +
    + @description Object representing the type of menu to instantiate and +add when parsing the child nodes of the menu item's source HTML element. +@final
    +
    This property is defined by MenuItem.
    +
    + +
    +

    browser

    + public String browser +
    + @description String representing the browser.
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    configSubmenu

    + public Menu|String|Object| + +
    This property is defined by MenuItem.
    +
    + +
    +

    constructor

    + public YAHOO.widget.MenuItem constructor +
    + @description Object reference to the menu item's constructor function. +@default YAHOO.widget.MenuItem
    +
    This property is defined by MenuItem.
    +
    + + + +
    +

    groupIndex

    + public Number groupIndex +
    + @description Number indicating the index of the group to which the menu +item belongs. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    imageRoot

    + public String imageRoot +
    + @description String representing the root path for all of the menu +item's images.
    +
    This property is defined by MenuItem.
    +
    + +
    +

    index

    + public Number index +
    + @description Number indicating the ordinal position of the menu item in +its group. +@default null
    +
    This property is defined by MenuItem.
    +
    + +
    +

    isSecure

    + public Boolean isSecure +
    + @description Boolean representing whether or not the current browsing +context is secure (HTTPS).
    +
    This property is defined by MenuItem.
    +
    + +
    +

    parent

    + public YAHOO.widget.Menu parent +
    + @description Object reference to the menu item's parent menu. +@default null
    +
    This property is defined by MenuItem.
    +
    + + + + + +
    +

    value

    + public Object value +
    + @description Object reference to the menu item's value. +@default null
    +
    This property is defined by MenuItem.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuItem

    + public function MenuItem() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blur

    + public function blur() +
    + @description Causes the menu item to lose focus and fires the +onblur event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configChecked

    + public function configChecked(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "checked" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configDisabled

    + public function configDisabled(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "disabled" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configEmphasis

    + public function configEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "emphasis" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configHelpText

    + public function configHelpText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "helptext" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSelected

    + public function configSelected(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "selected" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configStrongEmphasis

    + public function configStrongEmphasis(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "strongemphasis" configuration +property of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configSubmenu

    + public function configSubmenu(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "submenu" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configTarget

    + public function configTarget(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "target" configuration property +of the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configText

    + public function configText(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "text" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    configURL

    + public function configURL(String p_sType, Array p_aArgs, YAHOO.widget.MenuItem p_oItem) +
    + @description Event handler for when the "url" configuration property of +the menu item changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oItem : YAHOO.widget.MenuItem
      Object representing the menu item that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    destroy

    + public function destroy() +
    + @description Removes the menu item's <li> element +from its parent <ul> element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    focus

    + public function focus() +
    + @description Causes the menu item to receive the focus and fires the +focus event. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getNextEnabledSibling

    + public function getNextEnabledSibling() +
    + @description Finds the menu item's next enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    getPreviousEnabledSibling

    + public function getPreviousEnabledSibling() +
    + @description Finds the menu item's previous enabled sibling. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    init

    + public function init(String p_oObject, , + @description The MenuItem class's initialization method. This method is +automatically called by the constructor, and sets up all DOM references +for pre-existing markup, and creates required markup if it is not +already present. +
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-38450247">HTMLOptGroupElement} p_oObject Object specifying the <optgroup> element of the menu item.
  • href="http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level- : one-html.html#ID-70901257">HTMLOptionElement} p_oObject Object specifying the <option> element of the menu item.
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu item. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    + +
    This method is defined by MenuItem.
    + + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes an item's configurable properties. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the menu item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuItem.
    +
    + + +

    Event Details

    +
    + +
    +

    blurEvent

    + public event blurEvent +
    + @description Fires when the menu item loses the input focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    destroyEvent

    + public event destroyEvent +
    + @description Fires when the menu item's <li> +element is removed from its parent <ul> element. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    focusEvent

    + public event focusEvent +
    + @description Fires when the menu item receives focus. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when the +menu item has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when the menu item has +focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu item. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu item. Passes +back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse +is over the menu item. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by MenuItem.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuManager.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuManager.html new file mode 100644 index 000000000..892e60fc3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuManager.html @@ -0,0 +1,200 @@ + + + + YAHOO.widget.MenuManager + + + + + +
    + +

    Class YAHOO.widget.MenuManager

    + + + + + +
    Package:YAHOO.widget
    Class:MenuManager
    Extends:Object
    Defined In:menu.js
    +
    + Singleton that manages a collection of all menus and menu items. Listens for +DOM events at the document level and dispatches the events to the +corresponding menu or menu item.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addMenu(YAHOO.widget.Menu p_oMenu) : voidMenuManager
    @description Adds a menu to the collection of known menus.
     getMenu(String p_sId) : YAHOO.widget.MenuMenuManager
    @description Returns a menu with the specified id.
     getMenus() : ArrayMenuManager
    @description Returns an array of all menus registered with the +menu manger.
     hideVisible() : voidMenuManager
    @description Hides all visible, dynamically positioned menus.
     removeMenu(YAHOO.widget.Menu p_oMenu) : voidMenuManager
    @description Removes a menu from the collection of known menus.
     toString() : StringMenuManager
    @description Returns a string representing the menu manager.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Method Details

    +
    + +
    +

    addMenu

    + public function addMenu(YAHOO.widget.Menu p_oMenu) +
    + @description Adds a menu to the collection of known menus. +
    + Parameters: +
    • p_oMenu : YAHOO.widget.Menu
      Object specifying the Menu instance to be added.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    getMenu

    + public function getMenu(String p_sId) +
    + @description Returns a menu with the specified id. +
    + Parameters: +
    • p_sId : String
      String specifying the id of the menu to be retrieved.
    + Returns: +
      +
    • YAHOO.widget.Menu
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    getMenus

    + public function getMenus() +
    + @description Returns an array of all menus registered with the +menu manger. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    hideVisible

    + public function hideVisible() +
    + @description Hides all visible, dynamically positioned menus. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    removeMenu

    + public function removeMenu(YAHOO.widget.Menu p_oMenu) +
    + @description Removes a menu from the collection of known menus. +
    + Parameters: +
    • p_oMenu : YAHOO.widget.Menu
      Object specifying the Menu instance to be removed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the menu manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by MenuManager.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModule.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModule.html new file mode 100644 index 000000000..03cb20c26 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModule.html @@ -0,0 +1,1015 @@ + + + + YAHOO.widget.MenuModule + + + + + +
    + +

    Class YAHOO.widget.MenuModule

    + + + + + +
    Package:YAHOO.widget
    Class:MenuModule
    Extends:Overlay
    Defined In:menu.js
    +
    + The base class for all menuing containers.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     cfg : Boolean +@defaultOverlay
    True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuModule()MenuModule
    Deprecated.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidOverlay
    The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatica...
     initDefaultConfig() : voidOverlay
    Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringOverlay
    Returns a String representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    cfg

    + public Boolean +@default cfg +
    + True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuModule

    + public function MenuModule() +
    + Deprecated.
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Overlay OR
    • el : HTMLElement
      The element representing the Overlay
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Overlay.
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModuleItem.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModuleItem.html new file mode 100644 index 000000000..205c2ca32 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuModuleItem.html @@ -0,0 +1,65 @@ + + + + YAHOO.widget.MenuModuleItem + + + + + +
    + +

    Class YAHOO.widget.MenuModuleItem

    + + + + + +
    Package:YAHOO.widget
    Class:MenuModuleItem
    Extends:Object
    Defined In:menu.js
    +
    + Creates an item for a menu module.
    +
    + +

    Public Properties

    +
    This class has no public properties.
    +

    Public Methods

    + + + + + + + + + + + + + +
    MethodDefined By
     MenuModuleItem()MenuModuleItem
    Deprecated.
    + +

    Public Events

    +
    This class has no public events.
    + + +

    Constructor Details

    +
    +
    +

    MenuModuleItem

    + public function MenuModuleItem() +
    + Deprecated.
    + Parameters: +
    • None.
    +
    +
    +
    +
    + + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuNode.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuNode.html new file mode 100644 index 000000000..f1055a68b --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.MenuNode.html @@ -0,0 +1,1500 @@ + + + + YAHOO.widget.MenuNode + + + + + +
    + +

    Class YAHOO.widget.MenuNode

    + + + + + +
    Package:YAHOO.widget
    Class:MenuNode
    Extends:TextNode
    Defined In:treeview.js
    +
    + A menu-specific implementation that differs from TextNode in that only +one sibling can be expanded at a time.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     label : stringTextNode
    The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the labe...
     labelElId : stringTextNode
    The derived element id of the label for this node
     labelStyle : stringTextNode
    The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for ...
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     MenuNode()MenuNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getLabelEl() : objectTextNode
    Returns the label element +@for YAHOO.widget.TextNode
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     onLabelClick(me {Node}) : falseTextNode
    Executed when the label is clicked. Fires the labelClick custom event.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     setUpLabel(oData string) : voidTextNode
    Sets up the node label
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     labelClick : (YAHOO.widget.Node node)TextNode
    Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so...
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    label

    + public string label +
    + The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the label, or an object that +has a property called "label" that we will use.
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelElId

    + public string labelElId +
    + The derived element id of the label for this node
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelStyle

    + public string labelStyle +
    + The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for a specific node.
    +
    This property is defined by TextNode.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    MenuNode

    + public function MenuNode() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getLabelEl

    + public function getLabelEl() +
    + Returns the label element +@for YAHOO.widget.TextNode +
    + Parameters: +
    • None.
    + Returns: +
      +
    • object
      the element
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    onLabelClick

    + public function onLabelClick(me {Node}) +
    + Executed when the label is clicked. Fires the labelClick custom event. +
    + Parameters: +
    • {Node} : me
      this node @scope the anchor tag clicked
    + Returns: +
      +
    • false
      to cancel the anchor click
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setUpLabel

    + public function setUpLabel(oData string) +
    + Sets up the node label +
    + Parameters: +
    • string : oData
      containing the label, or an object with a label property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    labelClick

    + public event labelClick +
    + Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so there is a single +event that handles all nodes in the tree. The node clicked is +provided as an argument +@for YAHOO.widget.TreeView +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node clicked
    +
    +
    +
    This event is defined by TextNode.
    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menubar.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menubar.html new file mode 100644 index 000000000..15c357f5c --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Menubar.html @@ -0,0 +1,1903 @@ + + + + YAHOO.widget.Menubar + + + + + +
    + +

    Class YAHOO.widget.Menubar

    + + + + + +
    Package:YAHOO.widget
    Class:Menubar
    Extends:Menu
    Defined In:menu.js
    +
    + Horizontal collection of items, each of which can contain a submenu.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_CLASS_NAME : StringMenubar
    @description String representing the CSS class(es) to be applied to the menu +bar's <div> element. +@default "y...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     GROUP_TITLE_TAG_NAME : StringMenu
    @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@f...
     ITEM_TYPE : YAHOO.widget.MenuItemMenu
    @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either &#...
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     activeItem : YAHOO.widget.MenuItemMenu
    @description Object reference to the item in the menu that has focus. +@default null
     cfg : Boolean +@defaultOverlay
    True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
     itemData : ArrayMenu
    @description Array of items to be added to the menu. The array can contain +strings representing the text for each it...
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     lazyLoad : BooleanMenu
    @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and r...
     parent : YAHOO.widget.MenuItemMenu
    @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor us...
     srcElement : + Menu
    @description Object reference to the HTML element (either +<select> or <div>) used to +create the menu....
     value : ArrayMenubar
    @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu bar item. Th...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Menubar()Menubar
     _onClick(String p_sType, Array p_aArgs, YAHOO.widget.MenuBar p_oMenuBar) : voidMenubar
    @description "click" event handler for the menu bar. +@protected
     _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "keydown" event handler for the menu. +@protected
     _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseout" event handler for the menu. +@protected
     _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description "mouseover" event handler for the menu. +@protected
     addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Appends an item to the menu.
     addItems(Array p_aItems, Number p_nGroupIndex) : ArrayMenu
    @description Adds an array of items to the menu.
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     clearActiveItem(Boolean p_bBlur) : voidMenu
    @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's sub...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "container" configuration property +of the menu changes.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "hidedelay" configuration property +of the menu changes.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) : voidMenu
    @description Event handler for when the "position" configuration property +of the menu changes.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     getItem(Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Returns the item at the specified index.
     getItemGroups() : ArrayMenu
    @description Returns a multi-dimensional array of all of the items in the menu.
     getRoot() : voidMenu
    @description Finds the menu's root menu.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String p_oElement, String p_oElement, , Object p_oConfig) : voidMenubar
    @description The MenuBar class's initialization method. This method is +automatically called by the constructor, and s...
     initDefaultConfig() : voidMenubar
    @description Initializes the class's configurable properties which can be +changed using the menu bar's Config object ...
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Inserts an item into the menu at the specified index.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) : YAHOO.widget.MenuItemMenu
    @description Removes the specified item from the menu.
     setInitialFocus() : voidMenu
    @description Sets focus to the menu's first enabled item.
     setInitialSelection() : voidMenu
    @description Sets the "selected" configuration property of the menu's first +enabled item to "true."
     setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) : voidMenu
    @description Sets the title of a group of menu items.
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringMenubar
    @description Returns a string representing the menu bar.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     clickEvent : ()Menu
    @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument.
     itemAddedEvent : ()Menu
    @description Fires when an item is added to the menu.
     itemRemovedEvent : ()Menu
    @description Fires when an item is removed to the menu.
     keyDownEvent : ()Menu
    @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event obj...
     keyPressEvent : ()Menu
    @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the...
     keyUpEvent : ()Menu
    @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event ob...
     mouseDownEvent : ()Menu
    @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument.
     mouseOutEvent : ()Menu
    @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument.
     mouseOverEvent : ()Menu
    @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument.
     mouseUpEvent : ()Menu
    @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event...
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_CLASS_NAME

    + public String CSS_CLASS_NAME +
    + @description String representing the CSS class(es) to be applied to the menu +bar's <div> element. +@default "yuimenubar" +@final
    +
    This property is defined by Menubar.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    GROUP_TITLE_TAG_NAME

    + public String GROUP_TITLE_TAG_NAME +
    + @description String representing the tagname of the HTML element used to +title the menu's item groups. +@default H6 +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    ITEM_TYPE

    + public YAHOO.widget.MenuItem ITEM_TYPE +
    + @description Object representing the type of menu item to instantiate and +add when parsing the child nodes (either <li> element, +<optgroup> element or <option>) +of the menu's source HTML element. +@default YAHOO.widget.MenuItem +@final
    +
    This property is defined by Menu.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    activeItem

    + public YAHOO.widget.MenuItem activeItem +
    + @description Object reference to the item in the menu that has focus. +@default null
    +
    This property is defined by Menu.
    +
    + +
    +

    cfg

    + public Boolean +@default cfg +
    + True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    itemData

    + public Array itemData +
    + @description Array of items to be added to the menu. The array can contain +strings representing the text for each item to be created, object literals +representing the menu item configuration properties, or MenuItem instances. +This property should be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    lazyLoad

    + public Boolean lazyLoad +
    + @description Boolean indicating if the menu's "lazy load" feature is +enabled. If set to "true," initialization and rendering of the menu's +items will be deferred until the first time it is made visible. This +property should be set via the constructor using the configuration +object literal. +@default false
    +
    This property is defined by Menu.
    +
    + +
    +

    parent

    + public YAHOO.widget.MenuItem parent +
    + @description Object reference to the menu's parent menu or menu item. +This property can be set via the constructor using the configuration +object literal. +@default null
    +
    This property is defined by Menu.
    +
    + + + +
    +

    value

    + public Array value +
    + @config submenualignment +@description Array defining how submenus should be aligned to their +parent menu bar item. The format is: [itemCorner, submenuCorner]. +@default ["tl","bl"]
    +
    This property is defined by Menubar.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Menubar

    + public function Menubar() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    _onClick

    + public function _onClick(String p_sType, Array p_aArgs, YAHOO.widget.MenuBar p_oMenuBar) +
    + @description "click" event handler for the menu bar. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenuBar : YAHOO.widget.MenuBar
      Object representing the menu bar that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    _onKeyDown

    + public function _onKeyDown(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "keydown" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOut

    + public function _onMouseOut(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseout" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    _onMouseOver

    + public function _onMouseOver(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description "mouseover" event handler for the menu. +@protected +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItem

    + public function addItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nGroupIndex) +
    + @description Appends an item to the menu. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    addItems

    + public function addItems(Array p_aItems, Number p_nGroupIndex) +
    + @description Adds an array of items to the menu. +
    + Parameters: +
    • p_aItems : Array
      Array of items to be added to the menu. The array can contain strings specifying the text for each item to be created, object literals specifying each of the menu item configuration properties, or MenuItem instances.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the items belongs.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    clearActiveItem

    + public function clearActiveItem(Boolean p_bBlur) +
    + @description Sets the "selected" configuration property of the menu's active +item to "false" and hides the item's submenu. +
    + Parameters: +
    • p_bBlur : Boolean
      Boolean indicating if the menu's active item should be blurred.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "container" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHideDelay

    + public function configHideDelay(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "hidedelay" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configPosition

    + public function configPosition(String p_sType, Array p_aArgs, YAHOO.widget.Menu p_oMenu) +
    + @description Event handler for when the "position" configuration property +of the menu changes. +
    + Parameters: +
    • p_sType : String
      String representing the name of the event that was fired.
    • p_aArgs : Array
      Array of arguments sent when the event was fired.
    • p_oMenu : YAHOO.widget.Menu
      Object representing the menu that fired the event.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    getItem

    + public function getItem(Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Returns the item at the specified index. +
    + Parameters: +
    • p_nItemIndex : Number
      Number indicating the ordinal position of the item to be retrieved.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getItemGroups

    + public function getItemGroups() +
    + @description Returns a multi-dimensional array of all of the items in the menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Array
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    getRoot

    + public function getRoot() +
    + @description Finds the menu's root menu. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String p_oElement, String p_oElement, , Object p_oConfig) +
  • p_oConfig : Object
    Optional. Object literal specifying the configuration for the menu bar. See configuration class documentation for more details.
  • + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + @description Initializes the class's configurable properties which can be +changed using the menu bar's Config object ("cfg"). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    insertItem

    + public function insertItem(YAHOO.widget.MenuItem p_oItem, String p_oItem, Object p_oItem, Number p_nItemIndex, Number p_nGroupIndex) +
    + @description Inserts an item into the menu at the specified index. +
    + Parameters: +
    • p_oItem : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be added to the menu.
    • p_oItem : String
      String specifying the text of the item to be added to the menu.
    • p_oItem : Object
      Object literal containing a set of menu item configuration properties.
    • p_nItemIndex : Number
      Number indicating the ordinal position at which the item should be added.
    • p_nGroupIndex : Number
      Optional. Number indicating the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    removeItem

    + public function removeItem(YAHOO.widget.MenuItem p_oObject, Number p_oObject, Number p_nGroupIndex) +
    + @description Removes the specified item from the menu. +
    + Parameters: +
    • p_oObject : YAHOO.widget.MenuItem
      Object reference for the MenuItem instance to be removed from the menu.
    • p_oObject : Number
      Number specifying the index of the item to be removed.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the item belongs.
    + Returns: +
      +
    • YAHOO.widget.MenuItem
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialFocus

    + public function setInitialFocus() +
    + @description Sets focus to the menu's first enabled item. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setInitialSelection

    + public function setInitialSelection() +
    + @description Sets the "selected" configuration property of the menu's first +enabled item to "true." +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    setItemGroupTitle

    + public function setItemGroupTitle(String p_sGroupTitle, Number p_nGroupIndex) +
    + @description Sets the title of a group of menu items. +
    + Parameters: +
    • p_sGroupTitle : String
      String specifying the title of the group.
    • p_nGroupIndex : Number
      Optional. Number specifying the group to which the title belongs.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Menu.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + @description Returns a string representing the menu bar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Menubar.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    clickEvent

    + public event clickEvent +
    + @description Fires when the user clicks the on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemAddedEvent

    + public event itemAddedEvent +
    + @description Fires when an item is added to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    itemRemovedEvent

    + public event itemRemovedEvent +
    + @description Fires when an item is removed to the menu. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyDownEvent

    + public event keyDownEvent +
    + @description Fires when the user presses a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyPressEvent

    + public event keyPressEvent +
    + @description Fires when the user presses an alphanumeric key when one of the +menu's items has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    keyUpEvent

    + public event keyUpEvent +
    + @description Fires when the user releases a key when one of the menu's items +has focus. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseDownEvent

    + public event mouseDownEvent +
    + @description Fires when the user mouses down on the menu. Passes back the +DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOutEvent

    + public event mouseOutEvent +
    + @description Fires when the mouse has left the menu. Passes back the DOM +Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseOverEvent

    + public event mouseOverEvent +
    + @description Fires when the mouse has entered the menu. Passes back +the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    mouseUpEvent

    + public event mouseUpEvent +
    + @description Fires when the user releases a mouse button while the mouse is +over the menu. Passes back the DOM Event object as an argument. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Menu.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    + +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Node.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Node.html new file mode 100644 index 000000000..a61bd336c --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Node.html @@ -0,0 +1,1345 @@ + + + + YAHOO.widget.Node + + + + + +
    + +

    Class YAHOO.widget.Node

    + + + + + + +
    Package:YAHOO.widget
    Class:Node
    Extends:Object
    Subclasses:HTMLNode, RootNode, TextNode
    Defined In:treeview.js
    +
    + The base class for all tree nodes. The node's presentation and behavior in +response to mouse events is handled in Node subclasses.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Node()Node
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Node

    + public function Node() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Overlay.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Overlay.html new file mode 100644 index 000000000..ad5bb29f4 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Overlay.html @@ -0,0 +1,1016 @@ + + + + YAHOO.widget.Overlay + + + + + +
    + +

    Class YAHOO.widget.Overlay

    + + + + + + +
    Package:YAHOO.widget
    Class:Overlay
    Extends:YAHOO.widget.Module
    Subclasses:Menu, MenuModule, Panel, Tooltip
    Defined In:container_core.js
    +
    + Overlay is a Module that is absolutely positioned above the page flow. It has convenience methods for positioning and sizing, as well as options for controlling zIndex and constraining the Overlay's position to the current visible viewport. Overlay also contains a dynamicly generated IFRAME which is placed beneath it for Internet Explorer 6 and 5.x so that it will be properly rendered above SELECT elements.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     cfg : Boolean +@defaultOverlay
    True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Overlay()Overlay
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidOverlay
    The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatica...
     initDefaultConfig() : voidOverlay
    Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringOverlay
    Returns a String representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    cfg

    + public Boolean +@default cfg +
    + True if the Overlay should have an IFRAME shim (for correcting the select z-index bug in IE6 and below). +@config iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Overlay

    + public function Overlay() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Overlay OR
    • el : HTMLElement
      The element representing the Overlay
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Overlay.
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.OverlayManager.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.OverlayManager.html new file mode 100644 index 000000000..460160fb6 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.OverlayManager.html @@ -0,0 +1,416 @@ + + + + YAHOO.widget.OverlayManager + + + + + +
    + +

    Class YAHOO.widget.OverlayManager

    + + + + + +
    Package:YAHOO.widget
    Class:OverlayManager
    Extends:Object
    Defined In:container_core.js
    +
    + OverlayManager is used for maintaining the focus status of multiple Overlays.*
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_FOCUSED<static> : StringOverlayManager
    <static> The CSS class representing a focused Overlay
     cfg : YAHOO.util.ConfigOverlayManager
    The OverlayManager's Config object used for monitoring configuration properties.
     contructor : FunctionOverlayManager
    The class's constructor function
     overlays : YAHOO.widget.Overlay[]OverlayManager
    The array of Overlays that are currently registered
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     OverlayManager(Array overlays, Object userConfig)OverlayManager
     blurAll() : voidOverlayManager
    Removes focus from all registered Overlays in the manager
     find(YAHOO.widget.Overlay overlay, String overlay) : YAHOO.widget.OverlayOverlayManager
    Attempts to locate an Overlay by instance or ID.
     focus(YAHOO.widget.Overlay overlay, String overlay) : voidOverlayManager
    Focuses the specified Overlay
     getActive() : YAHOO.widget.OverlayOverlayManager
    Returns the currently focused Overlay
     hideAll() : voidOverlayManager
    Hides all Overlays in the manager.
     init(YAHOO.widget.Overlay[] overlays, Object userConfig) : voidOverlayManager
    Initializes the OverlayManager
     initDefaultConfig() : voidOverlayManager
    Initializes the default configuration of the OverlayManager
     register(YAHOO.widget.Overlay overlay, YAHOO.widget.Overlay[] overlay) : BooleanOverlayManager
    Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for ...
     remove(YAHOO.widget.Overlay overlay, String overlay) : voidOverlayManager
    Removes the specified Overlay from the manager
     showAll() : voidOverlayManager
    Shows all Overlays in the manager.
     toString() : StringOverlayManager
    Returns a string representation of the object.
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    CSS_FOCUSED<static>

    + public String CSS_FOCUSED<static> +
    + <static> The CSS class representing a focused Overlay
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    cfg

    + public YAHOO.util.Config cfg +
    + The OverlayManager's Config object used for monitoring configuration properties.
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    contructor

    + public Function contructor +
    + The class's constructor function
    +
    This property is defined by OverlayManager.
    +
    + +
    +

    overlays

    + public YAHOO.widget.Overlay[] overlays +
    + The array of Overlays that are currently registered
    +
    This property is defined by OverlayManager.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    OverlayManager

    + public function OverlayManager(Array overlays, Object userConfig) +
    +
    + Parameters: +
    • overlays : Array
      Optional. A collection of Overlays to register with the manager.
    • userConfig : Object
      The object literal representing the user configuration of the OverlayManager
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    blurAll

    + public function blurAll() +
    + Removes focus from all registered Overlays in the manager +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    find

    + public function find(YAHOO.widget.Overlay overlay, String overlay) +
    + Attempts to locate an Overlay by instance or ID. +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      An Overlay to locate within the manager
    • overlay : String
      An Overlay id to locate within the manager
    + Returns: +
      +
    • YAHOO.widget.Overlay
      The requested Overlay, if found, or null if it cannot be located.
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    focus

    + public function focus(YAHOO.widget.Overlay overlay, String overlay) +
    + Focuses the specified Overlay +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      The Overlay to focus
    • overlay : String
      The id of the Overlay to focus
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    getActive

    + public function getActive() +
    + Returns the currently focused Overlay +
    + Parameters: +
    • None.
    + Returns: +
      +
    • YAHOO.widget.Overlay
      The currently focused Overlay
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    hideAll

    + public function hideAll() +
    + Hides all Overlays in the manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    init

    + public function init(YAHOO.widget.Overlay[] overlays, Object userConfig) +
    + Initializes the OverlayManager +
    + Parameters: +
    • overlays : YAHOO.widget.Overlay[]
      Optional. A collection of Overlays to register with the manager.
    • userConfig : Object
      The object literal representing the user configuration of the OverlayManager
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the default configuration of the OverlayManager +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    register

    + public function register(YAHOO.widget.Overlay overlay, YAHOO.widget.Overlay[] overlay) +
    + Registers an Overlay or an array of Overlays with the manager. Upon registration, the Overlay receives functions for focus and blur, along with CustomEvents for each. +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      An Overlay to register with the manager.
    • overlay : YAHOO.widget.Overlay[]
      An array of Overlays to register with the manager.
    + Returns: +
      +
    • Boolean
      True if any Overlays are registered.
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    remove

    + public function remove(YAHOO.widget.Overlay overlay, String overlay) +
    + Removes the specified Overlay from the manager +
    + Parameters: +
    • overlay : YAHOO.widget.Overlay
      The Overlay to remove
    • overlay : String
      The id of the Overlay to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    showAll

    + public function showAll() +
    + Shows all Overlays in the manager. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the OverlayManager
    • +
    +
    +
    +
    This method is defined by OverlayManager.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Panel.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Panel.html new file mode 100644 index 000000000..5c10a7bb0 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Panel.html @@ -0,0 +1,1460 @@ + + + + YAHOO.widget.Panel + + + + + +
    + +

    Class YAHOO.widget.Panel

    + + + + + + +
    Package:YAHOO.widget
    Class:Panel
    Extends:Overlay
    Subclasses:Dialog
    Defined In:container.js
    +
    + Panel is an implementation of Overlay that behaves like an OS window, with a draggable header and an optional close icon at the top right.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     cfg : YAHOO.util.KeyListener[] +@defaultPanel
    A KeyListener (or array of KeyListeners) that will be enabled when the Panel is shown, and disabled when the Panel is...
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Panel(String el, HTMLElement el, Object userConfig)Panel
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     center() : voidOverlay
    Centers the container in the viewport.
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidPanel
    The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatica...
     initDefaultConfig() : voidPanel
    Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg).
     initEvents() : voidPanel
    Initializes the custom events for Module which are fired automatically at appropriate times by the Module class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidPanel
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode) : booleanPanel
    Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optiona...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringPanel
    Returns a String representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    cfg

    + public YAHOO.util.KeyListener[] +@default cfg +
    + A KeyListener (or array of KeyListeners) that will be enabled when the Panel is shown, and disabled when the Panel is hidden. +@config keylisteners
    +
    This property is defined by Panel.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Panel

    + public function Panel(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Panel OR
    • el : HTMLElement
      The element representing the Panel
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Panel. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Overlay initialization method, which is executed for Overlay and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the Overlay OR
    • el : HTMLElement
      The element representing the Overlay
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Panel's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Module which are fired automatically at appropriate times by the Module class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode) +
    + Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optionally appends the Panel to the specified node prior to the render's execution. NOTE: For Panels without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    + Returns: +
      +
    • boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a String representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Panel.
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.RootNode.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.RootNode.html new file mode 100644 index 000000000..9b129d5f3 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.RootNode.html @@ -0,0 +1,1344 @@ + + + + YAHOO.widget.RootNode + + + + + +
    + +

    Class YAHOO.widget.RootNode

    + + + + + +
    Package:YAHOO.widget
    Class:RootNode
    Extends:Node
    Defined In:treeview.js
    +
    + A custom YAHOO.widget.Node that handles the unique nature of +the virtual, presentationless root node.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     RootNode()RootNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + +
    EventDefined By
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    RootNode

    + public function RootNode() +
    +
    + Parameters: +
    • None.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.SimpleDialog.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.SimpleDialog.html new file mode 100644 index 000000000..07ccf640b --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.SimpleDialog.html @@ -0,0 +1,2180 @@ + + + + YAHOO.widget.SimpleDialog + + + + + +
    + +

    Class YAHOO.widget.SimpleDialog

    + + + + + +
    Package:YAHOO.widget
    Class:SimpleDialog
    Extends:Dialog
    Defined In:container.js
    +
    + SimpleDialog is a simple implementation of Dialog that can be used to submit a single value. Forms can be processed in 3 ways -- via an asynchronous Connection utility call, a simple form POST or GET, or manually.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_DIALOG<static> : StringDialog
    <static> Constant representing the default CSS class used for a Dialog
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_PANEL<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel
     CSS_PANEL_CONTAINER<static> : StringPanel
    <static> Constant representing the default CSS class used for a Panel's wrapping container
     CSS_SIMPLEDIALOG<static> : StringSimpleDialog
    <static> Constant representing the default CSS class used for a SimpleDialog
     ICON_ALARM<static> : StringSimpleDialog
    <static> Constant for the standard network icon for alarm
     ICON_BLOCK<static> : StringSimpleDialog
    <static> Constant for the standard network icon for a blocking action
     ICON_HELP<static> : StringSimpleDialog
    <static> Constant for the standard network icon for help
     ICON_INFO<static> : StringSimpleDialog
    <static> Constant for the standard network icon for info
     ICON_TIP<static> : StringSimpleDialog
    <static> Constant for the standard network icon for a tip
     ICON_WARN<static> : StringSimpleDialog
    <static> Constant for the standard network icon for warn
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     argument : ObjectDialog
    The arbitraty argument or arguments to pass to the Connection callback functions
     callback : ObjectDialog
    The internally maintained callback object for use with the Connection utility
     cfg : String +@defaultSimpleDialog
    Sets the text for the SimpleDialog +@config text
     failure : FunctionDialog
    The function to execute upon failure of the Connection submission
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
     success : FunctionDialog
    The function to execute upon success of the Connection submission
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     SimpleDialog(String el, HTMLElement el, Object userConfig)SimpleDialog
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     blurButtons() : voidDialog
    Blurs all the html buttons
     buildMask() : voidPanel
    Builds the mask that is laid over the document when the Panel is configured to be modal.
     buildWrapper() : voidPanel
    Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The conta...
     cancel() : voidDialog
    Executes the cancel of the Dialog followed by a hide.
     center() : voidOverlay
    Centers the container in the viewport.
     cfg() : voidDialog
    The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual". +@config postmethod
     configButtons(String type, Object[] args, Object obj) : voidDialog
    The default event handler for the "buttons" configuration property
     configClose(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "close" property is changed. The method controls the appending or hiding of ...
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContext(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "context" property is changed.
     configDraggable(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "draggable" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIcon(String type, Object[] args, Object obj) : voidSimpleDialog
    Fired when the "icon" property is set.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configKeyListeners(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "keylisteners" property is changed.
     configModal(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the ...
     configText(String type, Object[] args, Object obj) : voidSimpleDialog
    Fired when the "text" property is set.
     configUnderlay(String type, Object[] args, Object obj) : voidPanel
    The default event handler fired when the "underlay" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doSubmit() : voidDialog
    Performs the submission of the Dialog form depending on the value of "postmethod" property.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     focusDefaultButton() : voidDialog
    Sets the focus to the button that is designated as the default. By default, his handler is executed when the show eve...
     focusFirst() : voidDialog
    The default event handler used to focus the first field of the form when the Dialog is shown.
     focusFirstButton() : voidDialog
    Sets the focus to the first button in the button list
     focusLast() : voidDialog
    Sets the focus to the last button in the button or form element in the Dialog
     focusLastButton() : voidDialog
    Sets the focus to the first button in the button list
     getData() : ObjectDialog
    Returns a JSON-compatible data structure representing the data currently contained in the form.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     hideMask() : voidPanel
    Hides the modality mask.
     init(String el, HTMLElement el, Object userConfig) : voidSimpleDialog
    The SimpleDialog initialization method, which is executed for SimpleDialog and all of its subclasses. This method is ...
     initDefaultConfig() : voidSimpleDialog
    Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg).
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     registerDragDrop() : voidPanel
    Registers the Panel's header for drag & drop capability.
     registerForm() : voidSimpleDialog
    Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value ...
     removeMask() : voidPanel
    Removes the modality mask.
     render(String appendToNode, HTMLElement appendToNode) : booleanPanel
    Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optiona...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     showMask() : voidPanel
    Shows the modality mask.
     sizeMask() : voidPanel
    Sets the size of the modality mask to cover the entire scrollable area of the document
     sizeUnderlay() : voidPanel
    Adjusts the size of the shadow based on the size of the element.
     submit() : voidDialog
    Executes a submit of the Dialog followed by a hide, if validation is successful.
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringSimpleDialog
    Returns a string representation of the object.
     validate() : voidDialog
    Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. T...
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     asyncSubmitEvent : ()Dialog
    CustomEvent fired prior to asynchronous submission
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     beforeSumitEvent : ()Dialog
    CustomEvent fired prior to submission
     cancelEvent : ()Dialog
    CustomEvent fired after cancel
     dragEvent : ()Panel
    CustomEvent when the Panel is dragged
     formSubmitEvent : ()Dialog
    CustomEvent fired prior to form-based submission
     hideMaskEvent : ()Panel
    CustomEvent fired after the modality mask is hidden
     manualSubmitEvent : ()Dialog
    CustomEvent fired prior to manual submission
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
     showMaskEvent : ()Panel
    CustomEvent fired after the modality mask is shown
     submitEvent : ()Dialog
    CustomEvent fired after submission
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_DIALOG<static>

    + public String CSS_DIALOG<static> +
    + <static> Constant representing the default CSS class used for a Dialog
    +
    This property is defined by Dialog.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_PANEL<static>

    + public String CSS_PANEL<static> +
    + <static> Constant representing the default CSS class used for a Panel
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_PANEL_CONTAINER<static>

    + public String CSS_PANEL_CONTAINER<static> +
    + <static> Constant representing the default CSS class used for a Panel's wrapping container
    +
    This property is defined by Panel.
    +
    + +
    +

    CSS_SIMPLEDIALOG<static>

    + public String CSS_SIMPLEDIALOG<static> +
    + <static> Constant representing the default CSS class used for a SimpleDialog
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_ALARM<static>

    + public String ICON_ALARM<static> +
    + <static> Constant for the standard network icon for alarm
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_BLOCK<static>

    + public String ICON_BLOCK<static> +
    + <static> Constant for the standard network icon for a blocking action
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_HELP<static>

    + public String ICON_HELP<static> +
    + <static> Constant for the standard network icon for help
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_INFO<static>

    + public String ICON_INFO<static> +
    + <static> Constant for the standard network icon for info
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_TIP<static>

    + public String ICON_TIP<static> +
    + <static> Constant for the standard network icon for a tip
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    ICON_WARN<static>

    + public String ICON_WARN<static> +
    + <static> Constant for the standard network icon for warn
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    argument

    + public Object argument +
    + The arbitraty argument or arguments to pass to the Connection callback functions
    +
    This property is defined by Dialog.
    +
    + +
    +

    callback

    + public Object callback +
    + The internally maintained callback object for use with the Connection utility
    +
    This property is defined by Dialog.
    +
    + +
    +

    cfg

    + public String +@default cfg +
    + Sets the text for the SimpleDialog +@config text
    +
    This property is defined by SimpleDialog.
    +
    + +
    +

    failure

    + public Function failure +
    + The function to execute upon failure of the Connection submission
    +
    This property is defined by Dialog.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    + +
    +

    success

    + public Function success +
    + The function to execute upon success of the Connection submission
    +
    This property is defined by Dialog.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    SimpleDialog

    + public function SimpleDialog(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the SimpleDialog OR
    • el : HTMLElement
      The element representing the SimpleDialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    blurButtons

    + public function blurButtons() +
    + Blurs all the html buttons +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    buildMask

    + public function buildMask() +
    + Builds the mask that is laid over the document when the Panel is configured to be modal. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    buildWrapper

    + public function buildWrapper() +
    + Builds the wrapping container around the Panel that is used for positioning the shadow and matte underlays. The container element is assigned to a local instance variable called container, and the element is reinserted inside of it. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    cancel

    + public function cancel() +
    + Executes the cancel of the Dialog followed by a hide. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    cfg

    + public function cfg() +
    + The method to use for posting the Dialog's form. Possible values are "async", "form", and "manual". +@config postmethod +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configButtons

    + public function configButtons(String type, Object[] args, Object obj) +
    + The default event handler for the "buttons" configuration property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    configClose

    + public function configClose(String type, Object[] args, Object obj) +
    + The default event handler fired when the "close" property is changed. The method controls the appending or hiding of the close icon at the top right of the Panel. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configDraggable

    + public function configDraggable(String type, Object[] args, Object obj) +
    + The default event handler fired when the "draggable" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIcon

    + public function configIcon(String type, Object[] args, Object obj) +
    + Fired when the "icon" property is set. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configKeyListeners

    + public function configKeyListeners(String type, Object[] args, Object obj) +
    + The default event handler fired when the "keylisteners" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configModal

    + public function configModal(String type, Object[] args, Object obj) +
    + The default event handler fired when the "modal" property is changed. This handler subscribes or unsubscribes to the show and hide events to handle the display or hide of the modality mask. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configText

    + public function configText(String type, Object[] args, Object obj) +
    + Fired when the "text" property is set. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    configUnderlay

    + public function configUnderlay(String type, Object[] args, Object obj) +
    + The default event handler fired when the "underlay" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doSubmit

    + public function doSubmit() +
    + Performs the submission of the Dialog form depending on the value of "postmethod" property. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    focusDefaultButton

    + public function focusDefaultButton() +
    + Sets the focus to the button that is designated as the default. By default, his handler is executed when the show event is fired. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirst

    + public function focusFirst() +
    + The default event handler used to focus the first field of the form when the Dialog is shown. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusFirstButton

    + public function focusFirstButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLast

    + public function focusLast() +
    + Sets the focus to the last button in the button or form element in the Dialog +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    focusLastButton

    + public function focusLastButton() +
    + Sets the focus to the first button in the button list +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    getData

    + public function getData() +
    + Returns a JSON-compatible data structure representing the data currently contained in the form. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Object
      A JSON object reprsenting the data of the current form.
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMask

    + public function hideMask() +
    + Hides the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The SimpleDialog initialization method, which is executed for SimpleDialog and all of its subclasses. This method is automatically called by the constructor, and sets up all DOM references for pre-existing markup, and creates required markup if it is not already present. +
    + Parameters: +
    • el : String
      The element ID representing the SimpleDialog OR
    • el : HTMLElement
      The element representing the SimpleDialog
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this SimpleDialog. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the SimpleDialog's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    registerDragDrop

    + public function registerDragDrop() +
    + Registers the Panel's header for drag & drop capability. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    registerForm

    + public function registerForm() +
    + Prepares the SimpleDialog's internal FORM object, creating one if one is not currently present, and adding the value hidden field. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    removeMask

    + public function removeMask() +
    + Removes the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    render

    + public function render(String appendToNode, HTMLElement appendToNode) +
    + Renders the Panel by inserting the elements that are not already in the main Panel into their correct places. Optionally appends the Panel to the specified node prior to the render's execution. NOTE: For Panels without existing markup, the appendToNode argument is REQUIRED. If this argument is ommitted and the current element is not present in the document, the function will return false, indicating that the render was a failure. +
    + Parameters: +
    • appendToNode : String
      The element id to which the Module should be appended to prior to rendering OR
    • appendToNode : HTMLElement
      The element to which the Module should be appended to prior to rendering
    + Returns: +
      +
    • boolean
      Success or failure of the render
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMask

    + public function showMask() +
    + Shows the modality mask. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeMask

    + public function sizeMask() +
    + Sets the size of the modality mask to cover the entire scrollable area of the document +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    sizeUnderlay

    + public function sizeUnderlay() +
    + Adjusts the size of the shadow based on the size of the element. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Panel.
    +
    + +
    +

    submit

    + public function submit() +
    + Executes a submit of the Dialog followed by a hide, if validation is successful. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the SimpleDialog
    • +
    +
    +
    +
    This method is defined by SimpleDialog.
    +
    + +
    +

    validate

    + public function validate() +
    + Built-in function hook for writing a validation function that will be checked for a "true" value prior to a submit. This function, as implemented by default, always returns true, so it should be overridden if validation is necessary. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Dialog.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    asyncSubmitEvent

    + public event asyncSubmitEvent +
    + CustomEvent fired prior to asynchronous submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeSumitEvent

    + public event beforeSumitEvent +
    + CustomEvent fired prior to submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    cancelEvent

    + public event cancelEvent +
    + CustomEvent fired after cancel +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    dragEvent

    + public event dragEvent +
    + CustomEvent when the Panel is dragged +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    formSubmitEvent

    + public event formSubmitEvent +
    + CustomEvent fired prior to form-based submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    hideMaskEvent

    + public event hideMaskEvent +
    + CustomEvent fired after the modality mask is hidden +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    manualSubmitEvent

    + public event manualSubmitEvent +
    + CustomEvent fired prior to manual submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    showMaskEvent

    + public event showMaskEvent +
    + CustomEvent fired after the modality mask is shown +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Panel.
    +
    + +
    +

    submitEvent

    + public event submitEvent +
    + CustomEvent fired after submission +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Dialog.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.SliderThumb.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.SliderThumb.html new file mode 100644 index 000000000..2016d901e --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.SliderThumb.html @@ -0,0 +1,1739 @@ + + + + YAHOO.widget.SliderThumb + + + + + +
    + +

    Class YAHOO.widget.SliderThumb

    + + + + + +
    Package:YAHOO.widget
    Class:SliderThumb
    Extends:DD
    Defined In:slider.js
    +
    + A drag and drop implementation to be used as the thumb of a slider.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     available : booleanDragDrop
    The availabe property is false until the linked dom element is accessible.
     config : objectDragDrop
    Configuration attributes passed into the constructor
     groups : string:DragDrop
    The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interact...
     hasOuterHandles : boolean +@defaultDragDrop
    By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in...
     id : StringDragDrop
    The id of the element associated with this object. This is what we +refer to as the "linked element" because the size...
     invalidHandleClasses : string[]DragDrop
    An indexted array of css class names for elements that will be ignored +if clicked.
     invalidHandleIds : string:DragDrop
    An associative array of ids for elements that will be ignored if clicked
     invalidHandleTypes : string:DragDrop
    An associative array of HTML tags that will be ignored if clicked.
     maintainOffset : booleanDragDrop
    Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its par...
     parentElId : stringSliderThumb
    The id of the thumbs parent HTML element (the slider background +element).
     primaryButtonOnly : booleanDragDrop
    By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed m...
     scroll : booleanDD
    When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragge...
     startOffset : [int,SliderThumb
    The (X and Y) difference between the thumb location and its parent +(the slider background) when the control is insta...
     xTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is ge...
     yTicks : int[]DragDrop
    Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is gene...
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     SliderThumb(String id, String sGroup, int iLeft, int iRight, int iUp, int iDown, int iTickSize)SliderThumb
     addInvalidHandleClass(string cssClass) : voidDragDrop
    Lets you specify a css class of elements that will not initiate a drag
     addInvalidHandleId(string id) : voidDragDrop
    Lets you to specify an element id for a child of a drag handle +that should not initiate a drag
     addInvalidHandleType(string tagName) : voidDragDrop
    Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate...
     addToGroup(sGroup {string}) : voidDragDrop
    Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belon...
     alignElWithMouse(HTMLElement el, int iPageX, int iPageY) : voidDD
    Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the loc...
     applyConfig() : voidDragDrop
    Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level ...
     autoOffset(int iPageX, int iPageY) : voidDD
    Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was...
     cachePosition(iPageX the, iPageY the) : voidDD
    Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this s...
     clearConstraints() : voidDragDrop
    Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constrain...
     clearTicks() : voidSliderThumb
    Clear's the slider's ticks
     endDrag(Event e) : voidDragDrop
    Fired when we are done dragging the object
     getDragEl() : HTMLElementDragDrop
    Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be as...
     getEl() : HTMLElementDragDrop
    Returns a reference to the linked element
     getOffsetFromParent([int, int]}) : voidSliderThumb
    Returns the difference between the location of the thumb and its parent.
     getValue() : intSliderThumb
    Gets the current offset from the element's start position in +pixels.
     getXValue() : intSliderThumb
    Gets the current X offset from the element's start position in +pixels.
     getYValue() : intSliderThumb
    Gets the current Y offset from the element's start position in +pixels.
     init(id the, String sGroup, object config) : voidDragDrop
    Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass
     initSlider(int iLeft, int iRight, int iUp, int iDown, int iTickSize) : voidSliderThumb
    Set up the slider, must be called in the constructor of all subclasses
     initTarget(id the, String sGroup, object config) : voidDragDrop
    Initializes Targeting functionality only... the object does not +get a mousedown handler.
     isLocked() : booleanDragDrop
    Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on th...
     isTarget() : voidDragDrop
    By default, all insances can be a drop target. This can be disabled by +setting isTarget to false.
     isValidHandleChild(HTMLElement node) : booleanDragDrop
    Checks the tag exclusion list to see if this click should be ignored
     lock() : voidDragDrop
    Lock this instance
     onAvailable() : voidDragDrop
    Override the onAvailable method to do what is needed after the initial +position was determined.
     onDrag(Event e) : voidDragDrop
    Abstract method called during the onMouseMove event while dragging an +object.
     onDragDrop(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this item is dropped on another DragDrop +obj
     onDragEnter(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element fist begins hovering over +another DragDrop obj
     onDragOut(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when we are no longer hovering over an element
     onDragOver(Event e, String|DragDrop[] id) : voidDragDrop
    Abstract method called when this element is hovering over another +DragDrop obj
     onInvalidDrop(Event e) : voidDragDrop
    Abstract method called when this item is dropped on an area with no +drop target
     onMouseDown(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mousedown
     onMouseUp(Event e) : voidDragDrop
    Event handler that fires when a drag/drop obj gets a mouseup
     padding() : voidDragDrop
    The padding configured for this drag and drop object for calculating +the drop zone intersection with this object.
     removeFromGroup(string sGroup) : voidDragDrop
    Remove's this instance from the supplied interaction group
     removeInvalidHandleClass(string cssClass) : voidDragDrop
    Unsets an invalid css class
     removeInvalidHandleId(string id) : voidDragDrop
    Unsets an invalid handle id
     removeInvalidHandleType(string tagName) : voidDragDrop
    Unsets an excluded tag name set by addInvalidHandleType
     resetConstraints(boolean maintainOffset) : voidDragDrop
    resetConstraints must be called if you manually reposition a dd element.
     setDelta(int iDeltaX, int iDeltaY) : voidDD
    Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass i...
     setDragElId(id {string}) : voidDragDrop
    Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag
     setDragElPos(int iPageX, int iPageY) : voidDD
    Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to th...
     setHandleElId(id {string}) : voidDragDrop
    Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example o...
     setInitialPosition(int diffX, int diffY) : voidDragDrop
    Stores the initial placement of the linked element.
     setOuterHandleElId(id the) : voidDragDrop
    Allows you to set an element outside of the linked element as a drag +handle
     setPadding(int iTop, int iRight, int iBot, int iLeft) : voidDragDrop
    Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targe...
     setXConstraint(int iLeft, int iRight, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of th...
     setYConstraint(int iUp, int iDown, int iTickSize) : voidDragDrop
    By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element...
     startDrag(int X, int Y) : voidDragDrop
    Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met.
     toString() : stringSliderThumb
    Thumb toString
     unlock() : voidDragDrop
    Unlock this instace
     unreg() : voidDragDrop
    Remove all drag and drop hooks for this element
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    available

    + public boolean available +
    + The availabe property is false until the linked dom element is accessible.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    config

    + public object config +
    + Configuration attributes passed into the constructor
    +
    This property is defined by DragDrop.
    +
    + +
    +

    groups

    + public string: groups +
    + The group defines a logical collection of DragDrop objects that are +related. Instances only get events when interacting with other +DragDrop object in the same group. This lets us define multiple +groups using a single DragDrop subclass if we want.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    hasOuterHandles

    + public boolean +@default hasOuterHandles +
    + By default, drags can only be initiated if the mousedown occurs in the +region the linked element is. This is done in part to work around a +bug in some browsers that mis-report the mousedown if the previous +mouseup happened outside of the window. This property is set to true +if outer handles are defined.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    id

    + public String id +
    + The id of the element associated with this object. This is what we +refer to as the "linked element" because the size and position of +this element is used to determine when the drag and drop objects have +interacted.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleClasses

    + public string[] invalidHandleClasses +
    + An indexted array of css class names for elements that will be ignored +if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleIds

    + public string: invalidHandleIds +
    + An associative array of ids for elements that will be ignored if clicked
    +
    This property is defined by DragDrop.
    +
    + +
    +

    invalidHandleTypes

    + public string: invalidHandleTypes +
    + An associative array of HTML tags that will be ignored if clicked.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    maintainOffset

    + public boolean maintainOffset +
    + Maintain offsets when we resetconstraints. Set to true when you want +the position of the element relative to its parent to stay the same +when the page changes
    +
    This property is defined by DragDrop.
    +
    + +
    +

    parentElId

    + public string parentElId +
    + The id of the thumbs parent HTML element (the slider background +element).
    +
    This property is defined by SliderThumb.
    +
    + +
    +

    primaryButtonOnly

    + public boolean primaryButtonOnly +
    + By default the drag and drop instance will only respond to the primary +button click (left button for a right-handed mouse). Set to true to +allow drag and drop to start with any mouse click that is propogated +by the browser
    +
    This property is defined by DragDrop.
    +
    + +
    +

    scroll

    + public boolean scroll +
    + When set to true, the utility automatically tries to scroll the browser +window wehn a drag and drop element is dragged near the viewport boundary. +Defaults to true.
    +
    This property is defined by DD.
    +
    + +
    +

    startOffset

    + public [int, startOffset +
    + The (X and Y) difference between the thumb location and its parent +(the slider background) when the control is instantiated.
    +
    This property is defined by SliderThumb.
    +
    + +
    +

    xTicks

    + public int[] xTicks +
    + Array of pixel locations the element will snap to if we specified a +horizontal graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    + +
    +

    yTicks

    + public int[] yTicks +
    + Array of pixel locations the element will snap to if we specified a +vertical graduation/interval. This array is generated automatically +when you define a tick interval.
    +
    This property is defined by DragDrop.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    SliderThumb

    + public function SliderThumb(String id, String sGroup, int iLeft, int iRight, int iUp, int iDown, int iTickSize) +
    +
    + Parameters: +
    • id : String
      the id of the slider html element
    • sGroup : String
      the group of related DragDrop items
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move a certain number pixels at a time.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    addInvalidHandleClass

    + public function addInvalidHandleClass(string cssClass) +
    + Lets you specify a css class of elements that will not initiate a drag +
    + Parameters: +
    • cssClass : string
      the class of the elements you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleId

    + public function addInvalidHandleId(string id) +
    + Lets you to specify an element id for a child of a drag handle +that should not initiate a drag +
    + Parameters: +
    • id : string
      the element id of the element you wish to ignore
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addInvalidHandleType

    + public function addInvalidHandleType(string tagName) +
    + Allows you to specify a tag name that should not start a drag operation +when clicked. This is designed to facilitate embedding links within a +drag handle that do something other than start the drag. +
    + Parameters: +
    • tagName : string
      the type of element to exclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    addToGroup

    + public function addToGroup(sGroup {string}) +
    + Add this instance to a group of related drag/drop objects. All +instances belong to at least one group, and can belong to as many +groups as needed. +
    + Parameters: +
    • {string} : sGroup
      the name of the group
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    alignElWithMouse

    + public function alignElWithMouse(HTMLElement el, int iPageX, int iPageY) +
    + Sets the element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • el : HTMLElement
      the element to move
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    applyConfig

    + public function applyConfig() +
    + Applies the configuration parameters that were passed into the constructor. +This is supposed to happen at each level through the inheritance chain. So +a DDProxy implentation will execute apply config on DDProxy, DD, and +DragDrop in order to get all of the parameters that are available in +each object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    autoOffset

    + public function autoOffset(int iPageX, int iPageY) +
    + Sets the pointer offset to the distance between the linked element's top +left corner and the location the element was clicked +
    + Parameters: +
    • iPageX : int
      the X coordinate of the click
    • iPageY : int
      the Y coordinate of the click
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    cachePosition

    + public function cachePosition(iPageX the, iPageY the) +
    + Saves the most recent position so that we can reset the constraints and +tick marks on-demand. We need to know this so that we can calculate the +number of pixels the element is offset from its original position. +
    + Parameters: +
    • the : iPageX
      current x position (optional, this just makes it so we don't have to look it up again)
    • the : iPageY
      current y position (optional, this just makes it so we don't have to look it up again)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    clearConstraints

    + public function clearConstraints() +
    + Clears any constraints applied to this instance. Also clears ticks +since they can't exist independent of a constraint at this time. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    clearTicks

    + public function clearTicks() +
    + Clear's the slider's ticks +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    endDrag

    + public function endDrag(Event e) +
    + Fired when we are done dragging the object +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getDragEl

    + public function getDragEl() +
    + Returns a reference to the actual element to drag. By default this is +the same as the html element, but it can be assigned to another +element. An example of this can be found in YAHOO.util.DDProxy +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns a reference to the linked element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the html element
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    getOffsetFromParent

    + public function getOffsetFromParent([int, int]}) +
    + Returns the difference between the location of the thumb and its parent. +
    + Parameters: +
    • int]} : [int,
      parentPos Optionally accepts the position of the parent
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getValue

    + public function getValue() +
    + Gets the current offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getXValue

    + public function getXValue() +
    + Gets the current X offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved horizontally from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    getYValue

    + public function getYValue() +
    + Gets the current Y offset from the element's start position in +pixels. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      the number of pixels (positive or negative) the slider has moved vertically from the start position.
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    init

    + public function init(id the, String sGroup, object config) +
    + Sets up the DragDrop object. Must be called in the constructor of any +YAHOO.util.DragDrop subclass +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    initSlider

    + public function initSlider(int iLeft, int iRight, int iUp, int iDown, int iTickSize) +
    + Set up the slider, must be called in the constructor of all subclasses +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move left
    • iRight : int
      the number of pixels the element can move right
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      the width of the tick interval.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    initTarget

    + public function initTarget(id the, String sGroup, object config) +
    + Initializes Targeting functionality only... the object does not +get a mousedown handler. +
    + Parameters: +
    • the : id
      id of the linked element
    • sGroup : String
      the group of related items
    • config : object
      configuration attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isLocked

    + public function isLocked() +
    + Returns true if this instance is locked, or the drag drop mgr is locked +(meaning that all drag/drop is disabled on the page.) +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this obj or all drag/drop is locked, else false
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isTarget

    + public function isTarget() +
    + By default, all insances can be a drop target. This can be disabled by +setting isTarget to false. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    isValidHandleChild

    + public function isValidHandleChild(HTMLElement node) +
    + Checks the tag exclusion list to see if this click should be ignored +
    + Parameters: +
    • node : HTMLElement
      the HTMLElement to evaluate
    + Returns: +
      +
    • boolean
      true if this is a valid tag type, false if not
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    lock

    + public function lock() +
    + Lock this instance +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onAvailable

    + public function onAvailable() +
    + Override the onAvailable method to do what is needed after the initial +position was determined. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDrag

    + public function onDrag(Event e) +
    + Abstract method called during the onMouseMove event while dragging an +object. +
    + Parameters: +
    • e : Event
      the mousemove event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragDrop

    + public function onDragDrop(Event e, String|DragDrop[] id) +
    + Abstract method called when this item is dropped on another DragDrop +obj +
    + Parameters: +
    • e : Event
      the mouseup event
    • id : String|DragDrop[]
      In POINT mode, the element id this was dropped on. In INTERSECT mode, an array of dd items this was dropped on.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragEnter

    + public function onDragEnter(Event e, String|DragDrop[] id) +
    + Abstract method called when this element fist begins hovering over +another DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of one or more dragdrop items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOut

    + public function onDragOut(Event e, String|DragDrop[] id) +
    + Abstract method called when we are no longer hovering over an element +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this was hovering over. In INTERSECT mode, an array of dd items that the mouse is no longer over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onDragOver

    + public function onDragOver(Event e, String|DragDrop[] id) +
    + Abstract method called when this element is hovering over another +DragDrop obj +
    + Parameters: +
    • e : Event
      the mousemove event
    • id : String|DragDrop[]
      In POINT mode, the element id this is hovering over. In INTERSECT mode, an array of dd items being hovered over.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onInvalidDrop

    + public function onInvalidDrop(Event e) +
    + Abstract method called when this item is dropped on an area with no +drop target +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseDown

    + public function onMouseDown(Event e) +
    + Event handler that fires when a drag/drop obj gets a mousedown +
    + Parameters: +
    • e : Event
      the mousedown event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    onMouseUp

    + public function onMouseUp(Event e) +
    + Event handler that fires when a drag/drop obj gets a mouseup +
    + Parameters: +
    • e : Event
      the mouseup event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    padding

    + public function padding() +
    + The padding configured for this drag and drop object for calculating +the drop zone intersection with this object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeFromGroup

    + public function removeFromGroup(string sGroup) +
    + Remove's this instance from the supplied interaction group +
    + Parameters: +
    • sGroup : string
      The group to drop
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleClass

    + public function removeInvalidHandleClass(string cssClass) +
    + Unsets an invalid css class +
    + Parameters: +
    • cssClass : string
      the class of the element(s) you wish to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleId

    + public function removeInvalidHandleId(string id) +
    + Unsets an invalid handle id +
    + Parameters: +
    • id : string
      the id of the element to re-enable
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    removeInvalidHandleType

    + public function removeInvalidHandleType(string tagName) +
    + Unsets an excluded tag name set by addInvalidHandleType +
    + Parameters: +
    • tagName : string
      the type of element to unexclude
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    resetConstraints

    + public function resetConstraints(boolean maintainOffset) +
    + resetConstraints must be called if you manually reposition a dd element. +
    + Parameters: +
    • maintainOffset : boolean
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDelta

    + public function setDelta(int iDeltaX, int iDeltaY) +
    + Sets the pointer offset. You can call this directly to force the +offset to be in a particular location (e.g., pass in 0,0 to set it +to the center of the object, as done in YAHOO.widget.Slider) +
    + Parameters: +
    • iDeltaX : int
      the distance from the left
    • iDeltaY : int
      the distance from the top
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setDragElId

    + public function setDragElId(id {string}) +
    + Allows you to specify that an element other than the linked element +will be moved with the cursor during a drag +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setDragElPos

    + public function setDragElPos(int iPageX, int iPageY) +
    + Sets the drag element to the location of the mousedown or click event, +maintaining the cursor location relative to the location on the element +that was clicked. Override this if you want to place the element in a +location other than where the cursor is. +
    + Parameters: +
    • iPageX : int
      the X coordinate of the mousedown or drag event
    • iPageY : int
      the Y coordinate of the mousedown or drag event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DD.
    +
    + +
    +

    setHandleElId

    + public function setHandleElId(id {string}) +
    + Allows you to specify a child of the linked element that should be +used to initiate the drag operation. An example of this would be if +you have a content div with text and links. Clicking anywhere in the +content area would normally start the drag operation. Use this method +to specify that an element inside of the content div is the element +that starts the drag operation. +
    + Parameters: +
    • {string} : id
      the id of the element that will be used to initiate the drag.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setInitialPosition

    + public function setInitialPosition(int diffX, int diffY) +
    + Stores the initial placement of the linked element. +
    + Parameters: +
    • diffX : int
      the X offset, default 0
    • diffY : int
      the Y offset, default 0
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setOuterHandleElId

    + public function setOuterHandleElId(id the) +
    + Allows you to set an element outside of the linked element as a drag +handle +
    + Parameters: +
    • the : id
      id of the element that will be used to initiate the drag
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setPadding

    + public function setPadding(int iTop, int iRight, int iBot, int iLeft) +
    + Configures the padding for the target zone in px. Effectively expands +(or reduces) the virtual object size for targeting calculations. +Supports css-style shorthand; if only one parameter is passed, all sides +will have that padding, and if only two are passed, the top and bottom +will have the first param, the left and right the second. +
    + Parameters: +
    • iTop : int
      Top pad
    • iRight : int
      Right pad
    • iBot : int
      Bot pad
    • iLeft : int
      Left pad
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setXConstraint

    + public function setXConstraint(int iLeft, int iRight, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Use +this method to limit the horizontal travel of the element. Pass in +0,0 for the parameters if you want to lock the drag to the y axis. +
    + Parameters: +
    • iLeft : int
      the number of pixels the element can move to the left
    • iRight : int
      the number of pixels the element can move to the right
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    setYConstraint

    + public function setYConstraint(int iUp, int iDown, int iTickSize) +
    + By default, the element can be dragged any place on the screen. Set +this to limit the vertical travel of the element. Pass in 0,0 for the +parameters if you want to lock the drag to the x axis. +
    + Parameters: +
    • iUp : int
      the number of pixels the element can move up
    • iDown : int
      the number of pixels the element can move down
    • iTickSize : int
      optional parameter for specifying that the element should move iTickSize pixels at a time.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    startDrag

    + public function startDrag(int X, int Y) +
    + Abstract method called after a drag/drop object is clicked +and the drag or mousedown time thresholds have beeen met. +
    + Parameters: +
    • X : int
      click location
    • Y : int
      click location
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    toString

    + public function toString() +
    + Thumb toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the instance
    • +
    +
    +
    +
    This method is defined by SliderThumb.
    +
    + +
    +

    unlock

    + public function unlock() +
    + Unlock this instace +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    + +
    +

    unreg

    + public function unreg() +
    + Remove all drag and drop hooks for this element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by DragDrop.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVAnim.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVAnim.html new file mode 100644 index 000000000..25db79b00 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVAnim.html @@ -0,0 +1,137 @@ + + + + YAHOO.widget.TVAnim + + + + + +
    + +

    Class YAHOO.widget.TVAnim

    + + + + + +
    Package:YAHOO.widget
    Class:TVAnim
    Extends:Object
    Defined In:treeview.js
    +
    + A static factory class for tree view expand/collapse animations
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     FADE_IN : stringTVAnim
    <static> Constant for the fade in animation
     FADE_OUT : stringTVAnim
    <static> Constant for the fade out animation
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     getAnim(type {string}, el {HTMLElement}, callback {function}) : YAHOO.util.AnimationTVAnim
    <static> Returns a ygAnim instance of the given type
     isValid(type {string}) : booleanTVAnim
    <static> Returns true if the specified animation class is available
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    FADE_IN

    + public string FADE_IN +
    + <static> Constant for the fade in animation
    +
    This property is defined by TVAnim.
    +
    + +
    +

    FADE_OUT

    + public string FADE_OUT +
    + <static> Constant for the fade out animation
    +
    This property is defined by TVAnim.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    getAnim

    + public function getAnim(type {string}, el {HTMLElement}, callback {function}) +
    + <static> Returns a ygAnim instance of the given type +
    + Parameters: +
    • {string} : type
      the type of animation
    • {HTMLElement} : el
      the element to element (probably the children div)
    • {function} : callback
      function to invoke when the animation is done.
    + Returns: +
      +
    • YAHOO.util.Animation
      the animation instance
    • +
    +
    +
    +
    This method is defined by TVAnim.
    +
    + +
    +

    isValid

    + public function isValid(type {string}) +
    + <static> Returns true if the specified animation class is available +
    + Parameters: +
    • {string} : type
      the type of animation
    + Returns: +
      +
    • boolean
      true if valid, false if not
    • +
    +
    +
    +
    This method is defined by TVAnim.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeIn.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeIn.html new file mode 100644 index 000000000..a23ecfd9a --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeIn.html @@ -0,0 +1,184 @@ + + + + YAHOO.widget.TVFadeIn + + + + + +
    + +

    Class YAHOO.widget.TVFadeIn

    + + + + + +
    Package:YAHOO.widget
    Class:TVFadeIn
    Extends:Object
    Defined In:treeview.js
    +
    + A 1/2 second fade-in animation.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     callback : functionTVFadeIn
    the callback to invoke when the animation is complete
     el : HTMLElementTVFadeIn
    The element to animate
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TVFadeIn(el {HTMLElement}, callback {function})TVFadeIn
     animate() : voidTVFadeIn
    Performs the animation
     onComplete() : voidTVFadeIn
    Clean up and invoke callback
     toString() : stringTVFadeIn
    toString
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    callback

    + public function callback +
    + the callback to invoke when the animation is complete
    +
    This property is defined by TVFadeIn.
    +
    + +
    +

    el

    + public HTMLElement el +
    + The element to animate
    +
    This property is defined by TVFadeIn.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TVFadeIn

    + public function TVFadeIn(el {HTMLElement}, callback {function}) +
    +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {function} : callback
      function to invoke when the animation is finished
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    animate

    + public function animate() +
    + Performs the animation +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    + +
    +

    onComplete

    + public function onComplete() +
    + Clean up and invoke callback +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the string representation of the instance
    • +
    +
    +
    +
    This method is defined by TVFadeIn.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeOut.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeOut.html new file mode 100644 index 000000000..f5ae0de24 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TVFadeOut.html @@ -0,0 +1,184 @@ + + + + YAHOO.widget.TVFadeOut + + + + + +
    + +

    Class YAHOO.widget.TVFadeOut

    + + + + + +
    Package:YAHOO.widget
    Class:TVFadeOut
    Extends:Object
    Defined In:treeview.js
    +
    + A 1/2 second fade out animation.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     callback : functionTVFadeOut
    the callback to invoke when the animation is complete
     el : HTMLElementTVFadeOut
    The element to animate
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TVFadeOut(el {HTMLElement}, callback {Function})TVFadeOut
     animate() : voidTVFadeOut
    Performs the animation
     onComplete() : voidTVFadeOut
    Clean up and invoke callback
     toString() : stringTVFadeOut
    toString
    + +

    Public Events

    +
    This class has no public events.
    +

    Property Details

    +
    + +
    +

    callback

    + public function callback +
    + the callback to invoke when the animation is complete
    +
    This property is defined by TVFadeOut.
    +
    + +
    +

    el

    + public HTMLElement el +
    + The element to animate
    +
    This property is defined by TVFadeOut.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TVFadeOut

    + public function TVFadeOut(el {HTMLElement}, callback {Function}) +
    +
    + Parameters: +
    • {HTMLElement} : el
      the element to animate
    • {Function} : callback
      function to invoke when the animation is finished
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    animate

    + public function animate() +
    + Performs the animation +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    + +
    +

    onComplete

    + public function onComplete() +
    + Clean up and invoke callback +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    + +
    +

    toString

    + public function toString() +
    + toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the string representation of the instance
    • +
    +
    +
    +
    This method is defined by TVFadeOut.
    +
    +
    + +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tab.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tab.html new file mode 100644 index 000000000..67ca056f9 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tab.html @@ -0,0 +1,1150 @@ + + + + YAHOO.widget.Tab + + + + + +
    + +

    Class YAHOO.widget.Tab

    + + + + + +
    Package:YAHOO.widget
    Class:Tab
    Extends:Element
    Defined In:tabview.js
    +
    + A representation of a Tab's label and content.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     ACTIVE_CLASSNAME : String +@defaultTab
    The class name applied to active tabs.
     CLASSNAME : ObjectTab
    The className to add when building from scratch. +@default "navset"
     CONTENT_PARENT_CLASSNAME : ObjectTab
    The className of the HTMLElement containing the TabView's label elements +to look for when building from existing mark...
     DISABLED_CLASSNAME : String +@defaultTab
    The class name applied to disabled tabs.
     DOM_EVENTS : ObjectElement
    Dom events supported by the Element instance.
     LABEL_INNER_TAGNAME : String +@defaultTab
    The default tag name for a Tab's inner element.
     LOADING_CLASSNAME : String +@defaultTab
    The class name applied to dynamic tabs while loading.
     TAB_PARENT_CLASSNAME : ObjectTab
    The className of the HTMLElement containing the TabView's tab elements +to look for when building from existing markup...
     dataConnection : ObjectTab
    Provides a reference to the connection request object when data is +loaded dynamically.
     loadHandler : objectTab
    Object containing success and failure callbacks for loading data.
     register : YAHOO.widget.TabTab
    The tab currently active. +@config activeTab
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Tab([element {HTMLElement], Object properties)Tab
     DOMEventHandler(event e) : voidTab
    Routes childNode events.
     addClass(String className) : voidElement
    Wrapper for Dom method.
     addListener(String type, Function fn, Any obj, Object scope) : voidElement
    Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEve...
     addTab(YAHOO.widget.Tab tab, Integer index) : voidTab
    Adds a Tab to the TabView instance. +If no index is specified, the tab is added to the end of the tab list.
     appendChild(Boolean deep) : voidElement
    Wrapper for HTMLElement method.
     appendTo(HTMLElement |, HTMLElement |) : voidElement
    Appends the HTMLElement into either the supplied parentNode.
     contentTransition() : voidTab
    The transiton to use when switching between tabs.
     fireQueue() : voidElement
    Apply any queued set calls.
     getElementsByClassName(String className, [String tag]) : ArrayElement
    Wrapper for Dom method.
     getElementsByTagName(String tag) : voidElement
    Wrapper for HTMLElement method.
     getStyle(String property) : StringElement
    Wrapper for Dom method.
     getTab(Integer index) : YAHOO.widget.TabTab
    Returns the Tab instance at the specified index.
     getTabIndex(YAHOO.widget.Tab tab) : intTab
    Returns the index of given tab.
     hasChildNodes() : BooleanElement
    Wrapper for HTMLElement method.
     hasClass(String className) : BooleanElement
    Wrapper for Dom method.
     initAttributes(Object attr) : voidTab
    Registers TabView specific properties.
     insertBefore(HTMLElement element, HTMLElement before) : voidElement
    Wrapper for HTMLElement method.
     on(String type, Function fn, Any obj, Object scope) : voidElement
    Alias for addListener
     removeChild(HTMLElement child) : voidElement
    Wrapper for HTMLElement method.
     removeClass(String className) : voidElement
    Wrapper for Dom method.
     removeListener(String type, Function fn) : voidElement
    Remove an event listener
     removeTab(YAHOO.widget.Tab item) : voidTab
    Removes the specified Tab from the TabView.
     replaceChild(HTMLElement newNode, HTMLElement oldNode) : voidElement
    Wrapper for HTMLElement method.
     replaceClass(String oldClassName, String newClassName) : voidElement
    Wrapper for Dom method.
     setStyle(String property, String value) : voidElement
    Wrapper for Dom method.
     toString() : StringTab
    Provides a readable name for the TabView instance.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     available : ()Element
    Fires when the Element's HTMLElement can be retrieved by Id. +See: Element.addListener +Event fields: +<String> ty...
     beforeActiveChange : ()Tab
    Fires before the active state is changed. +See: Element.addListener +If handler returns false, the change will be cance...
     beforeActiveTabChange : ()Tab
    Fires before the activeTab is changed. +See: Element.addListener +If handler returns false, the change will be cancelle...
     beforeContentChange : ()Tab
    Fires before the tab content is changed. +See: Element.addListener +If handler returns false, the change will be cancel...
     beforeLabelChange : ()Tab
    Fires before the tab label is changed. +See: Element.addListener +If handler returns false, the change will be cancelle...
     beforeOrientationChange : ()Tab
    Fires before the orientation is changed. +See: Element.addListener +If handler returns false, the change will be cancel...
    + +

    Property Details

    +
    + +
    +

    ACTIVE_CLASSNAME

    + public String +@default ACTIVE_CLASSNAME +
    + The class name applied to active tabs.
    +
    This property is defined by Tab.
    +
    + +
    +

    CLASSNAME

    + public Object CLASSNAME +
    + The className to add when building from scratch. +@default "navset"
    +
    This property is defined by Tab.
    +
    + +
    +

    CONTENT_PARENT_CLASSNAME

    + public Object CONTENT_PARENT_CLASSNAME +
    + The className of the HTMLElement containing the TabView's label elements +to look for when building from existing markup, or to add when building +from scratch. +All childNodes of the content container are treated as content elements when +building from existing markup. +@default "nav-content"
    +
    This property is defined by Tab.
    +
    + +
    +

    DISABLED_CLASSNAME

    + public String +@default DISABLED_CLASSNAME +
    + The class name applied to disabled tabs.
    +
    This property is defined by Tab.
    +
    + +
    +

    DOM_EVENTS

    + public Object DOM_EVENTS +
    + Dom events supported by the Element instance.
    +
    This property is defined by Element.
    +
    + +
    +

    LABEL_INNER_TAGNAME

    + public String +@default LABEL_INNER_TAGNAME +
    + The default tag name for a Tab's inner element.
    +
    This property is defined by Tab.
    +
    + +
    +

    LOADING_CLASSNAME

    + public String +@default LOADING_CLASSNAME +
    + The class name applied to dynamic tabs while loading.
    +
    This property is defined by Tab.
    +
    + +
    +

    TAB_PARENT_CLASSNAME

    + public Object TAB_PARENT_CLASSNAME +
    + The className of the HTMLElement containing the TabView's tab elements +to look for when building from existing markup, or to add when building +from scratch. +All childNodes of the tab container are treated as Tabs when building +from existing markup. +@default "nav"
    +
    This property is defined by Tab.
    +
    + +
    +

    dataConnection

    + public Object dataConnection +
    + Provides a reference to the connection request object when data is +loaded dynamically.
    +
    This property is defined by Tab.
    +
    + +
    +

    loadHandler

    + public object loadHandler +
    + Object containing success and failure callbacks for loading data.
    +
    This property is defined by Tab.
    +
    + +
    +

    register

    + public YAHOO.widget.Tab register +
    + The tab currently active. +@config activeTab
    +
    This property is defined by Tab.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Tab

    + public function Tab([element {HTMLElement], Object properties) +
    +
    + Parameters: +
    • {HTMLElement : element
      | String} (optional) The html element that represents the TabView. An element will be created if none provided.
    • properties : Object
      A key map of initial properties
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    DOMEventHandler

    + public function DOMEventHandler(event e) +
    + Routes childNode events. +
    + Parameters: +
    • e : event
      The Dom event that is being handled.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    addClass

    + public function addClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addListener

    + public function addListener(String type, Function fn, Any obj, Object scope) +
    + Adds a listener for the given event. These may be DOM or +customEvent listeners. Any event that is fired via fireEvent +can be listened for. All handlers receive an event object. +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The handler to call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    addTab

    + public function addTab(YAHOO.widget.Tab tab, Integer index) +
    + Adds a Tab to the TabView instance. +If no index is specified, the tab is added to the end of the tab list. +
    + Parameters: +
    • tab : YAHOO.widget.Tab
      A Tab instance to add.
    • index : Integer
      The position to add the tab.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    appendChild

    + public function appendChild(Boolean deep) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • deep : Boolean
      Whether or not to do a deep clone
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    appendTo

    + public function appendTo(HTMLElement |, HTMLElement |) +
    + Appends the HTMLElement into either the supplied parentNode. +
    + Parameters: +
    • | : HTMLElement
      Element} parentNode The node to append to
    • | : HTMLElement
      Element} before An optional node to insert before
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    contentTransition

    + public function contentTransition() +
    + The transiton to use when switching between tabs. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    fireQueue

    + public function fireQueue() +
    + Apply any queued set calls. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByClassName

    + public function getElementsByClassName(String className, [String tag]) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to collect
    • tag : String
      (optional) The tag to use in conjunction with class name
    + Returns: +
      +
    • Array
      Array of HTMLElements
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getElementsByTagName

    + public function getElementsByTagName(String tag) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • tag : String
      The tagName to collect
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getStyle

    + public function getStyle(String property) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to retrieve
    + Returns: +
      +
    • String
      The current value of the property
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    getTab

    + public function getTab(Integer index) +
    + Returns the Tab instance at the specified index. +
    + Parameters: +
    • index : Integer
      The position of the Tab.
    + Returns: +
      +
    • YAHOO.widget.Tab
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    getTabIndex

    + public function getTabIndex(YAHOO.widget.Tab tab) +
    + Returns the index of given tab. +
    + Parameters: +
    • tab : YAHOO.widget.Tab
      The tab whose index will be returned.
    + Returns: +
      +
    • int
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    hasChildNodes

    + public function hasChildNodes() +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Boolean
      Whether or not the element has childNodes
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    hasClass

    + public function hasClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to add
    + Returns: +
      +
    • Boolean
      Whether or not the element has the class name
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    initAttributes

    + public function initAttributes(Object attr) +
    + Registers TabView specific properties. +
    + Parameters: +
    • attr : Object
      Hash of initial attributes
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    insertBefore

    + public function insertBefore(HTMLElement element, HTMLElement before) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • element : HTMLElement
      The HTMLElement to insert
    • before : HTMLElement
      The HTMLElement to insert the element before.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    on

    + public function on(String type, Function fn, Any obj, Object scope) +
    + Alias for addListener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    • obj : Any
      A variable to pass to the handler
    • scope : Object
      The object to use for the scope of the handler
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeChild

    + public function removeChild(HTMLElement child) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • child : HTMLElement
      The HTMLElement to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeClass

    + public function removeClass(String className) +
    + Wrapper for Dom method. +
    + Parameters: +
    • className : String
      The className to remove
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeListener

    + public function removeListener(String type, Function fn) +
    + Remove an event listener +
    + Parameters: +
    • type : String
      The name of the event to listen for
    • fn : Function
      The function call when the event fires
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    removeTab

    + public function removeTab(YAHOO.widget.Tab item) +
    + Removes the specified Tab from the TabView. +
    + Parameters: +
    • item : YAHOO.widget.Tab
      The Tab instance to be removed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    + +
    +

    replaceChild

    + public function replaceChild(HTMLElement newNode, HTMLElement oldNode) +
    + Wrapper for HTMLElement method. +
    + Parameters: +
    • newNode : HTMLElement
      The HTMLElement to insert
    • oldNode : HTMLElement
      The HTMLElement to replace
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    replaceClass

    + public function replaceClass(String oldClassName, String newClassName) +
    + Wrapper for Dom method. +
    + Parameters: +
    • oldClassName : String
      The className to replace
    • newClassName : String
      The className to add
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    setStyle

    + public function setStyle(String property, String value) +
    + Wrapper for Dom method. +
    + Parameters: +
    • property : String
      The style property to set
    • value : String
      The value to apply to the style property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Element.
    +
    + +
    +

    toString

    + public function toString() +
    + Provides a readable name for the TabView instance. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
    • +
    +
    +
    +
    This method is defined by Tab.
    +
    +
    + +

    Event Details

    +
    + +
    +

    available

    + public event available +
    + Fires when the Element's HTMLElement can be retrieved by Id. +

    See: Element.addListener

    +

    Event fields:
    +<String> type available
    +<HTMLElement> +target the HTMLElement bound to this Element instance
    +

    Usage:
    +var handler = function(e) {var target = e.target};
    +myTabs.addListener('available', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Element.
    +
    + +
    +

    beforeActiveChange

    + public event beforeActiveChange +
    + Fires before the active state is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeActiveChange
    +<Boolean> +prevValue the current value
    +<Boolean> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeActiveChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeActiveTabChange

    + public event beforeActiveTabChange +
    + Fires before the activeTab is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeActiveTabChange
    +<YAHOO.widget.Tab> +prevValue the currently active tab
    +<YAHOO.widget.Tab> +newValue the tab to be made active

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeActiveTabChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeContentChange

    + public event beforeContentChange +
    + Fires before the tab content is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeContentChange
    +<String> +prevValue the current value
    +<String> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeContentChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeLabelChange

    + public event beforeLabelChange +
    + Fires before the tab label is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeLabelChange
    +<String> +prevValue the current value
    +<String> +newValue the new value

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeLabelChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    + +
    +

    beforeOrientationChange

    + public event beforeOrientationChange +
    + Fires before the orientation is changed. +

    See: Element.addListener

    +

    If handler returns false, the change will be cancelled, and the value will not +be set.

    +

    Event fields:
    +<String> type beforeOrientationChange
    +<String> +prevValue the current orientation
    +<String> +newValue the new orientation to be applied

    +

    Usage:
    +var handler = function(e) {var previous = e.prevValue};
    +myTabs.addListener('beforeOrientationChange', handler);

    +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Tab.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.TextNode.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TextNode.html new file mode 100644 index 000000000..0bcb9fd50 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.TextNode.html @@ -0,0 +1,1505 @@ + + + + YAHOO.widget.TextNode + + + + + +
    + +

    Class YAHOO.widget.TextNode

    + + + + + + +
    Package:YAHOO.widget
    Class:TextNode
    Extends:Node
    Subclasses:MenuNode
    Defined In:treeview.js
    +
    + The default node presentation. The first parameter should be +either a string that will be used as the node's label, or an object +that has a string propery called label. By default, the clicking the +label will toggle the expanded/collapsed state of the node. By +changing the href property of the instance, this behavior can be +changed so that the label will go to the specified href.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     children : Node[]Node
    This node's child node collection.
     childrenRendered : booleanNode
    This flag is set to true when the html is generated for this node's +children, and set to false when new children are ...
     data : objectNode
    The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
     dataLoader : functionNode
    Function to execute when we need to get this node's child data.
     depth : intNode
    The depth of this node. We start at -1 for the root node.
     dynamicLoadComplete : booleanNode
    Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the dat...
     expanded : booleanNode
    The node's expanded/collapsed state
     hasIcon : booleanNode
    The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have ...
     href : stringNode
    The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
     iconMode : intNode
    Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. ...
     index : intNode
    The index for this instance obtained from global counter in YAHOO.widget.TreeView.
     isLoading : booleanNode
    This is true for dynamically loading nodes while waiting for the +callback to return.
     label : stringTextNode
    The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the labe...
     labelElId : stringTextNode
    The derived element id of the label for this node
     labelStyle : stringTextNode
    The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for ...
     multiExpand : booleanNode
    Can multiple children be expanded at once?
     nextSibling : NodeNode
    This node's next sibling
     parent : NodeNode
    Parent node
     previousSibling : NodeNode
    This node's previous sibling
     renderHidden : booleanNode
    Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden d...
     target : stringNode
    The label href target, defaults to current window
     tree : TreeViewNode
    Tree instance this node is part of
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     TextNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean})TextNode
     appendTo(parentNode {Node}) : NodeNode
    Appends this node to the supplied node's child collection
     applyParent(Node parentNode) : booleanNode
    Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted in...
     collapse() : voidNode
    Hides this nodes children (creating them if necessary), changes the +toggle style.
     collapseAll() : voidNode
    Recursively collapses all of this node's children.
     completeRender() : stringNode
    Called when we know we have all the child data.
     expand() : voidNode
    Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multi...
     expandAll() : voidNode
    Recursively expands all of this node's children.
     getAncestor(int depth) : NodeNode
    Returns this node's ancestor at the specified depth.
     getChildrenEl() : HTMLElementNode
    Returns the div that was generated for this node's children
     getChildrenElId() : stringNode
    Returns the id for this node's children div
     getDepthStyle(int depth) : stringNode
    Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified ...
     getEl() : HTMLElementNode
    Returns this node's container html element
     getElId() : stringNode
    Returns the id for this node's container div
     getHoverStyle() : stringNode
    Returns the hover style for the icon
     getHtml() : stringNode
    Returns the markup for this node and its children.
     getIconMode() : intNode
    Returns the current icon mode. This refers to the way childless dynamic +load nodes appear.
     getLabelEl() : objectTextNode
    Returns the label element +@for YAHOO.widget.TextNode
     getNodeHtml() : stringNode
    Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes.
     getSiblings() : Node[]Node
    Returns a node array of this node's siblings, null if none.
     getStyle() : stringNode
    Returns the css style name for the toggle
     getToggleEl() : HTMLElementNode
    Returns the element that is being used for this node's toggle.
     getToggleElId() : stringNode
    Returns the id for this node's toggle element
     getToggleLink() : stringNode
    Generates the link that will invoke this node's toggle method
     hasChildren(checkForLazyLoad {boolean}) : booleanNode
    Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not kn...
     hideChildren() : voidNode
    Hides this node's children
     init(oData {object}, oParent {Node}, expanded {boolean}) : voidNode
    Initializes this node, gets some of the properties from the parent
     insertAfter(node {Node}) : NodeNode
    Inserts this node after the supplied node
     insertBefore(node {Node}) : NodeNode
    Inserts this node before this supplied node
     isDynamic() : booleanNode
    Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the...
     isRoot() : booleanNode
    Evaluates if this node is the root node of the tree
     loadComplete() : voidNode
    Load complete is the callback function we pass to the data provider +in dynamic load situations.
     onLabelClick(me {Node}) : falseTextNode
    Executed when the label is clicked. Fires the labelClick custom event.
     refresh() : voidNode
    Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been...
     setDynamicLoad(fmDataLoader {function}, iconMode {int}) : voidNode
    Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without th...
     setUpLabel(oData string) : voidTextNode
    Sets up the node label
     showChildren() : voidNode
    Shows this node's children
     toString() : stringNode
    Node toString
     toggle() : voidNode
    Expands if node is collapsed, collapses otherwise.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     labelClick : (YAHOO.widget.Node node)TextNode
    Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so...
     parentChange : ()Node
    The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tr...
    + +

    Property Details

    +
    + +
    +

    children

    + public Node[] children +
    + This node's child node collection.
    +
    This property is defined by Node.
    +
    + +
    +

    childrenRendered

    + public boolean childrenRendered +
    + This flag is set to true when the html is generated for this node's +children, and set to false when new children are added.
    +
    This property is defined by Node.
    +
    + +
    +

    data

    + public object data +
    + The data linked to this node. This can be any object or primitive +value, and the data can be used in getNodeHtml().
    +
    This property is defined by Node.
    +
    + +
    +

    dataLoader

    + public function dataLoader +
    + Function to execute when we need to get this node's child data.
    +
    This property is defined by Node.
    +
    + +
    +

    depth

    + public int depth +
    + The depth of this node. We start at -1 for the root node.
    +
    This property is defined by Node.
    +
    + +
    +

    dynamicLoadComplete

    + public boolean dynamicLoadComplete +
    + Dynamically loaded nodes only fetch the data the first time they are +expanded. This flag is set to true once the data has been fetched.
    +
    This property is defined by Node.
    +
    + +
    +

    expanded

    + public boolean expanded +
    + The node's expanded/collapsed state
    +
    This property is defined by Node.
    +
    + +
    +

    hasIcon

    + public boolean hasIcon +
    + The toggle/branch icon will not show if this is set to false. This +could be useful if the implementer wants to have the child contain +extra info about the parent, rather than an actual node.
    +
    This property is defined by Node.
    +
    + +
    +

    href

    + public string href +
    + The href for the node's label. If one is not specified, the href will +be set so that it toggles the node.
    +
    This property is defined by Node.
    +
    + +
    +

    iconMode

    + public int iconMode +
    + Used to configure what happens when a dynamic load node is expanded +and we discover that it does not have children. By default, it is +treated as if it still could have children (plus/minus icon). Set +iconMode to have it display like a leaf node instead.
    +
    This property is defined by Node.
    +
    + +
    +

    index

    + public int index +
    + The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +
    This property is defined by Node.
    +
    + +
    +

    isLoading

    + public boolean isLoading +
    + This is true for dynamically loading nodes while waiting for the +callback to return.
    +
    This property is defined by Node.
    +
    + +
    +

    label

    + public string label +
    + The text for the label. It is assumed that the oData parameter will +either be a string that will be used as the label, or an object that +has a property called "label" that we will use.
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelElId

    + public string labelElId +
    + The derived element id of the label for this node
    +
    This property is defined by TextNode.
    +
    + +
    +

    labelStyle

    + public string labelStyle +
    + The CSS class for the label href. Defaults to ygtvlabel, but can be +overridden to provide a custom presentation for a specific node.
    +
    This property is defined by TextNode.
    +
    + +
    +

    multiExpand

    + public boolean multiExpand +
    + Can multiple children be expanded at once?
    +
    This property is defined by Node.
    +
    + +
    +

    nextSibling

    + public Node nextSibling +
    + This node's next sibling
    +
    This property is defined by Node.
    +
    + +
    +

    parent

    + public Node parent +
    + Parent node
    +
    This property is defined by Node.
    +
    + +
    +

    previousSibling

    + public Node previousSibling +
    + This node's previous sibling
    +
    This property is defined by Node.
    +
    + +
    +

    renderHidden

    + public boolean renderHidden +
    + Should we render children for a collapsed node? It is possible that the +implementer will want to render the hidden data... @todo verify that we +need this, and implement it if we do.
    +
    This property is defined by Node.
    +
    + +
    +

    target

    + public string target +
    + The label href target, defaults to current window
    +
    This property is defined by Node.
    +
    + +
    +

    tree

    + public TreeView tree +
    + Tree instance this node is part of
    +
    This property is defined by Node.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    TextNode

    + public function TextNode(oData {object}, oParent {YAHOO.widget.Node}, expanded {boolean}) +
    +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {YAHOO.widget.Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    appendTo

    + public function appendTo(parentNode {Node}) +
    + Appends this node to the supplied node's child collection +
    + Parameters: +
    • {Node} : parentNode
      the node to append to.
    + Returns: +
      +
    • Node
      The appended node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    applyParent

    + public function applyParent(Node parentNode) +
    + Certain properties for the node cannot be set until the parent +is known. This is called after the node is inserted into a tree. +the parent is also applied to this node's children in order to +make it possible to move a branch from one tree to another. +
    + Parameters: +
    • parentNode : Node
      this node's parent node
    + Returns: +
      +
    • boolean
      true if the application was successful
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapse

    + public function collapse() +
    + Hides this nodes children (creating them if necessary), changes the +toggle style. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    collapseAll

    + public function collapseAll() +
    + Recursively collapses all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    completeRender

    + public function completeRender() +
    + Called when we know we have all the child data. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      children html
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expand

    + public function expand() +
    + Shows this nodes children (creating them if necessary), changes the +toggle style, and collapses its siblings if multiExpand is not set. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    expandAll

    + public function expandAll() +
    + Recursively expands all of this node's children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getAncestor

    + public function getAncestor(int depth) +
    + Returns this node's ancestor at the specified depth. +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • Node
      the ancestor
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenEl

    + public function getChildrenEl() +
    + Returns the div that was generated for this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getChildrenElId

    + public function getChildrenElId() +
    + Returns the id for this node's children div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id for this node's children div
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getDepthStyle

    + public function getDepthStyle(int depth) +
    + Returns the css class for the spacer at the specified depth for +this node. If this node's ancestor at the specified depth +has a next sibling the presentation is different than if it +does not have a next sibling +
    + Parameters: +
    • depth : int
      the depth of the ancestor.
    + Returns: +
      +
    • string
      the css class for the spacer
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getEl

    + public function getEl() +
    + Returns this node's container html element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      the container html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getElId

    + public function getElId() +
    + Returns the id for this node's container div +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHoverStyle

    + public function getHoverStyle() +
    + Returns the hover style for the icon +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class hover state
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getHtml

    + public function getHtml() +
    + Returns the markup for this node and its children. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the markup for this node and its expanded children.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getIconMode

    + public function getIconMode() +
    + Returns the current icon mode. This refers to the way childless dynamic +load nodes appear. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • int
      0 for collapse style, 1 for leaf node style
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getLabelEl

    + public function getLabelEl() +
    + Returns the label element +@for YAHOO.widget.TextNode +
    + Parameters: +
    • None.
    + Returns: +
      +
    • object
      the element
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    getNodeHtml

    + public function getNodeHtml() +
    + Get the markup for the node. This is designed to be overrided so that we can +support different types of nodes. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      The HTML that will render this node.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getSiblings

    + public function getSiblings() +
    + Returns a node array of this node's siblings, null if none. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Node[]
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getStyle

    + public function getStyle() +
    + Returns the css style name for the toggle +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the css class for this node's toggle
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleEl

    + public function getToggleEl() +
    + Returns the element that is being used for this node's toggle. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • HTMLElement
      this node's toggle html element
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleElId

    + public function getToggleElId() +
    + Returns the id for this node's toggle element +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the toggel element id
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    getToggleLink

    + public function getToggleLink() +
    + Generates the link that will invoke this node's toggle method +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      the javascript url for toggling this node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hasChildren

    + public function hasChildren(checkForLazyLoad {boolean}) +
    + Checks if this node has children. If this node is lazy-loading and the +children have not been rendered, we do not know whether or not there +are actual children. In most cases, we need to assume that there are +children (for instance, the toggle needs to show the expandable +presentation state). In other times we want to know if there are rendered +children. For the latter, "checkForLazyLoad" should be false. +
    + Parameters: +
    • {boolean} : checkForLazyLoad
      should we check for unloaded children?
    + Returns: +
      +
    • boolean
      true if this has children or if it might and we are checking for this condition.
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    hideChildren

    + public function hideChildren() +
    + Hides this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    init

    + public function init(oData {object}, oParent {Node}, expanded {boolean}) +
    + Initializes this node, gets some of the properties from the parent +
    + Parameters: +
    • {object} : oData
      a string or object containing the data that will be used to render this node
    • {Node} : oParent
      this node's parent node
    • {boolean} : expanded
      the initial expanded/collapsed state
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertAfter

    + public function insertAfter(node {Node}) +
    + Inserts this node after the supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert after
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    insertBefore

    + public function insertBefore(node {Node}) +
    + Inserts this node before this supplied node +
    + Parameters: +
    • {Node} : node
      the node to insert this node before
    + Returns: +
      +
    • Node
      the inserted node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isDynamic

    + public function isDynamic() +
    + Evaluates if this node's children should be loaded dynamically. Looks for +the property both in this instance and the root node. If the tree is +defined to load all children dynamically, the data callback function is +defined in the root node +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this node's children are to be loaded dynamically
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    isRoot

    + public function isRoot() +
    + Evaluates if this node is the root node of the tree +
    + Parameters: +
    • None.
    + Returns: +
      +
    • boolean
      true if this is the root node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    loadComplete

    + public function loadComplete() +
    + Load complete is the callback function we pass to the data provider +in dynamic load situations. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    onLabelClick

    + public function onLabelClick(me {Node}) +
    + Executed when the label is clicked. Fires the labelClick custom event. +
    + Parameters: +
    • {Node} : me
      this node @scope the anchor tag clicked
    + Returns: +
      +
    • false
      to cancel the anchor click
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    refresh

    + public function refresh() +
    + Regenerates the html for this node and its children. To be used when the +node is expanded and new children have been added. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setDynamicLoad

    + public function setDynamicLoad(fmDataLoader {function}, iconMode {int}) +
    + Configures this node for dynamically obtaining the child data +when the node is first expanded. Calling it without the callback +will turn off dynamic load for the node. +
    + Parameters: +
    • {function} : fmDataLoader
      the function that will be used to get the data.
    • {int} : iconMode
      configures the icon that is displayed when a dynamic load node is expanded the first time without children. By default, the "collapse" icon will be used. If set to 1, the leaf node icon will be displayed.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    setUpLabel

    + public function setUpLabel(oData string) +
    + Sets up the node label +
    + Parameters: +
    • string : oData
      containing the label, or an object with a label property
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by TextNode.
    +
    + +
    +

    showChildren

    + public function showChildren() +
    + Shows this node's children +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toString

    + public function toString() +
    + Node toString +
    + Parameters: +
    • None.
    + Returns: +
      +
    • string
      string representation of the node
    • +
    +
    +
    +
    This method is defined by Node.
    +
    + +
    +

    toggle

    + public function toggle() +
    + Expands if node is collapsed, collapses otherwise. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Node.
    +
    +
    + +

    Event Details

    +
    + +
    +

    labelClick

    + public event labelClick +
    + Custom event that is fired when the text node label is clicked. The +custom event is defined on the tree instance, so there is a single +event that handles all nodes in the tree. The node clicked is +provided as an argument +@for YAHOO.widget.TreeView +
    + Subscribers will be called with the following parameters: +
    • node : YAHOO.widget.Node
      the node clicked
    +
    +
    +
    This event is defined by TextNode.
    +
    + +
    +

    parentChange

    + public event parentChange +
    + The parentChange event is fired when a parent element is applied +to the node. This is useful if you need to apply tree-level +properties to a tree that need to happen if a node is moved from +one tre to another. +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Node.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tooltip.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tooltip.html new file mode 100644 index 000000000..89f33c2b5 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.Tooltip.html @@ -0,0 +1,1231 @@ + + + + YAHOO.widget.Tooltip + + + + + +
    + +

    Class YAHOO.widget.Tooltip

    + + + + + +
    Package:YAHOO.widget
    Class:Tooltip
    Extends:Overlay
    Defined In:container.js
    +
    + Tooltip is an implementation of Overlay that behaves like an OS tooltip, displaying when the user mouses over a particular element, and disappearing on mouse out.
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     BOTTOM_LEFT<static> : StringOverlay
    <static> Constant representing the top bottom left corner of an element, used for configuring the context eleme...
     BOTTOM_RIGHT<static> : StringOverlay
    <static> Constant representing the bottom right corner of an element, used for configuring the context element ...
     CSS_OVERLAY<static> : StringOverlay
    <static> Constant representing the default CSS class used for an Overlay
     CSS_TOOLTIP<static> : StringTooltip
    <static> Constant representing the Tooltip CSS class
     TOP_LEFT<static> : StringOverlay
    <static> Constant representing the top left corner of an element, used for configuring the context element alig...
     TOP_RIGHT<static> : StringOverlay
    <static> Constant representing the top right corner of an element, used for configuring the context element ali...
     cfg : HTMLElement/String +@defaultTooltip
    Specifies the container element that the Tooltip's markup should be rendered into. +@config container
     javascript : StringOverlay
    <static> The URL that will be placed in the iframe
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     Tooltip(String el, HTMLElement el, Object userConfig)Tooltip
     align(String elementAlign, String contextAlign) : voidOverlay
    Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, T...
     center() : voidOverlay
    Centers the container in the viewport.
     configConstrainToViewport(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "constraintoviewport" property is changed.
     configContainer(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "container" property is changed.
     configContext(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "context" property is changed.
     configFixedCenter(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "fixedcenter" property is changed.
     configHeight(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "height" property is changed.
     configIframe(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "iframe" property is changed.
     configText(String type, Object[] args, Object obj) : voidTooltip
    The default event handler fired when the "text" property is changed.
     configVisible(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "visible" property is changed. This method is responsible for firing showEve...
     configWidth(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "width" property is changed.
     configX(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "x" property is changed.
     configXY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "xy" property is changed.
     configY(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "y" property is changed.
     configzIndex(String type, Object[] args, Object obj) : voidOverlay
    The default event handler fired when the "zIndex" property is changed.
     destroy() : voidOverlay
    Removes the Overlay element from the DOM and sets all child elements to null.
     doCenterOnDOMEvent() : voidOverlay
    Center event handler used for centering on scroll/resize, but only if the Overlay is visible
     doHide() : voidTooltip
    Sets the timeout for the auto-dismiss delay, which by default is 5 seconds, meaning that a tooltip will automatically...
     doShow(DOMEvent e) : NumberTooltip
    Processes the showing of the Tooltip by setting the timeout delay and offset of the Tooltip.
     enforceConstraints(String type, Object[] args, Object obj) : voidOverlay
    The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true.
     hideIframe() : voidOverlay
    Hides the iframe shim, if it has been enabled
     hideMacGeckoScrollbars() : voidOverlay
    Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot ...
     init(String el, HTMLElement el, Object userConfig) : voidTooltip
    The Tooltip initialization method. This method is automatically called by the constructor. A Tooltip is automatically...
     initDefaultConfig() : voidTooltip
    Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg).
     initEvents() : voidOverlay
    Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class.
     moveTo(Number x, Number y) : voidOverlay
    Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]);
     onContextMouseMove(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user moves the mouse while over the context element.
     onContextMouseOut(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user mouses out of the context element.
     onContextMouseOver(DOMEvent e, Object obj) : voidTooltip
    The default event handler fired when the user mouses over the context element.
     onDomResize(DOMEvent e, Object obj) : voidOverlay
    Event handler fired when the resize monitor element is resized.
     preventOverlay(Number pageX, Number pageY) : voidTooltip
    Fired when the Tooltip is moved, this event handler is used to prevent the Tooltip from overlapping with its context ...
     showIframe() : voidOverlay
    Shows the iframe shim, if it has been enabled
     showMacGeckoScrollbars() : voidOverlay
    Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars ca...
     syncPosition() : voidOverlay
    Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used t...
     toString() : StringTooltip
    Returns a string representation of the object.
     windowResizeHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window resize
     windowScrollHandler<static>(DOMEvent e) : voidOverlay
    <static> The DOM event handler used to fire the CustomEvent for window scroll
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     YAHOO.widget.Overlay.windowResizeEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window resize
     YAHOO.widget.Overlay.windowScrollEvent : ()Overlay
    A singleton CustomEvent used for reacting to the DOM event for window scroll
     beforeMoveEvent : (Number x, Number y)Overlay
    CustomEvent fired before the Overlay is moved.
     moveEvent : (Number x, Number y)Overlay
    CustomEvent fired after the Overlay is moved.
    + +

    Property Details

    +
    + +
    +

    BOTTOM_LEFT<static>

    + public String BOTTOM_LEFT<static> +
    + <static> Constant representing the top bottom left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    BOTTOM_RIGHT<static>

    + public String BOTTOM_RIGHT<static> +
    + <static> Constant representing the bottom right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_OVERLAY<static>

    + public String CSS_OVERLAY<static> +
    + <static> Constant representing the default CSS class used for an Overlay
    +
    This property is defined by Overlay.
    +
    + +
    +

    CSS_TOOLTIP<static>

    + public String CSS_TOOLTIP<static> +
    + <static> Constant representing the Tooltip CSS class
    +
    This property is defined by Tooltip.
    +
    + +
    +

    TOP_LEFT<static>

    + public String TOP_LEFT<static> +
    + <static> Constant representing the top left corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    TOP_RIGHT<static>

    + public String TOP_RIGHT<static> +
    + <static> Constant representing the top right corner of an element, used for configuring the context element alignment
    +
    This property is defined by Overlay.
    +
    + +
    +

    cfg

    + public HTMLElement/String +@default cfg +
    + Specifies the container element that the Tooltip's markup should be rendered into. +@config container
    +
    This property is defined by Tooltip.
    +
    + +
    +

    javascript

    + public String javascript +
    + <static> The URL that will be placed in the iframe
    +
    This property is defined by Overlay.
    +
    +
    + + +

    Constructor Details

    +
    +
    +

    Tooltip

    + public function Tooltip(String el, HTMLElement el, Object userConfig) +
    +
    + Parameters: +
    • el : String
      The element ID representing the Tooltip OR
    • el : HTMLElement
      The element representing the Tooltip
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Overlay. See configuration documentation for more details.
    +
    +
    +
    +
    + +

    Method Details

    +
    + +
    +

    align

    + public function align(String elementAlign, String contextAlign) +
    + Aligns the Overlay to its context element using the specified corner points (represented by the constants TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, and BOTTOM_RIGHT. +
    + Parameters: +
    • elementAlign : String
      The String representing the corner of the Overlay that should be aligned to the context element
    • contextAlign : String
      The corner of the context element that the elementAlign corner should stick to.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    center

    + public function center() +
    + Centers the container in the viewport. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configConstrainToViewport

    + public function configConstrainToViewport(String type, Object[] args, Object obj) +
    + The default event handler fired when the "constraintoviewport" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configContainer

    + public function configContainer(String type, Object[] args, Object obj) +
    + The default event handler fired when the "container" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configContext

    + public function configContext(String type, Object[] args, Object obj) +
    + The default event handler fired when the "context" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configFixedCenter

    + public function configFixedCenter(String type, Object[] args, Object obj) +
    + The default event handler fired when the "fixedcenter" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configHeight

    + public function configHeight(String type, Object[] args, Object obj) +
    + The default event handler fired when the "height" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configIframe

    + public function configIframe(String type, Object[] args, Object obj) +
    + The default event handler fired when the "iframe" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configText

    + public function configText(String type, Object[] args, Object obj) +
    + The default event handler fired when the "text" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    configVisible

    + public function configVisible(String type, Object[] args, Object obj) +
    + The default event handler fired when the "visible" property is changed. This method is responsible for firing showEvent and hideEvent. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configWidth

    + public function configWidth(String type, Object[] args, Object obj) +
    + The default event handler fired when the "width" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configX

    + public function configX(String type, Object[] args, Object obj) +
    + The default event handler fired when the "x" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configXY

    + public function configXY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "xy" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configY

    + public function configY(String type, Object[] args, Object obj) +
    + The default event handler fired when the "y" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    configzIndex

    + public function configzIndex(String type, Object[] args, Object obj) +
    + The default event handler fired when the "zIndex" property is changed. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    destroy

    + public function destroy() +
    + Removes the Overlay element from the DOM and sets all child elements to null. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doCenterOnDOMEvent

    + public function doCenterOnDOMEvent() +
    + Center event handler used for centering on scroll/resize, but only if the Overlay is visible +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    doHide

    + public function doHide() +
    + Sets the timeout for the auto-dismiss delay, which by default is 5 seconds, meaning that a tooltip will automatically dismiss itself after 5 seconds of being displayed. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    doShow

    + public function doShow(DOMEvent e) +
    + Processes the showing of the Tooltip by setting the timeout delay and offset of the Tooltip. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    + Returns: +
      +
    • Number
      The process ID of the timeout function associated with doShow
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    enforceConstraints

    + public function enforceConstraints(String type, Object[] args, Object obj) +
    + The default event handler executed when the moveEvent is fired, if the "constraintoviewport" is set to true. +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideIframe

    + public function hideIframe() +
    + Hides the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    hideMacGeckoScrollbars

    + public function hideMacGeckoScrollbars() +
    + Adds a special CSS class to the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    init

    + public function init(String el, HTMLElement el, Object userConfig) +
    + The Tooltip initialization method. This method is automatically called by the constructor. A Tooltip is automatically rendered by the init method, and it also is set to be invisible by default, and constrained to viewport by default as well. +
    + Parameters: +
    • el : String
      The element ID representing the Tooltip OR
    • el : HTMLElement
      The element representing the Tooltip
    • userConfig : Object
      The configuration object literal containing the configuration that should be set for this Tooltip. See configuration documentation for more details.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    initDefaultConfig

    + public function initDefaultConfig() +
    + Initializes the class's configurable properties which can be changed using the Overlay's Config object (cfg). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes the custom events for Overlay which are fired automatically at appropriate times by the Overlay class. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    moveTo

    + public function moveTo(Number x, Number y) +
    + Moves the Overlay to the specified position. This function is identical to calling this.cfg.setProperty("xy", [x,y]); +
    + Parameters: +
    • x : Number
      The Overlay's new x position
    • y : Number
      The Overlay's new y position
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    onContextMouseMove

    + public function onContextMouseMove(DOMEvent e, Object obj) +
    + The default event handler fired when the user moves the mouse while over the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onContextMouseOut

    + public function onContextMouseOut(DOMEvent e, Object obj) +
    + The default event handler fired when the user mouses out of the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onContextMouseOver

    + public function onContextMouseOver(DOMEvent e, Object obj) +
    + The default event handler fired when the user mouses over the context element. +
    + Parameters: +
    • e : DOMEvent
      The current DOM event
    • obj : Object
      The object argument
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    onDomResize

    + public function onDomResize(DOMEvent e, Object obj) +
    + Event handler fired when the resize monitor element is resized. +
    + Parameters: +
    • e : DOMEvent
      The resize DOM event
    • obj : Object
      The scope object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    preventOverlay

    + public function preventOverlay(Number pageX, Number pageY) +
    + Fired when the Tooltip is moved, this event handler is used to prevent the Tooltip from overlapping with its context element. +
    + Parameters: +
    • pageX : Number
      The x coordinate position of the mouse pointer
    • pageY : Number
      The y coordinate position of the mouse pointer
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    showIframe

    + public function showIframe() +
    + Shows the iframe shim, if it has been enabled +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    showMacGeckoScrollbars

    + public function showMacGeckoScrollbars() +
    + Removes a special CSS class from the Overlay when Mac/Gecko is in use, to work around a Gecko bug where +scrollbars cannot be hidden. See https://bugzilla.mozilla.org/show_bug.cgi?id=187435 +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    syncPosition

    + public function syncPosition() +
    + Synchronizes the Panel's "xy", "x", and "y" properties with the Panel's position in the DOM. This is primarily used to update position information during drag & drop. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      The string representation of the Tooltip
    • +
    +
    +
    +
    This method is defined by Tooltip.
    +
    + +
    +

    windowResizeHandler<static>

    + public function windowResizeHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window resize +
    + Parameters: +
    • e : DOMEvent
      The DOM resize event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    + +
    +

    windowScrollHandler<static>

    + public function windowScrollHandler<static>(DOMEvent e) +
    + <static> The DOM event handler used to fire the CustomEvent for window scroll +
    + Parameters: +
    • e : DOMEvent
      The DOM scroll event
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by Overlay.
    +
    +
    + +

    Event Details

    +
    + +
    +

    YAHOO.widget.Overlay.windowResizeEvent

    + public event YAHOO.widget.Overlay.windowResizeEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window resize +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    YAHOO.widget.Overlay.windowScrollEvent

    + public event YAHOO.widget.Overlay.windowScrollEvent +
    + A singleton CustomEvent used for reacting to the DOM event for window scroll +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    beforeMoveEvent

    + public event beforeMoveEvent +
    + CustomEvent fired before the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    + +
    +

    moveEvent

    + public event moveEvent +
    + CustomEvent fired after the Overlay is moved. +
    + Subscribers will be called with the following parameters: +
    • x : Number
      x coordinate
    • y : Number
      y coordinate
    +
    +
    +
    This event is defined by Overlay.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/YAHOO.widget.YAHOO.widget.Calendar2up.html b/www/extras/yui-ext/docs/output/output/YAHOO.widget.YAHOO.widget.Calendar2up.html new file mode 100644 index 000000000..c6af08303 --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/YAHOO.widget.YAHOO.widget.Calendar2up.html @@ -0,0 +1,1298 @@ + + + + YAHOO.widget.YAHOO.widget.Calendar2up + + + + + +
    + +

    Class YAHOO.widget.YAHOO.widget.Calendar2up

    + + + + + +
    Package:YAHOO.widget.YAHOO.widget
    Class:Calendar2up
    Extends:CalendarGroup
    Defined In:calendar.js
    +
    +
    +
    + +

    Public Properties

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDefined By
     CSS_2UPCLOSE<static> : StringCalendarGroup
    <static> CSS class representing the close icon for the 2-up calendar
     CSS_2UPTITLE<static> : StringCalendarGroup
    <static> CSS class representing the title for the 2-up calendar
     CSS_CONTAINER<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     CSS_MULTI_UP<static> : StringCalendarGroup
    <static> CSS class representing the container for the calendar
     Locale : ObjectCalendarGroup
    The local object which contains the CalendarGroup's locale settings
     Options : ObjectCalendarGroup
    The local object which contains the CalendarGroup's options
     cfg : Number +@defaultCalendarGroup
    The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
     containerId : StringCalendarGroup
    The unique id associated with the CalendarGroup container
     id : StringCalendarGroup
    The unique id associated with the CalendarGroup
     oDomContainer : HTMLElementCalendarGroup
    The outer containing element for the CalendarGroup
     pages : YAHOO.widget.Calendar[]CalendarGroup
    The collection of Calendar pages contained within the CalendarGroup
    + +

    Public Methods

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MethodDefined By
     addMonthRenderer(Number month, Function fnRender) : voidCalendarGroup
    Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matc...
     addMonths(Number count) : voidCalendarGroup
    Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the ne...
     addRenderer(String sDates, Function fnRender) : voidCalendarGroup
    Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell m...
     addWeekdayRenderer(Number weekday, Function fnRender) : voidCalendarGroup
    Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell ma...
     addYears(Number count) : voidCalendarGroup
    Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month.
     callChildFunction(String fnName, Array args) : voidCalendarGroup
    Calls a function within all child Calendars within this CalendarGroup.
     clear() : voidCalendarGroup
    Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year.
     configPageDate(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pagedate" property
     configPages(String type, Object[] args, Object obj) : voidCalendarGroup
    The default Config handler for the "pages" property
     constructChild(String id, String containerId, Object config) : YAHOO.widget.CalendarCalendarGroup
    Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be u...
     delegateConfig(String type, Object[] args, Object obj) : voidCalendarGroup
    Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children
     deselect(String/Date/Date[] date) : Date[]CalendarGroup
    Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render ...
     deselectAll() : Date[]CalendarGroup
    Deselects all dates on the current calendar.
     deselectCell(Number cellIndex) : Date[]CalendarGroup
    Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method ...
     getSelectedDates() : AnCalendarGroup
    Gets the list of currently selected dates from the calendar.
     init(String id, String containerId, Object config) : voidCalendarGroup
    Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly.
     initEvents() : voidCalendarGroup
    Initializes CalendarGroup's built-in CustomEvents
     nextMonth() : voidCalendarGroup
    Navigates to the next month page in the calendar widget.
     nextYear() : voidCalendarGroup
    Navigates to the next year in the currently selected month in the calendar widget.
     previousMonth() : voidCalendarGroup
    Navigates to the previous month page in the calendar widget.
     previousYear() : voidCalendarGroup
    Navigates to the previous year in the currently selected month in the calendar widget.
     render() : voidCalendarGroup
    Calls the render function of all child calendars within the group.
     renderFooter() : voidCalendarGroup
    Renders a footer for the 2-up calendar container. By default, this method is +unimplemented.
     renderHeader() : voidCalendarGroup
    Renders the header for the CalendarGroup.
     reset() : voidCalendarGroup
    Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s).
     select(String/Date/Date[] date) : Date[]CalendarGroup
    Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render me...
     selectCell(Number cellIndex) : Date[]CalendarGroup
    Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is u...
     setChildFunction(String fnName, Function fn) : voidCalendarGroup
    Adds a function to all child Calendars within this CalendarGroup.
     setMonth(Number month) : voidCalendarGroup
    Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, an...
     setYear(Number year) : voidCalendarGroup
    Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and ...
     subtractMonths(Number count) : voidCalendarGroup
    Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to...
     subtractYears(Number count) : voidCalendarGroup
    Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new...
     toString() : StringCalendarGroup
    Returns a string representation of the object.
    + +

    Public Events

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EventDefined By
     beforeDeselectEvent : ()CalendarGroup
    Fired before a selection is made
     beforeRenderEvent : ()CalendarGroup
    Fired before the Calendar is rendered
     beforeSelectEvent : ()CalendarGroup
    Fired before a selection is made
     changePageEvent : ()CalendarGroup
    Fired when the Calendar page is changed
     clearEvent : ()CalendarGroup
    Fired when the Calendar is cleared
     deselectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
     renderEvent : ()CalendarGroup
    Fired when the Calendar is rendered
     resetEvent : ()CalendarGroup
    Fired when the Calendar is reset
     selectEvent : (Array Array)CalendarGroup
    Fired when a selection is made
    + +

    Property Details

    +
    + +
    +

    CSS_2UPCLOSE<static>

    + public String CSS_2UPCLOSE<static> +
    + <static> CSS class representing the close icon for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_2UPTITLE<static>

    + public String CSS_2UPTITLE<static> +
    + <static> CSS class representing the title for the 2-up calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_CONTAINER<static>

    + public String CSS_CONTAINER<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    CSS_MULTI_UP<static>

    + public String CSS_MULTI_UP<static> +
    + <static> CSS class representing the container for the calendar
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Locale

    + public Object Locale +
    + The local object which contains the CalendarGroup's locale settings
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    Options

    + public Object Options +
    + The local object which contains the CalendarGroup's options
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    cfg

    + public Number +@default cfg +
    + The position of the year in a month/day/year date string +@config MDY_YEAR_POSITION
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    containerId

    + public String containerId +
    + The unique id associated with the CalendarGroup container
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    id

    + public String id +
    + The unique id associated with the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    oDomContainer

    + public HTMLElement oDomContainer +
    + The outer containing element for the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    + +
    +

    pages

    + public YAHOO.widget.Calendar[] pages +
    + The collection of Calendar pages contained within the CalendarGroup
    +
    This property is defined by CalendarGroup.
    +
    +
    + + +

    Method Details

    +
    + +
    +

    addMonthRenderer

    + public function addMonthRenderer(Number month, Function fnRender) +
    + Adds a month to the render stack. The function reference passed to this method will be executed +when a date cell matches the month passed to this method. +
    + Parameters: +
    • month : Number
      The month (1-12) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addMonths

    + public function addMonths(Number count) +
    + Adds the designated number of months to the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addRenderer

    + public function addRenderer(String sDates, Function fnRender) +
    + Adds a renderer to the render stack. The function reference passed to this method will be executed +when a date cell matches the conditions specified in the date string for this renderer. +
    + Parameters: +
    • sDates : String
      A date string to associate with the specified renderer. Valid formats include date (12/24/2005), month/day (12/24), and range (12/1/2004-1/1/2005)
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addWeekdayRenderer

    + public function addWeekdayRenderer(Number weekday, Function fnRender) +
    + Adds a weekday to the render stack. The function reference passed to this method will be executed +when a date cell matches the weekday passed to this method. +
    + Parameters: +
    • weekday : Number
      The weekday (0-6) to associate with this renderer
    • fnRender : Function
      The function executed to render cells that match the render rules for this renderer.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    addYears

    + public function addYears(Number count) +
    + Adds the designated number of years to the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to add to the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    callChildFunction

    + public function callChildFunction(String fnName, Array args) +
    + Calls a function within all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • args : Array
      The arguments to pass to the function
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    clear

    + public function clear() +
    + Clears the selected dates in the current calendar widget and sets the calendar +to the current month and year. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPageDate

    + public function configPageDate(String type, Object[] args, Object obj) +
    + The default Config handler for the "pagedate" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    configPages

    + public function configPages(String type, Object[] args, Object obj) +
    + The default Config handler for the "pages" property +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    constructChild

    + public function constructChild(String id, String containerId, Object config) +
    + Constructs a child calendar. This method can be overridden if a subclassed version of the default +calendar is to be used. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • YAHOO.widget.Calendar
      The YAHOO.widget.Calendar instance that is constructed
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    delegateConfig

    + public function delegateConfig(String type, Object[] args, Object obj) +
    + Delegates a configuration property to the CustomEvents associated with the CalendarGroup's children +
    + Parameters: +
    • type : String
      The CustomEvent type (usually the property name)
    • args : Object[]
      The CustomEvent arguments. For configuration handlers, args[0] will equal the newly applied value for the property.
    • obj : Object
      The scope object. For configuration handlers, this will usually equal the owner.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselect

    + public function deselect(String/Date/Date[] date) +
    + Deselects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once deselection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to deselect in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectAll

    + public function deselectAll() +
    + Deselects all dates on the current calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected. Assuming that this function executes properly, the return value should be an empty array. However, the empty array is returned for the sake of being able to check the selection status of the calendar.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    deselectCell

    + public function deselectCell(Number cellIndex) +
    + Deselects a date on the current calendar by referencing the index of the cell that should be deselected. +This method is used to easily deselect a single cell (usually with a mouse click) without having to do +a full render. The selected style is removed from the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to deselect in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    getSelectedDates

    + public function getSelectedDates() +
    + Gets the list of currently selected dates from the calendar. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • An
      array of currently selected JavaScript Date objects.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    init

    + public function init(String id, String containerId, Object config) +
    + Initializes the calendar group. All subclasses must call this method in order for the +group to be initialized properly. +
    + Parameters: +
    • id : String
      The id of the table element that will represent the calendar widget
    • containerId : String
      The id of the container div element that will wrap the calendar table
    • config : Object
      The configuration object containing the Calendar's arguments
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    initEvents

    + public function initEvents() +
    + Initializes CalendarGroup's built-in CustomEvents +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextMonth

    + public function nextMonth() +
    + Navigates to the next month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    nextYear

    + public function nextYear() +
    + Navigates to the next year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousMonth

    + public function previousMonth() +
    + Navigates to the previous month page in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    previousYear

    + public function previousYear() +
    + Navigates to the previous year in the currently selected month in the calendar widget. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    render

    + public function render() +
    + Calls the render function of all child calendars within the group. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderFooter

    + public function renderFooter() +
    + Renders a footer for the 2-up calendar container. By default, this method is +unimplemented. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    renderHeader

    + public function renderHeader() +
    + Renders the header for the CalendarGroup. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    reset

    + public function reset() +
    + Resets the calendar widget to the originally selected month and year, and +sets the calendar to the initial selection(s). +
    + Parameters: +
    • None.
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    select

    + public function select(String/Date/Date[] date) +
    + Selects a date or a collection of dates on the current calendar. This method, by default, +does not call the render method explicitly. Once selection has completed, render must be +called for the changes to be reflected visually. +
    + Parameters: +
    • date : String/Date/Date[]
      The date string of dates to select in the current calendar. Valid formats are individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). This method can also take a JavaScript Date object or an array of Date objects.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    selectCell

    + public function selectCell(Number cellIndex) +
    + Selects a date on the current calendar by referencing the index of the cell that should be selected. +This method is used to easily select a single cell (usually with a mouse click) without having to do +a full render. The selected style is applied to the cell directly. +
    + Parameters: +
    • cellIndex : Number
      The index of the cell to select in the current calendar.
    + Returns: +
      +
    • Date[]
      Array of JavaScript Date objects representing all individual dates that are currently selected.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setChildFunction

    + public function setChildFunction(String fnName, Function fn) +
    + Adds a function to all child Calendars within this CalendarGroup. +
    + Parameters: +
    • fnName : String
      The name of the function
    • fn : Function
      The function to apply to each Calendar page object
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setMonth

    + public function setMonth(Number month) +
    + Sets the calendar group's month explicitly. This month will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • month : Number
      The numeric month, from 0 (January) to 11 (December)
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    setYear

    + public function setYear(Number year) +
    + Sets the calendar group's year explicitly. This year will be set into the first +page of the multi-page calendar, and all other months will be iterated appropriately. +
    + Parameters: +
    • year : Number
      The numeric 4-digit year
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractMonths

    + public function subtractMonths(Number count) +
    + Subtracts the designated number of months from the current calendar month, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of months to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    subtractYears

    + public function subtractYears(Number count) +
    + Subtcats the designated number of years from the current calendar, and sets the current +calendar page date to the new month. +
    + Parameters: +
    • count : Number
      The number of years to subtract from the current calendar
    + Returns: +
      +
    • void
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    + +
    +

    toString

    + public function toString() +
    + Returns a string representation of the object. +
    + Parameters: +
    • None.
    + Returns: +
      +
    • String
      A string representation of the CalendarGroup object.
    • +
    +
    +
    +
    This method is defined by CalendarGroup.
    +
    +
    + +

    Event Details

    +
    + +
    +

    beforeDeselectEvent

    + public event beforeDeselectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeRenderEvent

    + public event beforeRenderEvent +
    + Fired before the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    beforeSelectEvent

    + public event beforeSelectEvent +
    + Fired before a selection is made +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    changePageEvent

    + public event changePageEvent +
    + Fired when the Calendar page is changed +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    clearEvent

    + public event clearEvent +
    + Fired when the Calendar is cleared +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    deselectEvent

    + public event deselectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    renderEvent

    + public event renderEvent +
    + Fired when the Calendar is rendered +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    resetEvent

    + public event resetEvent +
    + Fired when the Calendar is reset +
    + Subscribers will be called with the following parameters: +
    • None.
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    + +
    +

    selectEvent

    + public event selectEvent +
    + Fired when a selection is made +
    + Subscribers will be called with the following parameters: +
    • Array : Array
      of Date field arrays in the format [YYYY, MM, DD].
    +
    +
    +
    This event is defined by CalendarGroup.
    +
    +
    +
    +
    + Copyright © 2006 Jack Slocum. All rights reserved. + + + \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/output/tree.html b/www/extras/yui-ext/docs/output/output/tree.html new file mode 100644 index 000000000..63dda127f --- /dev/null +++ b/www/extras/yui-ext/docs/output/output/tree.html @@ -0,0 +1,80 @@ +

    Examples and Demos

    Coming Soon
    \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/slider.js.html b/www/extras/yui-ext/docs/output/slider.js.html new file mode 100644 index 000000000..171dd2f4c --- /dev/null +++ b/www/extras/yui-ext/docs/output/slider.js.html @@ -0,0 +1,1114 @@ +slider.js
    /*                                                                                                                                                      
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The Slider component is a UI control that enables the user to adjust 
    + * values in a finite range along one or two axes. Typically, the Slider 
    + * control is used in a web application as a rich, visual replacement 
    + * for an input box that takes a number as input. The Slider control can 
    + * also easily accommodate a second dimension, providing x,y output for 
    + * a selection point chosen from a rectangular region.
    + *
    + * @module    slider
    + * @title     Slider Widget
    + * @namespace YAHOO.widget
    + * @requires  yahoo,dom,dragdrop,event
    + * @optional  animation
    + */
    +// holder
    +/**
    + * A DragDrop implementation that can be used as a background for a
    + * slider.  It takes a reference to the thumb instance 
    + * so it can delegate some of the events to it.  The goal is to make the 
    + * thumb jump to the location on the background when the background is 
    + * clicked.  
    + *
    + * @class Slider
    + * @extends YAHOO.util.DragDrop
    + * @constructor
    + * @param {String} id     The id of the element linked to this instance
    + * @param {String} sGroup The group of related DragDrop items
    + * @param {String} sType  The type of slider (horiz, vert, region)
    + */
    +YAHOO.widget.Slider = function(sElementId, sGroup, oThumb, sType) {
    +    if (sElementId) {
    +
    +        /**
    +         * The type of the slider (horiz, vert, region)
    +         * @property type
    +         * @type string
    +         */
    +        this.type = sType;
    +
    +        this.init(sElementId, sGroup, true);
    +
    +        //this.removeInvalidHandleType("A");
    +
    +
    +        var self = this;
    +
    +        /**
    +         * Event the fires when the value of the control changes.  If 
    +         * the control is animated the event will fire every point
    +         * along the way.
    +         * @event change
    +         * @param {int} new
    +         * @param {int} firstOffset the number of pixels the thumb has moved
    +         * from its start position. Normal horizontal and vertical sliders will only
    +         * have the firstOffset.  Regions will have both, the first is the horizontal
    +         * offset, the second the vertical.
    +         * @param {int} secondOffset the y offset for region sliders
    +         */
    +        this.createEvent("change", this);
    +
    +        /**
    +         * Event that fires at the end of a slider thumb move.
    +         * @event slideStart
    +         */
    +        this.createEvent("slideStart", this);
    +
    +        /**
    +         * Event that fires at the end of a slider thumb move
    +         * @event slideEnd
    +         */
    +        this.createEvent("slideEnd", this);
    +
    +        /**
    +         * A YAHOO.widget.SliderThumb instance that we will use to 
    +         * reposition the thumb when the background is clicked
    +         * @property thumb
    +         * @type YAHOO.widget.SliderThumb
    +         */
    +        this.thumb = oThumb;
    +
    +        // add handler for the handle onchange event
    +        oThumb.onChange = function() { 
    +            self.handleThumbChange(); 
    +        };
    +
    +        /**
    +         * Overrides the isTarget property in YAHOO.util.DragDrop
    +         * @property isTarget
    +         * @private
    +         */
    +        this.isTarget = false;
    +    
    +        /**
    +         * Flag that determines if the thumb will animate when moved
    +         * @property animate
    +         * @type boolean
    +         */
    +        this.animate = YAHOO.widget.Slider.ANIM_AVAIL;
    +
    +        /**
    +         * Set to false to disable a background click thumb move
    +         * @property backgroundEnabled
    +         * @type boolean
    +         */
    +        this.backgroundEnabled = true;
    +
    +        /**
    +         * Adjustment factor for tick animation, the more ticks, the
    +         * faster the animation (by default)
    +         * @property tickPause
    +         * @type int
    +         */
    +        this.tickPause = 40;
    +
    +        /**
    +         * Enables the arrow, home and end keys, defaults to true.
    +         * @property enableKeys
    +         * @type boolean
    +         */
    +        this.enableKeys = true;
    +
    +        /**
    +         * Specifies the number of pixels the arrow keys will move the slider.
    +         * Default is 25.
    +         * @property keyIncrement
    +         * @type int
    +         */
    +        this.keyIncrement = 20;
    +
    +        /**
    +         * moveComplete is set to true when the slider has moved to its final
    +         * destination.  For animated slider, this value can be checked in 
    +         * the onChange handler to make it possible to execute logic only
    +         * when the move is complete rather than at all points along the way.
    +         *
    +         * @property moveComplete
    +         * @type Boolean
    +         */
    +        this.moveComplete = true;
    +
    +        /**
    +         * If animation is configured, specifies the length of the animation
    +         * in seconds.
    +         * @property animationDuration
    +         * @type int
    +         * @default 0.2
    +         */
    +        this.animationDuration = 0.2;
    +
    +        if (oThumb._isHoriz && oThumb.xTicks && oThumb.xTicks.length) {
    +            this.tickPause = Math.round(360 / oThumb.xTicks.length);
    +        } else if (oThumb.yTicks && oThumb.yTicks.length) {
    +            this.tickPause = Math.round(360 / oThumb.yTicks.length);
    +        }
    +
    +
    +        // delegate thumb methods
    +        oThumb.onMouseDown = function () { return self.focus(); };
    +        //oThumb.b4MouseDown = function () { return self.b4MouseDown(); };
    +        // oThumb.lock = function() { self.lock(); };
    +        // oThumb.unlock = function() { self.unlock(); };
    +        oThumb.onMouseUp = function() { self.thumbMouseUp(); };
    +        oThumb.onDrag = function() { self.fireEvents(); };
    +        oThumb.onAvailable = function() { return self.setStartSliderState(); };
    +    }
    +};
    +
    +/**
    + * Factory method for creating a horizontal slider
    + * @method YAHOO.widget.Slider.getHorizSlider
    + * @static
    + * @param {String} sBGElId the id of the slider's background element
    + * @param {String} sHandleElId the id of the thumb element
    + * @param {int} iLeft the number of pixels the element can move left
    + * @param {int} iRight the number of pixels the element can move right
    + * @param {int} iTickSize optional parameter for specifying that the element 
    + * should move a certain number pixels at a time.
    + * @return {Slider} a horizontal slider control
    + */
    +YAHOO.widget.Slider.getHorizSlider = 
    +    function (sBGElId, sHandleElId, iLeft, iRight, iTickSize) {
    +        return new YAHOO.widget.Slider(sBGElId, sBGElId, 
    +            new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 
    +                               iLeft, iRight, 0, 0, iTickSize), "horiz");
    +};
    +
    +/**
    + * Factory method for creating a vertical slider
    + * @method YAHOO.widget.Slider.getVertSlider
    + * @static
    + * @param {String} sBGElId the id of the slider's background element
    + * @param {String} sHandleElId the id of the thumb element
    + * @param {int} iUp the number of pixels the element can move up
    + * @param {int} iDown the number of pixels the element can move down
    + * @param {int} iTickSize optional parameter for specifying that the element 
    + * should move a certain number pixels at a time.
    + * @return {Slider} a vertical slider control
    + */
    +YAHOO.widget.Slider.getVertSlider = 
    +    function (sBGElId, sHandleElId, iUp, iDown, iTickSize) {
    +        return new YAHOO.widget.Slider(sBGElId, sBGElId, 
    +            new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, 0, 0, 
    +                               iUp, iDown, iTickSize), "vert");
    +};
    +
    +/**
    + * Factory method for creating a slider region like the one in the color
    + * picker example
    + * @method YAHOO.widget.Slider.getSliderRegion
    + * @static
    + * @param {String} sBGElId the id of the slider's background element
    + * @param {String} sHandleElId the id of the thumb element
    + * @param {int} iLeft the number of pixels the element can move left
    + * @param {int} iRight the number of pixels the element can move right
    + * @param {int} iUp the number of pixels the element can move up
    + * @param {int} iDown the number of pixels the element can move down
    + * @param {int} iTickSize optional parameter for specifying that the element 
    + * should move a certain number pixels at a time.
    + * @return {Slider} a slider region control
    + */
    +YAHOO.widget.Slider.getSliderRegion = 
    +    function (sBGElId, sHandleElId, iLeft, iRight, iUp, iDown, iTickSize) {
    +        return new YAHOO.widget.Slider(sBGElId, sBGElId, 
    +            new YAHOO.widget.SliderThumb(sHandleElId, sBGElId, iLeft, iRight, 
    +                               iUp, iDown, iTickSize), "region");
    +};
    +
    +/**
    + * By default, animation is available if the animation library is detected.
    + * @property YAHOO.widget.Slider.ANIM_AVAIL
    + * @static
    + * @type boolean
    + */
    +YAHOO.widget.Slider.ANIM_AVAIL = true;
    +
    +YAHOO.extend(YAHOO.widget.Slider, YAHOO.util.DragDrop, {
    +
    +    onAvailable: function() {
    +        var Event = YAHOO.util.Event;
    +        Event.on(this.id, "keydown",  this.handleKeyDown,  this, true);
    +        Event.on(this.id, "keypress", this.handleKeyPress, this, true);
    +    },
    + 
    +    handleKeyPress: function(e) {
    +        if (this.enableKeys) {
    +            var Event = YAHOO.util.Event;
    +            var kc = Event.getCharCode(e);
    +            switch (kc) {
    +                case 0x25: // left
    +                case 0x26: // up
    +                case 0x27: // right
    +                case 0x28: // down
    +                case 0x24: // home
    +                case 0x23: // end
    +                    Event.preventDefault(e);
    +                    break;
    +                default:
    +            }
    +        }
    +   },
    +
    +    handleKeyDown: function(e) {
    +        if (this.enableKeys) {
    +            var Event = YAHOO.util.Event;
    +
    +            var kc = Event.getCharCode(e), t=this.thumb;
    +            var h=this.getXValue(),v=this.getYValue();
    +
    +            var horiz = false;
    +            var changeValue = true;
    +            switch (kc) {
    +
    +                // left
    +                case 0x25: h -= this.keyIncrement; break;
    +
    +                // up
    +                case 0x26: v -= this.keyIncrement; break;
    +
    +                // right
    +                case 0x27: h += this.keyIncrement; break;
    +
    +                // down
    +                case 0x28: v += this.keyIncrement; break;
    +
    +                // home
    +                case 0x24: h = t.leftConstraint;    
    +                           v = t.topConstraint;    
    +                           break;
    +
    +                // end
    +                case 0x23: h = t.rightConstraint; 
    +                           v = t.bottomConstraint;    
    +                           break;
    +
    +                default:   changeValue = false;
    +            }
    +
    +            if (changeValue) {
    +                if (t._isRegion) {
    +                    this.setRegionValue(h, v, true);
    +                } else {
    +                    var newVal = (t._isHoriz) ? h : v;
    +                    this.setValue(newVal, true);
    +                }
    +                Event.stopEvent(e);
    +            }
    +
    +        }
    +    },
    +
    +    /**
    +     * Initialization that sets up the value offsets once the elements are ready
    +     * @method setSliderStartState
    +     */
    +    setStartSliderState: function() {
    +
    +
    +        this.setThumbCenterPoint();
    +
    +        /**
    +         * The basline position of the background element, used
    +         * to determine if the background has moved since the last
    +         * operation.
    +         * @property baselinePos
    +         * @type [int, int]
    +         */
    +        this.baselinePos = YAHOO.util.Dom.getXY(this.getEl());
    +
    +        this.thumb.startOffset = this.thumb.getOffsetFromParent(this.baselinePos);
    +
    +        if (this.thumb._isRegion) {
    +            if (this.deferredSetRegionValue) {
    +                this.setRegionValue.apply(this, this.deferredSetRegionValue, true);
    +                this.deferredSetRegionValue = null;
    +            } else {
    +                this.setRegionValue(0, 0, true);
    +            }
    +        } else {
    +            if (this.deferredSetValue) {
    +                this.setValue.apply(this, this.deferredSetValue, true);
    +                this.deferredSetValue = null;
    +            } else {
    +                this.setValue(0, true, true);
    +            }
    +        }
    +    },
    +
    +    /**
    +     * When the thumb is available, we cache the centerpoint of the element so
    +     * we can position the element correctly when the background is clicked
    +     * @method setThumbCenterPoint
    +     */
    +    setThumbCenterPoint: function() {
    +
    +        var el = this.thumb.getEl();
    +
    +        if (el) {
    +            /**
    +             * The center of the slider element is stored so we can position 
    +             * place it in the correct position when the background is clicked
    +             * @property thumbCenterPoint
    +             * @type {"x": int, "y": int}
    +             */
    +            this.thumbCenterPoint = { 
    +                    x: parseInt(el.offsetWidth/2, 10), 
    +                    y: parseInt(el.offsetHeight/2, 10) 
    +            };
    +        }
    +
    +    },
    +
    +    /**
    +     * Locks the slider, overrides YAHOO.util.DragDrop
    +     * @method lock
    +     */
    +    lock: function() {
    +        this.thumb.lock();
    +        this.locked = true;
    +    },
    +
    +    /**
    +     * Unlocks the slider, overrides YAHOO.util.DragDrop
    +     * @method unlock
    +     */
    +    unlock: function() {
    +        this.thumb.unlock();
    +        this.locked = false;
    +    },
    +
    +    /**
    +     * Handles mouseup event on the slider background
    +     * @method thumbMouseUp
    +     * @private
    +     */
    +    thumbMouseUp: function() {
    +        if (!this.isLocked() && !this.moveComplete) {
    +            this.endMove();
    +        }
    +
    +    },
    +
    +    /**
    +     * Returns a reference to this slider's thumb
    +     * @method getThumb
    +     * @return {SliderThumb} this slider's thumb
    +     */
    +    getThumb: function() {
    +        return this.thumb;
    +    },
    +
    +    /**
    +     * Try to focus the element when clicked so we can add
    +     * accessibility features
    +     * @method focus
    +     * @private
    +     */
    +    focus: function() {
    +
    +        // Focus the background element if possible
    +        var el = this.getEl();
    +
    +        if (el.focus) {
    +            try {
    +                el.focus();
    +            } catch(e) {
    +                // Prevent permission denied unhandled exception in FF that can
    +                // happen when setting focus while another element is handling
    +                // the blur.  @TODO this is still writing to the error log 
    +                // (unhandled error) in FF1.5 with strict error checking on.
    +            }
    +        }
    +
    +        this.verifyOffset();
    +
    +        if (this.isLocked()) {
    +            return false;
    +        } else {
    +            this.onSlideStart();
    +            return true;
    +        }
    +    },
    +
    +    /**
    +     * Event that fires when the value of the slider has changed
    +     * @method onChange
    +     * @param {int} firstOffset the number of pixels the thumb has moved
    +     * from its start position. Normal horizontal and vertical sliders will only
    +     * have the firstOffset.  Regions will have both, the first is the horizontal
    +     * offset, the second the vertical.
    +     * @param {int} secondOffset the y offset for region sliders
    +     * @deprecated use instance.subscribe("change") instead
    +     */
    +    onChange: function (firstOffset, secondOffset) { 
    +        /* override me */ 
    +    },
    +
    +    /**
    +     * Event that fires when the at the beginning of the slider thumb move
    +     * @method onSlideStart
    +     * @deprecated use instance.subscribe("slideStart") instead
    +     */
    +    onSlideStart: function () { 
    +        /* override me */ 
    +    },
    +
    +    /**
    +     * Event that fires at the end of a slider thumb move
    +     * @method onSliderEnd
    +     * @deprecated use instance.subscribe("slideEnd") instead
    +     */
    +    onSlideEnd: function () { 
    +        /* override me */ 
    +    },
    +
    +    /**
    +     * Returns the slider's thumb offset from the start position
    +     * @method getValue
    +     * @return {int} the current value
    +     */
    +    getValue: function () { 
    +        return this.thumb.getValue();
    +    },
    +
    +    /**
    +     * Returns the slider's thumb X offset from the start position
    +     * @method getXValue
    +     * @return {int} the current horizontal offset
    +     */
    +    getXValue: function () { 
    +        return this.thumb.getXValue();
    +    },
    +
    +    /**
    +     * Returns the slider's thumb Y offset from the start position
    +     * @method getYValue
    +     * @return {int} the current vertical offset
    +     */
    +    getYValue: function () { 
    +        return this.thumb.getYValue();
    +    },
    +
    +    /**
    +     * Internal handler for the slider thumb's onChange event
    +     * @method handleThumbChange
    +     * @private
    +     */
    +    handleThumbChange: function () { 
    +        var t = this.thumb;
    +        if (t._isRegion) {
    +            t.onChange(t.getXValue(), t.getYValue());
    +            this.fireEvent("change", { x: t.getXValue(), y: t.getYValue() } );
    +        } else {
    +            t.onChange(t.getValue());
    +            this.fireEvent("change", t.getValue());
    +        }
    +
    +    },
    +
    +    /**
    +     * Provides a way to set the value of the slider in code.
    +     * @method setValue
    +     * @param {int} newOffset the number of pixels the thumb should be
    +     * positioned away from the initial start point 
    +     * @param {boolean} skipAnim set to true to disable the animation
    +     * for this move action (but not others).
    +     * @param {boolean} force ignore the locked setting and set value anyway
    +     * @return {boolean} true if the move was performed, false if it failed
    +     */
    +    setValue: function(newOffset, skipAnim, force) {
    +
    +        if (!this.thumb.available) {
    +            this.deferredSetValue = arguments;
    +            return false;
    +        }
    +
    +        if (this.isLocked() && !force) {
    +            return false;
    +        }
    +
    +        if ( isNaN(newOffset) ) {
    +            return false;
    +        }
    +
    +        var t = this.thumb;
    +        var newX, newY;
    +        this.verifyOffset();
    +        if (t._isRegion) {
    +            return false;
    +        } else if (t._isHoriz) {
    +            this.onSlideStart();
    +            // this.fireEvent("slideStart");
    +            newX = t.initPageX + newOffset + this.thumbCenterPoint.x;
    +            this.moveThumb(newX, t.initPageY, skipAnim);
    +        } else {
    +            this.onSlideStart();
    +            // this.fireEvent("slideStart");
    +            newY = t.initPageY + newOffset + this.thumbCenterPoint.y;
    +            this.moveThumb(t.initPageX, newY, skipAnim);
    +        }
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Provides a way to set the value of the region slider in code.
    +     * @method setRegionValue
    +     * @param {int} newOffset the number of pixels the thumb should be
    +     * positioned away from the initial start point (x axis for region)
    +     * @param {int} newOffset2 the number of pixels the thumb should be
    +     * positioned away from the initial start point (y axis for region)
    +     * @param {boolean} skipAnim set to true to disable the animation
    +     * for this move action (but not others).
    +     * @param {boolean} force ignore the locked setting and set value anyway
    +     * @return {boolean} true if the move was performed, false if it failed
    +     */
    +    setRegionValue: function(newOffset, newOffset2, skipAnim) {
    +
    +        if (!this.thumb.available) {
    +            this.deferredSetRegionValue = arguments;
    +            return false;
    +        }
    +
    +        if (this.isLocked() && !force) {
    +            return false;
    +        }
    +
    +        if ( isNaN(newOffset) ) {
    +            return false;
    +        }
    +
    +        var t = this.thumb;
    +        if (t._isRegion) {
    +            this.onSlideStart();
    +            var newX = t.initPageX + newOffset + this.thumbCenterPoint.x;
    +            var newY = t.initPageY + newOffset2 + this.thumbCenterPoint.y;
    +            this.moveThumb(newX, newY, skipAnim);
    +            return true;
    +        }
    +
    +        return false;
    +
    +    },
    +
    +    /**
    +     * Checks the background position element position.  If it has moved from the
    +     * baseline position, the constraints for the thumb are reset
    +     * @method verifyOffset
    +     * @return {boolean} True if the offset is the same as the baseline.
    +     */
    +    verifyOffset: function() {
    +
    +        var newPos = YAHOO.util.Dom.getXY(this.getEl());
    +
    +        if (newPos[0] != this.baselinePos[0] || newPos[1] != this.baselinePos[1]) {
    +            this.thumb.resetConstraints();
    +            this.baselinePos = newPos;
    +            return false;
    +        }
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Move the associated slider moved to a timeout to try to get around the 
    +     * mousedown stealing moz does when I move the slider element between the 
    +     * cursor and the background during the mouseup event
    +     * @method moveThumb
    +     * @param {int} x the X coordinate of the click
    +     * @param {int} y the Y coordinate of the click
    +     * @param {boolean} skipAnim don't animate if the move happend onDrag
    +     * @private
    +     */
    +    moveThumb: function(x, y, skipAnim) {
    +
    +
    +        var t = this.thumb;
    +        var self = this;
    +
    +        if (!t.available) {
    +            return;
    +        }
    +
    +
    +        // this.verifyOffset();
    +
    +        t.setDelta(this.thumbCenterPoint.x, this.thumbCenterPoint.y);
    +
    +        var _p = t.getTargetCoord(x, y);
    +        var p = [_p.x, _p.y];
    +
    +        this.fireEvent("slideStart");
    +
    +        if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && t._graduated && !skipAnim) {
    +            // this.thumb._animating = true;
    +            this.lock();
    +            
    +            setTimeout( function() { self.moveOneTick(p); }, this.tickPause );
    +
    +        } else if (this.animate && YAHOO.widget.Slider.ANIM_AVAIL && !skipAnim) {
    +
    +            // this.thumb._animating = true;
    +            this.lock();
    +
    +            var oAnim = new YAHOO.util.Motion( 
    +                    t.id, { points: { to: p } }, 
    +                    this.animationDuration, 
    +                    YAHOO.util.Easing.easeOut );
    +
    +            oAnim.onComplete.subscribe( function() { self.endMove(); } );
    +            oAnim.animate();
    +        } else {
    +            t.setDragElPos(x, y);
    +            // this.fireEvents();
    +            this.endMove();
    +        }
    +    },
    +
    +    /**
    +     * Move the slider one tick mark towards its final coordinate.  Used
    +     * for the animation when tick marks are defined
    +     * @method moveOneTick
    +     * @param {int[]} the destination coordinate
    +     * @private
    +     */
    +    moveOneTick: function(finalCoord) {
    +
    +        var t = this.thumb;
    +        var curCoord = YAHOO.util.Dom.getXY(t.getEl());
    +        var tmp;
    +
    +        // var thresh = Math.min(t.tickSize + (Math.floor(t.tickSize/2)), 10);
    +        // var thresh = 10;
    +        // var thresh = t.tickSize + (Math.floor(t.tickSize/2));
    +
    +        var nextCoord = null;
    +
    +        if (t._isRegion) {
    +            nextCoord = this._getNextX(curCoord, finalCoord);
    +            var tmpX = (nextCoord) ? nextCoord[0] : curCoord[0];
    +            nextCoord = this._getNextY([tmpX, curCoord[1]], finalCoord);
    +
    +        } else if (t._isHoriz) {
    +            nextCoord = this._getNextX(curCoord, finalCoord);
    +        } else {
    +            nextCoord = this._getNextY(curCoord, finalCoord);
    +        }
    +
    +
    +        if (nextCoord) {
    +
    +            // move to the next coord
    +            // YAHOO.util.Dom.setXY(t.getEl(), nextCoord);
    +
    +            // var el = t.getEl();
    +            // YAHOO.util.Dom.setStyle(el, "left", (nextCoord[0] + this.thumb.deltaSetXY[0]) + "px");
    +            // YAHOO.util.Dom.setStyle(el, "top",  (nextCoord[1] + this.thumb.deltaSetXY[1]) + "px");
    +
    +            this.thumb.alignElWithMouse(t.getEl(), nextCoord[0], nextCoord[1]);
    +            
    +            // check if we are in the final position, if not make a recursive call
    +            if (!(nextCoord[0] == finalCoord[0] && nextCoord[1] == finalCoord[1])) {
    +                var self = this;
    +                setTimeout(function() { self.moveOneTick(finalCoord); }, 
    +                        this.tickPause);
    +            } else {
    +                this.endMove();
    +            }
    +        } else {
    +            this.endMove();
    +        }
    +
    +        //this.tickPause = Math.round(this.tickPause/2);
    +    },
    +
    +    /**
    +     * Returns the next X tick value based on the current coord and the target coord.
    +     * @method _getNextX
    +     * @private
    +     */
    +    _getNextX: function(curCoord, finalCoord) {
    +        var t = this.thumb;
    +        var thresh;
    +        var tmp = [];
    +        var nextCoord = null;
    +        if (curCoord[0] > finalCoord[0]) {
    +            thresh = t.tickSize - this.thumbCenterPoint.x;
    +            tmp = t.getTargetCoord( curCoord[0] - thresh, curCoord[1] );
    +            nextCoord = [tmp.x, tmp.y];
    +        } else if (curCoord[0] < finalCoord[0]) {
    +            thresh = t.tickSize + this.thumbCenterPoint.x;
    +            tmp = t.getTargetCoord( curCoord[0] + thresh, curCoord[1] );
    +            nextCoord = [tmp.x, tmp.y];
    +        } else {
    +            // equal, do nothing
    +        }
    +
    +        return nextCoord;
    +    },
    +
    +    /**
    +     * Returns the next Y tick value based on the current coord and the target coord.
    +     * @method _getNextY
    +     * @private
    +     */
    +    _getNextY: function(curCoord, finalCoord) {
    +        var t = this.thumb;
    +        var thresh;
    +        var tmp = [];
    +        var nextCoord = null;
    +
    +        if (curCoord[1] > finalCoord[1]) {
    +            thresh = t.tickSize - this.thumbCenterPoint.y;
    +            tmp = t.getTargetCoord( curCoord[0], curCoord[1] - thresh );
    +            nextCoord = [tmp.x, tmp.y];
    +        } else if (curCoord[1] < finalCoord[1]) {
    +            thresh = t.tickSize + this.thumbCenterPoint.y;
    +            tmp = t.getTargetCoord( curCoord[0], curCoord[1] + thresh );
    +            nextCoord = [tmp.x, tmp.y];
    +        } else {
    +            // equal, do nothing
    +        }
    +
    +        return nextCoord;
    +    },
    +
    +    /**
    +     * Resets the constraints before moving the thumb.
    +     * @method b4MouseDown
    +     * @private
    +     */
    +    b4MouseDown: function(e) {
    +        this.thumb.autoOffset();
    +        this.thumb.resetConstraints();
    +    },
    +
    +    /**
    +     * Handles the mousedown event for the slider background
    +     * @method onMouseDown
    +     * @private
    +     */
    +    onMouseDown: function(e) {
    +        // this.resetConstraints(true);
    +        // this.thumb.resetConstraints(true);
    +
    +        if (! this.isLocked() && this.backgroundEnabled) {
    +            var x = YAHOO.util.Event.getPageX(e);
    +            var y = YAHOO.util.Event.getPageY(e);
    +
    +            this.focus();
    +            this.moveThumb(x, y);
    +        }
    +        
    +    },
    +
    +    /**
    +     * Handles the onDrag event for the slider background
    +     * @method onDrag
    +     * @private
    +     */
    +    onDrag: function(e) {
    +        if (! this.isLocked()) {
    +            var x = YAHOO.util.Event.getPageX(e);
    +            var y = YAHOO.util.Event.getPageY(e);
    +            this.moveThumb(x, y, true);
    +        }
    +    },
    +
    +    /**
    +     * Fired when the slider movement ends
    +     * @method endMove
    +     * @private
    +     */
    +    endMove: function () {
    +        // this._animating = false;
    +        this.unlock();
    +        this.moveComplete = true;
    +        this.fireEvents();
    +    },
    +
    +    /**
    +     * Fires the change event if the value has been changed.  Ignored if we are in
    +     * the middle of an animation as the event will fire when the animation is
    +     * complete
    +     * @method fireEvents
    +     * @private
    +     */
    +    fireEvents: function () {
    +
    +        var t = this.thumb;
    +
    +        t.cachePosition();
    +
    +        if (! this.isLocked()) {
    +            if (t._isRegion) {
    +                var newX = t.getXValue();
    +                var newY = t.getYValue();
    +
    +                if (newX != this.previousX || newY != this.previousY) {
    +                    this.onChange(newX, newY);
    +                    this.fireEvent("change", { x: newX, y: newY });
    +                }
    +
    +                this.previousX = newX;
    +                this.previousY = newY;
    +
    +            } else {
    +                var newVal = t.getValue();
    +                if (newVal != this.previousVal) {
    +                    this.onChange( newVal );
    +                    this.fireEvent("change", newVal);
    +                }
    +                this.previousVal = newVal;
    +            }
    +
    +            if (this.moveComplete) {
    +                this.onSlideEnd();
    +                this.fireEvent("slideEnd");
    +                this.moveComplete = false;
    +            }
    +
    +        }
    +    },
    +
    +    /**
    +     * Slider toString
    +     * @method toString
    +     * @return {string} string representation of the instance
    +     */
    +    toString: function () { 
    +        return ("Slider (" + this.type +") " + this.id);
    +    }
    +
    +});
    +
    +YAHOO.augment(YAHOO.widget.Slider, YAHOO.util.EventProvider);
    +
    +/**
    + * A drag and drop implementation to be used as the thumb of a slider.
    + * @class SliderThumb
    + * @extends YAHOO.util.DD
    + * @constructor
    + * @param {String} id the id of the slider html element
    + * @param {String} sGroup the group of related DragDrop items
    + * @param {int} iLeft the number of pixels the element can move left
    + * @param {int} iRight the number of pixels the element can move right
    + * @param {int} iUp the number of pixels the element can move up
    + * @param {int} iDown the number of pixels the element can move down
    + * @param {int} iTickSize optional parameter for specifying that the element 
    + * should move a certain number pixels at a time.
    + */
    +YAHOO.widget.SliderThumb = function(id, sGroup, iLeft, iRight, iUp, iDown, iTickSize) {
    +
    +    if (id) {
    +        this.init(id, sGroup);
    +
    +        /**
    +         * The id of the thumbs parent HTML element (the slider background 
    +         * element).
    +         * @property parentElId
    +         * @type string
    +         */
    +        this.parentElId = sGroup;
    +    }
    +
    +    //this.removeInvalidHandleType("A");
    +
    +
    +    /**
    +     * Overrides the isTarget property in YAHOO.util.DragDrop
    +     * @property isTarget
    +     * @private
    +     */
    +    this.isTarget = false;
    +
    +    /**
    +     * The tick size for this slider
    +     * @property tickSize
    +     * @type int
    +     * @private
    +     */
    +    this.tickSize = iTickSize;
    +
    +    /**
    +     * Informs the drag and drop util that the offsets should remain when
    +     * resetting the constraints.  This preserves the slider value when
    +     * the constraints are reset
    +     * @property maintainOffset
    +     * @type boolean
    +     * @private
    +     */
    +    this.maintainOffset = true;
    +
    +    this.initSlider(iLeft, iRight, iUp, iDown, iTickSize);
    +
    +    /**
    +     * Turns off the autoscroll feature in drag and drop
    +     * @property scroll
    +     * @private
    +     */
    +    this.scroll = false;
    +
    +}; 
    +
    +YAHOO.extend(YAHOO.widget.SliderThumb, YAHOO.util.DD, {
    +
    +    /**
    +     * The (X and Y) difference between the thumb location and its parent 
    +     * (the slider background) when the control is instantiated.
    +     * @property startOffset
    +     * @type [int, int]
    +     */
    +    startOffset: null,
    +
    +    /**
    +     * Flag used to figure out if this is a horizontal or vertical slider
    +     * @property _isHoriz
    +     * @type boolean
    +     * @private
    +     */
    +    _isHoriz: false,
    +
    +    /**
    +     * Cache the last value so we can check for change
    +     * @property _prevVal
    +     * @type int
    +     * @private
    +     */
    +    _prevVal: 0,
    +
    +    /**
    +     * The slider is _graduated if there is a tick interval defined
    +     * @property _graduated
    +     * @type boolean
    +     * @private
    +     */
    +    _graduated: false,
    +
    +    /**
    +     * Returns the difference between the location of the thumb and its parent.
    +     * @method getOffsetFromParent
    +     * @param {[int, int]} parentPos Optionally accepts the position of the parent
    +     * @type [int, int]
    +     */
    +    getOffsetFromParent: function(parentPos) {
    +        var myPos = YAHOO.util.Dom.getXY(this.getEl());
    +        var ppos  = parentPos || YAHOO.util.Dom.getXY(this.parentElId);
    +
    +        return [ (myPos[0] - ppos[0]), (myPos[1] - ppos[1]) ];
    +    },
    +
    +    /**
    +     * Set up the slider, must be called in the constructor of all subclasses
    +     * @method initSlider
    +     * @param {int} iLeft the number of pixels the element can move left
    +     * @param {int} iRight the number of pixels the element can move right
    +     * @param {int} iUp the number of pixels the element can move up
    +     * @param {int} iDown the number of pixels the element can move down
    +     * @param {int} iTickSize the width of the tick interval.
    +     */
    +    initSlider: function (iLeft, iRight, iUp, iDown, iTickSize) {
    +
    +        this.setXConstraint(iLeft, iRight, iTickSize);
    +        this.setYConstraint(iUp, iDown, iTickSize);
    +
    +        if (iTickSize && iTickSize > 1) {
    +            this._graduated = true;
    +        }
    +
    +        this._isHoriz  = (iLeft || iRight); 
    +        this._isVert   = (iUp   || iDown);
    +        this._isRegion = (this._isHoriz && this._isVert); 
    +
    +    },
    +
    +    /**
    +     * Clear's the slider's ticks
    +     * @method clearTicks
    +     */
    +    clearTicks: function () {
    +        YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);
    +        this._graduated = false;
    +    },
    +
    +    /**
    +     * Gets the current offset from the element's start position in
    +     * pixels.
    +     * @method getValue
    +     * @return {int} the number of pixels (positive or negative) the
    +     * slider has moved from the start position.
    +     */
    +    getValue: function () {
    +        if (!this.available) { return 0; }
    +        var val = (this._isHoriz) ? this.getXValue() : this.getYValue();
    +        return val;
    +    },
    +
    +    /**
    +     * Gets the current X offset from the element's start position in
    +     * pixels.
    +     * @method getXValue
    +     * @return {int} the number of pixels (positive or negative) the
    +     * slider has moved horizontally from the start position.
    +     */
    +    getXValue: function () {
    +        if (!this.available) { return 0; }
    +        var newOffset = this.getOffsetFromParent();
    +        return (newOffset[0] - this.startOffset[0]);
    +    },
    +
    +    /**
    +     * Gets the current Y offset from the element's start position in
    +     * pixels.
    +     * @method getYValue
    +     * @return {int} the number of pixels (positive or negative) the
    +     * slider has moved vertically from the start position.
    +     */
    +    getYValue: function () {
    +        if (!this.available) { return 0; }
    +        var newOffset = this.getOffsetFromParent();
    +        return (newOffset[1] - this.startOffset[1]);
    +    },
    +
    +    /**
    +     * Thumb toString
    +     * @method toString
    +     * @return {string} string representation of the instance
    +     */
    +    toString: function () { 
    +        return "SliderThumb " + this.id;
    +    },
    +
    +    /**
    +     * The onchange event for the handle/thumb is delegated to the YAHOO.widget.Slider
    +     * instance it belongs to.
    +     * @method onChange
    +     * @private
    +     */
    +    onChange: function (x, y) { 
    +    }
    +
    +});
    +
    +if ("undefined" == typeof YAHOO.util.Anim) {
    +    YAHOO.widget.Slider.ANIM_AVAIL = false;
    +}
    +
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/tabview.js.html b/www/extras/yui-ext/docs/output/tabview.js.html new file mode 100644 index 000000000..cd76b69dc --- /dev/null +++ b/www/extras/yui-ext/docs/output/tabview.js.html @@ -0,0 +1,1951 @@ +tabview.js
    /*
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +(function() {
    +
    +    YAHOO.util.Lang = {
    +        isArray: function(val) { // frames lose type, so test constructor string
    +            if (val.constructor && val.constructor.toString().indexOf('Array') > -1) {
    +                return true;
    +            } else {
    +                return YAHOO.util.Lang.isObject(val) && val.constructor == Array;
    +            }
    +        },
    +
    +        isBoolean: function(val) {
    +            return typeof val == 'boolean';
    +        },
    +
    +        isFunction: function(val) {
    +            return typeof val == 'function';
    +        },
    +
    +        isNull: function(val) {
    +            return val === null;
    +        },
    +
    +        isNumber: function(val) {
    +            return !isNaN(val);
    +        },
    +
    +        isObject: function(val) {
    +            return typeof val == 'object' || YAHOO.util.Lang.isFunction(val);
    +        },
    +
    +        isString: function(val) {
    +            return typeof val == 'string';
    +        },
    +
    +        isUndefined: function(val) {
    +            return typeof val == 'undefined';
    +        }
    +    };
    +})();/**
    + * Provides Attribute configurations.
    + * @namespace YAHOO.util
    + * @class Attribute
    + * @constructor
    + * @param hash {Object} The intial Attribute.
    + * @param {YAHOO.util.AttributeProvider} The owner of the Attribute instance.
    + */
    +
    +YAHOO.util.Attribute = function(hash, owner) {
    +    if (owner) {
    +        this.owner = owner;
    +        this.configure(hash, true);
    +    }
    +};
    +
    +YAHOO.util.Attribute.prototype = {
    +	/**
    +     * The name of the attribute.
    +	 * @property name
    +	 * @type String
    +	 */
    +    name: undefined,
    +
    +	/**
    +     * The value of the attribute.
    +	 * @property value
    +	 * @type String
    +	 */
    +    value: null,
    +
    +	/**
    +     * The owner of the attribute.
    +	 * @property owner
    +	 * @type YAHOO.util.AttributeProvider
    +	 */
    +    owner: null,
    +
    +	/**
    +     * Whether or not the attribute is read only.
    +	 * @property readOnly
    +	 * @type Boolean
    +	 */
    +    readOnly: false,
    +
    +	/**
    +     * Whether or not the attribute can only be written once.
    +	 * @property writeOnce
    +	 * @type Boolean
    +	 */
    +    writeOnce: false,
    +
    +	/**
    +     * The attribute's initial configuration.
    +     * @private
    +	 * @property _initialConfig
    +	 * @type Object
    +	 */
    +    _initialConfig: null,
    +
    +	/**
    +     * Whether or not the attribute's value has been set.
    +     * @private
    +	 * @property _written
    +	 * @type Boolean
    +	 */
    +    _written: false,
    +
    +	/**
    +     * The method to use when setting the attribute's value.
    +     * The method recieves the new value as the only argument.
    +	 * @property method
    +	 * @type Function
    +	 */
    +    method: null,
    +
    +	/**
    +     * The validator to use when setting the attribute's value.
    +	 * @property validator
    +	 * @type Function
    +     * @return Boolean
    +	 */
    +    validator: null,
    +
    +    /**
    +     * Retrieves the current value of the attribute.
    +     * @method getValue
    +     * @return {any} The current value of the attribute.
    +     */
    +    getValue: function() {
    +        return this.value;
    +    },
    +
    +    /**
    +     * Sets the value of the attribute and fires beforeChange and change events.
    +     * @method setValue
    +     * @param {Any} value The value to apply to the attribute.
    +     * @param {Boolean} silent If true the change events will not be fired.
    +     * @return {Boolean} Whether or not the value was set.
    +     */
    +    setValue: function(value, silent) {
    +        var beforeRetVal;
    +        var owner = this.owner;
    +        var name = this.name;
    +
    +        var event = {
    +            type: name,
    +            prevValue: this.getValue(),
    +            newValue: value
    +        };
    +
    +        if (this.readOnly || ( this.writeOnce && this._written) ) {
    +            return false; // write not allowed
    +        }
    +
    +        if (this.validator && !this.validator.call(owner, value) ) {
    +            return false; // invalid value
    +        }
    +
    +        if (!silent) {
    +            beforeRetVal = owner.fireBeforeChangeEvent(event);
    +            if (beforeRetVal === false) {
    +                YAHOO.log('setValue ' + name +
    +                        'cancelled by beforeChange event', 'info', 'Attribute');
    +                return false;
    +            }
    +        }
    +
    +        if (this.method) {
    +            this.method.call(owner, value);
    +        }
    +
    +        this.value = value;
    +        this._written = true;
    +
    +        event.type = name;
    +
    +        if (!silent) {
    +            this.owner.fireChangeEvent(event);
    +        }
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Allows for configuring the Attribute's properties.
    +     * @method configure
    +     * @param {Object} map A key-value map of Attribute properties.
    +     * @param {Boolean} init Whether or not this should become the initial config.
    +     */
    +    configure: function(map, init) {
    +        map = map || {};
    +        this._written = false; // reset writeOnce
    +        this._initialConfig = this._initialConfig || {};
    +
    +        for (var key in map) {
    +            if ( key && map.hasOwnProperty(key) ) {
    +                this[key] = map[key];
    +                if (init) {
    +                    this._initialConfig[key] = map[key];
    +                }
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Resets the value to the initial config value.
    +     * @method resetValue
    +     * @return {Boolean} Whether or not the value was set.
    +     */
    +    resetValue: function() {
    +        return this.setValue(this._initialConfig.value);
    +    },
    +
    +    /**
    +     * Resets the attribute config to the initial config state.
    +     * @method resetConfig
    +     */
    +    resetConfig: function() {
    +        this.configure(this._initialConfig);
    +    },
    +
    +    /**
    +     * Resets the value to the current value.
    +     * Useful when values may have gotten out of sync with actual properties.
    +     * @method refresh
    +     * @return {Boolean} Whether or not the value was set.
    +     */
    +    refresh: function(silent) {
    +        this.setValue(this.value, silent);
    +    }
    +};(function() {
    +    var Lang = YAHOO.util.Lang;
    +
    +    /*
    +    Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +    Code licensed under the BSD License:
    +    http://developer.yahoo.net/yui/license.txt
    +    */
    +// holder
    +/**
    +     * Provides and manages YAHOO.util.Attribute instances
    +     * @namespace YAHOO.util
    +     * @class AttributeProvider
    +     * @uses YAHOO.util.EventProvider
    +     */
    +    YAHOO.util.AttributeProvider = function() {};
    +
    +    YAHOO.util.AttributeProvider.prototype = {
    +
    +        /**
    +         * A key-value map of Attribute configurations
    +         * @property _configs
    +         * @protected (may be used by subclasses and augmentors)
    +         * @private
    +         * @type {Object}
    +         */
    +        _configs: null,
    +        /**
    +         * Returns the current value of the attribute.
    +         * @method get
    +         * @param {String} key The attribute whose value will be returned.
    +         */
    +        get: function(key){
    +            var configs = this._configs || {};
    +            var config = configs[key];
    +
    +            if (!config) {
    +                YAHOO.log(key + ' not found', 'error', 'AttributeProvider');
    +                return undefined;
    +            }
    +
    +            return config.value;
    +        },
    +
    +        /**
    +         * Sets the value of a config.
    +         * @method set
    +         * @param {String} key The name of the attribute
    +         * @param {Any} value The value to apply to the attribute
    +         * @param {Boolean} silent Whether or not to suppress change events
    +         * @return {Boolean} Whether or not the value was set.
    +         */
    +        set: function(key, value, silent){
    +            var configs = this._configs || {};
    +            var config = configs[key];
    +
    +            if (!config) {
    +                YAHOO.log('set failed: ' + key + ' not found',
    +                        'error', 'AttributeProvider');
    +                return false;
    +            }
    +
    +            return config.setValue(value, silent);
    +        },
    +
    +        /**
    +         * Returns an array of attribute names.
    +         * @method getAttributeKeys
    +         * @return {Array} An array of attribute names.
    +         */
    +        getAttributeKeys: function(){
    +            var configs = this._configs;
    +            var keys = [];
    +            var config;
    +            for (var key in configs) {
    +                config = configs[key];
    +                if ( configs.hasOwnProperty(key) &&
    +                        !Lang.isUndefined(config) ) {
    +                    keys[keys.length] = key;
    +                }
    +            }
    +
    +            return keys;
    +        },
    +
    +        /**
    +         * Sets multiple attribute values.
    +         * @method setAttributes
    +         * @param {Object} map  A key-value map of attributes
    +         * @param {Boolean} silent Whether or not to suppress change events
    +         */
    +        setAttributes: function(map, silent){
    +            for (var key in map) {
    +                if ( map.hasOwnProperty(key) ) {
    +                    this.set(key, map[key], silent);
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Resets the specified attribute's value to its initial value.
    +         * @method resetValue
    +         * @param {String} key The name of the attribute
    +         * @param {Boolean} silent Whether or not to suppress change events
    +         * @return {Boolean} Whether or not the value was set
    +         */
    +        resetValue: function(key, silent){
    +            var configs = this._configs || {};
    +            if (configs[key]) {
    +                this.set(key, configs[key]._initialConfig.value, silent);
    +                return true;
    +            }
    +            return false;
    +        },
    +
    +        /**
    +         * Sets the attribute's value to its current value.
    +         * @method refresh
    +         * @param {String | Array} key The attribute(s) to refresh
    +         * @param {Boolean} silent Whether or not to suppress change events
    +         */
    +        refresh: function(key, silent){
    +            var configs = this._configs;
    +
    +            key = ( ( Lang.isString(key) ) ? [key] : key ) ||
    +                    this.getAttributeKeys();
    +
    +            for (var i = 0, len = key.length; i < len; ++i) {
    +                if ( // only set if there is a value and not null
    +                    configs[key[i]] &&
    +                    ! Lang.isUndefined(configs[key[i]].value) &&
    +                    ! Lang.isNull(configs[key[i]].value) ) {
    +                    configs[key[i]].refresh(silent);
    +                }
    +            }
    +        },
    +
    +        /**
    +         * Adds an Attribute to the AttributeProvider instance.
    +         * @method register
    +         * @param {String} key The attribute's name
    +         * @param {Object} map A key-value map containing the
    +         * attribute's properties.
    +         */
    +        register: function(key, map) {
    +            this._configs = this._configs || {};
    +
    +            if (this._configs[key]) { // dont override
    +                return false;
    +            }
    +
    +            map.name = key;
    +            this._configs[key] = new YAHOO.util.Attribute(map, this);
    +            return true;
    +        },
    +
    +        /**
    +         * Returns the attribute's properties.
    +         * @method getAttributeConfig
    +         * @param {String} key The attribute's name
    +         * @private
    +         * @return {object} A key-value map containing all of the
    +         * attribute's properties.
    +         */
    +        getAttributeConfig: function(key) {
    +            var configs = this._configs || {};
    +            var config = configs[key] || {};
    +            var map = {}; // returning a copy to prevent overrides
    +
    +            for (key in config) {
    +                if ( config.hasOwnProperty(key) ) {
    +                    map[key] = config[key];
    +                }
    +            }
    +
    +            return map;
    +        },
    +
    +        /**
    +         * Sets or updates an Attribute instance's properties.
    +         * @method configureAttribute
    +         * @param {String} key The attribute's name.
    +         * @param {Object} map A key-value map of attribute properties
    +         * @param {Boolean} init Whether or not this should become the intial config.
    +         */
    +        configureAttribute: function(key, map, init) {
    +            var configs = this._configs || {};
    +
    +            if (!configs[key]) {
    +                YAHOO.log('unable to configure, ' + key + ' not found',
    +                        'error', 'AttributeProvider');
    +                return false;
    +            }
    +
    +            configs[key].configure(map, init);
    +        },
    +
    +        /**
    +         * Resets an attribute to its intial configuration.
    +         * @method resetAttributeConfig
    +         * @param {String} key The attribute's name.
    +         * @private
    +         */
    +        resetAttributeConfig: function(key){
    +            var configs = this._configs || {};
    +            configs[key].resetConfig();
    +        },
    +
    +        /**
    +         * Fires the attribute's beforeChange event.
    +         * @method fireBeforeChangeEvent
    +         * @param {String} key The attribute's name.
    +         * @param {Obj} e The event object to pass to handlers.
    +         */
    +        fireBeforeChangeEvent: function(e) {
    +            var type = 'before';
    +            type += e.type.charAt(0).toUpperCase() + e.type.substr(1) + 'Change';
    +            e.type = type;
    +            return this.fireEvent(e.type, e);
    +        },
    +
    +        /**
    +         * Fires the attribute's change event.
    +         * @method fireChangeEvent
    +         * @param {String} key The attribute's name.
    +         * @param {Obj} e The event object to pass to the handlers.
    +         */
    +        fireChangeEvent: function(e) {
    +            e.type += 'Change';
    +            return this.fireEvent(e.type, e);
    +        }
    +    };
    +
    +    YAHOO.augment(YAHOO.util.AttributeProvider, YAHOO.util.EventProvider);
    +})();(function() {
    +// internal shorthand
    +var Dom = YAHOO.util.Dom,
    +    Lang = YAHOO.util.Lang,
    +    EventPublisher = YAHOO.util.EventPublisher,
    +    AttributeProvider = YAHOO.util.AttributeProvider;
    +
    +/**
    + * Element provides an interface to an HTMLElement's attributes and common
    + * methods.  Other commonly used attributes are added as well.
    + * @namespace YAHOO.util
    + * @class Element
    + * @uses YAHOO.util.AttributeProvider
    + * @constructor
    + * @param el {HTMLElement | String} The html element that
    + * represents the Element.
    + * @param {Object} map A key-value map of initial config names and values
    + */
    +YAHOO.util.Element = function(el, map) {
    +    if (arguments.length) {
    +        this.init(el, map);
    +    }
    +};
    +
    +YAHOO.util.Element.prototype = {
    +	/**
    +     * Dom events supported by the Element instance.
    +	 * @property DOM_EVENTS
    +	 * @type Object
    +	 */
    +    DOM_EVENTS: null,
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method appendChild
    +	 * @param {Boolean} deep Whether or not to do a deep clone
    +	 */
    +    appendChild: function(child) {
    +        child = child.get ? child.get('element') : child;
    +        this.get('element').appendChild(child);
    +    },
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method getElementsByTagName
    +	 * @param {String} tag The tagName to collect
    +	 */
    +    getElementsByTagName: function(tag) {
    +        return this.get('element').getElementsByTagName(tag);
    +    },
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method hasChildNodes
    +	 * @return {Boolean} Whether or not the element has childNodes
    +	 */
    +    hasChildNodes: function() {
    +        return this.get('element').hasChildNodes();
    +    },
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method insertBefore
    +	 * @param {HTMLElement} element The HTMLElement to insert
    +	 * @param {HTMLElement} before The HTMLElement to insert
    +     * the element before.
    +	 */
    +    insertBefore: function(element, before) {
    +        element = element.get ? element.get('element') : element;
    +        before = (before && before.get) ? before.get('element') : before;
    +
    +        this.get('element').insertBefore(element, before);
    +    },
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method removeChild
    +	 * @param {HTMLElement} child The HTMLElement to remove
    +	 */
    +    removeChild: function(child) {
    +        child = child.get ? child.get('element') : child;
    +        this.get('element').removeChild(child);
    +        return true;
    +    },
    +
    +	/**
    +     * Wrapper for HTMLElement method.
    +	 * @method replaceChild
    +	 * @param {HTMLElement} newNode The HTMLElement to insert
    +	 * @param {HTMLElement} oldNode The HTMLElement to replace
    +	 */
    +    replaceChild: function(newNode, oldNode) {
    +        newNode = newNode.get ? newNode.get('element') : newNode;
    +        oldNode = oldNode.get ? oldNode.get('element') : oldNode;
    +        return this.get('element').replaceChild(newNode, oldNode);
    +    },
    +
    +
    +    /**
    +     * Registers Element specific attributes.
    +     * @method initAttributes
    +     * @param {Object} map A key-value map of initial attribute configs
    +     */
    +    initAttributes: function(map) {
    +        map = map || {};
    +        var element = Dom.get(map.element) || null;
    +
    +        /**
    +         * The HTMLElement the Element instance refers to.
    +         * @config element
    +         * @type HTMLElement
    +         */
    +        this.register('element', {
    +            value: element,
    +            readOnly: true
    +         });
    +    },
    +
    +    /**
    +     * Adds a listener for the given event.  These may be DOM or
    +     * customEvent listeners.  Any event that is fired via fireEvent
    +     * can be listened for.  All handlers receive an event object.
    +     * @method addListener
    +     * @param {String} type The name of the event to listen for
    +     * @param {Function} fn The handler to call when the event fires
    +     * @param {Any} obj A variable to pass to the handler
    +     * @param {Object} scope The object to use for the scope of the handler
    +     */
    +    addListener: function(type, fn, obj, scope) {
    +        var el = this.get('element');
    +        var scope = scope || this;
    +
    +        el = this.get('id') || el;
    +
    +        if (!this._events[type]) { // create on the fly
    +            if ( this.DOM_EVENTS[type] ) {
    +                YAHOO.util.Event.addListener(el, type, function(e) {
    +                    if (e.srcElement && !e.target) { // supplement IE with target
    +                        e.target = e.srcElement;
    +                    }
    +                    this.fireEvent(type, e);
    +                }, obj, scope);
    +            }
    +
    +            this.createEvent(type, this);
    +            this._events[type] = true;
    +        }
    +
    +        this.subscribe.apply(this, arguments); // notify via customEvent
    +    },
    +
    +
    +    /**
    +     * Alias for addListener
    +     * @method on
    +     * @param {String} type The name of the event to listen for
    +     * @param {Function} fn The function call when the event fires
    +     * @param {Any} obj A variable to pass to the handler
    +     * @param {Object} scope The object to use for the scope of the handler
    +     */
    +    on: function() { this.addListener.apply(this, arguments); },
    +
    +
    +    /**
    +     * Remove an event listener
    +     * @method removeListener
    +     * @param {String} type The name of the event to listen for
    +     * @param {Function} fn The function call when the event fires
    +     */
    +    removeListener: function(type, fn) {
    +        this.unsubscribe.apply(this, arguments);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method addClass
    +	 * @param {String} className The className to add
    +	 */
    +    addClass: function(className) {
    +        Dom.addClass(this.get('element'), className);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method getElementsByClassName
    +	 * @param {String} className The className to collect
    +	 * @param {String} tag (optional) The tag to use in
    +     * conjunction with class name
    +     * @return {Array} Array of HTMLElements
    +	 */
    +    getElementsByClassName: function(className, tag) {
    +        return Dom.getElementsByClassName(className, tag,
    +                this.get('element') );
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method hasClass
    +	 * @param {String} className The className to add
    +     * @return {Boolean} Whether or not the element has the class name
    +	 */
    +    hasClass: function(className) {
    +        return Dom.hasClass(this.get('element'), className);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method removeClass
    +	 * @param {String} className The className to remove
    +	 */
    +    removeClass: function(className) {
    +        return Dom.removeClass(this.get('element'), className);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method replaceClass
    +	 * @param {String} oldClassName The className to replace
    +	 * @param {String} newClassName The className to add
    +	 */
    +    replaceClass: function(oldClassName, newClassName) {
    +        return Dom.replaceClass(this.get('element'),
    +                oldClassName, newClassName);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method setStyle
    +	 * @param {String} property The style property to set
    +	 * @param {String} value The value to apply to the style property
    +	 */
    +    setStyle: function(property, value) {
    +        return Dom.setStyle(this.get('element'),  property, value);
    +    },
    +
    +	/**
    +     * Wrapper for Dom method.
    +	 * @method getStyle
    +	 * @param {String} property The style property to retrieve
    +	 * @return {String} The current value of the property
    +	 */
    +    getStyle: function(property) {
    +        return Dom.getStyle(this.get('element'),  property);
    +    },
    +
    +	/**
    +     * Apply any queued set calls.
    +	 * @method fireQueue
    +	 */
    +    fireQueue: function() {
    +        var queue = this._queue;
    +        for (var i = 0, len = queue.length; i < len; ++i) {
    +            this[queue[i][0]].apply(this, queue[i][1]);
    +        }
    +    },
    +
    +	/**
    +     * Appends the HTMLElement into either the supplied parentNode.
    +	 * @method appendTo
    +	 * @param {HTMLElement | Element} parentNode The node to append to
    +	 * @param {HTMLElement | Element} before An optional node to insert before
    +	 */
    +    appendTo: function(parent, before) {
    +        parent = (parent.get) ?  parent.get('element') : Dom.get(parent);
    +
    +        before = (before && before.get) ?
    +                before.get('element') : Dom.get(before);
    +        var element = this.get('element');
    +
    +        var newAddition =  !Dom.inDocument(element);
    +
    +        if (!element) {
    +            YAHOO.log('appendTo failed: element not available',
    +                    'error', 'Element');
    +            return false;
    +        }
    +
    +        if (!parent) {
    +            YAHOO.log('appendTo failed: parent not available',
    +                    'error', 'Element');
    +            return false;
    +        }
    +
    +        if (element.parent != parent) {
    +            if (before) {
    +                parent.insertBefore(element, before);
    +            } else {
    +                parent.appendChild(element);
    +            }
    +        }
    +
    +        YAHOO.log(element + 'appended to ' + parent);
    +
    +        if (!newAddition) {
    +            return false; // note return; no refresh if in document
    +        }
    +
    +        // if a new addition, refresh HTMLElement any applied attributes
    +        var keys = this.getAttributeKeys();
    +
    +        for (var key in keys) { // only refresh HTMLElement attributes
    +            if ( !Lang.isUndefined(element[key]) ) {
    +                this.refresh(key);
    +            }
    +        }
    +    },
    +
    +    get: function(key) {
    +        var configs = this._configs || {};
    +        var el = configs.element; // avoid loop due to 'element'
    +        if (el && !configs[key] && !Lang.isUndefined(el.value[key]) ) {
    +            return el.value[key];
    +        }
    +
    +        return AttributeProvider.prototype.get.call(this, key);
    +    },
    +
    +    set: function(key, value, silent) {
    +        var el = this.get('element');
    +        if (!el) {
    +            this._queue[key] = ['set', arguments];
    +            return false;
    +        }
    +
    +        // set it on the element if not a property
    +        if ( !this._configs[key] && !Lang.isUndefined(el[key]) ) {
    +            _registerHTMLAttr(this, key);
    +        }
    +
    +        return AttributeProvider.prototype.set.apply(this, arguments);
    +    },
    +
    +    register: function(key) { // protect html attributes
    +        var configs = this._configs || {};
    +        var element = this.get('element') || null;
    +
    +        if ( element && !Lang.isUndefined(element[key]) ) {
    +            YAHOO.log(key + ' is reserved for ' + element,
    +                    'error', 'Element');
    +            return false;
    +        }
    +
    +        return AttributeProvider.prototype.register.apply(this, arguments);
    +    },
    +
    +    configureAttribute: function(property, map, init) { // protect html attributes
    +        if (!this._configs[property] && this._configs.element &&
    +                !Lang.isUndefined(this._configs.element[property]) ) {
    +            _registerHTMLAttr(this, property, map);
    +            return false;
    +        }
    +
    +        return AttributeProvider.prototype.configure.apply(this, arguments);
    +    },
    +
    +    getAttributeKeys: function() {
    +        var el = this.get('element');
    +        var keys = AttributeProvider.prototype.getAttributeKeys.call(this);
    +
    +        //add any unconfigured element keys
    +        for (var key in el) {
    +            if (!this._configs[key]) {
    +                keys[key] = keys[key] || el[key];
    +            }
    +        }
    +
    +        return keys;
    +    },
    +
    +    init: function(el, attr) {
    +        this._queue = this._queue || [];
    +        this._events = this._events || {};
    +        this._configs = this._configs || {};
    +        attr = attr || {};
    +        attr.element = attr.element || el || null;
    +
    +        this.DOM_EVENTS = {
    +            'click': true,
    +            'keydown': true,
    +            'keypress': true,
    +            'keyup': true,
    +            'mousedown': true,
    +            'mousemove': true,
    +            'mouseout': true,
    +            'mouseover': true,
    +            'mouseup': true
    +        };
    +
    +        var readyHandler = function() {
    +            this.initAttributes(attr);
    +
    +            this.setAttributes(attr, true);
    +            this.fireQueue();
    +            this.fireEvent('contentReady', {
    +                type: 'contentReady',
    +                target: attr.element
    +            });
    +        };
    +
    +        if ( Lang.isString(el) ) {
    +            _registerHTMLAttr(this, 'id', { value: el });
    +            YAHOO.util.Event.onAvailable(el, function() {
    +                attr.element = Dom.get(el);
    +                this.fireEvent('available', {
    +                    type: 'available',
    +                    target: attr.element
    +                });
    +            }, this, true);
    +
    +            YAHOO.util.Event.onContentReady(el, function() {
    +                readyHandler.call(this);
    +            }, this, true);
    +        } else {
    +            readyHandler.call(this);
    +        }
    +    }
    +};
    +
    +/**
    + * Sets the value of the property and fires beforeChange and change events.
    + * @private
    + * @method _registerHTMLAttr
    + * @param {YAHOO.util.Element} element The Element instance to
    + * register the config to.
    + * @param {String} key The name of the config to register
    + * @param {Object} map A key-value map of the config's params
    + */
    +var _registerHTMLAttr = function(self, key, map) {
    +    var el = self.get('element');
    +    map = map || {};
    +    map.name = key;
    +    map.method = map.method || function(value) {
    +        el[key] = value;
    +    };
    +    map.value = map.value || el[key];
    +    self._configs[key] = new YAHOO.util.Attribute(map, self);
    +};
    +
    +/**
    + * Fires when the Element's HTMLElement can be retrieved by Id.
    + * <p>See: <a href="#addListener">Element.addListener</a></p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> available<br>
    + * <code>&lt;HTMLElement&gt;
    + * target</code> the HTMLElement bound to this Element instance<br>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var target = e.target};<br>
    + * myTabs.addListener('available', handler);</code></p>
    + * @event available
    + */
    +// holder
    +/**
    + * Fires when the Element's HTMLElement subtree is rendered.
    + * <p>See: <a href="#addListener">Element.addListener</a></p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> contentReady<br>
    + * <code>&lt;HTMLElement&gt;
    + * target</code> the HTMLElement bound to this Element instance<br>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var target = e.target};<br>
    + * myTabs.addListener('contentReady', handler);</code></p>
    + * @event contentReady
    + */
    +
    +YAHOO.augment(YAHOO.util.Element, AttributeProvider);
    +})();(function() {
    +    var Dom = YAHOO.util.Dom,
    +        Event = YAHOO.util.Event,
    +        Lang = YAHOO.util.Lang;
    +
    +    /**
    +     * A representation of a Tab's label and content.
    +     * @namespace YAHOO.widget
    +     * @class Tab
    +     * @extends YAHOO.util.Element
    +     * @constructor
    +     * @param element {HTMLElement | String} (optional) The html element that
    +     * represents the TabView. An element will be created if none provided.
    +     * @param {Object} properties A key map of initial properties
    +     */
    +    Tab = function(el, attr) {
    +        attr = attr || {};
    +        if (arguments.length == 1 && !Lang.isString(el) && !el.nodeName) {
    +            attr = el;
    +            el = attr.element;
    +        }
    +
    +        if (!el && !attr.element) {
    +            el = _createTabElement.call(this, attr);
    +        }
    +
    +        this.loadHandler =  {
    +            success: function(o) {
    +                this.set('content', o.responseText);
    +            },
    +            failure: function(o) {
    +                YAHOO.log('loading failed: ' + o.statusText,
    +                        'error', 'Tab');
    +            }
    +        };
    +
    +        Tab.superclass.constructor.call(this, el, attr);
    +
    +        this.DOM_EVENTS = {}; // delegating to tabView
    +    };
    +
    +    YAHOO.extend(Tab, YAHOO.util.Element);
    +    var proto = Tab.prototype;
    +
    +    /**
    +     * The default tag name for a Tab's inner element.
    +     * @property LABEL_INNER_TAGNAME
    +     * @type String
    +     * @default "em"
    +     */
    +    proto.LABEL_TAGNAME = 'em';
    +
    +    /**
    +     * The class name applied to active tabs.
    +     * @property ACTIVE_CLASSNAME
    +     * @type String
    +     * @default "on"
    +     */
    +    proto.ACTIVE_CLASSNAME = 'selected';
    +
    +    /**
    +     * The class name applied to disabled tabs.
    +     * @property DISABLED_CLASSNAME
    +     * @type String
    +     * @default "disabled"
    +     */
    +    proto.DISABLED_CLASSNAME = 'disabled';
    +
    +    /**
    +     * The class name applied to dynamic tabs while loading.
    +     * @property LOADING_CLASSNAME
    +     * @type String
    +     * @default "disabled"
    +     */
    +    proto.LOADING_CLASSNAME = 'loading';
    +
    +    /**
    +     * Provides a reference to the connection request object when data is
    +     * loaded dynamically.
    +     * @property dataConnection
    +     * @type Object
    +     */
    +    proto.dataConnection = null;
    +
    +    /**
    +     * Object containing success and failure callbacks for loading data.
    +     * @property loadHandler
    +     * @type object
    +     */
    +    proto.loadHandler = null;
    +
    +    /**
    +     * Provides a readable name for the tab.
    +     * @method toString
    +     * @return String
    +     */
    +    proto.toString = function() {
    +        var el = this.get('element');
    +        var id = el.id || el.tagName;
    +        return "Tab " + id;
    +    };
    +
    +    /**
    +     * Registers TabView specific properties.
    +     * @method initAttributes
    +     * @param {Object} attr Hash of initial attributes
    +     */
    +    proto.initAttributes = function(attr) {
    +        attr = attr || {};
    +        Tab.superclass.initAttributes.call(this, attr);
    +
    +        var el = this.get('element');
    +
    +        /**
    +         * The event that triggers the tab's activation.
    +         * @config activationEvent
    +         * @type String
    +         */
    +        this.register('activationEvent', {
    +            value: attr.activationEvent || 'click'
    +        });
    +
    +        /**
    +         * The element that contains the tab's label.
    +         * @config labelEl
    +         * @type HTMLElement
    +         */
    +        this.register('labelEl', {
    +            value: attr.labelEl || _getlabelEl.call(this),
    +            method: function(value) {
    +                var current = this.get('labelEl');
    +
    +                if (current) {
    +                    if (current == value) {
    +                        return false; // already set
    +                    }
    +
    +                    this.replaceChild(value, current);
    +                } else if (el.firstChild) { // ensure label is firstChild by default
    +                    this.insertBefore(value, el.firstChild);
    +                } else {
    +                    this.appendChild(value);
    +                }
    +            }
    +        });
    +
    +        /**
    +         * The tab's label text (or innerHTML).
    +         * @config label
    +         * @type String
    +         */
    +        this.register('label', {
    +            value: attr.label || _getLabel.call(this),
    +            method: function(value) {
    +                var labelEl = this.get('labelEl');
    +                if (!labelEl) { // create if needed
    +                    this.set('labelEl', _createlabelEl.call(this));
    +                }
    +
    +                _setLabel.call(this, value);
    +            }
    +        });
    +
    +        /**
    +         * The HTMLElement that contains the tab's content.
    +         * @config contentEl
    +         * @type HTMLElement
    +         */
    +        this.register('contentEl', { // TODO: apply className?
    +            value: attr.contentEl || document.createElement('div'),
    +            method: function(value) {
    +                var current = this.get('contentEl');
    +
    +                if (current) {
    +                    if (current == value) {
    +                        return false; // already set
    +                    }
    +                    this.replaceChild(value, current);
    +                }
    +            }
    +        });
    +
    +        /**
    +         * The tab's content.
    +         * @config content
    +         * @type String
    +         */
    +        this.register('content', {
    +            value: attr.content, // TODO: what about existing?
    +            method: function(value) {
    +                this.get('contentEl').innerHTML = value;
    +            }
    +        });
    +
    +        var _dataLoaded = false;
    +
    +        /**
    +         * The tab's data source, used for loading content dynamically.
    +         * @config dataSrc
    +         * @type String
    +         */
    +        this.register('dataSrc', {
    +            value: attr.dataSrc
    +        });
    +
    +        /**
    +         * Whether or not content should be reloaded for every view.
    +         * @config cacheData
    +         * @type Boolean
    +         * @default false
    +         */
    +        this.register('cacheData', {
    +            value: attr.cacheData || false,
    +            validator: Lang.isBoolean
    +        });
    +
    +        /**
    +         * The method to use for the data request.
    +         * @config loadMethod
    +         * @type String
    +         * @default "GET"
    +         */
    +        this.register('loadMethod', {
    +            value: attr.loadMethod || 'GET',
    +            validator: Lang.isString
    +        });
    +
    +        /**
    +         * Whether or not any data has been loaded from the server.
    +         * @config dataLoaded
    +         * @type Boolean
    +         */
    +        this.register('dataLoaded', {
    +            value: false,
    +            validator: Lang.isBoolean,
    +            writeOnce: true
    +        });
    +
    +        /**
    +         * Number if milliseconds before aborting and calling failure handler.
    +         * @config dataTimeout
    +         * @type Number
    +         * @default null
    +         */
    +        this.register('dataTimeout', {
    +            value: attr.dataTimeout || null,
    +            validator: Lang.isNumber
    +        });
    +
    +        /**
    +         * Whether or not the tab is currently active.
    +         * If a dataSrc is set for the tab, the content will be loaded from
    +         * the given source.
    +         * @config active
    +         * @type Boolean
    +         */
    +        this.register('active', {
    +            value: attr.active || this.hasClass(this.ACTIVE_CLASSNAME),
    +            method: function(value) {
    +                if (value === true) {
    +                    this.addClass(this.ACTIVE_CLASSNAME);
    +                    this.set('title', 'active');
    +                } else {
    +                    this.removeClass(this.ACTIVE_CLASSNAME);
    +                    this.set('title', '');
    +                }
    +            },
    +            validator: function(value) {
    +                return Lang.isBoolean(value) && !this.get('disabled') ;
    +            }
    +        });
    +
    +        /**
    +         * Whether or not the tab is disabled.
    +         * @config disabled
    +         * @type Boolean
    +         */
    +        this.register('disabled', {
    +            value: attr.disabled || this.hasClass(this.DISABLED_CLASSNAME),
    +            method: function(value) {
    +                if (value === true) {
    +                    Dom.addClass(this.get('element'), this.DISABLED_CLASSNAME);
    +                } else {
    +                    Dom.removeClass(this.get('element'), this.DISABLED_CLASSNAME);
    +                }
    +            },
    +            validator: Lang.isBoolean
    +        });
    +
    +        /**
    +         * The href of the tab's anchor element.
    +         * @config href
    +         * @type String
    +         * @default '#'
    +         */
    +        this.register('href', {
    +            value: attr.href || '#',
    +            method: function(value) {
    +                this.getElementsByTagName('a')[0].href = value;
    +            },
    +            validator: Lang.isString
    +        });
    +
    +        /**
    +         * The Whether or not the tab's content is visible.
    +         * @config contentVisible
    +         * @type Boolean
    +         * @default false
    +         */
    +        this.register('contentVisible', {
    +            value: attr.contentVisible,
    +            method: function(value) {
    +                if (value == true) {
    +                    this.get('contentEl').style.display = 'block';
    +
    +                    if ( this.get('dataSrc') ) {
    +                     // load dynamic content unless already loaded and caching
    +                        if ( !this.get('dataLoaded') || !this.get('cacheData') ) {
    +                            _dataConnect.call(this);
    +                        }
    +                    }
    +                } else {
    +                    this.get('contentEl').style.display = 'none';
    +                }
    +            },
    +            validator: Lang.isBoolean
    +        });
    +    };
    +
    +    var _createTabElement = function(attr) {
    +        var el = document.createElement('li');
    +        var a = document.createElement('a');
    +
    +        a.href = attr.href || '#';
    +
    +        el.appendChild(a);
    +
    +        var label = attr.label || null;
    +        var labelEl = attr.labelEl || null;
    +
    +        if (labelEl) { // user supplied labelEl
    +            if (!label) { // user supplied label
    +                label = _getLabel.call(this, labelEl);
    +            }
    +        } else {
    +            labelEl = _createlabelEl.call(this);
    +        }
    +
    +        a.appendChild(labelEl);
    +
    +        return el;
    +    };
    +
    +    var _getlabelEl = function() {
    +        return this.getElementsByTagName(this.LABEL_TAGNAME)[0];
    +    };
    +
    +    var _createlabelEl = function() {
    +        var el = document.createElement(this.LABEL_TAGNAME);
    +        return el;
    +    };
    +
    +    var _setLabel = function(label) {
    +        var el = this.get('labelEl');
    +        el.innerHTML = label;
    +    };
    +
    +    var _getLabel = function() {
    +        var label,
    +            el = this.get('labelEl');
    +
    +            if (!el) {
    +                return undefined;
    +            }
    +
    +        return el.innerHTML;
    +    };
    +
    +    var _dataConnect = function() {
    +        if (!YAHOO.util.Connect) {
    +            YAHOO.log('YAHOO.util.Connect dependency not met',
    +                    'error', 'Tab');
    +            return false;
    +        }
    +
    +        Dom.addClass(this.get('contentEl').parentNode, this.LOADING_CLASSNAME);
    +
    +        this.dataConnection = YAHOO.util.Connect.asyncRequest(
    +            this.get('loadMethod'),
    +            this.get('dataSrc'),
    +            {
    +                success: function(o) {
    +                    this.loadHandler.success.call(this, o);
    +                    this.set('dataLoaded', true);
    +                    this.dataConnection = null;
    +                    Dom.removeClass(this.get('contentEl').parentNode,
    +                            this.LOADING_CLASSNAME);
    +                },
    +                failure: function(o) {
    +                    this.loadHandler.failure.call(this, o);
    +                    this.dataConnection = null;
    +                    Dom.removeClass(this.get('contentEl').parentNode,
    +                            this.LOADING_CLASSNAME);
    +                },
    +                scope: this,
    +                timeout: this.get('dataTimeout')
    +            }
    +        );
    +    };
    +
    +    YAHOO.widget.Tab = Tab;
    +
    +    /**
    +     * Fires before the active state is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p>If handler returns false, the change will be cancelled, and the value will not
    +     * be set.</p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> beforeActiveChange<br>
    +     * <code>&lt;Boolean&gt;
    +     * prevValue</code> the current value<br>
    +     * <code>&lt;Boolean&gt;
    +     * newValue</code> the new value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('beforeActiveChange', handler);</code></p>
    +     * @event beforeActiveChange
    +     */
    +// holder
    +/**
    +     * Fires after the active state is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> activeChange<br>
    +     * <code>&lt;Boolean&gt;
    +     * prevValue</code> the previous value<br>
    +     * <code>&lt;Boolean&gt;
    +     * newValue</code> the updated value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('activeChange', handler);</code></p>
    +     * @event activeChange
    +     */
    +// holder
    +/**
    +     * Fires before the tab label is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p>If handler returns false, the change will be cancelled, and the value will not
    +     * be set.</p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> beforeLabelChange<br>
    +     * <code>&lt;String&gt;
    +     * prevValue</code> the current value<br>
    +     * <code>&lt;String&gt;
    +     * newValue</code> the new value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('beforeLabelChange', handler);</code></p>
    +     * @event beforeLabelChange
    +     */
    +// holder
    +/**
    +     * Fires after the tab label is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> labelChange<br>
    +     * <code>&lt;String&gt;
    +     * prevValue</code> the previous value<br>
    +     * <code>&lt;String&gt;
    +     * newValue</code> the updated value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('labelChange', handler);</code></p>
    +     * @event labelChange
    +     */
    +// holder
    +/**
    +     * Fires before the tab content is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p>If handler returns false, the change will be cancelled, and the value will not
    +     * be set.</p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> beforeContentChange<br>
    +     * <code>&lt;String&gt;
    +     * prevValue</code> the current value<br>
    +     * <code>&lt;String&gt;
    +     * newValue</code> the new value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('beforeContentChange', handler);</code></p>
    +     * @event beforeContentChange
    +     */
    +// holder
    +/**
    +     * Fires after the tab content is changed.
    +     * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    +     * <p><strong>Event fields:</strong><br>
    +     * <code>&lt;String&gt; type</code> contentChange<br>
    +     * <code>&lt;String&gt;
    +     * prevValue</code> the previous value<br>
    +     * <code>&lt;Boolean&gt;
    +     * newValue</code> the updated value</p>
    +     * <p><strong>Usage:</strong><br>
    +     * <code>var handler = function(e) {var previous = e.prevValue};<br>
    +     * myTabs.addListener('contentChange', handler);</code></p>
    +     * @event contentChange
    +     */
    +})();(function() {
    +
    +    /**
    +     * The tabview module provides a widget for managing content bound to tabs.
    +     * @module tabview
    +     *
    +     */
    +// holder
    +/**
    +     * A widget to control tabbed views.
    +     * @namespace YAHOO.widget
    +     * @class TabView
    +     * @extends YAHOO.util.Element
    +     * @constructor
    +     * @param {HTMLElement | String | Object} el(optional) The html
    +     * element that represents the TabView, or the attribute object to use.
    +     * An element will be created if none provided.
    +     * @param {Object} attr (optional) A key map of the tabView's
    +     * initial attributes.  Ignored if first arg is attributes object.
    +     */
    +    YAHOO.widget.TabView = function(el, attr) {
    +        attr = attr || {};
    +        if (arguments.length == 1 && !Lang.isString(el) && !el.nodeName) {
    +            attr = el; // treat first arg as attr object
    +            el = attr.element || null;
    +        }
    +
    +        if (!el && !attr.element) { // create if we dont have one
    +            el = _createTabViewElement.call(this, attr);
    +        }
    +    	YAHOO.widget.TabView.superclass.constructor.call(this, el, attr);
    +    };
    +
    +    YAHOO.extend(YAHOO.widget.TabView, YAHOO.util.Element);
    +
    +    var proto = YAHOO.widget.TabView.prototype;
    +    var Dom = YAHOO.util.Dom;
    +    var Lang = YAHOO.util.Lang;
    +    var Event = YAHOO.util.Event;
    +    var Tab = YAHOO.widget.Tab;
    +
    +
    +    /**
    +     * The className to add when building from scratch.
    +     * @property CLASSNAME
    +     * @default "navset"
    +     */
    +    proto.CLASSNAME = 'yui-navset';
    +
    +    /**
    +     * The className of the HTMLElement containing the TabView's tab elements
    +     * to look for when building from existing markup, or to add when building
    +     * from scratch.
    +     * All childNodes of the tab container are treated as Tabs when building
    +     * from existing markup.
    +     * @property TAB_PARENT_CLASSNAME
    +     * @default "nav"
    +     */
    +    proto.TAB_PARENT_CLASSNAME = 'yui-nav';
    +
    +    /**
    +     * The className of the HTMLElement containing the TabView's label elements
    +     * to look for when building from existing markup, or to add when building
    +     * from scratch.
    +     * All childNodes of the content container are treated as content elements when
    +     * building from existing markup.
    +     * @property CONTENT_PARENT_CLASSNAME
    +     * @default "nav-content"
    +     */
    +    proto.CONTENT_PARENT_CLASSNAME = 'yui-content';
    +
    +    proto._tabParent = null;
    +    proto._contentParent = null;
    +
    +    /**
    +     * Adds a Tab to the TabView instance.
    +     * If no index is specified, the tab is added to the end of the tab list.
    +     * @method addTab
    +     * @param {YAHOO.widget.Tab} tab A Tab instance to add.
    +     * @param {Integer} index The position to add the tab.
    +     * @return void
    +     */
    +    proto.addTab = function(tab, index) {
    +        var tabs = this.get('tabs');
    +        if (!tabs) { // not ready yet
    +            this._queue[this._queue.length] = ['addTab', arguments];
    +            return false;
    +        }
    +
    +        index = (index === undefined) ? tabs.length : index;
    +
    +        var before = this.getTab(index);
    +
    +        var self = this;
    +        var el = this.get('element');
    +        var tabParent = this._tabParent;
    +        var contentParent = this._contentParent;
    +
    +        var tabElement = tab.get('element');
    +        var contentEl = tab.get('contentEl');
    +
    +        if ( before ) {
    +            tabParent.insertBefore(tabElement, before.get('element'));
    +        } else {
    +            tabParent.appendChild(tabElement);
    +        }
    +
    +        if ( contentEl && !Dom.isAncestor(contentParent, contentEl) ) {
    +            contentParent.appendChild(contentEl);
    +        }
    +
    +        if ( !tab.get('active') ) {
    +            tab.set('contentVisible', false, true); /* hide if not active */
    +        } else {
    +            this.set('activeTab', tab, true);
    +
    +        }
    +
    +        var activate = function(e) {
    +            YAHOO.util.Event.preventDefault(e);
    +            self.set('activeTab', this);
    +        };
    +
    +        tab.addListener( tab.get('activationEvent'), activate);
    +
    +        tab.addListener('activationEventChange', function(e) {
    +            if (e.prevValue != e.newValue) {
    +                tab.removeListener(e.prevValue, activate);
    +                tab.addListener(e.newValue, activate);
    +            }
    +        });
    +
    +        tabs.splice(index, 0, tab);
    +    };
    +
    +    /**
    +     * Routes childNode events.
    +     * @method DOMEventHandler
    +     * @param {event} e The Dom event that is being handled.
    +     * @return void
    +     */
    +    proto.DOMEventHandler = function(e) {
    +        var el = this.get('element');
    +        var target = YAHOO.util.Event.getTarget(e);
    +        var tabParent = this._tabParent;
    +
    +        if (Dom.isAncestor(tabParent, target) ) {
    +            var tabEl;
    +            var tab = null;
    +            var contentEl;
    +            var tabs = this.get('tabs');
    +
    +            for (var i = 0, len = tabs.length; i < len; i++) {
    +                tabEl = tabs[i].get('element');
    +                contentEl = tabs[i].get('contentEl');
    +
    +                if ( target == tabEl || Dom.isAncestor(tabEl, target) ) {
    +                    tab = tabs[i];
    +                    break; // note break
    +                }
    +            }
    +
    +            if (tab) {
    +                tab.fireEvent(e.type, e);
    +            }
    +        }
    +    };
    +
    +    /**
    +     * Returns the Tab instance at the specified index.
    +     * @method getTab
    +     * @param {Integer} index The position of the Tab.
    +     * @return YAHOO.widget.Tab
    +     */
    +    proto.getTab = function(index) {
    +    	return this.get('tabs')[index];
    +    };
    +
    +    /**
    +     * Returns the index of given tab.
    +     * @method getTabIndex
    +     * @param {YAHOO.widget.Tab} tab The tab whose index will be returned.
    +     * @return int
    +     */
    +    proto.getTabIndex = function(tab) {
    +        var index = null;
    +        var tabs = this.get('tabs');
    +    	for (var i = 0, len = tabs.length; i < len; ++i) {
    +            if (tab == tabs[i]) {
    +                index = i;
    +                break;
    +            }
    +        }
    +
    +        return index;
    +    };
    +
    +    /**
    +     * Removes the specified Tab from the TabView.
    +     * @method removeTab
    +     * @param {YAHOO.widget.Tab} item The Tab instance to be removed.
    +     * @return void
    +     */
    +    proto.removeTab = function(tab) {
    +        var tabCount = this.get('tabs').length;
    +
    +        var index = this.getTabIndex(tab);
    +        var nextIndex = index + 1;
    +        if ( tab == this.get('activeTab') ) { // select next tab
    +            if (tabCount > 1) {
    +                if (index + 1 == tabCount) {
    +                    this.set('activeIndex', index - 1);
    +                } else {
    +                    this.set('activeIndex', index + 1);
    +                }
    +            }
    +        }
    +
    +        this._tabParent.removeChild( tab.get('element') );
    +        this._contentParent.removeChild( tab.get('contentEl') );
    +        this._configs.tabs.value.splice(index, 1);
    +
    +    };
    +
    +    /**
    +     * Provides a readable name for the TabView instance.
    +     * @method toString
    +     * @return String
    +     */
    +    proto.toString = function() {
    +        var name = this.get('id') || this.get('tagName');
    +        return "TabView " + name;
    +    };
    +
    +    /**
    +     * The transiton to use when switching between tabs.
    +     * @method contentTransition
    +     */
    +    proto.contentTransition = function(newTab, oldTab) {
    +        newTab.set('contentVisible', true);
    +        oldTab.set('contentVisible', false);
    +    };
    +
    +    /**
    +     * Registers TabView specific properties.
    +     * @method initAttributes
    +     * @param {Object} attr Hash of initial attributes
    +     */
    +    proto.initAttributes = function(attr) {
    +        YAHOO.widget.TabView.superclass.initAttributes.call(this, attr);
    +
    +        if (!attr.orientation) {
    +            attr.orientation = 'top';
    +        }
    +
    +        var el = this.get('element');
    +
    +        /**
    +         * The Tabs belonging to the TabView instance.
    +         * @config tabs
    +         * @type Array
    +         */
    +        this.register('tabs', {
    +            value: [],
    +            readOnly: true
    +        });
    +
    +        /**
    +         * The container of the tabView's label elements.
    +         * @property _tabParent
    +         * @private
    +         * @type HTMLElement
    +         */
    +        this._tabParent =
    +                this.getElementsByClassName(this.TAB_PARENT_CLASSNAME,
    +                        'ul' )[0] || _createTabParent.call(this);
    +
    +        /**
    +         * The container of the tabView's content elements.
    +         * @property _contentParent
    +         * @type HTMLElement
    +         * @private
    +         */
    +        this._contentParent =
    +                this.getElementsByClassName(this.CONTENT_PARENT_CLASSNAME,
    +                        'div')[0] ||  _createContentParent.call(this);
    +
    +        /**
    +         * How the Tabs should be oriented relative to the TabView.
    +         * @config orientation
    +         * @type String
    +         * @default "top"
    +         */
    +        this.register('orientation', {
    +            value: attr.orientation,
    +            method: function(value) {
    +                var current = this.get('orientation');
    +                this.addClass('yui-navset-' + value);
    +
    +                if (current != value) {
    +                    this.removeClass('yui-navset-' + current);
    +                }
    +
    +                switch(value) {
    +                    case 'bottom':
    +                    this.appendChild(this._tabParent);
    +                    break;
    +                }
    +            }
    +        });
    +
    +        /**
    +         * The index of the tab currently active.
    +         * @config activeIndex
    +         * @type Int
    +         */
    +        this.register('activeIndex', {
    +            value: attr.activeIndex,
    +            method: function(value) {
    +                this.set('activeTab', this.getTab(value));
    +            },
    +            validator: function(value) {
    +                return !this.getTab(value).get('disabled'); // cannot activate if disabled
    +            }
    +        });
    +
    +        /**
    +         * The tab currently active.
    +         * @config activeTab
    +         * @type YAHOO.widget.Tab
    +         */
    +        this.register('activeTab', {
    +            value: attr.activeTab,
    +            method: function(tab) {
    +                var activeTab = this.get('activeTab');
    +
    +                if (tab) {
    +                    tab.set('active', true);
    +                }
    +
    +                if (activeTab && activeTab != tab) {
    +                    activeTab.set('active', false);
    +                }
    +
    +                if (activeTab && tab != activeTab) { // no transition if only 1
    +                    this.contentTransition(tab, activeTab);
    +                } else if (tab) {
    +                    tab.set('contentVisible', true);
    +                }
    +            },
    +            validator: function(value) {
    +                return !value.get('disabled'); // cannot activate if disabled
    +            }
    +        });
    +
    +        if ( this._tabParent ) {
    +            _initTabs.call(this);
    +        }
    +
    +        for (var type in this.DOM_EVENTS) {
    +            if ( this.DOM_EVENTS.hasOwnProperty(type) ) {
    +                this.addListener.call(this, type, this.DOMEventHandler);
    +            }
    +        }
    +    };
    +
    +    /**
    +     * Creates Tab instances from a collection of HTMLElements.
    +     * @method createTabs
    +     * @private
    +     * @param {Array|HTMLCollection} elements The elements to use for Tabs.
    +     * @return void
    +     */
    +    var _initTabs = function() {
    +        var tab,
    +            attr,
    +            contentEl;
    +
    +        var el = this.get('element');
    +        var tabs = _getChildNodes(this._tabParent);
    +        var contentElements = _getChildNodes(this._contentParent);
    +
    +        for (var i = 0, len = tabs.length; i < len; ++i) {
    +            attr = {};
    +
    +            if (contentElements[i]) {
    +                attr.contentEl = contentElements[i];
    +            }
    +
    +            tab = new YAHOO.widget.Tab(tabs[i], attr);
    +            this.addTab(tab);
    +
    +            if (tab.hasClass(tab.ACTIVE_CLASSNAME) ) {
    +                this._configs.activeTab.value = tab; // dont invoke method
    +            }
    +        }
    +    };
    +
    +    var _createTabViewElement = function(attr) {
    +        var el = document.createElement('div');
    +
    +        if ( this.CLASSNAME ) {
    +            el.className = this.CLASSNAME;
    +        }
    +
    +        return el;
    +    };
    +
    +    var _createTabParent = function(attr) {
    +        var el = document.createElement('ul');
    +
    +        if ( this.TAB_PARENT_CLASSNAME ) {
    +            el.className = this.TAB_PARENT_CLASSNAME;
    +        }
    +
    +        this.get('element').appendChild(el);
    +
    +        return el;
    +    };
    +
    +    var _createContentParent = function(attr) {
    +        var el = document.createElement('div');
    +
    +        if ( this.CONTENT_PARENT_CLASSNAME ) {
    +            el.className = this.CONTENT_PARENT_CLASSNAME;
    +        }
    +
    +        this.get('element').appendChild(el);
    +
    +        return el;
    +    };
    +
    +    var _getChildNodes = function(el) {
    +        var nodes = [];
    +        var childNodes = el.childNodes;
    +
    +        for (var i = 0, len = childNodes.length; i < len; ++i) {
    +            if (childNodes[i].nodeType == 1) {
    +                nodes[nodes.length] = childNodes[i];
    +            }
    +        }
    +
    +        return nodes;
    +    };
    +
    +/**
    + * Fires before the activeTab is changed.
    + * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    + * <p>If handler returns false, the change will be cancelled, and the value will not
    + * be set.</p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> beforeActiveTabChange<br>
    + * <code>&lt;<a href="YAHOO.widget.Tab.html">YAHOO.widget.Tab</a>&gt;
    + * prevValue</code> the currently active tab<br>
    + * <code>&lt;<a href="YAHOO.widget.Tab.html">YAHOO.widget.Tab</a>&gt;
    + * newValue</code> the tab to be made active</p>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var previous = e.prevValue};<br>
    + * myTabs.addListener('beforeActiveTabChange', handler);</code></p>
    + * @event beforeActiveTabChange
    + */
    +// holder
    +/**
    + * Fires after the activeTab is changed.
    + * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> activeTabChange<br>
    + * <code>&lt;<a href="YAHOO.widget.Tab.html">YAHOO.widget.Tab</a>&gt;
    + * prevValue</code> the formerly active tab<br>
    + * <code>&lt;<a href="YAHOO.widget.Tab.html">YAHOO.widget.Tab</a>&gt;
    + * newValue</code> the new active tab</p>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var previous = e.prevValue};<br>
    + * myTabs.addListener('activeTabChange', handler);</code></p>
    + * @event activeTabChange
    + */
    +// holder
    +/**
    + * Fires before the orientation is changed.
    + * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    + * <p>If handler returns false, the change will be cancelled, and the value will not
    + * be set.</p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> beforeOrientationChange<br>
    + * <code>&lt;String&gt;
    + * prevValue</code> the current orientation<br>
    + * <code>&lt;String&gt;
    + * newValue</code> the new orientation to be applied</p>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var previous = e.prevValue};<br>
    + * myTabs.addListener('beforeOrientationChange', handler);</code></p>
    + * @event beforeOrientationChange
    + */
    +// holder
    +/**
    + * Fires after the orientation is changed.
    + * <p>See: <a href="YAHOO.util.Element.html#addListener">Element.addListener</a></p>
    + * <p><strong>Event fields:</strong><br>
    + * <code>&lt;String&gt; type</code> orientationChange<br>
    + * <code>&lt;String&gt;
    + * prevValue</code> the former orientation<br>
    + * <code>&lt;String&gt;
    + * newValue</code> the new orientation</p>
    + * <p><strong>Usage:</strong><br>
    + * <code>var handler = function(e) {var previous = e.prevValue};<br>
    + * myTabs.addListener('orientationChange', handler);</code></p>
    + * @event orientationChange
    + */
    +})();

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/tree.html b/www/extras/yui-ext/docs/output/tree.html new file mode 100644 index 000000000..e0ab415ad --- /dev/null +++ b/www/extras/yui-ext/docs/output/tree.html @@ -0,0 +1,210 @@ +Documentation Home

    Examples and Demos

    + +
    +Help Forums \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/treeview.js.html b/www/extras/yui-ext/docs/output/treeview.js.html new file mode 100644 index 000000000..5e89af565 --- /dev/null +++ b/www/extras/yui-ext/docs/output/treeview.js.html @@ -0,0 +1,2183 @@ +treeview.js
    /*                                                                                                                                                      
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The treeview widget is a generic tree building tool.
    + * @module treeview
    + * @title TreeView Widget
    + * @requires yahoo
    + * @optional animation
    + * @namespace YAHOO.widget
    + */
    +// holder
    +/**
    + * Contains the tree view state data and the root node.
    + *
    + * @class TreeView
    + * @constructor
    + * @param {string|HTMLElement} id The id of the element, or the element
    + * itself that the tree will be inserted into.
    + */
    +YAHOO.widget.TreeView = function(id) {
    +    if (id) { this.init(id); }
    +};
    +
    +YAHOO.widget.TreeView.prototype = {
    +
    +    /**
    +     * The id of tree container element
    +     * @property id
    +     * @type String
    +     */
    +    id: null,
    +
    +    /**
    +     * The host element for this tree
    +     * @property _el
    +     * @private
    +     */
    +    _el: null,
    +
    +     /**
    +     * Flat collection of all nodes in this tree
    +     * @property _nodes
    +     * @type Node[]
    +     * @private
    +     */
    +    _nodes: null,
    +
    +    /**
    +     * We lock the tree control while waiting for the dynamic loader to return
    +     * @property locked
    +     * @type boolean
    +     */
    +    locked: false,
    +
    +    /**
    +     * The animation to use for expanding children, if any
    +     * @property _expandAnim
    +     * @type string
    +     * @private
    +     */
    +    _expandAnim: null,
    +
    +    /**
    +     * The animation to use for collapsing children, if any
    +     * @property _collapseAnim
    +     * @type string
    +     * @private
    +     */
    +    _collapseAnim: null,
    +
    +    /**
    +     * The current number of animations that are executing
    +     * @property _animCount
    +     * @type int
    +     * @private
    +     */
    +    _animCount: 0,
    +
    +    /**
    +     * The maximum number of animations to run at one time.
    +     * @property maxAnim
    +     * @type int
    +     */
    +    maxAnim: 2,
    +
    +    /**
    +     * Sets up the animation for expanding children
    +     * @method setExpandAnim
    +     * @param {string} type the type of animation (acceptable values defined 
    +     * in YAHOO.widget.TVAnim)
    +     */
    +    setExpandAnim: function(type) {
    +        if (YAHOO.widget.TVAnim.isValid(type)) {
    +            this._expandAnim = type;
    +        }
    +    },
    +
    +    /**
    +     * Sets up the animation for collapsing children
    +     * @method setCollapseAnim
    +     * @param {string} the type of animation (acceptable values defined in 
    +     * YAHOO.widget.TVAnim)
    +     */
    +    setCollapseAnim: function(type) {
    +        if (YAHOO.widget.TVAnim.isValid(type)) {
    +            this._collapseAnim = type;
    +        }
    +    },
    +
    +    /**
    +     * Perform the expand animation if configured, or just show the
    +     * element if not configured or too many animations are in progress
    +     * @method animateExpand
    +     * @param el {HTMLElement} the element to animate
    +     * @param node {YAHOO.util.Node} the node that was expanded
    +     * @return {boolean} true if animation could be invoked, false otherwise
    +     */
    +    animateExpand: function(el, node) {
    +
    +        if (this._expandAnim && this._animCount < this.maxAnim) {
    +            // this.locked = true;
    +            var tree = this;
    +            var a = YAHOO.widget.TVAnim.getAnim(this._expandAnim, el, 
    +                            function() { tree.expandComplete(node); });
    +            if (a) { 
    +                ++this._animCount;
    +                this.fireEvent("animStart", {
    +                        "node": node, 
    +                        "type": "expand"
    +                    });
    +                a.animate();
    +            }
    +
    +            return true;
    +        }
    +
    +        return false;
    +    },
    +
    +    /**
    +     * Perform the collapse animation if configured, or just show the
    +     * element if not configured or too many animations are in progress
    +     * @method animateCollapse
    +     * @param el {HTMLElement} the element to animate
    +     * @param node {YAHOO.util.Node} the node that was expanded
    +     * @return {boolean} true if animation could be invoked, false otherwise
    +     */
    +    animateCollapse: function(el, node) {
    +
    +        if (this._collapseAnim && this._animCount < this.maxAnim) {
    +            // this.locked = true;
    +            var tree = this;
    +            var a = YAHOO.widget.TVAnim.getAnim(this._collapseAnim, el, 
    +                            function() { tree.collapseComplete(node); });
    +            if (a) { 
    +                ++this._animCount;
    +                this.fireEvent("animStart", {
    +                        "node": node, 
    +                        "type": "collapse"
    +                    });
    +                a.animate();
    +            }
    +
    +            return true;
    +        }
    +
    +        return false;
    +    },
    +
    +    /**
    +     * Function executed when the expand animation completes
    +     * @method expandComplete
    +     */
    +    expandComplete: function(node) {
    +        --this._animCount;
    +        this.fireEvent("animComplete", {
    +                "node": node, 
    +                "type": "expand"
    +            });
    +        // this.locked = false;
    +    },
    +
    +    /**
    +     * Function executed when the collapse animation completes
    +     * @method collapseComplete
    +     */
    +    collapseComplete: function(node) {
    +        --this._animCount;
    +        this.fireEvent("animComplete", {
    +                "node": node, 
    +                "type": "collapse"
    +            });
    +        // this.locked = false;
    +    },
    +
    +    /**
    +     * Initializes the tree
    +     * @method init
    +     * @parm {string|HTMLElement} id the id of the element that will hold the tree
    +     * @private
    +     */
    +    init: function(id) {
    +
    +        this.id = id;
    +
    +        if ("string" !== typeof id) {
    +            this._el = id;
    +            this.id = this.generateId(id);
    +        }
    +
    +        /**
    +         * When animation is enabled, this event fires when the animation
    +         * starts
    +         * @event animStart
    +         * @type CustomEvent
    +         * @param {YAHOO.widget.Node} node the node that is expanding/collapsing
    +         * @parm {String} type the type of animation ("expand" or "collapse")
    +         */
    +        this.createEvent("animStart", this);
    +
    +        /**
    +         * When animation is enabled, this event fires when the animation
    +         * completes
    +         * @event animComplete
    +         * @type CustomEvent
    +         * @param {YAHOO.widget.Node} node the node that is expanding/collapsing
    +         * @parm {String} type the type of animation ("expand" or "collapse")
    +         */
    +        this.createEvent("animComplete", this);
    +
    +        /**
    +         * Fires when a node is going to be expanded.  Return false to stop
    +         * the expand.
    +         * @event collapse
    +         * @type CustomEvent
    +         * @param {YAHOO.widget.Node} node the node that is expanding/collapsing
    +         */
    +        this.createEvent("collapse", this);
    +
    +        /**
    +         * Fires when a node is going to be collapsed.  Return false to stop
    +         * the collapse.
    +         * @event expand
    +         * @type CustomEvent
    +         * @param {YAHOO.widget.Node} node the node that is expanding/collapsing
    +         */
    +        this.createEvent("expand", this);
    +
    +        this._nodes = [];
    +
    +        // store a global reference
    +        YAHOO.widget.TreeView.trees[this.id] = this;
    +
    +        // Set up the root node
    +        this.root = new YAHOO.widget.RootNode(this);
    +
    +
    +    },
    +
    +    /**
    +     * Renders the tree boilerplate and visible nodes
    +     * @method draw
    +     */
    +    draw: function() {
    +        var html = this.root.getHtml();
    +        this.getEl().innerHTML = html;
    +        this.firstDraw = false;
    +    },
    +
    +    /**
    +     * Returns the tree's host element
    +     * @method getEl
    +     * @return {HTMLElement} the host element
    +     */
    +    getEl: function() {
    +        if (! this._el) {
    +            this._el = document.getElementById(this.id);
    +        }
    +        return this._el;
    +    },
    +
    +    /**
    +     * Nodes register themselves with the tree instance when they are created.
    +     * @method regNode
    +     * @param node {Node} the node to register
    +     * @private
    +     */
    +    regNode: function(node) {
    +        this._nodes[node.index] = node;
    +    },
    +
    +    /**
    +     * Returns the root node of this tree
    +     * @method getRoot
    +     * @return {Node} the root node
    +     */
    +    getRoot: function() {
    +        return this.root;
    +    },
    +
    +    /**
    +     * Configures this tree to dynamically load all child data
    +     * @method setDynamicLoad
    +     * @param {function} fnDataLoader the function that will be called to get the data
    +     * @param iconMode {int} configures the icon that is displayed when a dynamic
    +     * load node is expanded the first time without children.  By default, the 
    +     * "collapse" icon will be used.  If set to 1, the leaf node icon will be
    +     * displayed.
    +     */
    +    setDynamicLoad: function(fnDataLoader, iconMode) { 
    +        this.root.setDynamicLoad(fnDataLoader, iconMode);
    +    },
    +
    +    /**
    +     * Expands all child nodes.  Note: this conflicts with the "multiExpand"
    +     * node property.  If expand all is called in a tree with nodes that
    +     * do not allow multiple siblings to be displayed, only the last sibling
    +     * will be expanded.
    +     * @method expandAll
    +     */
    +    expandAll: function() { 
    +        if (!this.locked) {
    +            this.root.expandAll(); 
    +        }
    +    },
    +
    +    /**
    +     * Collapses all expanded child nodes in the entire tree.
    +     * @method collapseAll
    +     */
    +    collapseAll: function() { 
    +        if (!this.locked) {
    +            this.root.collapseAll(); 
    +        }
    +    },
    +
    +    /**
    +     * Returns a node in the tree that has the specified index (this index
    +     * is created internally, so this function probably will only be used
    +     * in html generated for a given node.)
    +     * @method getNodeByIndex
    +     * @param {int} nodeIndex the index of the node wanted
    +     * @return {Node} the node with index=nodeIndex, null if no match
    +     */
    +    getNodeByIndex: function(nodeIndex) {
    +        var n = this._nodes[nodeIndex];
    +        return (n) ? n : null;
    +    },
    +
    +    /**
    +     * Returns a node that has a matching property and value in the data
    +     * object that was passed into its constructor.
    +     * @method getNodeByProperty
    +     * @param {object} property the property to search (usually a string)
    +     * @param {object} value the value we want to find (usuall an int or string)
    +     * @return {Node} the matching node, null if no match
    +     */
    +    getNodeByProperty: function(property, value) {
    +        for (var i in this._nodes) {
    +            var n = this._nodes[i];
    +            if (n.data && value == n.data[property]) {
    +                return n;
    +            }
    +        }
    +
    +        return null;
    +    },
    +
    +    /**
    +     * Returns a collection of nodes that have a matching property 
    +     * and value in the data object that was passed into its constructor.  
    +     * @method getNodesByProperty
    +     * @param {object} property the property to search (usually a string)
    +     * @param {object} value the value we want to find (usuall an int or string)
    +     * @return {Array} the matching collection of nodes, null if no match
    +     */
    +    getNodesByProperty: function(property, value) {
    +        var values = [];
    +        for (var i in this._nodes) {
    +            var n = this._nodes[i];
    +            if (n.data && value == n.data[property]) {
    +                values.push(n);
    +            }
    +        }
    +
    +        return (values.length) ? values : null;
    +    },
    +
    +    /**
    +     * Removes the node and its children, and optionally refreshes the 
    +     * branch of the tree that was affected.
    +     * @method removeNode
    +     * @param {Node} The node to remove
    +     * @param {boolean} autoRefresh automatically refreshes branch if true
    +     * @return {boolean} False is there was a problem, true otherwise.
    +     */
    +    removeNode: function(node, autoRefresh) { 
    +
    +        // Don't delete the root node
    +        if (node.isRoot()) {
    +            return false;
    +        }
    +
    +        // Get the branch that we may need to refresh
    +        var p = node.parent;
    +        if (p.parent) {
    +            p = p.parent;
    +        }
    +
    +        // Delete the node and its children
    +        this._deleteNode(node);
    +
    +        // Refresh the parent of the parent
    +        if (autoRefresh && p && p.childrenRendered) {
    +            p.refresh();
    +        }
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Deletes this nodes child collection, recursively.  Also collapses
    +     * the node, and resets the dynamic load flag.  The primary use for
    +     * this method is to purge a node and allow it to fetch its data
    +     * dynamically again.
    +     * @method removeChildren
    +     * @param {Node} node the node to purge
    +     */
    +    removeChildren: function(node) { 
    +        while (node.children.length) {
    +             this._deleteNode(node.children[0]);
    +        }
    +
    +        node.childrenRendered = false;
    +        node.dynamicLoadComplete = false;
    +        if (node.expanded) {
    +            node.collapse();
    +        } else {
    +            node.updateIcon();
    +        }
    +    },
    +
    +    /**
    +     * Deletes the node and recurses children
    +     * @method _deleteNode
    +     * @private
    +     */
    +    _deleteNode: function(node) { 
    +        // Remove all the child nodes first
    +        this.removeChildren(node);
    +
    +        // Remove the node from the tree
    +        this.popNode(node);
    +    },
    +
    +    /**
    +     * Removes the node from the tree, preserving the child collection 
    +     * to make it possible to insert the branch into another part of the 
    +     * tree, or another tree.
    +     * @method popNode
    +     * @param {Node} the node to remove
    +     */
    +    popNode: function(node) { 
    +        var p = node.parent;
    +
    +        // Update the parent's collection of children
    +        var a = [];
    +
    +        for (var i=0, len=p.children.length;i<len;++i) {
    +            if (p.children[i] != node) {
    +                a[a.length] = p.children[i];
    +            }
    +        }
    +
    +        p.children = a;
    +
    +        // reset the childrenRendered flag for the parent
    +        p.childrenRendered = false;
    +
    +         // Update the sibling relationship
    +        if (node.previousSibling) {
    +            node.previousSibling.nextSibling = node.nextSibling;
    +        }
    +
    +        if (node.nextSibling) {
    +            node.nextSibling.previousSibling = node.previousSibling;
    +        }
    +
    +        node.parent = null;
    +        node.previousSibling = null;
    +        node.nextSibling = null;
    +        node.tree = null;
    +
    +        // Update the tree's node collection 
    +        delete this._nodes[node.index];
    +    },
    +
    +    /**
    +     * TreeView instance toString
    +     * @method toString
    +     * @return {string} string representation of the tree
    +     */
    +    toString: function() {
    +        return "TreeView " + this.id;
    +    },
    +
    +    /**
    +     * Generates an unique id for an element if it doesn't yet have one
    +     * @method generateId
    +     * @private
    +     */
    +    generateId: function(el) {
    +        var id = el.id;
    +
    +        if (!id) {
    +            id = "yui-tv-auto-id-" + YAHOO.widget.TreeView.counter;
    +            ++YAHOO.widget.TreeView.counter;
    +        }
    +
    +        return id;
    +    },
    +
    +    /**
    +     * Abstract method that is executed when a node is expanded
    +     * @method onExpand
    +     * @param node {Node} the node that was expanded
    +     * @deprecated use treeobj.subscribe("expand") instead
    +     */
    +    onExpand: function(node) { },
    +
    +    /**
    +     * Abstract method that is executed when a node is collapsed.
    +     * @method onCollapse
    +     * @param node {Node} the node that was collapsed.
    +     * @deprecated use treeobj.subscribe("collapse") instead
    +     */
    +    onCollapse: function(node) { }
    +
    +};
    +
    +YAHOO.augment(YAHOO.widget.TreeView, YAHOO.util.EventProvider);
    +
    +/**
    + * Count of all nodes in all trees
    + * @property YAHOO.widget.TreeView.nodeCount
    + * @type int
    + * @static
    + */
    +YAHOO.widget.TreeView.nodeCount = 0;
    +
    +/**
    + * Global cache of tree instances
    + * @property YAHOO.widget.TreeView.trees
    + * @type Array
    + * @static
    + * @private
    + */
    +YAHOO.widget.TreeView.trees = [];
    +
    +/**
    + * Counter for generating a new unique element id
    + * @property YAHOO.widget.TreeView.counter
    + * @static
    + * @private
    + */
    +YAHOO.widget.TreeView.counter = 0;
    +
    +/**
    + * Global method for getting a tree by its id.  Used in the generated
    + * tree html.
    + * @method YAHOO.widget.TreeView.getTree
    + * @param treeId {String} the id of the tree instance
    + * @return {TreeView} the tree instance requested, null if not found.
    + * @static
    + */
    +YAHOO.widget.TreeView.getTree = function(treeId) {
    +    var t = YAHOO.widget.TreeView.trees[treeId];
    +    return (t) ? t : null;
    +};
    +
    +/**
    + * Global method for getting a node by its id.  Used in the generated
    + * tree html.
    + * @method YAHOO.widget.TreeView.getNode
    + * @param treeId {String} the id of the tree instance
    + * @param nodeIndex {String} the index of the node to return
    + * @return {Node} the node instance requested, null if not found
    + * @static
    + */
    +YAHOO.widget.TreeView.getNode = function(treeId, nodeIndex) {
    +    var t = YAHOO.widget.TreeView.getTree(treeId);
    +    return (t) ? t.getNodeByIndex(nodeIndex) : null;
    +};
    +
    +/**
    + * Add a DOM event
    + * @method YAHOO.widget.TreeView.addHandler
    + * @param el the elment to bind the handler to
    + * @param {string} sType the type of event handler
    + * @param {function} fn the callback to invoke
    + * @static
    + */
    +YAHOO.widget.TreeView.addHandler = function (el, sType, fn) {
    +    if (el.addEventListener) {
    +        el.addEventListener(sType, fn, false);
    +    } else if (el.attachEvent) {
    +        el.attachEvent("on" + sType, fn);
    +    }
    +};
    +
    +/**
    + * Remove a DOM event
    + * @method YAHOO.widget.TreeView.removeHandler
    + * @param el the elment to bind the handler to
    + * @param {string} sType the type of event handler
    + * @param {function} fn the callback to invoke
    + * @static
    + */
    +
    +YAHOO.widget.TreeView.removeHandler = function (el, sType, fn) {
    +    if (el.removeEventListener) {
    +        el.removeEventListener(sType, fn, false);
    +    } else if (el.detachEvent) {
    +        el.detachEvent("on" + sType, fn);
    +    }
    +};
    +
    +/**
    + * Attempts to preload the images defined in the styles used to draw the tree by
    + * rendering off-screen elements that use the styles.
    + * @method YAHOO.widget.TreeView.preload
    + * @param {string} prefix the prefix to use to generate the names of the
    + * images to preload, default is ygtv
    + * @static
    + */
    +YAHOO.widget.TreeView.preload = function(prefix) {
    +    prefix = prefix || "ygtv";
    +    var styles = ["tn","tm","tmh","tp","tph","ln","lm","lmh","lp","lph","loading"];
    +
    +    var sb = [];
    +    
    +    for (var i = 0; i < styles.length; ++i) { 
    +        sb[sb.length] = '<span class="' + prefix + styles[i] + '">&#160;</span>';
    +    }
    +
    +    var f = document.createElement("div");
    +    var s = f.style;
    +    s.position = "absolute";
    +    s.top = "-1000px";
    +    s.left = "-1000px";
    +    f.innerHTML = sb.join("");
    +
    +    document.body.appendChild(f);
    +
    +    YAHOO.widget.TreeView.removeHandler(window, 
    +                "load", YAHOO.widget.TreeView.preload);
    +
    +};
    +
    +YAHOO.widget.TreeView.addHandler(window, 
    +                "load", YAHOO.widget.TreeView.preload);
    +
    +/**
    + * The base class for all tree nodes.  The node's presentation and behavior in
    + * response to mouse events is handled in Node subclasses.
    + * @namespace YAHOO.widget
    + * @class Node
    + * @param oData {object} a string or object containing the data that will
    + * be used to render this node
    + * @param oParent {Node} this node's parent node
    + * @param expanded {boolean} the initial expanded/collapsed state
    + * @constructor
    + */
    +YAHOO.widget.Node = function(oData, oParent, expanded) {
    +    if (oData) { this.init(oData, oParent, expanded); }
    +};
    +
    +YAHOO.widget.Node.prototype = {
    +
    +    /**
    +     * The index for this instance obtained from global counter in YAHOO.widget.TreeView.
    +     * @property index
    +     * @type int
    +     */
    +    index: 0,
    +
    +    /**
    +     * This node's child node collection.
    +     * @property children
    +     * @type Node[] 
    +     */
    +    children: null,
    +
    +    /**
    +     * Tree instance this node is part of
    +     * @property tree
    +     * @type TreeView
    +     */
    +    tree: null,
    +
    +    /**
    +     * The data linked to this node.  This can be any object or primitive
    +     * value, and the data can be used in getNodeHtml().
    +     * @property data
    +     * @type object
    +     */
    +    data: null,
    +
    +    /**
    +     * Parent node
    +     * @property parent
    +     * @type Node
    +     */
    +    parent: null,
    +
    +    /**
    +     * The depth of this node.  We start at -1 for the root node.
    +     * @property depth
    +     * @type int
    +     */
    +    depth: -1,
    +
    +    /**
    +     * The href for the node's label.  If one is not specified, the href will
    +     * be set so that it toggles the node.
    +     * @property href
    +     * @type string
    +     */
    +    href: null,
    +
    +    /**
    +     * The label href target, defaults to current window
    +     * @property target
    +     * @type string
    +     */
    +    target: "_self",
    +
    +    /**
    +     * The node's expanded/collapsed state
    +     * @property expanded
    +     * @type boolean
    +     */
    +    expanded: false,
    +
    +    /**
    +     * Can multiple children be expanded at once?
    +     * @property multiExpand
    +     * @type boolean
    +     */
    +    multiExpand: true,
    +
    +    /**
    +     * Should we render children for a collapsed node?  It is possible that the
    +     * implementer will want to render the hidden data...  @todo verify that we 
    +     * need this, and implement it if we do.
    +     * @property renderHidden
    +     * @type boolean
    +     */
    +    renderHidden: false,
    +
    +    /**
    +     * This flag is set to true when the html is generated for this node's
    +     * children, and set to false when new children are added.
    +     * @property childrenRendered
    +     * @type boolean
    +     */
    +    childrenRendered: false,
    +
    +    /**
    +     * Dynamically loaded nodes only fetch the data the first time they are
    +     * expanded.  This flag is set to true once the data has been fetched.
    +     * @property dynamicLoadComplete
    +     * @type boolean
    +     */
    +    dynamicLoadComplete: false,
    +
    +    /**
    +     * This node's previous sibling
    +     * @property previousSibling
    +     * @type Node
    +     */
    +    previousSibling: null,
    +
    +    /**
    +     * This node's next sibling
    +     * @property nextSibling
    +     * @type Node
    +     */
    +    nextSibling: null,
    +
    +    /**
    +     * We can set the node up to call an external method to get the child
    +     * data dynamically.
    +     * @property _dynLoad
    +     * @type boolean
    +     * @private
    +     */
    +    _dynLoad: false,
    +
    +    /**
    +     * Function to execute when we need to get this node's child data.
    +     * @property dataLoader
    +     * @type function
    +     */
    +    dataLoader: null,
    +
    +    /**
    +     * This is true for dynamically loading nodes while waiting for the
    +     * callback to return.
    +     * @property isLoading
    +     * @type boolean
    +     */
    +    isLoading: false,
    +
    +    /**
    +     * The toggle/branch icon will not show if this is set to false.  This
    +     * could be useful if the implementer wants to have the child contain
    +     * extra info about the parent, rather than an actual node.
    +     * @property hasIcon
    +     * @type boolean
    +     */
    +    hasIcon: true,
    +
    +    /**
    +     * Used to configure what happens when a dynamic load node is expanded
    +     * and we discover that it does not have children.  By default, it is
    +     * treated as if it still could have children (plus/minus icon).  Set
    +     * iconMode to have it display like a leaf node instead.
    +     * @property iconMode
    +     * @type int
    +     */
    +    iconMode: 0,
    +
    +    /**
    +     * The node type
    +     * @property _type
    +     * @private
    +     */
    +    _type: "Node",
    +
    +    /*
    +    spacerPath: "http://us.i1.yimg.com/us.yimg.com/i/space.gif",
    +    expandedText: "Expanded",
    +    collapsedText: "Collapsed",
    +    loadingText: "Loading",
    +    */
    +// holder
    +/**
    +     * Initializes this node, gets some of the properties from the parent
    +     * @method init
    +     * @param oData {object} a string or object containing the data that will
    +     * be used to render this node
    +     * @param oParent {Node} this node's parent node
    +     * @param expanded {boolean} the initial expanded/collapsed state
    +     */
    +    init: function(oData, oParent, expanded) {
    +
    +        this.data       = oData;
    +        this.children   = [];
    +        this.index      = YAHOO.widget.TreeView.nodeCount;
    +        ++YAHOO.widget.TreeView.nodeCount;
    +        this.expanded   = expanded;
    +
    +        /**
    +         * The parentChange event is fired when a parent element is applied
    +         * to the node.  This is useful if you need to apply tree-level
    +         * properties to a tree that need to happen if a node is moved from
    +         * one tre to another.
    +         *
    +         * @event parentChange
    +         * @type CustomEvent
    +         */
    +        this.createEvent("parentChange", this);
    +
    +        // oParent should never be null except when we create the root node.
    +        if (oParent) {
    +            oParent.appendChild(this);
    +        }
    +    },
    +
    +    /**
    +     * Certain properties for the node cannot be set until the parent
    +     * is known. This is called after the node is inserted into a tree.
    +     * the parent is also applied to this node's children in order to
    +     * make it possible to move a branch from one tree to another.
    +     * @method applyParent
    +     * @param {Node} parentNode this node's parent node
    +     * @return {boolean} true if the application was successful
    +     */
    +    applyParent: function(parentNode) {
    +        if (!parentNode) {
    +            return false;
    +        }
    +
    +        this.tree   = parentNode.tree;
    +        this.parent = parentNode;
    +        this.depth  = parentNode.depth + 1;
    +
    +        if (!this.href) {
    +            this.href = "javascript:" + this.getToggleLink();
    +        }
    +
    +        if (! this.multiExpand) {
    +            this.multiExpand = parentNode.multiExpand;
    +        }
    +
    +        this.tree.regNode(this);
    +        parentNode.childrenRendered = false;
    +
    +        // cascade update existing children
    +        for (var i=0, len=this.children.length;i<len;++i) {
    +            this.children[i].applyParent(this);
    +        }
    +
    +        this.fireEvent("parentChange");
    +
    +        return true;
    +    },
    +
    +    /**
    +     * Appends a node to the child collection.
    +     * @method appendChild
    +     * @param childNode {Node} the new node
    +     * @return {Node} the child node
    +     * @private
    +     */
    +    appendChild: function(childNode) {
    +        if (this.hasChildren()) {
    +            var sib = this.children[this.children.length - 1];
    +            sib.nextSibling = childNode;
    +            childNode.previousSibling = sib;
    +        }
    +        this.children[this.children.length] = childNode;
    +        childNode.applyParent(this);
    +
    +        return childNode;
    +    },
    +
    +    /**
    +     * Appends this node to the supplied node's child collection
    +     * @method appendTo
    +     * @param parentNode {Node} the node to append to.
    +     * @return {Node} The appended node
    +     */
    +    appendTo: function(parentNode) {
    +        return parentNode.appendChild(this);
    +    },
    +
    +    /**
    +    * Inserts this node before this supplied node
    +    * @method insertBefore
    +    * @param node {Node} the node to insert this node before
    +    * @return {Node} the inserted node
    +    */
    +    insertBefore: function(node) {
    +        var p = node.parent;
    +        if (p) {
    +
    +            if (this.tree) {
    +                this.tree.popNode(this);
    +            }
    +
    +            var refIndex = node.isChildOf(p);
    +            p.children.splice(refIndex, 0, this);
    +            if (node.previousSibling) {
    +                node.previousSibling.nextSibling = this;
    +            }
    +            this.previousSibling = node.previousSibling;
    +            this.nextSibling = node;
    +            node.previousSibling = this;
    +
    +            this.applyParent(p);
    +        }
    +
    +        return this;
    +    },
    + 
    +    /**
    +    * Inserts this node after the supplied node
    +    * @method insertAfter
    +    * @param node {Node} the node to insert after
    +    * @return {Node} the inserted node
    +    */
    +    insertAfter: function(node) {
    +        var p = node.parent;
    +        if (p) {
    +
    +            if (this.tree) {
    +                this.tree.popNode(this);
    +            }
    +
    +            var refIndex = node.isChildOf(p);
    +
    +            if (!node.nextSibling) {
    +                return this.appendTo(p);
    +            }
    +
    +            p.children.splice(refIndex + 1, 0, this);
    +
    +            node.nextSibling.previousSibling = this;
    +            this.previousSibling = node;
    +            this.nextSibling = node.nextSibling;
    +            node.nextSibling = this;
    +
    +            this.applyParent(p);
    +        }
    +
    +        return this;
    +    },
    +
    +    /**
    +    * Returns true if the Node is a child of supplied Node
    +    * @method isChildOf
    +    * @param parentNode {Node} the Node to check
    +    * @return {boolean} The node index if this Node is a child of 
    +    *                   supplied Node, else -1.
    +    * @private
    +    */
    +    isChildOf: function(parentNode) {
    +        if (parentNode && parentNode.children) {
    +            for (var i=0, len=parentNode.children.length; i<len ; ++i) {
    +                if (parentNode.children[i] === this) {
    +                    return i;
    +                }
    +            }
    +        }
    +
    +        return -1;
    +    },
    +
    +    /**
    +     * Returns a node array of this node's siblings, null if none.
    +     * @method getSiblings
    +     * @return Node[]
    +     */
    +    getSiblings: function() {
    +        return this.parent.children;
    +    },
    +
    +    /**
    +     * Shows this node's children
    +     * @method showChildren
    +     */
    +    showChildren: function() {
    +        if (!this.tree.animateExpand(this.getChildrenEl(), this)) {
    +            if (this.hasChildren()) {
    +                this.getChildrenEl().style.display = "";
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Hides this node's children
    +     * @method hideChildren
    +     */
    +    hideChildren: function() {
    +
    +        if (!this.tree.animateCollapse(this.getChildrenEl(), this)) {
    +            this.getChildrenEl().style.display = "none";
    +        }
    +    },
    +
    +    /**
    +     * Returns the id for this node's container div
    +     * @method getElId
    +     * @return {string} the element id
    +     */
    +    getElId: function() {
    +        return "ygtv" + this.index;
    +    },
    +
    +    /**
    +     * Returns the id for this node's children div
    +     * @method getChildrenElId
    +     * @return {string} the element id for this node's children div
    +     */
    +    getChildrenElId: function() {
    +        return "ygtvc" + this.index;
    +    },
    +
    +    /**
    +     * Returns the id for this node's toggle element
    +     * @method getToggleElId
    +     * @return {string} the toggel element id
    +     */
    +    getToggleElId: function() {
    +        return "ygtvt" + this.index;
    +    },
    +
    +    /*
    +     * Returns the id for this node's spacer image.  The spacer is positioned
    +     * over the toggle and provides feedback for screen readers.
    +     * @method getSpacerId
    +     * @return {string} the id for the spacer image
    +     */
    +    /*
    +    getSpacerId: function() {
    +        return "ygtvspacer" + this.index;
    +    }, 
    +    */
    +// holder
    +/**
    +     * Returns this node's container html element
    +     * @method getEl
    +     * @return {HTMLElement} the container html element
    +     */
    +    getEl: function() {
    +        return document.getElementById(this.getElId());
    +    },
    +
    +    /**
    +     * Returns the div that was generated for this node's children
    +     * @method getChildrenEl
    +     * @return {HTMLElement} this node's children div
    +     */
    +    getChildrenEl: function() {
    +        return document.getElementById(this.getChildrenElId());
    +    },
    +
    +    /**
    +     * Returns the element that is being used for this node's toggle.
    +     * @method getToggleEl
    +     * @return {HTMLElement} this node's toggle html element
    +     */
    +    getToggleEl: function() {
    +        return document.getElementById(this.getToggleElId());
    +    },
    +
    +    /*
    +     * Returns the element that is being used for this node's spacer.
    +     * @method getSpacer
    +     * @return {HTMLElement} this node's spacer html element
    +     */
    +    /*
    +    getSpacer: function() {
    +        return document.getElementById( this.getSpacerId() ) || {};
    +    },
    +    */
    +
    +    /*
    +    getStateText: function() {
    +        if (this.isLoading) {
    +            return this.loadingText;
    +        } else if (this.hasChildren(true)) {
    +            if (this.expanded) {
    +                return this.expandedText;
    +            } else {
    +                return this.collapsedText;
    +            }
    +        } else {
    +            return "";
    +        }
    +    },
    +    */
    +// holder
    +/**
    +     * Generates the link that will invoke this node's toggle method
    +     * @method getToggleLink
    +     * @return {string} the javascript url for toggling this node
    +     */
    +    getToggleLink: function() {
    +        return "YAHOO.widget.TreeView.getNode(\'" + this.tree.id + "\'," + 
    +            this.index + ").toggle()";
    +    },
    +
    +    /**
    +     * Hides this nodes children (creating them if necessary), changes the
    +     * @method collapse
    +     * toggle style.
    +     */
    +    collapse: function() {
    +        // Only collapse if currently expanded
    +        if (!this.expanded) { return; }
    +
    +        // fire the collapse event handler
    +        var ret = this.tree.onCollapse(this);
    +
    +        if (false === ret) {
    +            return;
    +        }
    +
    +        ret = this.tree.fireEvent("collapse", this);
    +
    +        if (false === ret) {
    +            return;
    +        }
    +
    +        if (!this.getEl()) {
    +            this.expanded = false;
    +            return;
    +        }
    +
    +        // hide the child div
    +        this.hideChildren();
    +        this.expanded = false;
    +
    +        this.updateIcon();
    +
    +        // this.getSpacer().title = this.getStateText();
    +
    +    },
    +
    +    /**
    +     * Shows this nodes children (creating them if necessary), changes the
    +     * toggle style, and collapses its siblings if multiExpand is not set.
    +     * @method expand
    +     */
    +    expand: function() {
    +        // Only expand if currently collapsed.
    +        if (this.expanded) { return; }
    +
    +        // fire the expand event handler
    +        var ret = this.tree.onExpand(this);
    +
    +        if (false === ret) {
    +            return;
    +        }
    +        
    +        ret = this.tree.fireEvent("expand", this);
    +
    +        if (false === ret) {
    +            return;
    +        }
    +
    +        if (!this.getEl()) {
    +            this.expanded = true;
    +            return;
    +        }
    +
    +        if (! this.childrenRendered) {
    +            this.getChildrenEl().innerHTML = this.renderChildren();
    +        } else {
    +        }
    +
    +        this.expanded = true;
    +
    +        this.updateIcon();
    +
    +        // this.getSpacer().title = this.getStateText();
    +
    +        // We do an extra check for children here because the lazy
    +        // load feature can expose nodes that have no children.
    +
    +        // if (!this.hasChildren()) {
    +        if (this.isLoading) {
    +            this.expanded = false;
    +            return;
    +        }
    +
    +        if (! this.multiExpand) {
    +            var sibs = this.getSiblings();
    +            for (var i=0; i<sibs.length; ++i) {
    +                if (sibs[i] != this && sibs[i].expanded) { 
    +                    sibs[i].collapse(); 
    +                }
    +            }
    +        }
    +
    +        this.showChildren();
    +    },
    +
    +    updateIcon: function() {
    +        if (this.hasIcon) {
    +            var el = this.getToggleEl();
    +            if (el) {
    +                el.className = this.getStyle();
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Returns the css style name for the toggle
    +     * @method getStyle
    +     * @return {string} the css class for this node's toggle
    +     */
    +    getStyle: function() {
    +        if (this.isLoading) {
    +            return "ygtvloading";
    +        } else {
    +            // location top or bottom, middle nodes also get the top style
    +            var loc = (this.nextSibling) ? "t" : "l";
    +
    +            // type p=plus(expand), m=minus(collapase), n=none(no children)
    +            var type = "n";
    +            if (this.hasChildren(true) || (this.isDynamic() && !this.getIconMode())) {
    +            // if (this.hasChildren(true)) {
    +                type = (this.expanded) ? "m" : "p";
    +            }
    +
    +            return "ygtv" + loc + type;
    +        }
    +    },
    +
    +    /**
    +     * Returns the hover style for the icon
    +     * @return {string} the css class hover state
    +     * @method getHoverStyle
    +     */
    +    getHoverStyle: function() { 
    +        var s = this.getStyle();
    +        if (this.hasChildren(true) && !this.isLoading) { 
    +            s += "h"; 
    +        }
    +        return s;
    +    },
    +
    +    /**
    +     * Recursively expands all of this node's children.
    +     * @method expandAll
    +     */
    +    expandAll: function() { 
    +        for (var i=0;i<this.children.length;++i) {
    +            var c = this.children[i];
    +            if (c.isDynamic()) {
    +                alert("Not supported (lazy load + expand all)");
    +                break;
    +            } else if (! c.multiExpand) {
    +                alert("Not supported (no multi-expand + expand all)");
    +                break;
    +            } else {
    +                c.expand();
    +                c.expandAll();
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Recursively collapses all of this node's children.
    +     * @method collapseAll
    +     */
    +    collapseAll: function() { 
    +        for (var i=0;i<this.children.length;++i) {
    +            this.children[i].collapse();
    +            this.children[i].collapseAll();
    +        }
    +    },
    +
    +    /**
    +     * Configures this node for dynamically obtaining the child data
    +     * when the node is first expanded.  Calling it without the callback
    +     * will turn off dynamic load for the node.
    +     * @method setDynamicLoad
    +     * @param fmDataLoader {function} the function that will be used to get the data.
    +     * @param iconMode {int} configures the icon that is displayed when a dynamic
    +     * load node is expanded the first time without children.  By default, the 
    +     * "collapse" icon will be used.  If set to 1, the leaf node icon will be
    +     * displayed.
    +     */
    +    setDynamicLoad: function(fnDataLoader, iconMode) { 
    +        if (fnDataLoader) {
    +            this.dataLoader = fnDataLoader;
    +            this._dynLoad = true;
    +        } else {
    +            this.dataLoader = null;
    +            this._dynLoad = false;
    +        }
    +
    +        if (iconMode) {
    +            this.iconMode = iconMode;
    +        }
    +    },
    +
    +    /**
    +     * Evaluates if this node is the root node of the tree
    +     * @method isRoot
    +     * @return {boolean} true if this is the root node
    +     */
    +    isRoot: function() { 
    +        return (this == this.tree.root);
    +    },
    +
    +    /**
    +     * Evaluates if this node's children should be loaded dynamically.  Looks for
    +     * the property both in this instance and the root node.  If the tree is
    +     * defined to load all children dynamically, the data callback function is
    +     * defined in the root node
    +     * @method isDynamic
    +     * @return {boolean} true if this node's children are to be loaded dynamically
    +     */
    +    isDynamic: function() { 
    +        var lazy = (!this.isRoot() && (this._dynLoad || this.tree.root._dynLoad));
    +        return lazy;
    +    },
    +
    +    /**
    +     * Returns the current icon mode.  This refers to the way childless dynamic
    +     * load nodes appear.
    +     * @method getIconMode
    +     * @return {int} 0 for collapse style, 1 for leaf node style
    +     */
    +    getIconMode: function() {
    +        return (this.iconMode || this.tree.root.iconMode);
    +    },
    +
    +    /**
    +     * Checks if this node has children.  If this node is lazy-loading and the
    +     * children have not been rendered, we do not know whether or not there
    +     * are actual children.  In most cases, we need to assume that there are
    +     * children (for instance, the toggle needs to show the expandable 
    +     * presentation state).  In other times we want to know if there are rendered
    +     * children.  For the latter, "checkForLazyLoad" should be false.
    +     * @method hasChildren
    +     * @param checkForLazyLoad {boolean} should we check for unloaded children?
    +     * @return {boolean} true if this has children or if it might and we are
    +     * checking for this condition.
    +     */
    +    hasChildren: function(checkForLazyLoad) { 
    +        return ( this.children.length > 0 || 
    +                (checkForLazyLoad && this.isDynamic() && !this.dynamicLoadComplete) );
    +    },
    +
    +    /**
    +     * Expands if node is collapsed, collapses otherwise.
    +     * @method toggle
    +     */
    +    toggle: function() {
    +        if (!this.tree.locked && ( this.hasChildren(true) || this.isDynamic()) ) {
    +            if (this.expanded) { this.collapse(); } else { this.expand(); }
    +        }
    +    },
    +
    +    /**
    +     * Returns the markup for this node and its children.
    +     * @method getHtml
    +     * @return {string} the markup for this node and its expanded children.
    +     */
    +    getHtml: function() {
    +
    +        this.childrenRendered = false;
    +
    +        var sb = [];
    +        sb[sb.length] = '<div class="ygtvitem" id="' + this.getElId() + '">';
    +        sb[sb.length] = this.getNodeHtml();
    +        sb[sb.length] = this.getChildrenHtml();
    +        sb[sb.length] = '</div>';
    +        return sb.join("");
    +    },
    +
    +    /**
    +     * Called when first rendering the tree.  We always build the div that will
    +     * contain this nodes children, but we don't render the children themselves
    +     * unless this node is expanded.
    +     * @method getChildrenHtml
    +     * @return {string} the children container div html and any expanded children
    +     * @private
    +     */
    +    getChildrenHtml: function() {
    +
    +        var sb = [];
    +        sb[sb.length] = '<div class="ygtvchildren"';
    +        sb[sb.length] = ' id="' + this.getChildrenElId() + '"';
    +        if (!this.expanded) {
    +            sb[sb.length] = ' style="display:none;"';
    +        }
    +        sb[sb.length] = '>';
    +
    +        // Don't render the actual child node HTML unless this node is expanded.
    +        if ( (this.hasChildren(true) && this.expanded) ||
    +                (this.renderHidden && !this.isDynamic()) ) {
    +            sb[sb.length] = this.renderChildren();
    +        }
    +
    +        sb[sb.length] = '</div>';
    +
    +        return sb.join("");
    +    },
    +
    +    /**
    +     * Generates the markup for the child nodes.  This is not done until the node
    +     * is expanded.
    +     * @method renderChildren
    +     * @return {string} the html for this node's children
    +     * @private
    +     */
    +    renderChildren: function() {
    +
    +
    +        var node = this;
    +
    +        if (this.isDynamic() && !this.dynamicLoadComplete) {
    +            this.isLoading = true;
    +            this.tree.locked = true;
    +
    +            if (this.dataLoader) {
    +
    +                setTimeout( 
    +                    function() {
    +                        node.dataLoader(node, 
    +                            function() { 
    +                                node.loadComplete(); 
    +                            });
    +                    }, 10);
    +                
    +            } else if (this.tree.root.dataLoader) {
    +
    +                setTimeout( 
    +                    function() {
    +                        node.tree.root.dataLoader(node, 
    +                            function() { 
    +                                node.loadComplete(); 
    +                            });
    +                    }, 10);
    +
    +            } else {
    +                return "Error: data loader not found or not specified.";
    +            }
    +
    +            return "";
    +
    +        } else {
    +            return this.completeRender();
    +        }
    +    },
    +
    +    /**
    +     * Called when we know we have all the child data.
    +     * @method completeRender
    +     * @return {string} children html
    +     */
    +    completeRender: function() {
    +        var sb = [];
    +
    +        for (var i=0; i < this.children.length; ++i) {
    +            // this.children[i].childrenRendered = false;
    +            sb[sb.length] = this.children[i].getHtml();
    +        }
    +        
    +        this.childrenRendered = true;
    +
    +        return sb.join("");
    +    },
    +
    +    /**
    +     * Load complete is the callback function we pass to the data provider
    +     * in dynamic load situations.
    +     * @method loadComplete
    +     */
    +    loadComplete: function() {
    +        this.getChildrenEl().innerHTML = this.completeRender();
    +        this.dynamicLoadComplete = true;
    +        this.isLoading = false;
    +        this.expand();
    +        this.tree.locked = false;
    +    },
    +
    +    /**
    +     * Returns this node's ancestor at the specified depth.
    +     * @method getAncestor
    +     * @param {int} depth the depth of the ancestor.
    +     * @return {Node} the ancestor
    +     */
    +    getAncestor: function(depth) {
    +        if (depth >= this.depth || depth < 0)  {
    +            return null;
    +        }
    +
    +        var p = this.parent;
    +        
    +        while (p.depth > depth) {
    +            p = p.parent;
    +        }
    +
    +        return p;
    +    },
    +
    +    /**
    +     * Returns the css class for the spacer at the specified depth for
    +     * this node.  If this node's ancestor at the specified depth
    +     * has a next sibling the presentation is different than if it
    +     * does not have a next sibling
    +     * @method getDepthStyle
    +     * @param {int} depth the depth of the ancestor.
    +     * @return {string} the css class for the spacer
    +     */
    +    getDepthStyle: function(depth) {
    +        return (this.getAncestor(depth).nextSibling) ? 
    +            "ygtvdepthcell" : "ygtvblankdepthcell";
    +    },
    +
    +    /**
    +     * Get the markup for the node.  This is designed to be overrided so that we can
    +     * support different types of nodes.
    +     * @method getNodeHtml
    +     * @return {string} The HTML that will render this node.
    +     */
    +    getNodeHtml: function() { 
    +        return ""; 
    +    },
    +
    +    /**
    +     * Regenerates the html for this node and its children.  To be used when the
    +     * node is expanded and new children have been added.
    +     * @method refresh
    +     */
    +    refresh: function() {
    +        // this.loadComplete();
    +        this.getChildrenEl().innerHTML = this.completeRender();
    +
    +        if (this.hasIcon) {
    +            var el = this.getToggleEl();
    +            if (el) {
    +                el.className = this.getStyle();
    +            }
    +        }
    +    },
    +
    +    /**
    +     * Node toString
    +     * @method toString
    +     * @return {string} string representation of the node
    +     */
    +    toString: function() {
    +        return "Node (" + this.index + ")";
    +    }
    +
    +};
    +
    +YAHOO.augment(YAHOO.widget.Node, YAHOO.util.EventProvider);
    +
    +/**
    + * A custom YAHOO.widget.Node that handles the unique nature of 
    + * the virtual, presentationless root node.
    + * @namespace YAHOO.widget
    + * @class RootNode
    + * @extends YAHOO.widget.Node
    + * @param oTree {YAHOO.widget.TreeView} The tree instance this node belongs to
    + * @constructor
    + */
    +YAHOO.widget.RootNode = function(oTree) {
    +	// Initialize the node with null params.  The root node is a
    +	// special case where the node has no presentation.  So we have
    +	// to alter the standard properties a bit.
    +	this.init(null, null, true);
    +	
    +	/*
    +	 * For the root node, we get the tree reference from as a param
    +	 * to the constructor instead of from the parent element.
    +	 */
    +	this.tree = oTree;
    +};
    +
    +YAHOO.extend(YAHOO.widget.RootNode, YAHOO.widget.Node, {
    +    
    +    // overrides YAHOO.widget.Node
    +    getNodeHtml: function() { 
    +        return ""; 
    +    },
    +
    +    toString: function() { 
    +        return "RootNode";
    +    },
    +
    +    loadComplete: function() { 
    +        this.tree.draw();
    +    }
    +
    +});
    +/**
    + * The default node presentation.  The first parameter should be
    + * either a string that will be used as the node's label, or an object
    + * that has a string propery called label.  By default, the clicking the
    + * label will toggle the expanded/collapsed state of the node.  By
    + * changing the href property of the instance, this behavior can be
    + * changed so that the label will go to the specified href.
    + * @namespace YAHOO.widget
    + * @class TextNode
    + * @extends YAHOO.widget.Node
    + * @constructor
    + * @param oData {object} a string or object containing the data that will
    + * be used to render this node
    + * @param oParent {YAHOO.widget.Node} this node's parent node
    + * @param expanded {boolean} the initial expanded/collapsed state
    + */
    +YAHOO.widget.TextNode = function(oData, oParent, expanded) {
    +
    +    if (oData) { 
    +        this.init(oData, oParent, expanded);
    +        this.setUpLabel(oData);
    +    }
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.TextNode, YAHOO.widget.Node, {
    +    
    +    /**
    +     * The CSS class for the label href.  Defaults to ygtvlabel, but can be
    +     * overridden to provide a custom presentation for a specific node.
    +     * @property labelStyle
    +     * @type string
    +     */
    +    labelStyle: "ygtvlabel",
    +
    +    /**
    +     * The derived element id of the label for this node
    +     * @property labelElId
    +     * @type string
    +     */
    +    labelElId: null,
    +
    +    /**
    +     * The text for the label.  It is assumed that the oData parameter will
    +     * either be a string that will be used as the label, or an object that
    +     * has a property called "label" that we will use.
    +     * @property label
    +     * @type string
    +     */
    +    label: null,
    +
    +    textNodeParentChange: function() {
    + 
    +        /**
    +         * Custom event that is fired when the text node label is clicked.  The
    +         * custom event is defined on the tree instance, so there is a single
    +         * event that handles all nodes in the tree.  The node clicked is 
    +         * provided as an argument
    +         *
    +         * @event labelClick
    +         * @for YAHOO.widget.TreeView
    +         * @param {YAHOO.widget.Node} node the node clicked
    +         */
    +        if (this.tree && !this.tree.hasEvent("labelClick")) {
    +            this.tree.createEvent("labelClick", this.tree);
    +        }
    +       
    +    },
    +
    +    /**
    +     * Sets up the node label
    +     * @method setUpLabel
    +     * @param oData string containing the label, or an object with a label property
    +     */
    +    setUpLabel: function(oData) { 
    +        
    +        // set up the custom event on the tree
    +        this.textNodeParentChange();
    +        this.subscribe("parentChange", this.textNodeParentChange);
    +
    +        if (typeof oData == "string") {
    +            oData = { label: oData };
    +        }
    +        this.label = oData.label;
    +        
    +        // update the link
    +        if (oData.href) {
    +            this.href = oData.href;
    +        }
    +
    +        // set the target
    +        if (oData.target) {
    +            this.target = oData.target;
    +        }
    +
    +        if (oData.style) {
    +            this.labelStyle = oData.style;
    +        }
    +
    +        this.labelElId = "ygtvlabelel" + this.index;
    +    },
    +
    +    /**
    +     * Returns the label element
    +     * @for YAHOO.widget.TextNode
    +     * @method getLabelEl
    +     * @return {object} the element
    +     */
    +    getLabelEl: function() { 
    +        return document.getElementById(this.labelElId);
    +    },
    +
    +    // overrides YAHOO.widget.Node
    +    getNodeHtml: function() { 
    +        var sb = [];
    +
    +        sb[sb.length] = '<table border="0" cellpadding="0" cellspacing="0">';
    +        sb[sb.length] = '<tr>';
    +        
    +        for (var i=0;i<this.depth;++i) {
    +            // sb[sb.length] = '<td class="ygtvdepthcell">&#160;</td>';
    +            sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '">&#160;</td>';
    +        }
    +
    +        var getNode = 'YAHOO.widget.TreeView.getNode(\'' +
    +                        this.tree.id + '\',' + this.index + ')';
    +
    +        sb[sb.length] = '<td';
    +        // sb[sb.length] = ' onselectstart="return false"';
    +        sb[sb.length] = ' id="' + this.getToggleElId() + '"';
    +        sb[sb.length] = ' class="' + this.getStyle() + '"';
    +        if (this.hasChildren(true)) {
    +            sb[sb.length] = ' onmouseover="this.className=';
    +            sb[sb.length] = getNode + '.getHoverStyle()"';
    +            sb[sb.length] = ' onmouseout="this.className=';
    +            sb[sb.length] = getNode + '.getStyle()"';
    +        }
    +        sb[sb.length] = ' onclick="javascript:' + this.getToggleLink() + '">';
    +
    +        /*
    +        sb[sb.length] = '<img id="' + this.getSpacerId() + '"';
    +        sb[sb.length] = ' alt=""';
    +        sb[sb.length] = ' tabindex=0';
    +        sb[sb.length] = ' src="' + this.spacerPath + '"';
    +        sb[sb.length] = ' title="' + this.getStateText() + '"';
    +        sb[sb.length] = ' class="ygtvspacer"';
    +        // sb[sb.length] = ' onkeypress="return ' + getNode + '".onKeyPress()"';
    +        sb[sb.length] = ' />';
    +        */
    +
    +        sb[sb.length] = '&#160;';
    +
    +        sb[sb.length] = '</td>';
    +        sb[sb.length] = '<td>';
    +        sb[sb.length] = '<a';
    +        sb[sb.length] = ' id="' + this.labelElId + '"';
    +        sb[sb.length] = ' class="' + this.labelStyle + '"';
    +        sb[sb.length] = ' href="' + this.href + '"';
    +        sb[sb.length] = ' target="' + this.target + '"';
    +        sb[sb.length] = ' onclick="return ' + getNode + '.onLabelClick(' + getNode +')"';
    +        if (this.hasChildren(true)) {
    +            sb[sb.length] = ' onmouseover="document.getElementById(\'';
    +            sb[sb.length] = this.getToggleElId() + '\').className=';
    +            sb[sb.length] = getNode + '.getHoverStyle()"';
    +            sb[sb.length] = ' onmouseout="document.getElementById(\'';
    +            sb[sb.length] = this.getToggleElId() + '\').className=';
    +            sb[sb.length] = getNode + '.getStyle()"';
    +        }
    +        sb[sb.length] = ' >';
    +        sb[sb.length] = this.label;
    +        sb[sb.length] = '</a>';
    +        sb[sb.length] = '</td>';
    +        sb[sb.length] = '</tr>';
    +        sb[sb.length] = '</table>';
    +
    +        return sb.join("");
    +    },
    +
    +    /**
    +     * Executed when the label is clicked.  Fires the labelClick custom event.
    +     * @method onLabelClick
    +     * @param me {Node} this node
    +     * @scope the anchor tag clicked
    +     * @return false to cancel the anchor click
    +     */
    +    onLabelClick: function(me) { 
    +        return me.tree.fireEvent("labelClick", me);
    +        //return true;
    +    },
    +
    +    toString: function() { 
    +        return "TextNode (" + this.index + ") " + this.label;
    +    }
    +
    +});
    +/**
    + * A menu-specific implementation that differs from TextNode in that only 
    + * one sibling can be expanded at a time.
    + * @namespace YAHOO.widget
    + * @class MenuNode
    + * @extends YAHOO.widget.TextNode
    + * @param oData {object} a string or object containing the data that will
    + * be used to render this node
    + * @param oParent {YAHOO.widget.Node} this node's parent node
    + * @param expanded {boolean} the initial expanded/collapsed state
    + * @constructor
    + */
    +YAHOO.widget.MenuNode = function(oData, oParent, expanded) {
    +	if (oData) { 
    +		this.init(oData, oParent, expanded);
    +		this.setUpLabel(oData);
    +	}
    +
    +    /*
    +     * Menus usually allow only one branch to be open at a time.
    +     */
    +	this.multiExpand = false;
    +
    +
    +};
    +
    +YAHOO.extend(YAHOO.widget.MenuNode, YAHOO.widget.TextNode, {
    +
    +    toString: function() { 
    +        return "MenuNode (" + this.index + ") " + this.label;
    +    }
    +
    +});
    +/**
    + * This implementation takes either a string or object for the
    + * oData argument.  If is it a string, we will use it for the display
    + * of this node (and it can contain any html code).  If the parameter
    + * is an object, we look for a parameter called "html" that will be
    + * used for this node's display.
    + * @namespace YAHOO.widget
    + * @class HTMLNode
    + * @extends YAHOO.widget.Node
    + * @constructor
    + * @param oData {object} a string or object containing the data that will
    + * be used to render this node
    + * @param oParent {YAHOO.widget.Node} this node's parent node
    + * @param expanded {boolean} the initial expanded/collapsed state
    + * @param hasIcon {boolean} specifies whether or not leaf nodes should
    + * have an icon
    + */
    +YAHOO.widget.HTMLNode = function(oData, oParent, expanded, hasIcon) {
    +    if (oData) { 
    +        this.init(oData, oParent, expanded);
    +        this.initContent(oData, hasIcon);
    +    }
    +};
    +
    +YAHOO.extend(YAHOO.widget.HTMLNode, YAHOO.widget.Node, {
    +
    +    /**
    +     * The CSS class for the html content container.  Defaults to ygtvhtml, but 
    +     * can be overridden to provide a custom presentation for a specific node.
    +     * @property contentStyle
    +     * @type string
    +     */
    +    contentStyle: "ygtvhtml",
    +
    +    /**
    +     * The generated id that will contain the data passed in by the implementer.
    +     * @property contentElId
    +     * @type string
    +     */
    +    contentElId: null,
    +
    +    /**
    +     * The HTML content to use for this node's display
    +     * @property content
    +     * @type string
    +     */
    +    content: null,
    +
    +    /**
    +     * Sets up the node label
    +     * @property initContent
    +     * @param {object} An html string or object containing an html property
    +     * @param {boolean} hasIcon determines if the node will be rendered with an
    +     * icon or not
    +     */
    +    initContent: function(oData, hasIcon) { 
    +        if (typeof oData == "string") {
    +            oData = { html: oData };
    +        }
    +
    +        this.html = oData.html;
    +        this.contentElId = "ygtvcontentel" + this.index;
    +        this.hasIcon = hasIcon;
    +
    +    },
    +
    +    /**
    +     * Returns the outer html element for this node's content
    +     * @method getContentEl
    +     * @return {HTMLElement} the element
    +     */
    +    getContentEl: function() { 
    +        return document.getElementById(this.contentElId);
    +    },
    +
    +    // overrides YAHOO.widget.Node
    +    getNodeHtml: function() { 
    +        var sb = [];
    +
    +        sb[sb.length] = '<table border="0" cellpadding="0" cellspacing="0">';
    +        sb[sb.length] = '<tr>';
    +        
    +        for (var i=0;i<this.depth;++i) {
    +            sb[sb.length] = '<td class="' + this.getDepthStyle(i) + '">&#160;</td>';
    +        }
    +
    +        if (this.hasIcon) {
    +            sb[sb.length] = '<td';
    +            sb[sb.length] = ' id="' + this.getToggleElId() + '"';
    +            sb[sb.length] = ' class="' + this.getStyle() + '"';
    +            sb[sb.length] = ' onclick="javascript:' + this.getToggleLink() + '"';
    +            if (this.hasChildren(true)) {
    +                sb[sb.length] = ' onmouseover="this.className=';
    +                sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
    +                sb[sb.length] = this.tree.id + '\',' + this.index +  ').getHoverStyle()"';
    +                sb[sb.length] = ' onmouseout="this.className=';
    +                sb[sb.length] = 'YAHOO.widget.TreeView.getNode(\'';
    +                sb[sb.length] = this.tree.id + '\',' + this.index +  ').getStyle()"';
    +            }
    +            sb[sb.length] = '>&#160;</td>';
    +        }
    +
    +        sb[sb.length] = '<td';
    +        sb[sb.length] = ' id="' + this.contentElId + '"';
    +        sb[sb.length] = ' class="' + this.contentStyle + '"';
    +        sb[sb.length] = ' >';
    +        sb[sb.length] = this.html;
    +        sb[sb.length] = '</td>';
    +        sb[sb.length] = '</tr>';
    +        sb[sb.length] = '</table>';
    +
    +        return sb.join("");
    +    },
    +
    +    toString: function() { 
    +        return "HTMLNode (" + this.index + ")";
    +    }
    +
    +});
    +/**
    + * A static factory class for tree view expand/collapse animations
    + * @class TVAnim
    + * @static
    + */
    +YAHOO.widget.TVAnim = function() {
    +    return {
    +        /**
    +         * Constant for the fade in animation
    +         * @property FADE_IN
    +         * @type string
    +         * @static
    +         */
    +        FADE_IN: "TVFadeIn",
    +
    +        /**
    +         * Constant for the fade out animation
    +         * @property FADE_OUT
    +         * @type string
    +         * @static
    +         */
    +        FADE_OUT: "TVFadeOut",
    +
    +        /**
    +         * Returns a ygAnim instance of the given type
    +         * @method getAnim
    +         * @param type {string} the type of animation
    +         * @param el {HTMLElement} the element to element (probably the children div)
    +         * @param callback {function} function to invoke when the animation is done.
    +         * @return {YAHOO.util.Animation} the animation instance
    +         * @static
    +         */
    +        getAnim: function(type, el, callback) {
    +            if (YAHOO.widget[type]) {
    +                return new YAHOO.widget[type](el, callback);
    +            } else {
    +                return null;
    +            }
    +        },
    +
    +        /**
    +         * Returns true if the specified animation class is available
    +         * @method isValid
    +         * @param type {string} the type of animation
    +         * @return {boolean} true if valid, false if not
    +         * @static
    +         */
    +        isValid: function(type) {
    +            return (YAHOO.widget[type]);
    +        }
    +    };
    +} ();
    +
    +/**
    + * A 1/2 second fade-in animation.
    + * @class TVFadeIn
    + * @constructor
    + * @param el {HTMLElement} the element to animate
    + * @param callback {function} function to invoke when the animation is finished
    + */
    +YAHOO.widget.TVFadeIn = function(el, callback) {
    +    /**
    +     * The element to animate
    +     * @property el
    +     * @type HTMLElement
    +     */
    +    this.el = el;
    +
    +    /**
    +     * the callback to invoke when the animation is complete
    +     * @property callback
    +     * @type function
    +     */
    +    this.callback = callback;
    +
    +};
    +
    +YAHOO.widget.TVFadeIn.prototype = {
    +    /**
    +     * Performs the animation
    +     * @method animate
    +     */
    +    animate: function() {
    +        var tvanim = this;
    +
    +        var s = this.el.style;
    +        s.opacity = 0.1;
    +        s.filter = "alpha(opacity=10)";
    +        s.display = "";
    +
    +        var dur = 0.4; 
    +        var a = new YAHOO.util.Anim(this.el, {opacity: {from: 0.1, to: 1, unit:""}}, dur);
    +        a.onComplete.subscribe( function() { tvanim.onComplete(); } );
    +        a.animate();
    +    },
    +
    +    /**
    +     * Clean up and invoke callback
    +     * @method onComplete
    +     */
    +    onComplete: function() {
    +        this.callback();
    +    },
    +
    +    /**
    +     * toString
    +     * @method toString
    +     * @return {string} the string representation of the instance
    +     */
    +    toString: function() {
    +        return "TVFadeIn";
    +    }
    +};
    +
    +/**
    + * A 1/2 second fade out animation.
    + * @class TVFadeOut
    + * @constructor
    + * @param el {HTMLElement} the element to animate
    + * @param callback {Function} function to invoke when the animation is finished
    + */
    +YAHOO.widget.TVFadeOut = function(el, callback) {
    +    /**
    +     * The element to animate
    +     * @property el
    +     * @type HTMLElement
    +     */
    +    this.el = el;
    +
    +    /**
    +     * the callback to invoke when the animation is complete
    +     * @property callback
    +     * @type function
    +     */
    +    this.callback = callback;
    +
    +};
    +
    +YAHOO.widget.TVFadeOut.prototype = {
    +    /**
    +     * Performs the animation
    +     * @method animate
    +     */
    +    animate: function() {
    +        var tvanim = this;
    +        var dur = 0.4;
    +        var a = new YAHOO.util.Anim(this.el, {opacity: {from: 1, to: 0.1, unit:""}}, dur);
    +        a.onComplete.subscribe( function() { tvanim.onComplete(); } );
    +        a.animate();
    +    },
    +
    +    /**
    +     * Clean up and invoke callback
    +     * @method onComplete
    +     */
    +    onComplete: function() {
    +        var s = this.el.style;
    +        s.display = "none";
    +        // s.opacity = 1;
    +        s.filter = "alpha(opacity=100)";
    +        this.callback();
    +    },
    +
    +    /**
    +     * toString
    +     * @method toString
    +     * @return {string} the string representation of the instance
    +     */
    +    toString: function() {
    +        return "TVFadeOut";
    +    }
    +};
    +
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/utilities.js.html b/www/extras/yui-ext/docs/output/utilities.js.html new file mode 100644 index 000000000..0a221d212 --- /dev/null +++ b/www/extras/yui-ext/docs/output/utilities.js.html @@ -0,0 +1,100 @@ +utilities.js
    /* Copyright (c) 2006, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txtversion: 0.12.0 */
    +if(typeof YAHOO=="undefined"){var YAHOO={};}YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i<a.length;++i){d=a[i].split(".");o=YAHOO;for(j=(d[0]=="YAHOO")?1:0;j<d.length;++j){o[d[j]]=o[d[j]]||{};o=o[d[j]];}}return o;};YAHOO.log=function(_2,_3,_4){var l=YAHOO.widget.Logger;if(l&&l.log){return l.log(_2,_3,_4);}else{return false;}};YAHOO.extend=function(_6,_7,_8){var F=function(){};F.prototype=_7.prototype;_6.prototype=new F();_6.prototype.constructor=_6;_6.superclass=_7.prototype;if(_7.prototype.constructor==Object.prototype.constructor){_7.prototype.constructor=_7;}if(_8){for(var i in _8){_6.prototype[i]=_8[i];}}};YAHOO.augment=function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i<a.length;++i){rp[a[i]]=sp[a[i]];}}else{for(p in sp){if(!rp[p]){rp[p]=sp[p];}}}};YAHOO.namespace("util","widget","example");(function(){var Y=YAHOO.util,getStyle,setStyle,id_counter=0,propertyCache={};var ua=navigator.userAgent.toLowerCase(),isOpera=(ua.indexOf('opera')>-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;}if(propertyCache[property]){return propertyCache[property];}while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];}return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}}return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};}if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}}break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};}YAHOO.util.Dom={get:function(el){if(!el){return null;}if(typeof el!='string'&&!(el instanceof Array)){return el;}if(typeof el=='string'){return document.getElementById(el);}else{var collection=[];for(var i=0,len=el.length;i<len;++i){collection[collection.length]=Y.Dom.get(el[i]);}return collection;}return null;},getStyle:function(el,property){property=toCamel(property);var f=function(element){return getStyle(element,property);};return Y.Dom.batch(el,f,Y.Dom,true);},setStyle:function(el,property,val){property=toCamel(property);var f=function(element){setStyle(element,property,val);};Y.Dom.batch(el,f,Y.Dom,true);},getXY:function(el){var f=function(el){if(el.parentNode===null||el.offsetParent===null||this.getStyle(el,'display')=='none'){return false;}var parentNode=null;var pos=[];var box;if(el.getBoundingClientRect){box=el.getBoundingClientRect();var doc=document;if(!this.inDocument(el)&&parent.document!=document){doc=parent.document;if(!this.isAncestor(doc.documentElement,el)){return false;}}var scrollTop=Math.max(doc.documentElement.scrollTop,doc.body.scrollTop);var scrollLeft=Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft);return[box.left+scrollLeft,box.top+scrollTop];}else{pos=[el.offsetLeft,el.offsetTop];parentNode=el.offsetParent;if(parentNode!=el){while(parentNode){pos[0]+=parentNode.offsetLeft;pos[1]+=parentNode.offsetTop;parentNode=parentNode.offsetParent;}}if(isSafari&&this.getStyle(el,'position')=='absolute'){pos[0]-=document.body.offsetLeft;pos[1]-=document.body.offsetTop;}}if(el.parentNode){parentNode=el.parentNode;}else{parentNode=null;}while(parentNode&&parentNode.tagName.toUpperCase()!='BODY'&&parentNode.tagName.toUpperCase()!='HTML'){if(Y.Dom.getStyle(parentNode,'display')!='inline'){pos[0]-=parentNode.scrollLeft;pos[1]-=parentNode.scrollTop;}if(parentNode.parentNode){parentNode=parentNode.parentNode;}else{parentNode=null;}}return pos;};return Y.Dom.batch(el,f,Y.Dom,true);},getX:function(el){var f=function(el){return Y.Dom.getXY(el)[0];};return Y.Dom.batch(el,f,Y.Dom,true);},getY:function(el){var f=function(el){return Y.Dom.getXY(el)[1];};return Y.Dom.batch(el,f,Y.Dom,true);},setXY:function(el,pos,noRetry){var f=function(el){var style_pos=this.getStyle(el,'position');if(style_pos=='static'){this.setStyle(el,'position','relative');style_pos='relative';}var pageXY=this.getXY(el);if(pageXY===false){return false;}var delta=[parseInt(this.getStyle(el,'left'),10),parseInt(this.getStyle(el,'top'),10)];if(isNaN(delta[0])){delta[0]=(style_pos=='relative')?0:el.offsetLeft;}if(isNaN(delta[1])){delta[1]=(style_pos=='relative')?0:el.offsetTop;}if(pos[0]!==null){el.style.left=pos[0]-pageXY[0]+delta[0]+'px';}if(pos[1]!==null){el.style.top=pos[1]-pageXY[1]+delta[1]+'px';}var newXY=this.getXY(el);if(!noRetry&&(newXY[0]!=pos[0]||newXY[1]!=pos[1])){this.setXY(el,pos,true);}};Y.Dom.batch(el,f,Y.Dom,true);},setX:function(el,x){Y.Dom.setXY(el,[x,null]);},setY:function(el,y){Y.Dom.setXY(el,[null,y]);},getRegion:function(el){var f=function(el){var region=new Y.Region.getRegion(el);return region;};return Y.Dom.batch(el,f,Y.Dom,true);},getClientWidth:function(){return Y.Dom.getViewportWidth();},getClientHeight:function(){return Y.Dom.getViewportHeight();},getElementsByClassName:function(className,tag,root){var method=function(el){return Y.Dom.hasClass(el,className);};return Y.Dom.getElementsBy(method,tag,root);},hasClass:function(el,className){var re=new RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)');var f=function(el){return re.test(el['className']);};return Y.Dom.batch(el,f,Y.Dom,true);},addClass:function(el,className){var f=function(el){if(this.hasClass(el,className)){return;}el['className']=[el['className'],className].join(' ');};Y.Dom.batch(el,f,Y.Dom,true);},removeClass:function(el,className){var re=new RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)','g');var f=function(el){if(!this.hasClass(el,className)){return;}var c=el['className'];el['className']=c.replace(re,' ');if(this.hasClass(el,className)){this.removeClass(el,className);}};Y.Dom.batch(el,f,Y.Dom,true);},replaceClass:function(el,oldClassName,newClassName){if(oldClassName===newClassName){return false;}var re=new RegExp('(?:^|\\s+)'+oldClassName+'(?:\\s+|$)','g');var f=function(el){if(!this.hasClass(el,oldClassName)){this.addClass(el,newClassName);return;}el['className']=el['className'].replace(re,' '+newClassName+' ');if(this.hasClass(el,oldClassName)){this.replaceClass(el,oldClassName,newClassName);}};Y.Dom.batch(el,f,Y.Dom,true);},generateId:function(el,prefix){prefix=prefix||'yui-gen';el=el||{};var f=function(el){if(el){el=Y.Dom.get(el);}else{el={};}if(!el.id){el.id=prefix+id_counter++;}return el.id;};return Y.Dom.batch(el,f,Y.Dom,true);},isAncestor:function(haystack,needle){haystack=Y.Dom.get(haystack);if(!haystack||!needle){return false;}var f=function(needle){if(haystack.contains&&!isSafari){return haystack.contains(needle);}else if(haystack.compareDocumentPosition){return!!(haystack.compareDocumentPosition(needle)&16);}else{var parent=needle.parentNode;while(parent){if(parent==haystack){return true;}else if(!parent.tagName||parent.tagName.toUpperCase()=='HTML'){return false;}parent=parent.parentNode;}return false;}};return Y.Dom.batch(needle,f,Y.Dom,true);},inDocument:function(el){var f=function(el){return this.isAncestor(document.documentElement,el);};return Y.Dom.batch(el,f,Y.Dom,true);},getElementsBy:function(method,tag,root){tag=tag||'*';root=Y.Dom.get(root)||document;var nodes=[];var elements=root.getElementsByTagName(tag);if(!elements.length&&(tag=='*'&&root.all)){elements=root.all;}for(var i=0,len=elements.length;i<len;++i){if(method(elements[i])){nodes[nodes.length]=elements[i];}}return nodes;},batch:function(el,method,o,override){var id=el;el=Y.Dom.get(el);var scope=(override)?o:window;if(!el||el.tagName||!el.length){if(!el){return false;}return method.call(scope,el,o);}var collection=[];for(var i=0,len=el.length;i<len;++i){if(!el[i]){id=el[i];}collection[collection.length]=method.call(scope,el[i],o);}return collection;},getDocumentHeight:function(){var scrollHeight=(document.compatMode!='CSS1Compat')?document.body.scrollHeight:document.documentElement.scrollHeight;var h=Math.max(scrollHeight,Y.Dom.getViewportHeight());return h;},getDocumentWidth:function(){var scrollWidth=(document.compatMode!='CSS1Compat')?document.body.scrollWidth:document.documentElement.scrollWidth;var w=Math.max(scrollWidth,Y.Dom.getViewportWidth());return w;},getViewportHeight:function(){var height=self.innerHeight;var mode=document.compatMode;if((mode||isIE)&&!isOpera){height=(mode=='CSS1Compat')?document.documentElement.clientHeight:document.body.clientHeight;}return height;},getViewportWidth:function(){var width=self.innerWidth;var mode=document.compatMode;if(mode||isIE){width=(mode=='CSS1Compat')?document.documentElement.clientWidth:document.body.clientWidth;}return width;}};})();YAHOO.util.Region=function(t,r,b,l){this.top=t;this[1]=t;this.right=r;this.bottom=b;this.left=l;this[0]=l;};YAHOO.util.Region.prototype.contains=function(region){return(region.left>=this.left&&region.right<=this.right&&region.top>=this.top&&region.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];}this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.util.CustomEvent=function(_1,_2,_3,_4){this.type=_1;this.scope=_2||window;this.silent=_3;this.signature=_4||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var _5="_YUICEOnSubscribe";if(_1!==_5){this.subscribeEvent=new YAHOO.util.CustomEvent(_5,this,true);}};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(fn,_7,_8){if(this.subscribeEvent){this.subscribeEvent.fire(fn,_7,_8);}this.subscribers.push(new YAHOO.util.Subscriber(fn,_7,_8));},unsubscribe:function(fn,_9){var _10=false;for(var i=0,len=this.subscribers.length;i<len;++i){var s=this.subscribers[i];if(s&&s.contains(fn,_9)){this._delete(i);_10=true;}}return _10;},fire:function(){var len=this.subscribers.length;if(!len&&this.silent){return true;}var _14=[],ret=true,i;for(i=0;i<arguments.length;++i){_14.push(arguments[i]);}var _15=_14.length;if(!this.silent){}for(i=0;i<len;++i){var s=this.subscribers[i];if(s){if(!this.silent){}var _16=s.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var _17=null;if(_14.length>0){_17=_14[0];}ret=s.fn.call(_16,_17,s.obj);}else{ret=s.fn.call(_16,this.type,_14,s.obj);}if(false===ret){if(!this.silent){}return false;}}}return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i<len;++i){this._delete(len-1-i);}},_delete:function(_18){var s=this.subscribers[_18];if(s){delete s.fn;delete s.obj;}this.subscribers.splice(_18,1);},toString:function(){return "CustomEvent: "+"'"+this.type+"', "+"scope: "+this.scope;}};YAHOO.util.Subscriber=function(fn,obj,_20){this.fn=fn;this.obj=obj||null;this.override=_20;};YAHOO.util.Subscriber.prototype.getScope=function(_21){if(this.override){if(this.override===true){return this.obj;}else{return this.override;}}return _21;};YAHOO.util.Subscriber.prototype.contains=function(fn,obj){if(obj){return (this.fn==fn&&this.obj==obj);}else{return (this.fn==fn);}};YAHOO.util.Subscriber.prototype.toString=function(){return "Subscriber { obj: "+(this.obj||"")+", override: "+(this.override||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var _22=false;var _23=[];var _24=[];var _25=[];var _26=[];var _27=0;var _28=[];var _29=[];var _30=0;return {POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/Safari|Konqueror|KHTML/gi).test(navigator.userAgent),isIE:(!this.isSafari&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var _31=this;var _32=function(){_31._tryPreloadAttach();};this._interval=setInterval(_32,this.POLL_INTERVAL);}},onAvailable:function(_33,_34,_35,_36){_28.push({id:_33,fn:_34,obj:_35,override:_36,checkReady:false});_27=this.POLL_RETRYS;this.startInterval();},onContentReady:function(_37,_38,_39,_40){_28.push({id:_37,fn:_38,obj:_39,override:_40,checkReady:true});_27=this.POLL_RETRYS;this.startInterval();},addListener:function(el,_42,fn,obj,_43){if(!fn||!fn.call){return false;}if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i<len;++i){ok=this.on(el[i],_42,fn,obj,_43)&&ok;}return ok;}else{if(typeof el=="string"){var oEl=this.getEl(el);if(oEl){el=oEl;}else{this.onAvailable(el,function(){YAHOO.util.Event.on(el,_42,fn,obj,_43);});return true;}}}if(!el){return false;}if("unload"==_42&&obj!==this){_24[_24.length]=[el,_42,fn,obj,_43];return true;}var _46=el;if(_43){if(_43===true){_46=obj;}else{_46=_43;}}var _47=function(e){return fn.call(_46,YAHOO.util.Event.getEvent(e),obj);};var li=[el,_42,fn,_47,_46];var _50=_23.length;_23[_50]=li;if(this.useLegacyEvent(el,_42)){var _51=this.getLegacyIndex(el,_42);if(_51==-1||el!=_25[_51][0]){_51=_25.length;_29[el.id+_42]=_51;_25[_51]=[el,_42,el["on"+_42]];_26[_51]=[];el["on"+_42]=function(e){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e),_51);};}_26[_51].push(li);}else{this._simpleAdd(el,_42,_47,false);}return true;},fireLegacyEvent:function(e,_52){var ok=true;var le=_26[_52];for(var i=0,len=le.length;i<len;++i){var li=le[i];if(li&&li[this.WFN]){var _54=li[this.ADJ_SCOPE];var ret=li[this.WFN].call(_54,e);ok=(ok&&ret);}}return ok;},getLegacyIndex:function(el,_56){var key=this.generateId(el)+_56;if(typeof _29[key]=="undefined"){return -1;}else{return _29[key];}},useLegacyEvent:function(el,_58){if(!el.addEventListener&&!el.attachEvent){return true;}else{if(this.isSafari){if("click"==_58||"dblclick"==_58){return true;}}}return false;},removeListener:function(el,_59,fn){var i,len;if(typeof el=="string"){el=this.getEl(el);}else{if(this._isValidCollection(el)){var ok=true;for(i=0,len=el.length;i<len;++i){ok=(this.removeListener(el[i],_59,fn)&&ok);}return ok;}}if(!fn||!fn.call){return this.purgeElement(el,false,_59);}if("unload"==_59){for(i=0,len=_24.length;i<len;i++){var li=_24[i];if(li&&li[0]==el&&li[1]==_59&&li[2]==fn){_24.splice(i,1);return true;}}return false;}var _60=null;var _61=arguments[3];if("undefined"==typeof _61){_61=this._getCacheIndex(el,_59,fn);}if(_61>=0){_60=_23[_61];}if(!el||!_60){return false;}if(this.useLegacyEvent(el,_59)){var _62=this.getLegacyIndex(el,_59);var _63=_26[_62];if(_63){for(i=0,len=_63.length;i<len;++i){li=_63[i];if(li&&li[this.EL]==el&&li[this.TYPE]==_59&&li[this.FN]==fn){_63.splice(i,1);}}}}else{this._simpleRemove(el,_59,_60[this.WFN],false);}delete _23[_61][this.WFN];delete _23[_61][this.FN];_23.splice(_61,1);return true;},getTarget:function(ev,_65){var t=ev.target||ev.srcElement;return this.resolveTextNode(t);},resolveTextNode:function(_67){if(_67&&3==_67.nodeType){return _67.parentNode;}else{return _67;}},getPageX:function(ev){var x=ev.pageX;if(!x&&0!==x){x=ev.clientX||0;if(this.isIE){x+=this._getScrollLeft();}}return x;},getPageY:function(ev){var y=ev.pageY;if(!y&&0!==y){y=ev.clientY||0;if(this.isIE){y+=this._getScrollTop();}}return y;},getXY:function(ev){return [this.getPageX(ev),this.getPageY(ev)];},getRelatedTarget:function(ev){var t=ev.relatedTarget;if(!t){if(ev.type=="mouseout"){t=ev.toElement;}else{if(ev.type=="mouseover"){t=ev.fromElement;}}}return this.resolveTextNode(t);},getTime:function(ev){if(!ev.time){var t=new Date().getTime();try{ev.time=t;}catch(e){return t;}}return ev.time;},stopEvent:function(ev){this.stopPropagation(ev);this.preventDefault(ev);},stopPropagation:function(ev){if(ev.stopPropagation){ev.stopPropagation();}else{ev.cancelBubble=true;}},preventDefault:function(ev){if(ev.preventDefault){ev.preventDefault();}else{ev.returnValue=false;}},getEvent:function(e){var ev=e||window.event;if(!ev){var c=this.getEvent.caller;while(c){ev=c.arguments[0];if(ev&&Event==ev.constructor){break;}c=c.caller;}}return ev;},getCharCode:function(ev){return ev.charCode||ev.keyCode||0;},_getCacheIndex:function(el,_71,fn){for(var i=0,len=_23.length;i<len;++i){var li=_23[i];if(li&&li[this.FN]==fn&&li[this.EL]==el&&li[this.TYPE]==_71){return i;}}return -1;},generateId:function(el){var id=el.id;if(!id){id="yuievtautoid-"+_30;++_30;el.id=id;}return id;},_isValidCollection:function(o){return (o&&o.length&&typeof o!="string"&&!o.tagName&&!o.alert&&typeof o[0]!="undefined");},elCache:{},getEl:function(id){return document.getElementById(id);},clearCache:function(){},_load:function(e){_22=true;var EU=YAHOO.util.Event;if(this.isIE){EU._simpleRemove(window,"load",EU._load);}},_tryPreloadAttach:function(){if(this.locked){return false;}this.locked=true;var _75=!_22;if(!_75){_75=(_27>0);}var _76=[];for(var i=0,len=_28.length;i<len;++i){var _77=_28[i];if(_77){var el=this.getEl(_77.id);if(el){if(!_77.checkReady||_22||el.nextSibling||(document&&document.body)){var _78=el;if(_77.override){if(_77.override===true){_78=_77.obj;}else{_78=_77.override;}}_77.fn.call(_78,_77.obj);delete _28[i];}}else{_76.push(_77);}}}_27=(_76.length===0)?0:_27-1;if(_75){this.startInterval();}else{clearInterval(this._interval);this._interval=null;}this.locked=false;return true;},purgeElement:function(el,_79,_80){var _81=this.getListeners(el,_80);if(_81){for(var i=0,len=_81.length;i<len;++i){var l=_81[i];this.removeListener(el,l.type,l.fn);}}if(_79&&el&&el.childNodes){for(i=0,len=el.childNodes.length;i<len;++i){this.purgeElement(el.childNodes[i],_79,_80);}}},getListeners:function(el,_83){var _84=[];if(_23&&_23.length>0){for(var i=0,len=_23.length;i<len;++i){var l=_23[i];if(l&&l[this.EL]===el&&(!_83||_83===l[this.TYPE])){_84.push({type:l[this.TYPE],fn:l[this.FN],obj:l[this.OBJ],adjust:l[this.ADJ_SCOPE],index:i});}}}return (_84.length)?_84:null;},_unload:function(e){var EU=YAHOO.util.Event,i,j,l,len,index;for(i=0,len=_24.length;i<len;++i){l=_24[i];if(l){var _85=window;if(l[EU.ADJ_SCOPE]){if(l[EU.ADJ_SCOPE]===true){_85=l[EU.OBJ];}else{_85=l[EU.ADJ_SCOPE];}}l[EU.FN].call(_85,EU.getEvent(e),l[EU.OBJ]);delete _24[i];l=null;_85=null;}}if(_23&&_23.length>0){j=_23.length;while(j){index=j-1;l=_23[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);}j=j-1;}l=null;EU.clearCache();}for(i=0,len=_25.length;i<len;++i){delete _25[i][0];delete _25[i];}EU._simpleRemove(window,"unload",EU._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var dd=document.documentElement,db=document.body;if(dd&&(dd.scrollTop||dd.scrollLeft)){return [dd.scrollTop,dd.scrollLeft];}else{if(db){return [db.scrollTop,db.scrollLeft];}else{return [0,0];}}},_simpleAdd:function(){if(window.addEventListener){return function(el,_87,fn,_88){el.addEventListener(_87,fn,(_88));};}else{if(window.attachEvent){return function(el,_89,fn,_90){el.attachEvent("on"+_89,fn);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(el,_91,fn,_92){el.removeEventListener(_91,fn,(_92));};}else{if(window.detachEvent){return function(el,_93,fn){el.detachEvent("on"+_93,fn);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;if(document&&document.body){EU._load();}else{EU._simpleAdd(window,"load",EU._load);}EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(_94,_95,_96,_97){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_94];if(ce){ce.subscribe(_95,_96,_97);}else{this.__yui_subscribers=this.__yui_subscribers||{};var _99=this.__yui_subscribers;if(!_99[_94]){_99[_94]=[];}_99[_94].push({fn:_95,obj:_96,override:_97});}},unsubscribe:function(_100,p_fn,_102){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_100];if(ce){return ce.unsubscribe(p_fn,_102);}else{return false;}},createEvent:function(_103,_104){this.__yui_events=this.__yui_events||{};var opts=_104||{};var _106=this.__yui_events;if(_106[_103]){}else{var _107=opts.scope||this;var _108=opts.silent||null;var ce=new YAHOO.util.CustomEvent(_103,_107,_108,YAHOO.util.CustomEvent.FLAT);_106[_103]=ce;if(opts.onSubscribeCallback){ce.subscribeEvent.subscribe(opts.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var qs=this.__yui_subscribers[_103];if(qs){for(var i=0;i<qs.length;++i){ce.subscribe(qs[i].fn,qs[i].obj,qs[i].override);}}}return _106[_103];},fireEvent:function(_110,arg1,arg2,etc){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_110];if(ce){var args=[];for(var i=1;i<arguments.length;++i){args.push(arguments[i]);}return ce.fire.apply(ce,args);}else{return null;}},hasEvent:function(type){if(this.__yui_events){if(this.__yui_events[type]){return true;}}return false;}};YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={toString:function(){var el=this.getEl();var id=el.id||el.tagName;return("Anim "+id);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(attr,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attr,val,unit){if(this.patterns.noNegatives.test(attr)){val=(val>0)?val:0;}YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);}var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;}return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';}return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;}start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i<len;++i){end[i]=start[i]+attributes[attr]['by'][i];}}else{end=start+attributes[attr]['by'];}}this.runtimeAttributes[attr].start=start;this.runtimeAttributes[attr].end=end;this.runtimeAttributes[attr].unit=(isset(attributes[attr].unit))?attributes[attr]['unit']:this.getDefaultUnit(attr);},init:function(el,attributes,duration,method){var isAnimated=false;var startTime=null;var actualFrames=0;el=YAHOO.util.Dom.get(el);this.attributes=attributes||{};this.duration=duration||1;this.method=method||YAHOO.util.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=YAHOO.util.AnimMgr.fps;this.getEl=function(){return el;};this.isAnimated=function(){return isAnimated;};this.getStartTime=function(){return startTime;};this.runtimeAttributes={};this.animate=function(){if(this.isAnimated()){return false;}this.currentFrame=0;this.totalFrames=(this.useSeconds)?Math.ceil(YAHOO.util.AnimMgr.fps*this.duration):this.duration;YAHOO.util.AnimMgr.registerElement(this);};this.stop=function(finish){if(finish){this.currentFrame=this.totalFrames;this._onTween.fire();}YAHOO.util.AnimMgr.stop(this);};var onStart=function(){this.onStart.fire();this.runtimeAttributes={};for(var attr in this.attributes){this.setRuntimeAttribute(attr);}isAnimated=true;actualFrames=0;startTime=new Date();};var onTween=function(){var data={duration:new Date()-this.getStartTime(),currentFrame:this.currentFrame};data.toString=function(){return('duration: '+data.duration+', currentFrame: '+data.currentFrame);};this.onTween.fire(data);var runtimeAttributes=this.runtimeAttributes;for(var attr in runtimeAttributes){this.setAttribute(attr,this.doMethod(attr,runtimeAttributes[attr].start,runtimeAttributes[attr].end),runtimeAttributes[attr].unit);}actualFrames+=1;};var onComplete=function(){var actual_duration=(new Date()-startTime)/1000;var data={duration:actual_duration,frames:actualFrames,fps:actualFrames/actual_duration};data.toString=function(){return('duration: '+data.duration+', frames: '+data.frames+', fps: '+data.fps);};isAnimated=false;actualFrames=0;this.onComplete.fire(data);};this._onStart=new YAHOO.util.CustomEvent('_start',this,true);this.onStart=new YAHOO.util.CustomEvent('start',this);this.onTween=new YAHOO.util.CustomEvent('tween',this);this._onTween=new YAHOO.util.CustomEvent('_tween',this,true);this.onComplete=new YAHOO.util.CustomEvent('complete',this);this._onComplete=new YAHOO.util.CustomEvent('_complete',this,true);this._onStart.subscribe(onStart);this._onTween.subscribe(onTween);this._onComplete.subscribe(onComplete);}};YAHOO.util.AnimMgr=new function(){var thread=null;var queue=[];var tweenCount=0;this.fps=200;this.delay=1;this.registerElement=function(tween){queue[queue.length]=tween;tweenCount+=1;tween._onStart.fire();this.start();};this.unRegister=function(tween,index){tween._onComplete.fire();index=index||getIndex(tween);if(index!=-1){queue.splice(index,1);}tweenCount-=1;if(tweenCount<=0){this.stop();}};this.start=function(){if(thread===null){thread=setInterval(this.run,this.delay);}};this.stop=function(tween){if(!tween){clearInterval(thread);for(var i=0,len=queue.length;i<len;++i){if(queue[i].isAnimated()){this.unRegister(tween,i);}}queue=[];thread=null;tweenCount=0;}else{this.unRegister(tween);}};this.run=function(){for(var i=0,len=queue.length;i<len;++i){var tween=queue[i];if(!tween||!tween.isAnimated()){continue;}if(tween.currentFrame<tween.totalFrames||tween.totalFrames===null){tween.currentFrame+=1;if(tween.useSeconds){correctFrame(tween);}tween._onTween.fire();}else{YAHOO.util.AnimMgr.stop(tween,i);}}};var getIndex=function(anim){for(var i=0,len=queue.length;i<len;++i){if(queue[i]==anim){return i;}}return-1;};var correctFrame=function(tween){var frames=tween.totalFrames;var frame=tween.currentFrame;var expected=(tween.currentFrame*tween.duration*1000/tween.totalFrames);var elapsed=(new Date()-tween.getStartTime());var tweak=0;if(elapsed<tween.duration*1000){tweak=Math.round((elapsed/expected-1)*tween.currentFrame);}else{tweak=frames-(frame+1);}if(tweak>0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);}tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i<n;++i){tmp[i]=[points[i][0],points[i][1]];}for(var j=1;j<n;++j){for(i=0;i<n-j;++i){tmp[i][0]=(1-t)*tmp[i][0]+t*tmp[parseInt(i+1,10)][0];tmp[i][1]=(1-t)*tmp[i][1]+t*tmp[parseInt(i+1,10)][1];}}return[tmp[0][0],tmp[0][1]];};};(function(){YAHOO.util.ColorAnim=function(el,attributes,duration,method){YAHOO.util.ColorAnim.superclass.constructor.call(this,el,attributes,duration,method);};YAHOO.extend(YAHOO.util.ColorAnim,YAHOO.util.Anim);var Y=YAHOO.util;var superclass=Y.ColorAnim.superclass;var proto=Y.ColorAnim.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("ColorAnim "+id);};proto.patterns.color=/color$/i;proto.patterns.rgb=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;proto.patterns.hex=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;proto.patterns.hex3=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;proto.patterns.transparent=/^transparent|rgba\(0, 0, 0, 0\)$/;proto.parseColor=function(s){if(s.length==3){return s;}var c=this.patterns.hex.exec(s);if(c&&c.length==4){return[parseInt(c[1],16),parseInt(c[2],16),parseInt(c[3],16)];}c=this.patterns.rgb.exec(s);if(c&&c.length==4){return[parseInt(c[1],10),parseInt(c[2],10),parseInt(c[3],10)];}c=this.patterns.hex3.exec(s);if(c&&c.length==4){return[parseInt(c[1]+c[1],16),parseInt(c[2]+c[2],16),parseInt(c[3]+c[3],16)];}return null;};proto.getAttribute=function(attr){var el=this.getEl();if(this.patterns.color.test(attr)){var val=YAHOO.util.Dom.getStyle(el,attr);if(this.patterns.transparent.test(val)){var parent=el.parentNode;val=Y.Dom.getStyle(parent,attr);while(parent&&this.patterns.transparent.test(val)){parent=parent.parentNode;val=Y.Dom.getStyle(parent,attr);if(parent.tagName.toUpperCase()=='HTML'){val='#fff';}}}}else{val=superclass.getAttribute.call(this,attr);}return val;};proto.doMethod=function(attr,start,end){var val;if(this.patterns.color.test(attr)){val=[];for(var i=0,len=start.length;i<len;++i){val[i]=superclass.doMethod.call(this,attr,start[i],end[i]);}val='rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')';}else{val=superclass.doMethod.call(this,attr,start,end);}return val;};proto.setRuntimeAttribute=function(attr){superclass.setRuntimeAttribute.call(this,attr);if(this.patterns.color.test(attr)){var attributes=this.attributes;var start=this.parseColor(this.runtimeAttributes[attr].start);var end=this.parseColor(this.runtimeAttributes[attr].end);if(typeof attributes[attr]['to']==='undefined'&&typeof attributes[attr]['by']!=='undefined'){end=this.parseColor(attributes[attr].by);for(var i=0,len=start.length;i<len;++i){end[i]=start[i]+end[i];}}this.runtimeAttributes[attr].start=start;this.runtimeAttributes[attr].end=end;}};})();YAHOO.util.Easing={easeNone:function(t,b,c,d){return c*t/d+b;},easeIn:function(t,b,c,d){return c*(t/=d)*t+b;},easeOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},easeBoth:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},easeInStrong:function(t,b,c,d){return c*(t/=d)*t*t*t+b;},easeOutStrong:function(t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b;},easeBothStrong:function(t,b,c,d){if((t/=d/2)<1)return c/2*t*t*t*t+b;return-c/2*((t-=2)*t*t*t-2)+b;},elasticIn:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);return-(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;},elasticOut:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b;},elasticBoth:function(t,b,c,d,a,p){if(t==0)return b;if((t/=d/2)==2)return b+c;if(!p)p=d*(.3*1.5);if(!a||a<Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);if(t<1)return-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b;},backIn:function(t,b,c,d,s){if(typeof s=='undefined')s=1.70158;return c*(t/=d)*t*((s+1)*t-s)+b;},backOut:function(t,b,c,d,s){if(typeof s=='undefined')s=1.70158;return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b;},backBoth:function(t,b,c,d,s){if(typeof s=='undefined')s=1.70158;if((t/=d/2)<1)return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b;},bounceIn:function(t,b,c,d){return c-YAHOO.util.Easing.bounceOut(d-t,0,c,d)+b;},bounceOut:function(t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b;}else if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b;}else if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b;}else{return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b;}},bounceBoth:function(t,b,c,d){if(t<d/2)return YAHOO.util.Easing.bounceIn(t*2,0,c,d)*.5+b;return YAHOO.util.Easing.bounceOut(t*2-d,0,c,d)*.5+c*.5+b;}};(function(){YAHOO.util.Motion=function(el,attributes,duration,method){if(el){YAHOO.util.Motion.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Motion,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Motion.superclass;var proto=Y.Motion.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Motion "+id);};proto.patterns.points=/^points$/i;proto.setAttribute=function(attr,val,unit){if(this.patterns.points.test(attr)){unit=unit||'px';superclass.setAttribute.call(this,'left',val[0],unit);superclass.setAttribute.call(this,'top',val[1],unit);}else{superclass.setAttribute.call(this,attr,val,unit);}};proto.getAttribute=function(attr){if(this.patterns.points.test(attr)){var val=[superclass.getAttribute.call(this,'left'),superclass.getAttribute.call(this,'top')];}else{val=superclass.getAttribute.call(this,attr);}return val;};proto.doMethod=function(attr,start,end){var val=null;if(this.patterns.points.test(attr)){var t=this.method(this.currentFrame,0,100,this.totalFrames)/100;val=Y.Bezier.getPosition(this.runtimeAttributes[attr],t);}else{val=superclass.doMethod.call(this,attr,start,end);}return val;};proto.setRuntimeAttribute=function(attr){if(this.patterns.points.test(attr)){var el=this.getEl();var attributes=this.attributes;var start;var control=attributes['points']['control']||[];var end;var i,len;if(control.length>0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i<len;++i){tmp[i]=control[i];}control=tmp;}if(Y.Dom.getStyle(el,'position')=='static'){Y.Dom.setStyle(el,'position','relative');}if(isset(attributes['points']['from'])){Y.Dom.setXY(el,attributes['points']['from']);}else{Y.Dom.setXY(el,Y.Dom.getXY(el));}start=this.getAttribute('points');if(isset(attributes['points']['to'])){end=translateValues.call(this,attributes['points']['to'],start);var pageXY=Y.Dom.getXY(this.getEl());for(i=0,len=control.length;i<len;++i){control[i]=translateValues.call(this,control[i],start);}}else if(isset(attributes['points']['by'])){end=[start[0]+attributes['points']['by'][0],start[1]+attributes['points']['by'][1]];for(i=0,len=control.length;i<len;++i){control[i]=[start[0]+control[i][0],start[1]+control[i][1]];}}this.runtimeAttributes[attr]=[start];if(control.length>0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);}this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;}else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);}return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);}return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})();(function(){var _1=YAHOO.util.Event;var _2=YAHOO.util.Dom;YAHOO.util.DragDrop=function(id,_4,_5){if(id){this.init(id,_4,_5);}};YAHOO.util.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=_2.get(this.id);}return this._domRef;},getDragEl:function(){return _2.get(this.dragElId);},init:function(id,_9,_10){this.initTarget(id,_9,_10);_1.on(this.id,"mousedown",this.handleMouseDown,this,true);},initTarget:function(id,_11,_12){this.config=_12||{};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.id=id;this.addToGroup((_11)?_11:"default");this.handleElId=id;_1.onAvailable(id,this.handleOnAvailable,this,true);this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(_13,_14,_15,_16){if(!_14&&0!==_14){this.padding=[_13,_13,_13,_13];}else{if(!_15&&0!==_15){this.padding=[_13,_14,_13,_14];}else{this.padding=[_13,_14,_15,_16];}}},setInitPosition:function(_17,_18){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;}var dx=_17||0;var dy=_18||0;var p=_2.getXY(el);this.initPageX=p[0]-dx;this.initPageY=p[1]-dy;this.lastPageX=p[0];this.lastPageY=p[1];this.setStartPosition(p);},setStartPosition:function(pos){var p=pos||_2.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(_24){this.groups[_24]=true;this.DDM.regDragDrop(this,_24);},removeFromGroup:function(_25){if(this.groups[_25]){delete this.groups[_25];}this.DDM.removeDDFromGroup(this,_25);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}_1.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){_1.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return (this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){var _27=e.which||e.button;if(this.primaryButtonOnly&&_27>1){return;}if(this.isLocked()){return;}this.DDM.refreshCache(this.groups);var pt=new YAHOO.util.Point(_1.getPageX(e),_1.getPageY(e));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){this.setStartPosition();this.b4MouseDown(e);this.onMouseDown(e);this.DDM.handleMouseDown(e,this);this.DDM.stopEvent(e);}else{}}},clickValidator:function(e){var _29=_1.getTarget(e);return (this.isValidHandleChild(_29)&&(this.id==this.handleElId||this.DDM.handleWasClicked(_29,this.id)));},addInvalidHandleType:function(_30){var _31=_30.toUpperCase();this.invalidHandleTypes[_31]=_31;},addInvalidHandleId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(_32){this.invalidHandleClasses.push(_32);},removeInvalidHandleType:function(_33){var _34=_33.toUpperCase();delete this.invalidHandleTypes[_34];},removeInvalidHandleId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(_35){for(var i=0,len=this.invalidHandleClasses.length;i<len;++i){if(this.invalidHandleClasses[i]==_35){delete this.invalidHandleClasses[i];}}},isValidHandleChild:function(_37){var _38=true;var _39;try{_39=_37.nodeName.toUpperCase();}catch(e){_39=_37.nodeName;}_38=_38&&!this.invalidHandleTypes[_39];_38=_38&&!this.invalidHandleIds[_37.id];for(var i=0,len=this.invalidHandleClasses.length;_38&&i<len;++i){_38=!_2.hasClass(_37,this.invalidHandleClasses[i]);}return _38;},setXTicks:function(_40,_41){this.xTicks=[];this.xTickSize=_41;var _42={};for(var i=this.initPageX;i>=this.minX;i=i-_41){if(!_42[i]){this.xTicks[this.xTicks.length]=i;_42[i]=true;}}for(i=this.initPageX;i<=this.maxX;i=i+_41){if(!_42[i]){this.xTicks[this.xTicks.length]=i;_42[i]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(_43,_44){this.yTicks=[];this.yTickSize=_44;var _45={};for(var i=this.initPageY;i>=this.minY;i=i-_44){if(!_45[i]){this.yTicks[this.yTicks.length]=i;_45[i]=true;}}for(i=this.initPageY;i<=this.maxY;i=i+_44){if(!_45[i]){this.yTicks[this.yTicks.length]=i;_45[i]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(_46,_47,_48){this.leftConstraint=_46;this.rightConstraint=_47;this.minX=this.initPageX-_46;this.maxX=this.initPageX+_47;if(_48){this.setXTicks(this.initPageX,_48);}this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(iUp,_50,_51){this.topConstraint=iUp;this.bottomConstraint=_50;this.minY=this.initPageY-iUp;this.maxY=this.initPageY+_50;if(_51){this.setYTicks(this.initPageY,_51);}this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var dx=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var dy=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy);}else{this.setInitPosition();}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(val,_53){if(!_53){return val;}else{if(_53[0]>=val){return _53[0];}else{for(var i=0,len=_53.length;i<len;++i){var _54=i+1;if(_53[_54]&&_53[_54]>=val){var _55=val-_53[i];var _56=_53[_54]-val;return (_56>_55)?_53[i]:_53[_54];}}return _53[_53.length-1];}}},toString:function(){return ("DragDrop "+this.id);}};})();if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var _57=YAHOO.util.Event;return {ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initalized:false,locked:false,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(_58,_59){for(var i in this.ids){for(var j in this.ids[i]){var oDD=this.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;}oDD[_58].apply(oDD,_59);}}},_onLoad:function(){this.init();_57.on(document,"mouseup",this.handleMouseUp,this,true);_57.on(document,"mousemove",this.handleMouseMove,this,true);_57.on(window,"unload",this._onUnload,this,true);_57.on(window,"resize",this._onResize,this,true);},_onResize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,_61){if(!this.initialized){this.init();}if(!this.ids[_61]){this.ids[_61]={};}this.ids[_61][oDD.id]=oDD;},removeDDFromGroup:function(oDD,_62){if(!this.ids[_62]){this.ids[_62]={};}var obj=this.ids[_62];if(obj&&obj[oDD.id]){delete obj[oDD.id];}},_remove:function(oDD){for(var g in oDD.groups){if(g&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}}delete this.handleIds[oDD.id];},regHandle:function(_65,_66){if(!this.handleIds[_65]){this.handleIds[_65]={};}this.handleIds[_65][_66]=_66;},isDragDrop:function(id){return (this.getDDById(id))?true:false;},getRelated:function(_67,_68){var _69=[];for(var i in _67.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;}if(!_68||dd.isTarget){_69[_69.length]=dd;}}}return _69;},isLegalTarget:function(oDD,_71){var _72=this.getRelated(oDD,true);for(var i=0,len=_72.length;i<len;++i){if(_72[i].id==_71.id){return true;}}return false;},isTypeOfDD:function(oDD){return (oDD&&oDD.__ygDragDrop);},isHandle:function(_73,_74){return (this.handleIds[_73]&&this.handleIds[_73][_74]);},getDDById:function(id){for(var i in this.ids){if(this.ids[i][id]){return this.ids[i][id];}}return null;},handleMouseDown:function(e,oDD){this.currentTarget=YAHOO.util.Event.getTarget(e);this.dragCurrent=oDD;var el=oDD.getEl();this.startX=YAHOO.util.Event.getPageX(e);this.startY=YAHOO.util.Event.getPageY(e);this.deltaX=this.startX-el.offsetLeft;this.deltaY=this.startY-el.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var DDM=YAHOO.util.DDM;DDM.startDrag(DDM.startX,DDM.startY);},this.clickTimeThresh);},startDrag:function(x,y){clearTimeout(this.clickTimeout);if(this.dragCurrent){this.dragCurrent.b4StartDrag(x,y);this.dragCurrent.startDrag(x,y);}this.dragThreshMet=true;},handleMouseUp:function(e){if(!this.dragCurrent){return;}clearTimeout(this.clickTimeout);if(this.dragThreshMet){this.fireEvents(e,true);}else{}this.stopDrag(e);this.stopEvent(e);},stopEvent:function(e){if(this.stopPropagation){YAHOO.util.Event.stopPropagation(e);}if(this.preventDefault){YAHOO.util.Event.preventDefault(e);}},stopDrag:function(e){if(this.dragCurrent){if(this.dragThreshMet){this.dragCurrent.b4EndDrag(e);this.dragCurrent.endDrag(e);}this.dragCurrent.onMouseUp(e);}this.dragCurrent=null;this.dragOvers={};},handleMouseMove:function(e){if(!this.dragCurrent){return true;}if(YAHOO.util.Event.isIE&&!e.button){this.stopEvent(e);return this.handleMouseUp(e);}if(!this.dragThreshMet){var _76=Math.abs(this.startX-YAHOO.util.Event.getPageX(e));var _77=Math.abs(this.startY-YAHOO.util.Event.getPageY(e));if(_76>this.clickPixelThresh||_77>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);this.fireEvents(e,false);}this.stopEvent(e);return true;},fireEvents:function(e,_78){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;}var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);var pt=new YAHOO.util.Point(x,y);var _80=[];var _81=[];var _82=[];var _83=[];var _84=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;}if(!this.isOverTarget(pt,ddo,this.mode)){_81.push(ddo);}_80[i]=true;delete this.dragOvers[i];}for(var _86 in dc.groups){if("string"!=typeof _86){continue;}for(i in this.ids[_86]){var oDD=this.ids[_86][i];if(!this.isTypeOfDD(oDD)){continue;}if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(_78){_83.push(oDD);}else{if(!_80[oDD.id]){_84.push(oDD);}else{_82.push(oDD);}this.dragOvers[oDD.id]=oDD;}}}}}if(this.mode){if(_81.length){dc.b4DragOut(e,_81);dc.onDragOut(e,_81);}if(_84.length){dc.onDragEnter(e,_84);}if(_82.length){dc.b4DragOver(e,_82);dc.onDragOver(e,_82);}if(_83.length){dc.b4DragDrop(e,_83);dc.onDragDrop(e,_83);}}else{var len=0;for(i=0,len=_81.length;i<len;++i){dc.b4DragOut(e,_81[i].id);dc.onDragOut(e,_81[i].id);}for(i=0,len=_84.length;i<len;++i){dc.onDragEnter(e,_84[i].id);}for(i=0,len=_82.length;i<len;++i){dc.b4DragOver(e,_82[i].id);dc.onDragOver(e,_82[i].id);}for(i=0,len=_83.length;i<len;++i){dc.b4DragDrop(e,_83[i].id);dc.onDragDrop(e,_83[i].id);}}if(_78&&!_83.length){dc.onInvalidDrop(e);}},getBestMatch:function(dds){var _89=null;var len=dds.length;if(len==1){_89=dds[0];}else{for(var i=0;i<len;++i){var dd=dds[i];if(dd.cursorIsOver){_89=dd;break;}else{if(!_89||_89.overlap.getArea()<dd.overlap.getArea()){_89=dd;}}}}return _89;},refreshCache:function(_90){for(var _91 in _90){if("string"!=typeof _91){continue;}for(var i in this.ids[_91]){var oDD=this.ids[_91][i];if(this.isTypeOfDD(oDD)){var loc=this.getLocation(oDD);if(loc){this.locationCache[oDD.id]=loc;}else{delete this.locationCache[oDD.id];}}}}},verifyEl:function(el){try{if(el){var _93=el.offsetParent;if(_93){return true;}}}catch(e){}return false;},getLocation:function(oDD){if(!this.isTypeOfDD(oDD)){return null;}var el=oDD.getEl(),pos,x1,x2,y1,y2,t,r,b,l;try{pos=YAHOO.util.Dom.getXY(el);}catch(e){}if(!pos){return null;}x1=pos[0];x2=x1+el.offsetWidth;y1=pos[1];y2=y1+el.offsetHeight;t=y1-oDD.padding[0];r=x2+oDD.padding[1];b=y2+oDD.padding[2];l=x1-oDD.padding[3];return new YAHOO.util.Region(t,r,b,l);},isOverTarget:function(pt,_94,_95){var loc=this.locationCache[_94.id];if(!loc||!this.useCache){loc=this.getLocation(_94);this.locationCache[_94.id]=loc;}if(!loc){return false;}_94.cursorIsOver=loc.contains(pt);var dc=this.dragCurrent;if(!dc||!dc.getTargetCoord||(!_95&&!dc.constrainX&&!dc.constrainY)){return _94.cursorIsOver;}_94.overlap=null;var pos=dc.getTargetCoord(pt.x,pt.y);var el=dc.getDragEl();var _96=new YAHOO.util.Region(pos.y,pos.x+el.offsetWidth,pos.y+el.offsetHeight,pos.x);var _97=_96.intersect(loc);if(_97){_94.overlap=_97;return (_95)?true:_94.cursorIsOver;}else{return false;}},_onUnload:function(e,me){this.unregAll();},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null;}this._execOnAll("unreg",[]);for(i in this.elementCache){delete this.elementCache[i];}this.elementCache={};this.ids={};},elementCache:{},getElWrapper:function(id){var _99=this.elementCache[id];if(!_99||!_99.el){_99=this.elementCache[id]=new this.ElementWrapper(YAHOO.util.Dom.get(id));}return _99;},getElement:function(id){return YAHOO.util.Dom.get(id);},getCss:function(id){var el=YAHOO.util.Dom.get(id);return (el)?el.style:null;},ElementWrapper:function(el){this.el=el||null;this.id=this.el&&el.id;this.css=this.el&&el.style;},getPosX:function(el){return YAHOO.util.Dom.getX(el);},getPosY:function(el){return YAHOO.util.Dom.getY(el);},swapNode:function(n1,n2){if(n1.swapNode){n1.swapNode(n2);}else{var p=n2.parentNode;var s=n2.nextSibling;if(s==n1){p.insertBefore(n1,n2);}else{if(n2==n1.nextSibling){p.insertBefore(n2,n1);}else{n1.parentNode.replaceChild(n2,n1);p.insertBefore(n1,s);}}}},getScroll:function(){var t,l,dde=document.documentElement,db=document.body;if(dde&&(dde.scrollTop||dde.scrollLeft)){t=dde.scrollTop;l=dde.scrollLeft;}else{if(db){t=db.scrollTop;l=db.scrollLeft;}else{YAHOO.log("could not get scroll property");}}return {top:t,left:l};},getStyle:function(el,_104){return YAHOO.util.Dom.getStyle(el,_104);},getScrollTop:function(){return this.getScroll().top;},getScrollLeft:function(){return this.getScroll().left;},moveToEl:function(_105,_106){var _107=YAHOO.util.Dom.getXY(_106);YAHOO.util.Dom.setXY(_105,_107);},getClientHeight:function(){return YAHOO.util.Dom.getViewportHeight();},getClientWidth:function(){return YAHOO.util.Dom.getViewportWidth();},numericSort:function(a,b){return (a-b);},_timeoutCount:0,_addListeners:function(){var DDM=YAHOO.util.DDM;if(YAHOO.util.Event&&document){DDM._onLoad();}else{if(DDM._timeoutCount>2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(node,id){if(this.isHandle(id,node.id)){return true;}else{var p=node.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}}return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();}YAHOO.util.DD=function(id,_111,_112){if(id){this.init(id,_111,_112);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(_113,_114){var x=_113-this.startPageX;var y=_114-this.startPageY;this.setDelta(x,y);},setDelta:function(_115,_116){this.deltaX=_115;this.deltaY=_116;},setDragElPos:function(_117,_118){var el=this.getDragEl();this.alignElWithMouse(el,_117,_118);},alignElWithMouse:function(el,_119,_120){var _121=this.getTargetCoord(_119,_120);if(!this.deltaSetXY){var _122=[_121.x,_121.y];YAHOO.util.Dom.setXY(el,_122);var _123=parseInt(YAHOO.util.Dom.getStyle(el,"left"),10);var _124=parseInt(YAHOO.util.Dom.getStyle(el,"top"),10);this.deltaSetXY=[_123-_121.x,_124-_121.y];}else{YAHOO.util.Dom.setStyle(el,"left",(_121.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(el,"top",(_121.y+this.deltaSetXY[1])+"px");}this.cachePosition(_121.x,_121.y);this.autoScroll(_121.x,_121.y,el.offsetHeight,el.offsetWidth);},cachePosition:function(_125,_126){if(_125){this.lastPageX=_125;this.lastPageY=_126;}else{var _127=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=_127[0];this.lastPageY=_127[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var _130=this.DDM.getClientHeight();var _131=this.DDM.getClientWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var _135=w+x;var _136=(_130+st-y-this.deltaY);var _137=(_131+sl-x-this.deltaX);var _138=40;var _139=(document.all)?80:30;if(bot>_130&&_136<_138){window.scrollTo(sl,st+_139);}if(y<st&&st>0&&y-st<_138){window.scrollTo(sl,st-_139);}if(_135>_131&&_137<_138){window.scrollTo(sl+_139,st);}if(x<sl&&sl>0&&x-sl<_138){window.scrollTo(sl-_139,st);}}},getTargetCoord:function(_140,_141){var x=_140-this.deltaX;var y=_141-this.deltaY;if(this.constrainX){if(x<this.minX){x=this.minX;}if(x>this.maxX){x=this.maxX;}}if(this.constrainY){if(y<this.minY){y=this.minY;}if(y>this.maxY){y=this.maxY;}}x=this.getTick(x,this.xTicks);y=this.getTick(y,this.yTicks);return {x:x,y:y};},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.autoOffset(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},toString:function(){return ("DD "+this.id);}});YAHOO.util.DDProxy=function(id,_142,_143){if(id){this.init(id,_142,_143);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var self=this;var body=document.body;if(!body||!body.firstChild){setTimeout(function(){self.createFrame();},50);return;}var div=this.getDragEl();if(!div){div=document.createElement("div");div.id=this.dragElId;var s=div.style;s.position="absolute";s.visibility="hidden";s.cursor="move";s.border="2px solid #aaa";s.zIndex=999;body.insertBefore(div,body.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(_147,_148){var el=this.getEl();var _149=this.getDragEl();var s=_149.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));}this.setDragElPos(_147,_148);YAHOO.util.Dom.setStyle(_149,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var DOM=YAHOO.util.Dom;var el=this.getEl();var _151=this.getDragEl();var bt=parseInt(DOM.getStyle(_151,"borderTopWidth"),10);var br=parseInt(DOM.getStyle(_151,"borderRightWidth"),10);var bb=parseInt(DOM.getStyle(_151,"borderBottomWidth"),10);var bl=parseInt(DOM.getStyle(_151,"borderLeftWidth"),10);if(isNaN(bt)){bt=0;}if(isNaN(br)){br=0;}if(isNaN(bb)){bb=0;}if(isNaN(bl)){bl=0;}var _156=Math.max(0,el.offsetWidth-br-bl);var _157=Math.max(0,el.offsetHeight-bt-bb);DOM.setStyle(_151,"width",_156+"px");DOM.setStyle(_151,"height",_157+"px");}},b4MouseDown:function(e){var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(e){var DOM=YAHOO.util.Dom;var lel=this.getEl();var del=this.getDragEl();DOM.setStyle(del,"visibility","");DOM.setStyle(lel,"visibility","hidden");YAHOO.util.DDM.moveToEl(lel,del);DOM.setStyle(del,"visibility","hidden");DOM.setStyle(lel,"visibility","");},toString:function(){return ("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(id,_160,_161){if(id){this.initTarget(id,_160,_161);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return ("DDTarget "+this.id);}});
    +YAHOO.util.Connect={_msxml_progid:['MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP','Microsoft.XMLHTTP'],_http_header:{},_has_http_headers:false,_use_default_post_header:true,_default_post_header:'application/x-www-form-urlencoded',_isFormSubmit:false,_isFileUpload:false,_formNode:null,_sFormData:null,_poll:{},_timeOut:{},_polling_interval:50,_transaction_id:0,setProgId:function(id)
    +{this._msxml_progid.unshift(id);},setDefaultPostHeader:function(b)
    +{this._use_default_post_header=b;},setPollingInterval:function(i)
    +{if(typeof i=='number'&&isFinite(i)){this._polling_interval=i;}},createXhrObject:function(transactionId)
    +{var obj,http;try
    +{http=new XMLHttpRequest();obj={conn:http,tId:transactionId};}
    +catch(e)
    +{for(var i=0;i<this._msxml_progid.length;++i){try
    +{http=new ActiveXObject(this._msxml_progid[i]);obj={conn:http,tId:transactionId};break;}
    +catch(e){}}}
    +finally
    +{return obj;}},getConnectionObject:function()
    +{var o;var tId=this._transaction_id;try
    +{o=this.createXhrObject(tId);if(o){this._transaction_id++;}}
    +catch(e){}
    +finally
    +{return o;}},asyncRequest:function(method,uri,callback,postData)
    +{var o=this.getConnectionObject();if(!o){return null;}
    +else{if(this._isFormSubmit){if(this._isFileUpload){this.uploadFile(o.tId,callback,uri,postData);this.releaseObject(o);return;}
    +if(method=='GET'){if(this._sFormData.length!=0){uri+=((uri.indexOf('?')==-1)?'?':'&')+this._sFormData;}
    +else{uri+="?"+this._sFormData;}}
    +else if(method=='POST'){postData=postData?this._sFormData+"&"+postData:this._sFormData;}}
    +o.conn.open(method,uri,true);if(this._isFormSubmit||(postData&&this._use_default_post_header)){this.initHeader('Content-Type',this._default_post_header);if(this._isFormSubmit){this.resetFormState();}}
    +if(this._has_http_headers){this.setHeader(o);}
    +this.handleReadyState(o,callback);o.conn.send(postData||null);return o;}},handleReadyState:function(o,callback)
    +{var oConn=this;if(callback&&callback.timeout){this._timeOut[o.tId]=window.setTimeout(function(){oConn.abort(o,callback,true);},callback.timeout);}
    +this._poll[o.tId]=window.setInterval(function(){if(o.conn&&o.conn.readyState==4){window.clearInterval(oConn._poll[o.tId]);delete oConn._poll[o.tId];if(callback&&callback.timeout){delete oConn._timeOut[o.tId];}
    +oConn.handleTransactionResponse(o,callback);}},this._polling_interval);},handleTransactionResponse:function(o,callback,isAbort)
    +{if(!callback){this.releaseObject(o);return;}
    +var httpStatus,responseObject;try
    +{if(o.conn.status!==undefined&&o.conn.status!=0){httpStatus=o.conn.status;}
    +else{httpStatus=13030;}}
    +catch(e){httpStatus=13030;}
    +if(httpStatus>=200&&httpStatus<300){try
    +{responseObject=this.createResponseObject(o,callback.argument);if(callback.success){if(!callback.scope){callback.success(responseObject);}
    +else{callback.success.apply(callback.scope,[responseObject]);}}}
    +catch(e){}}
    +else{try
    +{switch(httpStatus){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:responseObject=this.createExceptionObject(o.tId,callback.argument,(isAbort?isAbort:false));if(callback.failure){if(!callback.scope){callback.failure(responseObject);}
    +else{callback.failure.apply(callback.scope,[responseObject]);}}
    +break;default:responseObject=this.createResponseObject(o,callback.argument);if(callback.failure){if(!callback.scope){callback.failure(responseObject);}
    +else{callback.failure.apply(callback.scope,[responseObject]);}}}}
    +catch(e){}}
    +this.releaseObject(o);responseObject=null;},createResponseObject:function(o,callbackArg)
    +{var obj={};var headerObj={};try
    +{var headerStr=o.conn.getAllResponseHeaders();var header=headerStr.split('\n');for(var i=0;i<header.length;i++){var delimitPos=header[i].indexOf(':');if(delimitPos!=-1){headerObj[header[i].substring(0,delimitPos)]=header[i].substring(delimitPos+2);}}}
    +catch(e){}
    +obj.tId=o.tId;obj.status=o.conn.status;obj.statusText=o.conn.statusText;obj.getResponseHeader=headerObj;obj.getAllResponseHeaders=headerStr;obj.responseText=o.conn.responseText;obj.responseXML=o.conn.responseXML;if(typeof callbackArg!==undefined){obj.argument=callbackArg;}
    +return obj;},createExceptionObject:function(tId,callbackArg,isAbort)
    +{var COMM_CODE=0;var COMM_ERROR='communication failure';var ABORT_CODE=-1;var ABORT_ERROR='transaction aborted';var obj={};obj.tId=tId;if(isAbort){obj.status=ABORT_CODE;obj.statusText=ABORT_ERROR;}
    +else{obj.status=COMM_CODE;obj.statusText=COMM_ERROR;}
    +if(callbackArg){obj.argument=callbackArg;}
    +return obj;},initHeader:function(label,value)
    +{if(this._http_header[label]===undefined){this._http_header[label]=value;}
    +else{this._http_header[label]=value+","+this._http_header[label];}
    +this._has_http_headers=true;},setHeader:function(o)
    +{for(var prop in this._http_header){if(this._http_header.hasOwnProperty(prop)){o.conn.setRequestHeader(prop,this._http_header[prop]);}}
    +delete this._http_header;this._http_header={};this._has_http_headers=false;},setForm:function(formId,isUpload,secureUri)
    +{this.resetFormState();var oForm;if(typeof formId=='string'){oForm=(document.getElementById(formId)||document.forms[formId]);}
    +else if(typeof formId=='object'){oForm=formId;}
    +else{return;}
    +if(isUpload){this.createFrame(secureUri?secureUri:null);this._isFormSubmit=true;this._isFileUpload=true;this._formNode=oForm;return;}
    +var oElement,oName,oValue,oDisabled;var hasSubmit=false;for(var i=0;i<oForm.elements.length;i++){oElement=oForm.elements[i];oDisabled=oForm.elements[i].disabled;oName=oForm.elements[i].name;oValue=oForm.elements[i].value;if(!oDisabled&&oName)
    +{switch(oElement.type)
    +{case'select-one':case'select-multiple':for(var j=0;j<oElement.options.length;j++){if(oElement.options[j].selected){if(window.ActiveXObject){this._sFormData+=encodeURIComponent(oName)+'='+encodeURIComponent(oElement.options[j].attributes['value'].specified?oElement.options[j].value:oElement.options[j].text)+'&';}
    +else{this._sFormData+=encodeURIComponent(oName)+'='+encodeURIComponent(oElement.options[j].hasAttribute('value')?oElement.options[j].value:oElement.options[j].text)+'&';}}}
    +break;case'radio':case'checkbox':if(oElement.checked){this._sFormData+=encodeURIComponent(oName)+'='+encodeURIComponent(oValue)+'&';}
    +break;case'file':case undefined:case'reset':case'button':break;case'submit':if(hasSubmit==false){this._sFormData+=encodeURIComponent(oName)+'='+encodeURIComponent(oValue)+'&';hasSubmit=true;}
    +break;default:this._sFormData+=encodeURIComponent(oName)+'='+encodeURIComponent(oValue)+'&';break;}}}
    +this._isFormSubmit=true;this._sFormData=this._sFormData.substr(0,this._sFormData.length-1);return this._sFormData;},resetFormState:function(){this._isFormSubmit=false;this._isFileUpload=false;this._formNode=null;this._sFormData="";},createFrame:function(secureUri){var frameId='yuiIO'+this._transaction_id;if(window.ActiveXObject){var io=document.createElement('<iframe id="'+frameId+'" name="'+frameId+'" />');if(typeof secureUri=='boolean'){io.src='javascript:false';}
    +else if(typeof secureURI=='string'){io.src=secureUri;}}
    +else{var io=document.createElement('iframe');io.id=frameId;io.name=frameId;}
    +io.style.position='absolute';io.style.top='-1000px';io.style.left='-1000px';document.body.appendChild(io);},appendPostData:function(postData)
    +{var formElements=new Array();var postMessage=postData.split('&');for(var i=0;i<postMessage.length;i++){var delimitPos=postMessage[i].indexOf('=');if(delimitPos!=-1){formElements[i]=document.createElement('input');formElements[i].type='hidden';formElements[i].name=postMessage[i].substring(0,delimitPos);formElements[i].value=postMessage[i].substring(delimitPos+1);this._formNode.appendChild(formElements[i]);}}
    +return formElements;},uploadFile:function(id,callback,uri,postData){var frameId='yuiIO'+id;var io=document.getElementById(frameId);this._formNode.action=uri;this._formNode.method='POST';this._formNode.target=frameId;if(this._formNode.encoding){this._formNode.encoding='multipart/form-data';}
    +else{this._formNode.enctype='multipart/form-data';}
    +if(postData){var oElements=this.appendPostData(postData);}
    +this._formNode.submit();if(oElements&&oElements.length>0){try
    +{for(var i=0;i<oElements.length;i++){this._formNode.removeChild(oElements[i]);}}
    +catch(e){}}
    +this.resetFormState();var uploadCallback=function()
    +{var obj={};obj.tId=id;obj.argument=callback.argument;try
    +{obj.responseText=io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;obj.responseXML=io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;}
    +catch(e){}
    +if(callback.upload){if(!callback.scope){callback.upload(obj);}
    +else{callback.upload.apply(callback.scope,[obj]);}}
    +if(YAHOO.util.Event){YAHOO.util.Event.removeListener(io,"load",uploadCallback);}
    +else if(window.detachEvent){io.detachEvent('onload',uploadCallback);}
    +else{io.removeEventListener('load',uploadCallback,false);}
    +setTimeout(function(){document.body.removeChild(io);},100);};if(YAHOO.util.Event){YAHOO.util.Event.addListener(io,"load",uploadCallback);}
    +else if(window.attachEvent){io.attachEvent('onload',uploadCallback);}
    +else{io.addEventListener('load',uploadCallback,false);}},abort:function(o,callback,isTimeout)
    +{if(this.isCallInProgress(o)){o.conn.abort();window.clearInterval(this._poll[o.tId]);delete this._poll[o.tId];if(isTimeout){delete this._timeOut[o.tId];}
    +this.handleTransactionResponse(o,callback,true);return true;}
    +else{return false;}},isCallInProgress:function(o)
    +{if(o.conn){return o.conn.readyState!=4&&o.conn.readyState!=0;}
    +else{return false;}},releaseObject:function(o)
    +{o.conn=null;o=null;}};

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/yahoo-dom-event.js.html b/www/extras/yui-ext/docs/output/yahoo-dom-event.js.html new file mode 100644 index 000000000..6b5107b5e --- /dev/null +++ b/www/extras/yui-ext/docs/output/yahoo-dom-event.js.html @@ -0,0 +1 @@ +yahoo-dom-event.js
    /* Copyright (c) 2006, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txtversion: 0.12.0 */ if(typeof YAHOO=="undefined"){var YAHOO={};}YAHOO.namespace=function(){var a=arguments,o=null,i,j,d;for(i=0;i<a.length;++i){d=a[i].split(".");o=YAHOO;for(j=(d[0]=="YAHOO")?1:0;j<d.length;++j){o[d[j]]=o[d[j]]||{};o=o[d[j]];}}return o;};YAHOO.log=function(_2,_3,_4){var l=YAHOO.widget.Logger;if(l&&l.log){return l.log(_2,_3,_4);}else{return false;}};YAHOO.extend=function(_6,_7,_8){var F=function(){};F.prototype=_7.prototype;_6.prototype=new F();_6.prototype.constructor=_6;_6.superclass=_7.prototype;if(_7.prototype.constructor==Object.prototype.constructor){_7.prototype.constructor=_7;}if(_8){for(var i in _8){_6.prototype[i]=_8[i];}}};YAHOO.augment=function(r,s){var rp=r.prototype,sp=s.prototype,a=arguments,i,p;if(a[2]){for(i=2;i<a.length;++i){rp[a[i]]=sp[a[i]];}}else{for(p in sp){if(!rp[p]){rp[p]=sp[p];}}}};YAHOO.namespace("util","widget","example");(function(){var Y=YAHOO.util,getStyle,setStyle,id_counter=0,propertyCache={};var ua=navigator.userAgent.toLowerCase(),isOpera=(ua.indexOf('opera')>-1),isSafari=(ua.indexOf('safari')>-1),isGecko=(!isOpera&&!isSafari&&ua.indexOf('gecko')>-1),isIE=(!isOpera&&ua.indexOf('msie')>-1);var patterns={HYPHEN:/(-[a-z])/i};var toCamel=function(property){if(!patterns.HYPHEN.test(property)){return property;}if(propertyCache[property]){return propertyCache[property];}while(patterns.HYPHEN.exec(property)){property=property.replace(RegExp.$1,RegExp.$1.substr(1).toUpperCase());}propertyCache[property]=property;return property;};if(document.defaultView&&document.defaultView.getComputedStyle){getStyle=function(el,property){var value=null;var computed=document.defaultView.getComputedStyle(el,'');if(computed){value=computed[toCamel(property)];}return el.style[property]||value;};}else if(document.documentElement.currentStyle&&isIE){getStyle=function(el,property){switch(toCamel(property)){case'opacity':var val=100;try{val=el.filters['DXImageTransform.Microsoft.Alpha'].opacity;}catch(e){try{val=el.filters('alpha').opacity;}catch(e){}}return val/100;break;default:var value=el.currentStyle?el.currentStyle[property]:null;return(el.style[property]||value);}};}else{getStyle=function(el,property){return el.style[property];};}if(isIE){setStyle=function(el,property,val){switch(property){case'opacity':if(typeof el.style.filter=='string'){el.style.filter='alpha(opacity='+val*100+')';if(!el.currentStyle||!el.currentStyle.hasLayout){el.style.zoom=1;}}break;default:el.style[property]=val;}};}else{setStyle=function(el,property,val){el.style[property]=val;};}YAHOO.util.Dom={get:function(el){if(!el){return null;}if(typeof el!='string'&&!(el instanceof Array)){return el;}if(typeof el=='string'){return document.getElementById(el);}else{var collection=[];for(var i=0,len=el.length;i<len;++i){collection[collection.length]=Y.Dom.get(el[i]);}return collection;}return null;},getStyle:function(el,property){property=toCamel(property);var f=function(element){return getStyle(element,property);};return Y.Dom.batch(el,f,Y.Dom,true);},setStyle:function(el,property,val){property=toCamel(property);var f=function(element){setStyle(element,property,val);};Y.Dom.batch(el,f,Y.Dom,true);},getXY:function(el){var f=function(el){if(el.parentNode===null||el.offsetParent===null||this.getStyle(el,'display')=='none'){return false;}var parentNode=null;var pos=[];var box;if(el.getBoundingClientRect){box=el.getBoundingClientRect();var doc=document;if(!this.inDocument(el)&&parent.document!=document){doc=parent.document;if(!this.isAncestor(doc.documentElement,el)){return false;}}var scrollTop=Math.max(doc.documentElement.scrollTop,doc.body.scrollTop);var scrollLeft=Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft);return[box.left+scrollLeft,box.top+scrollTop];}else{pos=[el.offsetLeft,el.offsetTop];parentNode=el.offsetParent;if(parentNode!=el){while(parentNode){pos[0]+=parentNode.offsetLeft;pos[1]+=parentNode.offsetTop;parentNode=parentNode.offsetParent;}}if(isSafari&&this.getStyle(el,'position')=='absolute'){pos[0]-=document.body.offsetLeft;pos[1]-=document.body.offsetTop;}}if(el.parentNode){parentNode=el.parentNode;}else{parentNode=null;}while(parentNode&&parentNode.tagName.toUpperCase()!='BODY'&&parentNode.tagName.toUpperCase()!='HTML'){if(Y.Dom.getStyle(parentNode,'display')!='inline'){pos[0]-=parentNode.scrollLeft;pos[1]-=parentNode.scrollTop;}if(parentNode.parentNode){parentNode=parentNode.parentNode;}else{parentNode=null;}}return pos;};return Y.Dom.batch(el,f,Y.Dom,true);},getX:function(el){var f=function(el){return Y.Dom.getXY(el)[0];};return Y.Dom.batch(el,f,Y.Dom,true);},getY:function(el){var f=function(el){return Y.Dom.getXY(el)[1];};return Y.Dom.batch(el,f,Y.Dom,true);},setXY:function(el,pos,noRetry){var f=function(el){var style_pos=this.getStyle(el,'position');if(style_pos=='static'){this.setStyle(el,'position','relative');style_pos='relative';}var pageXY=this.getXY(el);if(pageXY===false){return false;}var delta=[parseInt(this.getStyle(el,'left'),10),parseInt(this.getStyle(el,'top'),10)];if(isNaN(delta[0])){delta[0]=(style_pos=='relative')?0:el.offsetLeft;}if(isNaN(delta[1])){delta[1]=(style_pos=='relative')?0:el.offsetTop;}if(pos[0]!==null){el.style.left=pos[0]-pageXY[0]+delta[0]+'px';}if(pos[1]!==null){el.style.top=pos[1]-pageXY[1]+delta[1]+'px';}var newXY=this.getXY(el);if(!noRetry&&(newXY[0]!=pos[0]||newXY[1]!=pos[1])){this.setXY(el,pos,true);}};Y.Dom.batch(el,f,Y.Dom,true);},setX:function(el,x){Y.Dom.setXY(el,[x,null]);},setY:function(el,y){Y.Dom.setXY(el,[null,y]);},getRegion:function(el){var f=function(el){var region=new Y.Region.getRegion(el);return region;};return Y.Dom.batch(el,f,Y.Dom,true);},getClientWidth:function(){return Y.Dom.getViewportWidth();},getClientHeight:function(){return Y.Dom.getViewportHeight();},getElementsByClassName:function(className,tag,root){var method=function(el){return Y.Dom.hasClass(el,className);};return Y.Dom.getElementsBy(method,tag,root);},hasClass:function(el,className){var re=new RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)');var f=function(el){return re.test(el['className']);};return Y.Dom.batch(el,f,Y.Dom,true);},addClass:function(el,className){var f=function(el){if(this.hasClass(el,className)){return;}el['className']=[el['className'],className].join(' ');};Y.Dom.batch(el,f,Y.Dom,true);},removeClass:function(el,className){var re=new RegExp('(?:^|\\s+)'+className+'(?:\\s+|$)','g');var f=function(el){if(!this.hasClass(el,className)){return;}var c=el['className'];el['className']=c.replace(re,' ');if(this.hasClass(el,className)){this.removeClass(el,className);}};Y.Dom.batch(el,f,Y.Dom,true);},replaceClass:function(el,oldClassName,newClassName){if(oldClassName===newClassName){return false;}var re=new RegExp('(?:^|\\s+)'+oldClassName+'(?:\\s+|$)','g');var f=function(el){if(!this.hasClass(el,oldClassName)){this.addClass(el,newClassName);return;}el['className']=el['className'].replace(re,' '+newClassName+' ');if(this.hasClass(el,oldClassName)){this.replaceClass(el,oldClassName,newClassName);}};Y.Dom.batch(el,f,Y.Dom,true);},generateId:function(el,prefix){prefix=prefix||'yui-gen';el=el||{};var f=function(el){if(el){el=Y.Dom.get(el);}else{el={};}if(!el.id){el.id=prefix+id_counter++;}return el.id;};return Y.Dom.batch(el,f,Y.Dom,true);},isAncestor:function(haystack,needle){haystack=Y.Dom.get(haystack);if(!haystack||!needle){return false;}var f=function(needle){if(haystack.contains&&!isSafari){return haystack.contains(needle);}else if(haystack.compareDocumentPosition){return!!(haystack.compareDocumentPosition(needle)&16);}else{var parent=needle.parentNode;while(parent){if(parent==haystack){return true;}else if(!parent.tagName||parent.tagName.toUpperCase()=='HTML'){return false;}parent=parent.parentNode;}return false;}};return Y.Dom.batch(needle,f,Y.Dom,true);},inDocument:function(el){var f=function(el){return this.isAncestor(document.documentElement,el);};return Y.Dom.batch(el,f,Y.Dom,true);},getElementsBy:function(method,tag,root){tag=tag||'*';root=Y.Dom.get(root)||document;var nodes=[];var elements=root.getElementsByTagName(tag);if(!elements.length&&(tag=='*'&&root.all)){elements=root.all;}for(var i=0,len=elements.length;i<len;++i){if(method(elements[i])){nodes[nodes.length]=elements[i];}}return nodes;},batch:function(el,method,o,override){var id=el;el=Y.Dom.get(el);var scope=(override)?o:window;if(!el||el.tagName||!el.length){if(!el){return false;}return method.call(scope,el,o);}var collection=[];for(var i=0,len=el.length;i<len;++i){if(!el[i]){id=el[i];}collection[collection.length]=method.call(scope,el[i],o);}return collection;},getDocumentHeight:function(){var scrollHeight=(document.compatMode!='CSS1Compat')?document.body.scrollHeight:document.documentElement.scrollHeight;var h=Math.max(scrollHeight,Y.Dom.getViewportHeight());return h;},getDocumentWidth:function(){var scrollWidth=(document.compatMode!='CSS1Compat')?document.body.scrollWidth:document.documentElement.scrollWidth;var w=Math.max(scrollWidth,Y.Dom.getViewportWidth());return w;},getViewportHeight:function(){var height=self.innerHeight;var mode=document.compatMode;if((mode||isIE)&&!isOpera){height=(mode=='CSS1Compat')?document.documentElement.clientHeight:document.body.clientHeight;}return height;},getViewportWidth:function(){var width=self.innerWidth;var mode=document.compatMode;if(mode||isIE){width=(mode=='CSS1Compat')?document.documentElement.clientWidth:document.body.clientWidth;}return width;}};})();YAHOO.util.Region=function(t,r,b,l){this.top=t;this[1]=t;this.right=r;this.bottom=b;this.left=l;this[0]=l;};YAHOO.util.Region.prototype.contains=function(region){return(region.left>=this.left&&region.right<=this.right&&region.top>=this.top&&region.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(region){var t=Math.max(this.top,region.top);var r=Math.min(this.right,region.right);var b=Math.min(this.bottom,region.bottom);var l=Math.max(this.left,region.left);if(b>=t&&r>=l){return new YAHOO.util.Region(t,r,b,l);}else{return null;}};YAHOO.util.Region.prototype.union=function(region){var t=Math.min(this.top,region.top);var r=Math.max(this.right,region.right);var b=Math.max(this.bottom,region.bottom);var l=Math.min(this.left,region.left);return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+"}");};YAHOO.util.Region.getRegion=function(el){var p=YAHOO.util.Dom.getXY(el);var t=p[1];var r=p[0]+el.offsetWidth;var b=p[1]+el.offsetHeight;var l=p[0];return new YAHOO.util.Region(t,r,b,l);};YAHOO.util.Point=function(x,y){if(x instanceof Array){y=x[1];x=x[0];}this.x=this.right=this.left=this[0]=x;this.y=this.top=this.bottom=this[1]=y;};YAHOO.util.Point.prototype=new YAHOO.util.Region();YAHOO.util.CustomEvent=function(_1,_2,_3,_4){this.type=_1;this.scope=_2||window;this.silent=_3;this.signature=_4||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var _5="_YUICEOnSubscribe";if(_1!==_5){this.subscribeEvent=new YAHOO.util.CustomEvent(_5,this,true);}};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(fn,_7,_8){if(this.subscribeEvent){this.subscribeEvent.fire(fn,_7,_8);}this.subscribers.push(new YAHOO.util.Subscriber(fn,_7,_8));},unsubscribe:function(fn,_9){var _10=false;for(var i=0,len=this.subscribers.length;i<len;++i){var s=this.subscribers[i];if(s&&s.contains(fn,_9)){this._delete(i);_10=true;}}return _10;},fire:function(){var len=this.subscribers.length;if(!len&&this.silent){return true;}var _14=[],ret=true,i;for(i=0;i<arguments.length;++i){_14.push(arguments[i]);}var _15=_14.length;if(!this.silent){}for(i=0;i<len;++i){var s=this.subscribers[i];if(s){if(!this.silent){}var _16=s.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var _17=null;if(_14.length>0){_17=_14[0];}ret=s.fn.call(_16,_17,s.obj);}else{ret=s.fn.call(_16,this.type,_14,s.obj);}if(false===ret){if(!this.silent){}return false;}}}return true;},unsubscribeAll:function(){for(var i=0,len=this.subscribers.length;i<len;++i){this._delete(len-1-i);}},_delete:function(_18){var s=this.subscribers[_18];if(s){delete s.fn;delete s.obj;}this.subscribers.splice(_18,1);},toString:function(){return "CustomEvent: "+"'"+this.type+"', "+"scope: "+this.scope;}};YAHOO.util.Subscriber=function(fn,obj,_20){this.fn=fn;this.obj=obj||null;this.override=_20;};YAHOO.util.Subscriber.prototype.getScope=function(_21){if(this.override){if(this.override===true){return this.obj;}else{return this.override;}}return _21;};YAHOO.util.Subscriber.prototype.contains=function(fn,obj){if(obj){return (this.fn==fn&&this.obj==obj);}else{return (this.fn==fn);}};YAHOO.util.Subscriber.prototype.toString=function(){return "Subscriber { obj: "+(this.obj||"")+", override: "+(this.override||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var _22=false;var _23=[];var _24=[];var _25=[];var _26=[];var _27=0;var _28=[];var _29=[];var _30=0;return {POLL_RETRYS:200,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,OBJ:3,ADJ_SCOPE:4,isSafari:(/Safari|Konqueror|KHTML/gi).test(navigator.userAgent),isIE:(!this.isSafari&&!navigator.userAgent.match(/opera/gi)&&navigator.userAgent.match(/msie/gi)),_interval:null,startInterval:function(){if(!this._interval){var _31=this;var _32=function(){_31._tryPreloadAttach();};this._interval=setInterval(_32,this.POLL_INTERVAL);}},onAvailable:function(_33,_34,_35,_36){_28.push({id:_33,fn:_34,obj:_35,override:_36,checkReady:false});_27=this.POLL_RETRYS;this.startInterval();},onContentReady:function(_37,_38,_39,_40){_28.push({id:_37,fn:_38,obj:_39,override:_40,checkReady:true});_27=this.POLL_RETRYS;this.startInterval();},addListener:function(el,_42,fn,obj,_43){if(!fn||!fn.call){return false;}if(this._isValidCollection(el)){var ok=true;for(var i=0,len=el.length;i<len;++i){ok=this.on(el[i],_42,fn,obj,_43)&&ok;}return ok;}else{if(typeof el=="string"){var oEl=this.getEl(el);if(oEl){el=oEl;}else{this.onAvailable(el,function(){YAHOO.util.Event.on(el,_42,fn,obj,_43);});return true;}}}if(!el){return false;}if("unload"==_42&&obj!==this){_24[_24.length]=[el,_42,fn,obj,_43];return true;}var _46=el;if(_43){if(_43===true){_46=obj;}else{_46=_43;}}var _47=function(e){return fn.call(_46,YAHOO.util.Event.getEvent(e),obj);};var li=[el,_42,fn,_47,_46];var _50=_23.length;_23[_50]=li;if(this.useLegacyEvent(el,_42)){var _51=this.getLegacyIndex(el,_42);if(_51==-1||el!=_25[_51][0]){_51=_25.length;_29[el.id+_42]=_51;_25[_51]=[el,_42,el["on"+_42]];_26[_51]=[];el["on"+_42]=function(e){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(e),_51);};}_26[_51].push(li);}else{this._simpleAdd(el,_42,_47,false);}return true;},fireLegacyEvent:function(e,_52){var ok=true;var le=_26[_52];for(var i=0,len=le.length;i<len;++i){var li=le[i];if(li&&li[this.WFN]){var _54=li[this.ADJ_SCOPE];var ret=li[this.WFN].call(_54,e);ok=(ok&&ret);}}return ok;},getLegacyIndex:function(el,_56){var key=this.generateId(el)+_56;if(typeof _29[key]=="undefined"){return -1;}else{return _29[key];}},useLegacyEvent:function(el,_58){if(!el.addEventListener&&!el.attachEvent){return true;}else{if(this.isSafari){if("click"==_58||"dblclick"==_58){return true;}}}return false;},removeListener:function(el,_59,fn){var i,len;if(typeof el=="string"){el=this.getEl(el);}else{if(this._isValidCollection(el)){var ok=true;for(i=0,len=el.length;i<len;++i){ok=(this.removeListener(el[i],_59,fn)&&ok);}return ok;}}if(!fn||!fn.call){return this.purgeElement(el,false,_59);}if("unload"==_59){for(i=0,len=_24.length;i<len;i++){var li=_24[i];if(li&&li[0]==el&&li[1]==_59&&li[2]==fn){_24.splice(i,1);return true;}}return false;}var _60=null;var _61=arguments[3];if("undefined"==typeof _61){_61=this._getCacheIndex(el,_59,fn);}if(_61>=0){_60=_23[_61];}if(!el||!_60){return false;}if(this.useLegacyEvent(el,_59)){var _62=this.getLegacyIndex(el,_59);var _63=_26[_62];if(_63){for(i=0,len=_63.length;i<len;++i){li=_63[i];if(li&&li[this.EL]==el&&li[this.TYPE]==_59&&li[this.FN]==fn){_63.splice(i,1);}}}}else{this._simpleRemove(el,_59,_60[this.WFN],false);}delete _23[_61][this.WFN];delete _23[_61][this.FN];_23.splice(_61,1);return true;},getTarget:function(ev,_65){var t=ev.target||ev.srcElement;return this.resolveTextNode(t);},resolveTextNode:function(_67){if(_67&&3==_67.nodeType){return _67.parentNode;}else{return _67;}},getPageX:function(ev){var x=ev.pageX;if(!x&&0!==x){x=ev.clientX||0;if(this.isIE){x+=this._getScrollLeft();}}return x;},getPageY:function(ev){var y=ev.pageY;if(!y&&0!==y){y=ev.clientY||0;if(this.isIE){y+=this._getScrollTop();}}return y;},getXY:function(ev){return [this.getPageX(ev),this.getPageY(ev)];},getRelatedTarget:function(ev){var t=ev.relatedTarget;if(!t){if(ev.type=="mouseout"){t=ev.toElement;}else{if(ev.type=="mouseover"){t=ev.fromElement;}}}return this.resolveTextNode(t);},getTime:function(ev){if(!ev.time){var t=new Date().getTime();try{ev.time=t;}catch(e){return t;}}return ev.time;},stopEvent:function(ev){this.stopPropagation(ev);this.preventDefault(ev);},stopPropagation:function(ev){if(ev.stopPropagation){ev.stopPropagation();}else{ev.cancelBubble=true;}},preventDefault:function(ev){if(ev.preventDefault){ev.preventDefault();}else{ev.returnValue=false;}},getEvent:function(e){var ev=e||window.event;if(!ev){var c=this.getEvent.caller;while(c){ev=c.arguments[0];if(ev&&Event==ev.constructor){break;}c=c.caller;}}return ev;},getCharCode:function(ev){return ev.charCode||ev.keyCode||0;},_getCacheIndex:function(el,_71,fn){for(var i=0,len=_23.length;i<len;++i){var li=_23[i];if(li&&li[this.FN]==fn&&li[this.EL]==el&&li[this.TYPE]==_71){return i;}}return -1;},generateId:function(el){var id=el.id;if(!id){id="yuievtautoid-"+_30;++_30;el.id=id;}return id;},_isValidCollection:function(o){return (o&&o.length&&typeof o!="string"&&!o.tagName&&!o.alert&&typeof o[0]!="undefined");},elCache:{},getEl:function(id){return document.getElementById(id);},clearCache:function(){},_load:function(e){_22=true;var EU=YAHOO.util.Event;if(this.isIE){EU._simpleRemove(window,"load",EU._load);}},_tryPreloadAttach:function(){if(this.locked){return false;}this.locked=true;var _75=!_22;if(!_75){_75=(_27>0);}var _76=[];for(var i=0,len=_28.length;i<len;++i){var _77=_28[i];if(_77){var el=this.getEl(_77.id);if(el){if(!_77.checkReady||_22||el.nextSibling||(document&&document.body)){var _78=el;if(_77.override){if(_77.override===true){_78=_77.obj;}else{_78=_77.override;}}_77.fn.call(_78,_77.obj);delete _28[i];}}else{_76.push(_77);}}}_27=(_76.length===0)?0:_27-1;if(_75){this.startInterval();}else{clearInterval(this._interval);this._interval=null;}this.locked=false;return true;},purgeElement:function(el,_79,_80){var _81=this.getListeners(el,_80);if(_81){for(var i=0,len=_81.length;i<len;++i){var l=_81[i];this.removeListener(el,l.type,l.fn);}}if(_79&&el&&el.childNodes){for(i=0,len=el.childNodes.length;i<len;++i){this.purgeElement(el.childNodes[i],_79,_80);}}},getListeners:function(el,_83){var _84=[];if(_23&&_23.length>0){for(var i=0,len=_23.length;i<len;++i){var l=_23[i];if(l&&l[this.EL]===el&&(!_83||_83===l[this.TYPE])){_84.push({type:l[this.TYPE],fn:l[this.FN],obj:l[this.OBJ],adjust:l[this.ADJ_SCOPE],index:i});}}}return (_84.length)?_84:null;},_unload:function(e){var EU=YAHOO.util.Event,i,j,l,len,index;for(i=0,len=_24.length;i<len;++i){l=_24[i];if(l){var _85=window;if(l[EU.ADJ_SCOPE]){if(l[EU.ADJ_SCOPE]===true){_85=l[EU.OBJ];}else{_85=l[EU.ADJ_SCOPE];}}l[EU.FN].call(_85,EU.getEvent(e),l[EU.OBJ]);delete _24[i];l=null;_85=null;}}if(_23&&_23.length>0){j=_23.length;while(j){index=j-1;l=_23[index];if(l){EU.removeListener(l[EU.EL],l[EU.TYPE],l[EU.FN],index);}j=j-1;}l=null;EU.clearCache();}for(i=0,len=_25.length;i<len;++i){delete _25[i][0];delete _25[i];}EU._simpleRemove(window,"unload",EU._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var dd=document.documentElement,db=document.body;if(dd&&(dd.scrollTop||dd.scrollLeft)){return [dd.scrollTop,dd.scrollLeft];}else{if(db){return [db.scrollTop,db.scrollLeft];}else{return [0,0];}}},_simpleAdd:function(){if(window.addEventListener){return function(el,_87,fn,_88){el.addEventListener(_87,fn,(_88));};}else{if(window.attachEvent){return function(el,_89,fn,_90){el.attachEvent("on"+_89,fn);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(el,_91,fn,_92){el.removeEventListener(_91,fn,(_92));};}else{if(window.detachEvent){return function(el,_93,fn){el.detachEvent("on"+_93,fn);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;if(document&&document.body){EU._load();}else{EU._simpleAdd(window,"load",EU._load);}EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(_94,_95,_96,_97){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_94];if(ce){ce.subscribe(_95,_96,_97);}else{this.__yui_subscribers=this.__yui_subscribers||{};var _99=this.__yui_subscribers;if(!_99[_94]){_99[_94]=[];}_99[_94].push({fn:_95,obj:_96,override:_97});}},unsubscribe:function(_100,p_fn,_102){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_100];if(ce){return ce.unsubscribe(p_fn,_102);}else{return false;}},createEvent:function(_103,_104){this.__yui_events=this.__yui_events||{};var opts=_104||{};var _106=this.__yui_events;if(_106[_103]){}else{var _107=opts.scope||this;var _108=opts.silent||null;var ce=new YAHOO.util.CustomEvent(_103,_107,_108,YAHOO.util.CustomEvent.FLAT);_106[_103]=ce;if(opts.onSubscribeCallback){ce.subscribeEvent.subscribe(opts.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var qs=this.__yui_subscribers[_103];if(qs){for(var i=0;i<qs.length;++i){ce.subscribe(qs[i].fn,qs[i].obj,qs[i].override);}}}return _106[_103];},fireEvent:function(_110,arg1,arg2,etc){this.__yui_events=this.__yui_events||{};var ce=this.__yui_events[_110];if(ce){var args=[];for(var i=1;i<arguments.length;++i){args.push(arguments[i]);}return ce.fire.apply(ce,args);}else{return null;}},hasEvent:function(type){if(this.__yui_events){if(this.__yui_events[type]){return true;}}return false;}};

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/yahoo.js.html b/www/extras/yui-ext/docs/output/yahoo.js.html new file mode 100644 index 000000000..020bf1442 --- /dev/null +++ b/www/extras/yui-ext/docs/output/yahoo.js.html @@ -0,0 +1,146 @@ +yahoo.js
    /*                                                                                                                                                      
    +Copyright (c) 2006, Yahoo! Inc. All rights reserved.
    +Code licensed under the BSD License:
    +http://developer.yahoo.net/yui/license.txt
    +version: 0.12.0
    +*/
    +// holder
    +/**
    + * The YAHOO object is the single global object used by YUI Library.  It
    + * contains utility function for setting up namespaces, inheritance, and
    + * logging.  YAHOO.util, YAHOO.widget, and YAHOO.example are namespaces
    + * created automatically for and used by the library.
    + * @module yahoo
    + * @title  YAHOO Global
    + */
    +// holder
    +/**
    + * The YAHOO global namespace object
    + * @class YAHOO
    + * @static
    + */
    +if (typeof YAHOO == "undefined") {
    +    var YAHOO = {};
    +}
    +
    +/**
    + * Returns the namespace specified and creates it if it doesn't exist
    + * <pre>
    + * YAHOO.namespace("property.package");
    + * YAHOO.namespace("YAHOO.property.package");
    + * </pre>
    + * Either of the above would create YAHOO.property, then
    + * YAHOO.property.package
    + *
    + * Be careful when naming packages. Reserved words may work in some browsers
    + * and not others. For instance, the following will fail in Safari:
    + * <pre>
    + * YAHOO.namespace("really.long.nested.namespace");
    + * </pre>
    + * This fails because "long" is a future reserved word in ECMAScript
    + *
    + * @method namespace
    + * @static
    + * @param  {String*} arguments 1-n namespaces to create 
    + * @return {Object}  A reference to the last namespace object created
    + */
    +YAHOO.namespace = function() {
    +    var a=arguments, o=null, i, j, d;
    +    for (i=0; i<a.length; ++i) {
    +        d=a[i].split(".");
    +        o=YAHOO;
    +
    +        // YAHOO is implied, so it is ignored if it is included
    +        for (j=(d[0] == "YAHOO") ? 1 : 0; j<d.length; ++j) {
    +            o[d[j]]=o[d[j]] || {};
    +            o=o[d[j]];
    +        }
    +    }
    +
    +    return o;
    +};
    +
    +/**
    + * Uses YAHOO.widget.Logger to output a log message, if the widget is available.
    + *
    + * @method log
    + * @static
    + * @param  {String}  msg  The message to log.
    + * @param  {String}  cat  The log category for the message.  Default
    + *                        categories are "info", "warn", "error", time".
    + *                        Custom categories can be used as well. (opt)
    + * @param  {String}  src  The source of the the message (opt)
    + * @return {Boolean}      True if the log operation was successful.
    + */
    +YAHOO.log = function(msg, cat, src) {
    +    var l=YAHOO.widget.Logger;
    +    if(l && l.log) {
    +        return l.log(msg, cat, src);
    +    } else {
    +        return false;
    +    }
    +};
    +
    +/**
    + * Utility to set up the prototype, constructor and superclass properties to
    + * support an inheritance strategy that can chain constructors and methods.
    + *
    + * @method extend
    + * @static
    + * @param {Function} subc   the object to modify
    + * @param {Function} superc the object to inherit
    + * @param {String[]} overrides  additional properties/methods to add to the
    + *                              subclass prototype.  These will override the
    + *                              matching items obtained from the superclass 
    + *                              if present.
    + */
    +YAHOO.extend = function(subc, superc, overrides) {
    +    var F = function() {};
    +    F.prototype=superc.prototype;
    +    subc.prototype=new F();
    +    subc.prototype.constructor=subc;
    +    subc.superclass=superc.prototype;
    +    if (superc.prototype.constructor == Object.prototype.constructor) {
    +        superc.prototype.constructor=superc;
    +    }
    +
    +    if (overrides) {
    +        for (var i in overrides) {
    +            subc.prototype[i]=overrides[i];
    +        }
    +    }
    +};
    +
    +/**
    + * Applies all prototype properties in the supplier to the receiver if the
    + * receiver does not have these properties yet.  Optionally, one or more
    + * methods/properties can be specified (as additional parameters).  This
    + * option will overwrite the property if receiver has it already.
    + *
    + * @method augment
    + * @static
    + * @param {Function} r  the object to receive the augmentation
    + * @param {Function} s  the object that supplies the properties to augment
    + * @param {String*}  arguments zero or more properties methods to augment the
    + *                             receiver with.  If none specified, everything
    + *                             in the supplier will be used unless it would
    + *                             overwrite an existing property in the receiver
    + */
    +YAHOO.augment = function(r, s) {
    +    var rp=r.prototype, sp=s.prototype, a=arguments, i, p;
    +    if (a[2]) {
    +        for (i=2; i<a.length; ++i) {
    +            rp[a[i]] = sp[a[i]];
    +        }
    +    } else {
    +        for (p in sp) { 
    +            if (!rp[p]) {
    +                rp[p] = sp[p];
    +            }
    +        }
    +    }
    +};
    +
    +YAHOO.namespace("util", "widget", "example");
    +
    +

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/output/yutil.js.html b/www/extras/yui-ext/docs/output/yutil.js.html new file mode 100644 index 000000000..4f169e01c --- /dev/null +++ b/www/extras/yui-ext/docs/output/yutil.js.html @@ -0,0 +1,411 @@ +yutil.js
    YAHOO.namespace('ext');
    +YAHOO.namespace('ext.util');
    +YAHOO.namespace('ext.grid');
    +YAHOO.ext.Strict = (document.compatMode == 'CSS1Compat');
    +YAHOO.ext.SSL_SECURE_URL = 'javascript:false';
    +// for old browsers
    +window.undefined = undefined;
    +/**
    + * @class Function
    + */
    + //
    +/**
    + * Creates a callback that passes arguments[0], arguments[1], arguments[2], ...
    + * Call directly on any function. Example: <code>myFunction.createCallback(myarg, myarg2)</code>
    + * Will create a function that is bound to those 2 args.
    + * @return {Function} The new function
    +*/
    +Function.prototype.createCallback = function(/*args...*/){
    +    // make args available, in function below
    +    var args = arguments;
    +    var method = this;
    +    return function() {
    +        return method.apply(window, args);
    +    };
    +};
    +
    +/**
    + * Creates a delegate (callback) that sets the scope to obj.
    + * Call directly on any function. Example: <code>this.myFunction.createDelegate(this)</code>
    + * Will create a function that is automatically scoped to this.
    + * @param {Object} obj (optional) The object for which the scope is set
    + * @param {<i>Array</i>} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
    + * @param {<i>Boolean/Number</i>} appendArgs (optional) if True args are appended to call args instead of overriding, 
    + *                                             if a number the args are inserted at the specified position
    + * @return {Function} The new function
    + */
    +Function.prototype.createDelegate = function(obj, args, appendArgs){
    +    var method = this;
    +    return function() {
    +        var callargs = args || arguments;
    +        if(appendArgs === true){
    +            callArgs = Array.prototype.slice.call(arguments, 0);
    +            callargs = callArgs.concat(args);
    +        }else if(typeof appendArgs == 'number'){
    +            callargs = Array.prototype.slice.call(arguments, 0); // copy arguments first
    +            var applyArgs = [appendArgs, 0].concat(args); // create method call params
    +            Array.prototype.splice.apply(callargs, applyArgs); // splice them in
    +        }
    +        return method.apply(obj || window, callargs);
    +    };
    +};
    +
    +/**
    + * Calls this function after the number of millseconds specified.
    + * @param {Number} millis The number of milliseconds for the setTimeout call
    + * @param {Object} obj (optional) The object for which the scope is set
    + * @param {<i>Array</i>} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller)
    + * @param {<i>Boolean/Number</i>} appendArgs (optional) if True args are appended to call args instead of overriding, 
    + *                                             if a number the args are inserted at the specified position
    + * @return {Number} The timeout id that can be used with clearTimeout
    + */
    +Function.prototype.defer = function(millis, obj, args, appendArgs){
    +    return setTimeout(this.createDelegate(obj, args, appendArgs), millis);
    +};
    +/**
    + * Create a combined function call sequence of the original function + the passed function.
    + * The resulting function returns the results of the original function.
    + * The passed fcn is called with the parameters of the original function
    + * @param {Function} fcn The function to sequence
    + * @param {<i>Object</i>} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)
    + * @return {Function} The new function
    + */
    +Function.prototype.createSequence = function(fcn, scope){
    +    if(typeof fcn != 'function'){
    +        return this;
    +    }
    +    var method = this;
    +    return function() {
    +        var retval = method.apply(this || window, arguments);
    +        fcn.apply(scope || this || window, arguments);
    +        return retval;
    +    };
    +};
    +
    +/**
    + * Creates an interceptor function. The passed fcn is called before the original one. If it returns false, the original one is not called.
    + * The resulting function returns the results of the original function.
    + * The passed fcn is called with the parameters of the original function.
    + * @addon
    + * @param {Function} fcn The function to call before the original
    + * @param {<i>Object</i>} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window)
    + * @return {Function} The new function
    + */
    +Function.prototype.createInterceptor = function(fcn, scope){
    +    if(typeof fcn != 'function'){
    +        return this;
    +    }
    +    var method = this;
    +    return function() {
    +        fcn.target = this;
    +        fcn.method = method;
    +        if(fcn.apply(scope || this || window, arguments) === false){
    +            return;
    +        }
    +        return method.apply(this || window, arguments);;
    +    };
    +};
    +
    +/**
    + * @class YAHOO.ext.util.Browser
    + * @singleton
    + */
    +YAHOO.ext.util.Browser = new function(){
    +	var ua = navigator.userAgent.toLowerCase();
    +	/** @type Boolean */
    +	this.isOpera = (ua.indexOf('opera') > -1);
    +   	/** @type Boolean */
    +	this.isSafari = (ua.indexOf('webkit') > -1);
    +   	/** @type Boolean */
    +	this.isIE = (window.ActiveXObject);
    +   	/** @type Boolean */
    +	this.isIE7 = (ua.indexOf('msie 7') > -1);
    +   	/** @type Boolean */
    +	this.isGecko = !this.isSafari && (ua.indexOf('gecko') > -1);
    +	
    +	if(ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1){
    +	    /** @type Boolean */
    +	    this.isWindows = true;
    +	}else if(ua.indexOf("macintosh") != -1){
    +		/** @type Boolean */
    +	    this.isMac = true;
    +	}
    +}();
    +
    +YAHOO.print = function(arg1, arg2, etc){
    +    if(!YAHOO.ext._console){
    +        var cs = YAHOO.ext.DomHelper.insertBefore(document.body.firstChild,
    +        {tag: 'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;' +
    +                'background:white;position:absolute;right:5px;top:5px;' +
    +                'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'}, true);
    +        new YAHOO.ext.Resizable(cs, {
    +            transparent:true,
    +            handles: 'all',
    +            pinned:true, 
    +            adjustments: [0,0], 
    +            wrap:true, 
    +            draggable:(YAHOO.util.DD ? true : false)
    +        });
    +        YAHOO.ext._console = cs;
    +    }
    +    var msg = '';
    +    for(var i = 0, len = arguments.length; i < len; i++) {
    +    	msg += arguments[i] + '<hr noshade style="color:#eeeeee;" size="1">';
    +    }
    +    YAHOO.ext._console.dom.innerHTML = msg + YAHOO.ext._console.dom.innerHTML;
    +    YAHOO.ext._console.dom.scrollTop = 0;
    +};
    +
    +YAHOO.printf = function(format, arg1, arg2, etc){
    +    var args = Array.prototype.slice.call(arguments, 1);
    +    YAHOO.print(format.replace(
    +      /\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g,
    +      function(m, a1, a2, a3) {
    +        if (m.chatAt == '{') {
    +          return m.slice(1, -1);
    +        }
    +        var rpl = args[a1];
    +        if (a3) {
    +          var f = eval(a3);
    +          rpl = f(rpl);
    +        }
    +        return rpl ? rpl : '';
    +      }));
    +}
    +
    +/**
    + * @class YAHOO.util.CustomEvent
    + */
    + //
    + /**
    + * Enable custom handler signature and event cancelling. Using fireDirect() instead of fire() calls the subscribed event handlers 
    + * with the exact parameters passed to fireDirect, instead of the usual (eventType, args[], obj). IMO this is more intuitive 
    + * and promotes cleaner code. Also, if an event handler returns false, it is returned by fireDirect and no other handlers will be called.<br>
    + * Example:<br><br><pre><code>
    + * if(beforeUpdateEvent.fireDirect(myArg, myArg2) !== false){
    + *     // do update
    + * }</code></pre>
    + */
    +YAHOO.util.CustomEvent.prototype.fireDirect = function(){
    +    var len=this.subscribers.length;
    +    for (var i=0; i<len; ++i) {
    +        var s = this.subscribers[i];
    +        if(s){
    +            var scope = (s.override) ? s.obj : this.scope;
    +            if(s.fn.apply(scope, arguments) === false){
    +                return false;
    +            }
    +        }
    +    }
    +    return true;
    +};
    +
    +YAHOO.extendX = function(subclass, superclass, overrides){
    +    YAHOO.extend(subclass, superclass);
    +    subclass.override = function(o){
    +        YAHOO.override(subclass, o);
    +    };
    +    if(!subclass.prototype.override){
    +        subclass.prototype.override = function(o){
    +            for(var method in o){
    +                this[method] = o[method];
    +            }  
    +        };
    +    }
    +    if(overrides){
    +        subclass.override(overrides);
    +    }
    +};
    +
    +YAHOO.override = function(origclass, overrides){
    +    if(overrides){
    +        var p = origclass.prototype;
    +        for(var method in overrides){
    +            p[method] = overrides[method];
    +        }
    +    }
    +};
    +
    +/**
    + * @class YAHOO.ext.util.DelayedTask
    + * Provides a convenient method of performing setTimeout where a new
    + * timeout cancels the old timeout. An example would be performing validation on a keypress.
    + * You can use this class to buffer
    + * the keypress events for a certain number of milliseconds, and perform only if they stop
    + * for that amount of time.
    + * @constructor The parameters to this constructor serve as defaults and are not required.
    + * @param {<i>Function</i>} fn (optional) The default function to timeout
    + * @param {<i>Object</i>} scope (optional) The default scope of that timeout
    + * @param {<i>Array</i>} args (optional) The default Array of arguments
    + */
    +YAHOO.ext.util.DelayedTask = function(fn, scope, args){
    +    var timeoutId = null;
    +    
    +    /**
    +     * Cancels any pending timeout and queues a new one
    +     * @param {Number} delay The milliseconds to delay
    +     * @param {Function} newFn (optional) Overrides function passed to constructor
    +     * @param {Object} newScope (optional) Overrides scope passed to constructor
    +     * @param {Array} newArgs (optional) Overrides args passed to constructor
    +     */
    +    this.delay = function(delay, newFn, newScope, newArgs){
    +        if(timeoutId){
    +            clearTimeout(timeoutId);
    +        }
    +        fn = newFn || fn;
    +        scope = newScope || scope;
    +        args = newArgs || args;
    +        timeoutId = setTimeout(fn.createDelegate(scope, args), delay);
    +    };
    +    
    +    /**
    +     * Cancel the last queued timeout
    +     */
    +    this.cancel = function(){
    +        if(timeoutId){
    +            clearTimeout(timeoutId);
    +            timeoutId = null;
    +        }
    +    };
    +};
    +
    +/**
    + * @class YAHOO.ext.util.Observable
    + * Abstract base class that provides a common interface for publishing events. Subclasses are expected to 
    + * to have a property "events" with all the events defined.<br>
    + * For example:
    + * <pre><code>
    + var Employee = function(name){
    +    this.name = name;
    +    this.events = {
    +        'fired' : new YAHOO.util.CustomEvent('fired'),
    +        'quit' : new YAHOO.util.CustomEvent('quit')
    +    }
    + }
    + YAHOO.extend(Employee, YAHOO.ext.util.Observable);
    +</code></pre>
    + */
    +YAHOO.ext.util.Observable = function(){};
    +YAHOO.ext.util.Observable.prototype = {
    +    /**
    +     * Fires the specified event with the passed parameters (minus the event name).
    +     * @param {String} eventName
    +     * @param {Object...} args Variable number of parameters are passed to handlers
    +     */
    +    fireEvent : function(){
    +        var ce = this.events[arguments[0].toLowerCase()];
    +        return ce.fireDirect.apply(ce, Array.prototype.slice.call(arguments, 1));
    +    },
    +    
    +    /**
    +     * Appends an event handler to this element
    +     * @param {String}   eventName     The type of event to listen for
    +     * @param {Function} handler        The method the event invokes
    +     * @param {<i>Object</i>}   scope  (optional) The scope (this object) for the handler
    +     * @param {<i>boolean</i>}  override (optional) If true, scope becomes the scope
    +     */
    +    addListener : function(eventName, fn, scope, override){
    +        eventName = eventName.toLowerCase();
    +        if(!this.events[eventName]){
    +            // added for a better message when subscribing to wrong event
    +            throw 'You are trying to listen for an event that does not exist: "' + eventName + '".';
    +        }
    +        this.events[eventName].subscribe(fn, scope, override);
    +    },
    +    
    +    /**
    +     * Appends an event handler to this element that is delayed the specified number of milliseconds.
    +     * @param {String}   eventName     The type of event to listen for
    +     * @param {Function} handler        The method the event invokes
    +     * @param {<i>Object</i>}   scope  (optional) The scope (this object) for the handler
    +     * @param {<i>Number</i>}  delay (optional) The number of milliseconds to delay
    +     * @return {Function} The wrapped function that was created (can be used to remove the listener)
    +     */
    +    delayedListener : function(eventName, fn, scope, delay){
    +        var newFn = function(){
    +            setTimeout(fn.createDelegate(scope, arguments), delay || 1);
    +        }
    +        this.addListener(eventName, newFn);
    +        return newFn;
    +    },
    +    
    +    /**
    +     * Removes a listener
    +     * @param {String}   eventName     The type of event to listen for
    +     * @param {Function} handler        The handler to remove
    +     * @param {<i>Object</i>}   scope  (optional) The scope (this object) for the handler
    +     */
    +    removeListener : function(eventName, fn, scope){
    +        this.events[eventName.toLowerCase()].unsubscribe(fn, scope);
    +    },
    +    
    +    /**
    +     * Removes all listeners for this object
    +     */
    +    purgeListeners : function(){
    +        for(var evt in this.events){
    +            if(typeof this.events[evt] != 'function'){
    +                 this.events[evt].unsubscribeAll();
    +            }
    +        }
    +    }
    +};
    +YAHOO.ext.util.Observable.prototype.on = YAHOO.ext.util.Observable.prototype.addListener;
    +
    +/**
    + * @class YAHOO.ext.util.Config
    + * Class with one useful method
    + * @singleton
    + */
    +YAHOO.ext.util.Config = {
    +    /**
    +     * Copies all the properties of config to obj.
    +     * @param {Object} obj The receiver of the properties
    +     * @param {Object} config The source of the properties
    +     * @param {Object} defaults A different object that will also be applied for default values
    +     * @return {Object} returns obj
    +     */
    +    apply : function(obj, config, defaults){
    +        if(defaults){
    +            this.apply(obj, defaults);
    +        }
    +        if(config){
    +            for(var prop in config){
    +                obj[prop] = config[prop];
    +            }
    +        }
    +        return obj;
    +    }
    +};
    +
    +if(!String.escape){
    +    String.escape = function(string) {
    +        return string.replace(/('|\\)/g, "\\$1");
    +    };
    +};
    +
    +String.leftPad = function (val, size, ch) {
    +    var result = new String(val);
    +    if (ch == null) {
    +        ch = " ";
    +    }
    +    while (result.length < size) {
    +        result = ch + result;
    +    }
    +    return result;
    +};
    +
    +// workaround for Safari 1.3 not supporting hasOwnProperty
    +if(YAHOO.util.Connect){
    +    YAHOO.util.Connect.setHeader = function(o){
    +		for(var prop in this._http_header){
    +		    // if(this._http_header.hasOwnProperty(prop)){
    +			if(typeof this._http_header[prop] != 'function'){
    +				o.conn.setRequestHeader(prop, this._http_header[prop]);
    +			}
    +		}
    +		delete this._http_header;
    +		this._http_header = {};
    +		this._has_http_headers = false;
    +	};   
    +}

    Copyright © 2006 Jack Slocum. All rights reserved. \ No newline at end of file diff --git a/www/extras/yui-ext/docs/resources/block-bg.gif b/www/extras/yui-ext/docs/resources/block-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3cf86dae85e9ef1e8531abfe22529369e820eec GIT binary patch literal 834 zcmZ?wbhEHbWMq(JXlG!!|K|6Dx4$2~`~CRcpC|ACJp1tH`NuymKK*(1>CfxWf8Kog z`|j)C_uu}0`1beH_rITi{QL6r-?yLtzW@67n+a literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/class.gif b/www/extras/yui-ext/docs/resources/class.gif new file mode 100644 index 0000000000000000000000000000000000000000..445769d3f863fff85bf8dae9e50ca2fbdd2d580f GIT binary patch literal 945 zcmZ?wbhEHb6krfwXlDQcQ_o~GuN3{H6Nag0EsGx6l|6PSd+b*I#H;qP!+!_A#wTHI zPb1o&CiOkbneseu`t#JOpR;CuEt~zKYW~Z@xnJuSzARt#t#2GZdv-WZP}~tRj*oB|LorIYr@vw({}!uwfFDhO(&LbJ2U^lzeR`sUwH800T8|T z00#d*{P_PLi2nZvyK9sf4FQ^mfZ|UUW(Ec>1|5)1pgh6A(Z?XlA>*-O!NF!$M-7&b z2M@Kd^GWGABrIrf5YP;mqG0Ic!oef1<ENsed*j@4Yk?RR_1qN#Xfm)wA literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/collapse-bg.gif b/www/extras/yui-ext/docs/resources/collapse-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6b8da2874a896a1ab8e2696819c3bd63508a0f6 GIT binary patch literal 1623 zcmeH`jZ>0$0DylW5+J15t3~B!rsQdgvZhxVFJHoCO`T4(X0rTXrj{vYrU`zgVrqUw zek7P?Ei+Qe(%fEA!qW3wYpF}Dwzb)&n_YU{?%nlg>~7D0@H}^qzmV_aD~5mu6arwg zFUHO<&Jm7x;v~56lUxPKZU<954oSTN)0x2;pND4phGp-IkRLdj3m+@siZAe^i-obJ z0pFG#K2Z^rSQT=r=Bv}naB1CA%YfQ5tu^Pjbjr8g z%dzRov+FK&>@D7jl+tx&uKG*vhANN2YR@M%j3K4>@D=84SMY3CGCFk>Jpl+P7$s~MXjFZ0>6q6>{Lu5mXL_ zQrfO>j53xZ&XVGip!JGjaWMAnf~koL2f2j^1Q21BF~7`yYrHWEurM2A*?tP2iYA@{ zI>2A0hraFKLB_lJENTV}mK16fB5Gk{$_|YVCP)_gx!yJzUO0?aO|#%pWPCQ#OdwJM>RYFO%&8Xd+W!UEu$K^hhWB?PY$>31?<-d67T) z$cS=X6`{rfO4Ho=g+ML<7(dTQ!QvS}-RKQisyqxJ+3t$=?c{OZ<hsNHY;u>7j9%@GC*!=W@1J$dJGlN*ptUj)CE5u(b(i(9HCCNcC=7c&jR=j?3L&N165s=&d@RAOZ%4`Ar&}T;7%$d> zO69`*S0%@+xs6${>nf-qzI$fJL-U=Y1TO6#g6iTFA(yONTC~9jJ@m{%Rba3423U}6j|NVNOF-)6q2wwapiq}#t60&B98h){D)4L@YZhjk z1oJD6lr%jZCN7oo!{gpc#CJ_%=(7bW)25D*qKj)Sv>k##7OsTRtWVr7RJF6WgJl?s z;8GdUBJmgUZ7qGpMF&)XZS*9a8=P|t5 z-YTPhjC)R;vxPV=d%QU^wa=8wA;_^4glSFcIqkVyo4bX16j(`{+C7-XHoiT=V@)D$Yiqxv2i9&6TzmVDG;wX8^kZ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/cssQuery.js b/www/extras/yui-ext/docs/resources/cssQuery.js new file mode 100644 index 000000000..4a7eb88a9 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/cssQuery.js @@ -0,0 +1,6 @@ +/* + cssQuery, version 2.0.2 (2005-08-19) + Copyright: 2004-2005, Dean Edwards (http://dean.edwards.name/) + License: http://creativecommons.org/licenses/LGPL/2.1/ +*/ +eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('7 x=6(){7 1D="2.0.2";7 C=/\\s*,\\s*/;7 x=6(s,A){33{7 m=[];7 u=1z.32.2c&&!A;7 b=(A)?(A.31==22)?A:[A]:[1g];7 1E=18(s).1l(C),i;9(i=0;i<1E.y;i++){s=1y(1E[i]);8(U&&s.Z(0,3).2b("")==" *#"){s=s.Z(2);A=24([],b,s[1])}1A A=b;7 j=0,t,f,a,c="";H(j+~]/;7 20=/[\\s#.:>+~()@]|[^\\s#.:>+~()@]+/g;6 1y(s){8(S.l(s))s=" "+s;5 s.P(20)||[]};7 W=/\\s*([\\s>+~(),]|^|$)\\s*/g;7 I=/([\\s>+~,]|[^(]\\+|^)([#.:@])/g;7 18=6(s){5 s.O(W,"$1").O(I,"$1*$2")};7 1u={1Z:6(){5"\'"},P:/^(\'[^\']*\')|("[^"]*")$/,l:6(s){5 o.P.l(s)},1S:6(s){5 o.l(s)?s:o+s+o},1Y:6(s){5 o.l(s)?s.Z(1,-1):s}};7 1s=6(t){5 1u.1Y(t)};7 E=/([\\/()[\\]?{}|*+-])/g;6 R(s){5 s.O(E,"\\\\$1")};x.15("1j-2H",6(){D[">"]=6(r,f,t,n){7 e,i,j;9(i=0;i=c);5(c%m)==s}});x.15("1j-2m",6(){U=1i("L;/*@2l@8(@\\2k)U=K@2j@*/");8(!U){X=6(e,t,n){5 n?e.2i("*",t):e.X(t)};14=6(e,n){5!n||(n=="*")||(e.2h==n)};1h=1g.1I?6(e){5/1J/i.l(Q(e).1I)}:6(e){5 Q(e).1H.1f!="2g"};1e=6(e){5 e.2f||e.1G||1b(e)};6 1b(e){7 t="",n,i;9(i=0;(n=e.1F[i]);i++){1d(n.1c){F 11:F 1:t+=1b(n);1a;F 3:t+=n.2e;1a}}5 t}}});19=K;5 x}();',62,190,'|||||return|function|var|if|for||||||||pseudoClasses||||test|||this||AttributeSelector|||||||cssQuery|length|push|fr|id||selectors||case|nextElementSibling|while||tests|true|false|thisElement||replace|match|getDocument|regEscape||attributeSelectors|isMSIE|cache||getElementsByTagName|isNaN|slice|child||new|getAttribute|compareNamespace|addModule|previousElementSibling|compareTagName|parseSelector|loaded|break|_0|nodeType|switch|getTextContent|tagName|document|isXML|eval|css|_1|split|ch|parentNode|childElements|nthChild|disabled|firstElementChild|getText|RegExp|Quote|x22|PREFIX|lang|_2|arguments|else|all|links|version|se|childNodes|innerText|documentElement|contentType|xml|parseInt|indeterminate|checked|last|nth|lastElementChild|parse|_3|add|href|String|className|create|NS_IE|remove|toString|ST|select|Array|null|_4|mimeType|lastChild|firstChild|continue|modules|delete|join|caching|error|nodeValue|textContent|HTML|prefix|getElementsByTagNameNS|end|x5fwin32|cc_on|standard||odd|even|enabled|hash|location|target|not|only|empty|root|contains|level3|outerHTML|htmlFor|class|toLowerCase|Function|name|first|level2|prototype|item|scopeName|toUpperCase|ownerDocument|Document|XML|Boolean|URL|unknown|typeof|nextSibling|previousSibling|visited|link|valueOf|clearCache|catch|concat|constructor|callee|try'.split('|'),0,{})) diff --git a/www/extras/yui-ext/docs/resources/docs.css b/www/extras/yui-ext/docs/resources/docs.css new file mode 100644 index 000000000..97b7c9e24 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/docs.css @@ -0,0 +1,87 @@ +.pkg h3 { + padding-left:34px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; + height:18px; + cursor:pointer; +} +h3.collapser-expanded{ + background: #fff url(pkg-open.gif) no-repeat 0px -1px; +} +h3.collapser-collapsed { + background: #fff url(pkg-closed.gif) no-repeat 0px -1px; +} +.pkg-body{ + margin-left:16px; + font:normal 11px verdana,helvetica,tahoma,sans-serif; +} +#classes a{ + font:normal 11px verdana,helvetica,tahoma,sans-serif; + display:block; + text-decoration:none; + height:18px; + color:black; + background: #fff url(class.gif) no-repeat 16px -1px; + padding-left:34px; + -moz-outline:none; + outline:none; + white-space: nowrap; +} +#classes a:hover{ + text-decoration: underline; +} +#classes a.ex{ + background: #fff url(example.gif) no-repeat 16px -1px; +} +#classes{ + overflow:auto; + padding:5px; +} +#class .loading-indicator{ + font-size:12px; + height:18px; +} +#docs .ylayout-panel-north{ + border:0px none; + background:#0000aa url(../../resources/images/basic-dialog/hd-sprite.gif) repeat-x 0px -83px; + padding-top:3px; + padding-left:3px; +} +#docs .ylayout-collapsed-west{ + background-image: url(collapse-bg.gif); + background-repeat:no-repeat; + background-position:center; +} +#header { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color:white; +} +.loading-indicator { + font-size:8pt; + background-image:url('../../resources/images/grid/loading.gif'); + background-repeat: no-repeat; + background-position:top left; + padding-left:20px; + height:18px; + text-align:left; +} +a#welcome-link{ + background:#fff url(docs.gif) no-repeat 0px 0px; + padding-left:18px; +} +a#help-forums{ + background:#fff url(forum.gif) no-repeat 16px 0px; + padding-left:34px; + display:block +} +#loading{ + position:absolute; + left:45%; + top:40%; + border:3px solid #B2D0F7; + background:white url(block-bg.gif) repeat-x; + padding:10px; + font:bold 14px verdana,tahoma,helvetica; + color:#003366; + width:150px; + text-align:center; +} \ No newline at end of file diff --git a/www/extras/yui-ext/docs/resources/docs.gif b/www/extras/yui-ext/docs/resources/docs.gif new file mode 100644 index 0000000000000000000000000000000000000000..a915dfb5add75e566cd5f6c4b0981ff9e7a24e29 GIT binary patch literal 1016 zcmZ?wbhEHb6krfwXlGy$FqojB-(vjwst-L1ab8+~=R zdu#9X&e=9`#-=^Hb~SVy=x+w1)1B>CC$=7((0qDw`}w(j=clw^n9+TCMh_5OnKa?f zyoom^Ha?u$^=M|-;|U86OjvMX!iozG3m!DAc+jxm!-N$dCT#dHVaJCBQ%^3Ld2soh zqpRkfSTq0h!l`!`Prb8v+MOlS?kt`8XxXestL8mhJ^%TRbr(19zPez?gAI#cZC?I< z+p14H*M8l*xbW}5w#$chygPK@@S#&T51e>#;=sED7am-= z@Zjdf2e&RgzIXk>ohwi7UVVP=`ioolUtD{A*!gm(oNx*hFO=M>x* z$f$NyT;DOuqEn(hiAz6rN6bd17T3v*MK*0Rl26(BWmE$~W;~wAJxwdP?#%_q$1R-f z6%xxNJde5y@k#b{a6D}2>oQeY w^eHzMwHQb%RlmyVh)8s5F{-^HvSBj|!%Hq69tla|wC2~>nb|o!Bm@|&0d7)OzyJUM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/docs.js b/www/extras/yui-ext/docs/resources/docs.js new file mode 100644 index 000000000..0e9ae9bb5 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/docs.js @@ -0,0 +1,114 @@ +YAHOO.ext.Element.selectorFunction = cssQuery; + +var Docs = function(){ + var layout, center; + + var classClicked = function(e){ + // find the "a" element that was clicked + var a = e.findTarget(null, 'a'); + if(a){ + e.preventDefault(); + Docs.loadDoc(a.href); + } + }; + + return { + init : function(){ + getEl('loading').remove(); + // initialize state manager, we will use cookies + YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider()); + + // create the main layout + layout = new YAHOO.ext.BorderLayout(document.body, { + north: { + split:false, + initialSize: 32, + titlebar: false + }, + west: { + split:true, + initialSize: 250, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + useShim:true, + cmargins: {top:2,bottom:2,right:2,left:2} + }, + center: { + titlebar: true, + title: 'View Documentation', + autoScroll:false, + tabPosition: 'top', + closeOnTab: true, + //alwaysShowTabs: true, + resizeTabs: true + } + }); + // tell the layout not to perform layouts until we're done adding everything + layout.beginUpdate(); + layout.add('north', new YAHOO.ext.ContentPanel('header')); + + layout.add('west', new YAHOO.ext.ContentPanel('classes', {title: 'Documentation Explorer', fitToFrame:true})); + center = layout.getRegion('center'); + center.add(new YAHOO.ext.ContentPanel('main', {fitToFrame:true})); + + layout.restoreState(); + layout.endUpdate(); + + var classes = getEl('classes'); + classes.mon('click', classClicked); + classes.select('h3').each(function(el){ + var c = new NavNode(el); + if(!/^(?:YAHOO|API Reference|Examples and Demos)$/.test(el.innerHTML)){ + c.collapse(); + } + }); + var page = window.location.href.split('#')[1]; + if(!page){ + page = 'welcome.html'; + } + this.loadDoc(page); + }, + + loadDoc : function(url){ + getEl('main').dom.src = url; + } + }; +}(); +YAHOO.ext.EventManager.onDocumentReady(Docs.init, Docs, true); + +/** + * Simple tree node class based on Collapser and predetermined markup. + */ +var NavNode = function(clickEl, collapseEl){ + this.clickEl = getEl(clickEl); + if(!collapseEl){ + collapseEl = this.clickEl.dom.nextSibling; + while(collapseEl.nodeType != 1){ + collapseEl = collapseEl.nextSibling; + } + } + this.collapseEl = getEl(collapseEl); + this.clickEl.addClass('collapser-expanded'); + this.clickEl.mon('click', function(){ + this.collapsed === true ? + this.expand() : this.collapse(); + }, this, true); +}; + +NavNode.prototype = { + collapse : function(){ + this.collapsed = true; + this.collapseEl.setDisplayed(false); + this.clickEl.replaceClass('collapser-expanded','collapser-collapsed'); + }, + + expand : function(){ + this.collapseEl.setDisplayed(true); + this.collapsed = false; + this.collapseEl.setStyle('height', ''); + this.clickEl.replaceClass('collapser-collapsed','collapser-expanded'); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/docs/resources/example.gif b/www/extras/yui-ext/docs/resources/example.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad599cf2a69fc4b94db4e80ab0f18a70b77175da GIT binary patch literal 1008 zcmZ?wbhEHb6krfwXlGzBGtITJDKPa+wsULIPdZ_kde$uCv~BKL%c4j2WshB58(iHx zf`g`pgiZ<#pAi-|H#~A;bjeSDCTowm-qo!!^_Cfx0wac}mVyYuGX?(KijvgCQ|vX|Yf zUbV0N-oN?BjGaFhFMqUb$9kq}V)$->CMpv9mAaxW-PFmRk@2<4FR*s$P$noq@> z6OPHpxW#oHYCIYqD9q4}+7!|F=}2e4oOzCj#SRztJ}JY54IeHv9%f`_VPWcIe%?FV zEa%!1$Kqo>QjA6qO(eahWXv>l2xZvV8LaMaoO+_elk13Y;5?5-6C5`-W?i0ZyIf^r zqY`tdnag<@&7xMWi6Y8AIRUS>EEm)aZF1RQ;KanRG_$8paM2USXUzo6s+@Jra{Ie@wloRs=~L)$DV@|_KDDcAMqlmmexCC)C9h8q zyE9Gp_zcDSvlK2ZRJ*xS_x3vTNApx3FVT6nSnJsm?dK~^U#v8GvC8z#Cfi3lJl||_ ze81E4!*1^ndwf6a3;29E^y7ip&qpG@9F6{REcVseg70UNzn@M0aw_Bdxs2}@vVL98 z|8c40=hebr*GhlisQ-Pp{?DD-ITIV^Pi9vy;=GD<$_1Z-S+*%>K~uB{QR)*!JVrQ@7?+Z^fgy)M2jqNEo?zfO!Elp9#$&^RgUu}0Eh2XW@H(0K?U-Tsc&V3g zJNxX6D?3~~g;d;oBs7DLFiERr1}$?me#Sjb!=dWQgo6#elT3uqw`??W<>;3-jLKP2 z$&xNDl}@NL$Q0|y%!%*2=6h)`5w;ouilaj1B( fz>&dBOi9P1V8MX~28N*3Y#%mkeci~&$Y2cspeP@T literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/folder_open.gif b/www/extras/yui-ext/docs/resources/folder_open.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba4c657d451f7dad46eaecd7f21259417bbc4634 GIT binary patch literal 997 zcmZ?wbhEHb6krfwXlGy$6XKH)=97~Y(NvN))l+r0(u?+1it$zo@~}({bIDKg%gu}{ zNe`^f3!hdbKfheMAzisKQ*~vHXnSSCmL~pv9UT1)Y5gswliJHCca%@z6>gGmBRlwfT-mEt*ZZbtN-7r zn=`Rt{*=Jku)RxIdVy|8oD!rs-3`qnP# zUbm!c&657j%Q`kJ>)EipZ{v#I?W?+WuIb*ocJ}dIJ?9Q}-aFE8?7*g5mlnLg-uUrO z=ihsc|L!*Yzu)-(LCgO~J)a&<`uuFx@7MGHzL@dv#f)#S7JPfR{O7x6-#@H=aOdj7 zd$<1n|IaWA208>3f3h$#Fw`;VfE)tK6AT=O82)m|cx+g3u$kp|P2`RV{7&}q*WTP* zy!@P4JNwQj3nPy6326t;t9dXXF+t2m^u3Pep-ritjiE2D>*CaRJ9q{njc5>){?i?lfj3yyKlR!F=jp=q?ly-!Ln%!T9O z@#YD78IuG)E9 c61Tx%VPg{u2bX|^0)sLQ)9g z3((VXUHk~(B^o^=85amqK?D|^r51kIlSSv}B<%ycbVXq4k`xaXJ9;^bOR`NX?g`b0+**drUp&@yp9QR;Y#9gz1ul^OS^kFH03YclT%rjS)(<3 zOE@DU*d^$pwd=>#?+23E9CvoQ(%f7+U@Hi<4CEEZYlmyIx=MVk?^dynL~_g;*!^yM zj!Ugrvsb_c+xOviRN;P@J?~d!k!i;92Tx3rdh0x#kl@%;VeGXHM`-9N&)zE( zLO{cVgpLOZ6Fwx&_)sw8LBWC#1q=Q+toSft!~X>b{xgh%(GVD#A)xq^g^_`Qn?VQU zd{CZX;P7J*=aBK(u;5@bhp<*mgaMOtqmYh3g2cwAW=1aMh!qA89hrLAl@$yE7@1m_ om>5)Y5*VA98M&nc3Kl3h_^|Wvtq8f1z|b(CznLplLV&><08y|#761SM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/minus.gif b/www/extras/yui-ext/docs/resources/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..2c63585399e537b45a57456aafe5fd532c81c029 GIT binary patch literal 904 zcmZ?wbhEHb6krfw_|Cv!=#}jB-)YLyV^h{1TM9&5k8M5o{TL8k`+n})wQKjjUwi)j zIS{>n|NQ;;=imQ-2crL@U^E1VNeC$ZWMO1rU}Vr?00K~+VBkn)VCInV*s$PWGdrh7 zh{l4249zSm9xVR>Udq3sOkj1T z@R}--bv0re>LfNdN^fnF-QFU)=hNov3pP6ZL zdwbCB?S=oZs*|No!)|Nor- z|92fYaNzXm(`U|{xqSKZwQJXoU3-1w;m7CizrX(c9|#ym!DtB3CIl3JvM@6+Ff!siLQ;R`jL33}vPDDt6#iPY1 zrA!zs-W*t%dYVsI#iilH0mg%qu_1}ydp zo%rCWgP=QO2J40`4_HML4tKFuA2@nIz$}1ihGH{IaHCkrk{RCH*KskYv9>u_GB@-H z=W&MxG%nik@URxw6JCL)WA}wrl=kyFII?yC^V@2L4L6QlJ1@iO7w~c6mY0{c*mUwF w9GbZJHzc19Q#_#cy3s_|Bw_)>K}Kd)4vq}Q$7YTadXu!{PE*uY>70Ks>}<^TWy literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/pkg-open.gif b/www/extras/yui-ext/docs/resources/pkg-open.gif new file mode 100644 index 0000000000000000000000000000000000000000..ffd18a31adf148f72b0500c20f929b7ac4859c59 GIT binary patch literal 1040 zcmZ?wbhEHbRA3NbXlGzB^h$R6?=&-=aaIP?oGg}kIcy8^I2ILfEiU9P24$!>3v-_@?Pw@dZdEXiZDqz?6KotSEHa+=}k8OCR3nw(sqcz%)E z^&Jkk_UAm>?EL6pz~8F{|8JLmcvAKMN&S?id*>|OyM6oiIctwC-Fj{1-dlT*9ou>8 z$^Yvu|6jNKf8Y82L+Ae=lmGvp`Tzf%|NoaBIdbIa(W7V2p1pYS;<0P5Z#?|?{QdXW zpa1{*{pbJx{|uvGGz2IP0mYvz%nS^S3_2i_KzV|J<1GU-hm6OD1qYisgtcN$Y)EM1 zkQCysQT24sGq2j>;#)Fg8OV`%}PEMnE$pgy|PW%!9i@m09TyX4wkS#;T)m>8_w5(4!T=(|^6Ju|q z%7j-ZCNi^gEn`$W!oX$X*3PNJGe^`zDf6~y{@!y_r9zK&b1HDX;dO9g?-SJw@Mx1Z zZ|goiL;w7R2aN}kM5CRHMRbx|US3vCE4X2hQ0UxPPfjp1F<1it-f7uY literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/plus.gif b/www/extras/yui-ext/docs/resources/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..c09f82e4d3c65cad839f4607d8a8f3a24293fa81 GIT binary patch literal 912 zcmZ?wbhEHb6krfw_|Cv!=#}jB-)YLyV^h{1TM9&5k1gGMZR@e;ThBc|b`6NWpSyPL z+P&}Bo_~K1MDO1}fB*gY_y6C4=>I4f4S^va0*XIb7#SEC8FUzc0F);fIC2@7Ib=LG zEI8QA&Z!Ziv0x!XGmD1D6bHj5W_AWHw9DI36qZ}OgWx7`9$KB6Uoy~CQmz+0z}hKrA@k3 zyYOuJ(u*}4A2l>IG&MCgH8r)gwDfeh_4M@g_V!MmJZZ|5DbuD+n=xbR%$YN1&6>4n z(V}I`mMveoX4R@yD_5`ExM|&%En9Z%*s*KZu6_IVwXL|)y!FwZ{YTaxxxMAe=Uvyn z?z#2tz`;F-4<9&m=+NQAhmRgTdiwO~GiT0RxN!E;rAwDDU%qnX%Ju8lZ``C-Huf9Bc`~BtnuWvqmfBE6Z>yJO* z0MVx(Z$JNd`{n1`FTdV>`SJeC&-Y(`efsq2!_4DV?AHV

    ~I}XfXWLadKd8}sPVs(DDNeX;BD}&v9gw@*2Oj?`{A6{TlaBITL zM=cZDSe=a`9tJ*TUSL&pV-4eDRe^R5!FdmMBpq+MzCPitN2bE!KxM7gORIdXkLt8= zcZ;z;bXvMDR?qH{(TWAG-F>?5Ox)Ls7Uwr|y7k;R5wv7uvW~G3e}hAdN1ueDhE2kR z2MvwvQ&}y3II6S>sICZRR&-dx-XJR^GQ;Ca`*}H=@@E=af((wlZ5k14B-Sapa*3%+ Ju(2>$0{|kig4F;3 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/reset.css b/www/extras/yui-ext/docs/resources/reset.css new file mode 100644 index 000000000..e9416e59e --- /dev/null +++ b/www/extras/yui-ext/docs/resources/reset.css @@ -0,0 +1,7 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.11.0 +*/ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} \ No newline at end of file diff --git a/www/extras/yui-ext/docs/resources/style.css b/www/extras/yui-ext/docs/resources/style.css new file mode 100644 index 000000000..0a4905dd8 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/style.css @@ -0,0 +1,221 @@ +body { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color: #000000; + background-color:#FFFFFF; + margin: 0px; + padding: 10px; +} +.body-wrap{ + width:95%; +} +.list {list-style:inside square;margin-bottom:10px;} +.list li{padding:2px;} +body, td, th { + font-size: 13px; +} +code { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +pre { + font-family: "Lucida Console", "Courier New", Courier, monospace; + font-size: 12px; +} +th { + text-align: left; + font-weight: bold; + vertical-align: bottom; + background:#1e4e8f url(/deploy/yui-ext/resources/images/basic-dialog/hd-sprite.gif) repeat-x 0px -83px; + color:white; + padding:3px; +} +.top-tools{ + float:right; + clear:none; +} +table { + background-color: white; +} +a { + color: #083772; +} +a:link { + color: #083772; + text-decoration: none; +} + +a:visited { + color: #1e4e8f; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #0000CC; +} + +a:active { + text-decoration: none; + color: #1e4e8f; +} + +/* Headings */ +h1, h2, h3, h4, h5, h6 { + font-family: "Trebuchet MS", "Bitstream Vera Sans", verdana, lucida, arial, helvetica, sans-serif; + font-weight: bold; + margin-top: 3px; + margin-bottom: 3px; + letter-spacing: 1px; + width: 90%; +} + +h1 { + font-size: 18px; +} + +h2 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 18px; + padding-top: 20px; + padding-bottom: 5px; +} + +h3 { + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + font-weight: bold; + font-size: 16px; +} + +h4 { + font-size: 12px; + color: #666666; +} + +h5 { + font-size: 11px; +} + +.label { + font-weight: bold; + padding-right: 15px; +} +.description{ + margin: 10px 0px; +} +.member-table{ + width:100%; + margin-bottom:10px; +} +.member-table td{ + padding:2px; + vertical-align:top; + padding-right:15px; +} +body .alt{ + background:#f1f1f1; +} +.member-table td.micon{ + width:20px; + padding:0px; + border-left:1px solid #bbbbbb; +} +.member-table td.msource{ + border-right:1px solid #bbbbbb; + width:100px; +} +.mlink{ + font-weight:bold; +} +.member-table td.inherited{ + background-image: url(inherited.gif); + background-position:2px 2px; + background-repeat: no-repeat; +} +.member-table td.mdesc{ + padding-top:0px; +} +.member-table td.micon,.member-table td.mdesc,.member-table td.msource{ + border-bottom:1px solid #bbbbbb; +} +.optional{ + color:#555555; +} + +pre { + background: #F8F8F8; + border: 1px solid #e8e8e8; + border-left-width: 8px; + padding: 0.8em; + margin: 1em ; + margin-right: 0; +} +pre { + font-size: 12px !important; + line-height:14px !important; + padding:5px; + margin-left:0; +} +.detail-wrap{ + border:1px solid #bbbbbb; + border-bottom:0px none; +} +.mdetail-head{ + margin-top:10px; +} +.mdetail{ + padding:7px; + border-bottom:1px solid #bbbbbb; +} +.mdetail h3{ + margin: 5px 0px; + font-size:14px; + color:#083772; +} +.mdetail-desc{ + margin:8px; +} +.mdetail-def{ + font-style: italic; + font-size: 12px; + margin-top:10px; + margin-left:8px; + display:block; +} +.sub-desc{ + margin:5px; + margin-left:16px; +} +.mdetail-params{ + margin-top:10px; +} +.mdetail-params strong{ + font-weight:bold; + display: block; + margin-bottom:3px; +} +.mdetail-params ul{ + list-style: inside; + list-style-type: disc; + margin-left:12px; +} +.mdetail-params li{ + list-style: inside; + list-style-type: disc; +} + +.hl-default { color: black; } +.hl-code { color: black; } +.hl-brackets { color: black; } +.hl-comment { color: #008000; } +.hl-quotes { color: #a31515; } +.hl-string { color: #a31515; } +.hl-identifier { color: black; } +.hl-builtin { color: darkblue; } +.hl-reserved { color: blue; } +.hl-inlinedoc { color: blue; } +.hl-var { color: black; } +.hl-url { color: blue; } +.hl-special { color: navy; } +.hl-number { color: darkgreen; } +.hl-inlinetags { color: blue; } \ No newline at end of file diff --git a/www/extras/yui-ext/docs/resources/tree-bg.gif b/www/extras/yui-ext/docs/resources/tree-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..00fac636201972c1191a77034f7723753a972920 GIT binary patch literal 1925 zcmbu8`BzhS8ixaj1PKCRks<;CD=033Qir9bf=Gjk1&7ww!jV#j)};dumO6qXD6$Ar z=`huLM#>`KvD6mJSR4y&1W8yTB!(^fLK3o)#5#q(ufu%(8|I#Sp7Z(P-p~8od*AzJ zT54?E2a_%ilxhma!NFl=WyNSk!y;JhXtsgMh)M&@n?PemodxxagkZ9v(Mm3WaS2Yy zP@upm70#$}cAgMK8kFi#u1AG|5Y#4A8OiOSwV=UD8o+EvlMP11I4Z_52_cM2NdTS{ zAIp#@g~u|OkmKZw6Zi_`D?p&cCrUC1genqXT1_Ux%sfu3VNOHlf=G*V8W3wyqydQz z#afW+QKAExp2&dQfHFNOjYJ7lCR7?>-i&G!A!sb9TSTn|j5eYNmZxa814oQpF^)(G zVU!q3aYPIw5*U->s07AkI3@+249AJ89C>)G(vL>3Nvd;LJSCX>pdA>rkWxi5|to*?>|#D2ymKfYO8tBdE=&BA>tl z+C|h`i7*&!B!J0|MjLSk4pEgLhe%3EfKeHaNMTGy%wb%PV=~~$aa=|+JXRp@1z|#o z6AGAA;-nJzL{*If6$s}^fT?*Ds$p7#Q$$jWGa8uF;j9)!I-JvjSdStdNDU~_gUpCh z1IUdiGl0T`awDkBs3b4ef@(7%Xvo4?QM(96I~r_Yeu^eL(IXSdESS;a^ow$k7*MPy zB!!?fqrwDg3#!b7qye;KZEU26+)f_$cO}^+E9h;c6AX4RJq5C~WOe`lgR#7dLZPfs zwh~fa{1X)F3Z;iS6usH)%dPK4{AqJd2IJ+uheMKu$(j4EZvV0`yZ2U)n?Ez?jbj1J zY4!f;FUNhgu{gCU{FQbNaQX=OJ0M(!a-E~`9kb*IvkkvvOvO~~h7VQzXze@T#f{o2t_YFc(h zxj%Ak%6rrnanR@Ddb0=jO8VU8?#4p7JejrppIb{|sl)wmJG6G+zsuriUj`17TOdt#s9i0F$q?~d%$pXmK-2F+*Cr=8VxJ-M;Gv-x(XsI%+( zvD@AULXzvh>Hcb^K;-=$-Fw_y^jahLPHj<3dgy*;BlYM{mMtejTWz;1>D-c#dPcgx zAjx}dCu6_2kS-Wvh=W4w?^RbmNcmBDxP+Vki)UNXj(s1OucBZ4)$Y&iPtm&32bMy) z4;nPbD+iW0@!$P$z@P2rl}0=Ny;sV78`CSr`j^>|@(3C=BxNDGX1F}Cb)T0%m2u58 zIh#fuDRs?Ub)=$KayPitojv1O`Y+lL@0{XUwMW8AWAV1cRlMrSdseGUaFX?dF^_ea zTeq#(`b+iudmePWDLiYn`gs)TZSMr%7eO7hw2hPc+%+yC-7c8G}J zI6o?@Xi@*93j?BJg3r>9?+V_XaiY8NdBBc7>%#*_Z#fJG9Q&zd_$^%*|LlS7eHm-O z`XDzIm?QFs`-~G#@!WNljKZ`sr9EtB>8mb zpWos+7#?47{);k4=iCUVH5ts+o^36(TqcA1$E8NUdqpHBxxE@aSXWl*md&hieMqTd zo^q&;jbU%fi*XzZ4e+WytZ>}ZbZzKT48PWwQQ>!!<+WvRX6VMgJii}mJn8xDI#<{B zb?gPt%1VCy$NSp@X1K#U|82WmRNo$`V{zg|wuaN=?LohBIf=j9J};-;3~@>0CI{HB Kl+vh_g#Q6ee|~EK literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/welcome-bg.gif b/www/extras/yui-ext/docs/resources/welcome-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..24b1ab2a8b0666e8a19dd9deb797c5211af3bc2b GIT binary patch literal 1925 zcmbu8`BzhS8ixaj1PKCRks<;CD=033Qir9bf=Gjk1&7ww!jV#j)};dumO6qXD6$Ar z=`huLM#>`KvD6mJSR4y&1W8yTB!(^fLK3o)#5#q(ufu%(8|I#Sp7Z(P-p~8od*AzJ zT54?E2M&};mud>d!NFl=WyNSk!y;JhXtsgMh)M&@n?PemodxxagkZ9v(Mm3WaS2Yy zP@upm70#$}cAgMK8kFi#u1AG|5Y#4A8OiOSwV=UD8o+EvlMP11I4Z_52_cM2NdTS{ zAIp#@g~u|OkmKZw6Zi_`D?p&cCrUC1genqXT1_Ux%sfu3VNOHlf=G*V8W3wyqydQz z#afW+QKAExp2&dQfHFNOjYJ7lCR7?>-i&G!A!sb9TSTn|j5eYNmZxa814oQpF^)(G zVU!q3aYPIw5*U->s07AkI3@+249AJ89C>)G(vL>3Nvd;LJSCX>pdA>rkWxi5|to*?>|#D2ymKfYO8tBdE=&BA>tl z+C|h`i7*&!B!J0|MjLSk4pEgLhe%3EfKeHaNMTGy%wb%PV=~~$aa=|+JXRp@1z|#o z6AGAA;-nJzL{*If6$s}^fT?*Ds$p7#Q$$jWGa8uF;j9)!I-JvjSdStdNDU~_gUpCh z1IUdiGl0T`awDkBs3b4ef@(7%Xvo4?QM(96I~r_Yeu^eL(IXSdESS;a^ow$k7*MPy zB!!?fqrwDg3#!b7qye;KZEU26+)f_$cO}^+E9h;c6AX4RJq5C~WOe`lgR#7dLZPfs zwh~fa{1X)F3Z;iS6usH)%dPK4{AqJd2IJ+uheMKu$(j4EZvV0`yZ2U)n?Ez?jbj1J zY4!f;FUNhgu{gCU{FQbNaQX=OJ0M(!a-E~`9kb*IvkkvvOvO~~h7VQzXze@T#f{o2t_YFc(h zxj%Ak%6rrnanR@Ddb0=jO8VU8?#4p7JejrppIb{|sl)wmJG6G+zsuriUj`17TOdt#s9i0F$q?~d%$pXmK-2F+*Cr=8VxJ-M;Gv-x(XsI%+( zvD@AULXzvh>Hcb^K;-=$-Fw_y^jahLPHj<3dgy*;BlYM{mMtejTWz;1>D-c#dPcgx zAjx}dCu6_2kS-Wvh=W4w?^RbmNcmBDxP+Vki)UNXj(s1OucBZ4)$Y&iPtm&32bMy) z4;nPbD+iW0@!$P$z@P2rl}0=Ny;sV78`CSr`j^>|@(3C=BxNDGX1F}Cb)T0%m2u58 zIh#fuDRs?Ub)=$KayPitojv1O`Y+lL@0{XUwMW8AWAV1cRlMrSdseGUaFX?dF^_ea zTeq#(`b+iudmePWDLiYn`gs)TZSMr%7eO7hw2hPc+%+yC-7c8G}J zI6o?@Xi@*93j?BJg3r>9?+V_XaiY8NdBBc7>%#*_Z#fJG9Q&zd_$^%*|LlS7eHm-O z`XDzIm?QFs`-~G#@!WNljKZ`sr9EtB>8mb zpWos+7#?47{);k4=iCUVH5ts+o^36(TqcA1$E8NUdqpHBxxE@aSXWl*md&hieMqTd zo^q&;jbU%fi*XzZ4e+WytZ>}ZbZzKT48PWwQQ>!!<+WvRX6VMgJii}mJn8xDI#<{B zb?gPt%1VCy$NSp@X1K#U|82WmRNo$`V{zg|wuaN=?LohBIf=j9J};-;3~@>0CI{HB Kl+vh_g#Q6bCw^-H literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/docs/resources/welcome.css b/www/extras/yui-ext/docs/resources/welcome.css new file mode 100644 index 000000000..06720d702 --- /dev/null +++ b/www/extras/yui-ext/docs/resources/welcome.css @@ -0,0 +1,61 @@ +body{ + background:url(welcome-bg.gif) top left; + font-family: Tahoma, Verdana, Arial, Helvetica, sans-serif; + color: #000000; + margin: 0px; + font-size:13px; + padding-bottom:15px; +} +a { + color: #083772; +} +a:link { + color: #083772; + text-decoration: none; +} + +a:visited { + color: #1e4e8f; + text-decoration: none; +} + +a:hover { + text-decoration: underline; + color: #0000CC; +} +.col{ + width:45%; + float:left; + margin-left:10px; +} +.block{ + border:3px solid #B2D0F7; + background:white url(block-bg.gif) repeat-x; + margin-top:10px; +} +.block-title{ + color: #083772; + font-weight: bold; + padding: 4px; + padding-left: 8px; +} +.block-body{ + padding:8px; + padding-top:2px; +} +.block-body b{ + color:#333333; + font-size:11px; +} +.block-body em { + display:block; + margin-top:5px; + font-size:11px; + color:gray; + text-align:right; +} +.list{ + list-style: square; + padding-left:20px; + margin-top:5px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/docs/welcome.html b/www/extras/yui-ext/docs/welcome.html new file mode 100644 index 000000000..f7cba946d --- /dev/null +++ b/www/extras/yui-ext/docs/welcome.html @@ -0,0 +1,78 @@ + + + Welcome + + + + +

    +
    +

    Welcome!

    +
    + Welcome to the new Documentation Center. Click on a class or example in the tree on the left to begin.

    + If you need help, it's only a click away: Help Forums.

    + The code, documentation and examples here are the result of hard work. This is my only job. You can keep this project going by + making a contribution using the button below.

    +
    +
    + + + + +
    +
    +
    +
    +
    +

    API Reference

    +
    + The API Reference contains documentation for all the classes and components found in the yui-ext library. + The most common classes: + + yui-ext .33 RC2 +
    +
    +
    +

    YUI Reference

    +
    + The documentation parser recognizes YUI's new documentation syntax as well. I've added a YUI reference so you can see everything in the same place.

    + You can also view the original YUI documentation with a nifty search feature on Yahoo! Developer Network. + Yahoo! UI .12 +
    +
    +
    +
    +
    +

    Examples and Demos

    +
    + Most of the examples have been extracted directly from my blog. All paths in the examples + have been converted to map directly to paths in the yui-ext download. This will be the same structure of all examples going forward. + No more searching through blog code to figure out how something was done!

    + If there's an example missing that you would like to see, you can sponsor development of it. Send me an email.

    + The most popular examples: +
    + Common Problems +
      +
    • To view the HTML source of an example, right click (Mac users control+click) in the body of the + example and select "View Source" or "This Frame"->"View Source".
    • +
    • Some examples take up a lot of screen space. You can right click and "Open in a new tab" or + "Open in a new Window" on the link to an example to see it in a full window.
    • +
    +
    +
    +
    + + \ No newline at end of file diff --git a/www/extras/yui-ext/editor-grid-lib.js b/www/extras/yui-ext/editor-grid-lib.js new file mode 100644 index 000000000..3397c2d98 --- /dev/null +++ b/www/extras/yui-ext/editor-grid-lib.js @@ -0,0 +1,268 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.grid.Grid=function(container,dataModel,colModel,selectionModel){this.container=YAHOO.ext.Element.get(container);this.container.update('');this.container.setStyle('overflow','hidden');this.id=this.container.id;this.rows=[];this.rowCount=0;this.fieldId=null;this.dataModel=dataModel;this.colModel=colModel;this.selModel=selectionModel;this.activeEditor=null;this.editingCell=null;this.minColumnWidth=25;this.autoSizeColumns=false;this.autoSizeHeaders=false;this.monitorWindowResize=true;this.maxRowsToMeasure=0;this.trackMouseOver=false;this.enableDragDrop=false;this.stripeRows=true;this.autoHeight=false;this.autoWidth=false;this.allowTextSelectionPattern=/INPUT|TEXTAREA|SELECT/i;this.setValueDelegate=this.setCellValue.createDelegate(this);var CE=YAHOO.util.CustomEvent;this.events={'click':new CE('click'),'dblclick':new CE('dblclick'),'mousedown':new CE('mousedown'),'mouseup':new CE('mouseup'),'mouseover':new CE('mouseover'),'mouseout':new CE('mouseout'),'keypress':new CE('keypress'),'keydown':new CE('keydown'),'cellclick':new CE('cellclick'),'celldblclick':new CE('celldblclick'),'rowclick':new CE('rowclick'),'rowdblclick':new CE('rowdblclick'),'headerclick':new CE('headerclick'),'rowcontextmenu':new CE('rowcontextmenu'),'headercontextmenu':new CE('headercontextmenu'),'beforeedit':new CE('beforeedit'),'afteredit':new CE('afteredit'),'bodyscroll':new CE('bodyscroll'),'columnresize':new CE('columnresize'),'startdrag':new CE('startdrag'),'enddrag':new CE('enddrag'),'dragdrop':new CE('dragdrop'),'dragover':new CE('dragover'),'dragenter':new CE('dragenter'),'dragout':new CE('dragout')};};YAHOO.ext.grid.Grid.prototype={render:function(){if((!this.container.dom.offsetHeight||this.container.dom.offsetHeight<20)||this.container.getStyle('height')=='auto'){this.autoHeight=true;} +if((!this.container.dom.offsetWidth||this.container.dom.offsetWidth<20)){this.autoWidth=true;} +if(!this.view){if(this.dataModel.isPaged()){this.view=new YAHOO.ext.grid.PagedGridView();}else{this.view=new YAHOO.ext.grid.GridView();}} +this.view.init(this);this.el=getEl(this.view.render(),true);var c=this.container;c.mon("click",this.onClick,this,true);c.mon("dblclick",this.onDblClick,this,true);c.mon("contextmenu",this.onContextMenu,this,true);c.mon("selectstart",this.cancelTextSelection,this,true);c.mon("mousedown",this.cancelTextSelection,this,true);c.mon("mousedown",this.onMouseDown,this,true);c.mon("mouseup",this.onMouseUp,this,true);if(this.trackMouseOver){this.el.mon("mouseover",this.onMouseOver,this,true);this.el.mon("mouseout",this.onMouseOut,this,true);} +c.mon("keypress",this.onKeyPress,this,true);c.mon("keydown",this.onKeyDown,this,true);this.init();},setDataModel:function(dm,rerender){this.view.unplugDataModel(this.dataModel);this.dataModel=dm;this.view.plugDataModel(dm);if(rerender){dm.fireEvent('datachanged');}},init:function(){this.rows=this.el.dom.rows;if(!this.disableSelection){if(!this.selModel){this.selModel=new YAHOO.ext.grid.DefaultSelectionModel(this);} +this.selModel.init(this);this.selModel.onSelectionChange.subscribe(this.updateField,this,true);}else{this.selModel=new YAHOO.ext.grid.DisableSelectionModel(this);this.selModel.init(this);} +if(this.enableDragDrop){this.dd=new YAHOO.ext.grid.GridDD(this,this.container.dom);}},onMouseDown:function(e){this.fireEvent('mousedown',e);},onMouseUp:function(e){this.fireEvent('mouseup',e);},onMouseOver:function(e){this.fireEvent('mouseover',e);},onMouseOut:function(e){this.fireEvent('mouseout',e);},onKeyPress:function(e){this.fireEvent('keypress',e);},onKeyDown:function(e){this.fireEvent('keydown',e);},fireEvent:YAHOO.ext.util.Observable.prototype.fireEvent,on:YAHOO.ext.util.Observable.prototype.on,addListener:YAHOO.ext.util.Observable.prototype.addListener,delayedListener:YAHOO.ext.util.Observable.prototype.delayedListener,removeListener:YAHOO.ext.util.Observable.prototype.removeListener,purgeListeners:YAHOO.ext.util.Observable.prototype.purgeListeners,onClick:function(e){this.fireEvent('click',e);var target=e.getTarget();var row=this.getRowFromChild(target);var cell=this.getCellFromChild(target);var header=this.getHeaderFromChild(target);if(row){this.fireEvent('rowclick',this,row.rowIndex,e);} +if(cell){this.fireEvent('cellclick',this,row.rowIndex,cell.columnIndex,e);} +if(header){this.fireEvent('headerclick',this,header.columnIndex,e);}},onContextMenu:function(e){var target=e.getTarget();var row=this.getRowFromChild(target);var header=this.getHeaderFromChild(target);if(row){this.fireEvent('rowcontextmenu',this,row.rowIndex,e);} +if(header){this.fireEvent('headercontextmenu',this,header.columnIndex,e);} +e.preventDefault();},onDblClick:function(e){this.fireEvent('dblclick',e);var target=e.getTarget();var row=this.getRowFromChild(target);var cell=this.getCellFromChild(target);if(row){this.fireEvent('rowdblclick',this,row.rowIndex,e);} +if(cell){this.fireEvent('celldblclick',this,row.rowIndex,cell.columnIndex,e);}},startEditing:function(rowIndex,colIndex){var row=this.rows[rowIndex];var cell=row.childNodes[colIndex];this.stopEditing();setTimeout(this.doEdit.createDelegate(this,[row,cell]),10);},stopEditing:function(){if(this.activeEditor){this.activeEditor.stopEditing();}},doEdit:function(row,cell){if(!row||!cell)return;var cm=this.colModel;var dm=this.dataModel;var colIndex=cell.columnIndex;var rowIndex=row.rowIndex;if(cm.isCellEditable(colIndex,rowIndex)){var ed=cm.getCellEditor(colIndex,rowIndex);if(ed){if(this.activeEditor){this.activeEditor.stopEditing();} +this.fireEvent('beforeedit',this,rowIndex,colIndex);this.activeEditor=ed;this.editingCell=cell;this.view.ensureVisible(row,true);try{cell.focus();}catch(e){} +ed.init(this,this.el.dom.parentNode,this.setValueDelegate);var value=dm.getValueAt(rowIndex,cm.getDataIndex(colIndex));setTimeout(ed.startEditing.createDelegate(ed,[value,row,cell]),1);}}},setCellValue:function(value,rowIndex,colIndex){this.dataModel.setValueAt(value,rowIndex,this.colModel.getDataIndex(colIndex));this.fireEvent('afteredit',this,rowIndex,colIndex);},cancelTextSelection:function(e){var target=e.getTarget();if(target&&target!=this.el.dom.parentNode&&!this.allowTextSelectionPattern.test(target.tagName)){e.preventDefault();}},autoSize:function(){this.view.updateWrapHeight();this.view.adjustForScroll();},scrollTo:function(row){if(typeof row=='number'){row=this.rows[row];} +this.view.ensureVisible(row,true);},getEditingCell:function(){return this.editingCell;},bindToField:function(fieldId){this.fieldId=fieldId;this.readField();},updateField:function(){if(this.fieldId){var field=YAHOO.util.Dom.get(this.fieldId);field.value=this.getSelectedRowIds().join(',');}},readField:function(){if(this.fieldId){var field=YAHOO.util.Dom.get(this.fieldId);var values=field.value.split(',');var rows=this.getRowsById(values);this.selModel.selectRows(rows,false);}},getRow:function(index){return this.rows[index];},getRowsById:function(id){var dm=this.dataModel;if(!(id instanceof Array)){for(var i=0;ithis.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; + +YAHOO.ext.grid.GridView=function(){this.grid=null;this.lastFocusedRow=null;this.onScroll=new YAHOO.util.CustomEvent('onscroll');this.adjustScrollTask=new YAHOO.ext.util.DelayedTask(this._adjustForScroll,this);this.ensureVisibleTask=new YAHOO.ext.util.DelayedTask();};YAHOO.ext.grid.GridView.prototype={init:function(grid){this.grid=grid;},fireScroll:function(scrollLeft,scrollTop){this.onScroll.fireDirect(this.grid,scrollLeft,scrollTop);},getColumnRenderers:function(){var renderers=[];var cm=this.grid.colModel;var colCount=cm.getColumnCount();for(var i=0;i=pos&&x=this.grid.dataModel.getRowCount()){return null;} +return[colIndex,rowIndex];} +return null;},_adjustForScroll:function(){this.forceScrollUpdate();if(this.scrollbarMode==YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){var adjustment=0;if(this.wrap.clientWidth&&this.wrap.clientWidth!==0){adjustment=this.wrap.offsetWidth-this.wrap.clientWidth;} +this.hwrap.setWidth(this.wrap.offsetWidth-adjustment);}else{this.hwrap.setWidth(this.wrap.offsetWidth);} +this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(),this.wrap.clientWidth));},focusRow:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;try{row.childNodes.item(0).hideFocus=true;row.childNodes.item(0).focus();}catch(e){} +this.ensureVisible(row);this.wrap.scrollLeft=left;this.handleScroll();this.lastFocusedRow=row;},ensureVisible:function(row,disableDelay){if(!disableDelay){this.ensureVisibleTask.delay(50,this._ensureVisible,this,[row]);}else{this._ensureVisible(row);}},_ensureVisible:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;var rowTop=parseInt(row.offsetTop,10);var rowBottom=rowTop+row.offsetHeight;var clientTop=parseInt(this.wrap.scrollTop,10);var clientBottom=clientTop+this.wrap.clientHeight;if(rowTopclientBottom){this.wrap.scrollTop=rowBottom-this.wrap.clientHeight;} +this.wrap.scrollLeft=left;this.handleScroll();},updateColumns:function(){this.grid.stopEditing();var colModel=this.grid.colModel;var hcols=this.headers;var colCount=colModel.getColumnCount();var pos=0;var totalWidth=colModel.getTotalWidth();for(var i=0;i'+'{1}'+''+''}]});htemplate.compile();for(var i=0;i0){this.removeRows(0,count-1);}},query:function(spec,returnUnmatched){var d=this.data;var r=[];for(var i=0;iv2) +return dsc?-1:+1;return 0;};this.data.sort(fn);if(!suppressEvent){this.fireRowsSorted(columnIndex,direction);}},each:function(fn,scope){var d=this.data;for(var i=0,len=d.length;i0;},getTotalRowCount:function(){return this.totalCount||this.getRowCount();},getPageSize:function(){return this.pageSize;},getTotalPages:function(){if(this.getPageSize()==0||this.getTotalRowCount()==0){return 1;} +return Math.ceil(this.getTotalRowCount()/this.getPageSize());},initPaging:function(url,pageSize,baseParams){this.pageUrl=url;this.pageSize=pageSize;this.remoteSort=true;if(baseParams)this.baseParams=baseParams;},createParams:function(pageNum,sortColumn,sortDir){var params={},map=this.paramMap;for(var key in this.baseParams){if(typeof this.baseParams[key]!='function'){params[key]=this.baseParams[key];}} +params[map['page']]=pageNum;params[map['pageSize']]=this.getPageSize();params[map['sortColumn']]=(typeof sortColumn=='undefined'?'':sortColumn);params[map['sortDir']]=sortDir||'';return params;},loadPage:function(pageNum,callback,keepExisting){var sort=this.getSortState();var params=this.createParams(pageNum,sort.column,sort.direction);this.load(this.pageUrl,params,this.setLoadedPage.createDelegate(this,[pageNum,callback]),keepExisting?(pageNum-1)*this.pageSize:null);},applySort:function(suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this,arguments);}else if(!suppressEvent){var sort=this.getSortState();if(sort.column){this.fireRowsSorted(sort.column,sort.direction,true);}}},resetPaging:function(){this.loadedPage=1;},sort:function(sortInfo,columnIndex,direction,suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this,arguments);}else{this.sortInfo=sortInfo;this.sortColumn=columnIndex;this.sortDir=direction;var params=this.createParams(this.loadedPage,columnIndex,direction);this.load(this.pageUrl,params,this.fireRowsSorted.createDelegate(this,[columnIndex,direction,true]));}},load:function(url,params,callback,insertIndex){this.fireEvent('beforeload',this);if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var cb={success:this.processResponse,failure:this.processException,scope:this,argument:{callback:callback,insertIndex:insertIndex}};var method=params?'POST':'GET';YAHOO.util.Connect.asyncRequest(method,url,cb,params);},processResponse:function(response){var cb=response.argument.callback;var keepExisting=(typeof response.argument.insertIndex=='number');var insertIndex=response.argument.insertIndex;switch(this.dataType){case YAHOO.ext.grid.LoadableDataModel.XML:this.loadData(response.responseXML,cb,keepExisting,insertIndex);break;case YAHOO.ext.grid.LoadableDataModel.JSON:var rtext=response.responseText;try{while(rtext.substring(0,1)==" "){rtext=rtext.substring(1,rtext.length);} +if(rtext.indexOf("{")<0){throw"Invalid JSON response";} +if(rtext.indexOf("{}")===0){this.loadData({},response.argument.callback);return;} +var jsonObjRaw=eval("("+rtext+")");if(!jsonObjRaw){throw"Error evaling JSON response";} +this.loadData(jsonObjRaw,cb,keepExisting,insertIndex);}catch(e){this.fireLoadException(e,response);if(typeof callback=='function'){callback(this,false);}} +break;case YAHOO.ext.grid.LoadableDataModel.TEXT:this.loadData(response.responseText,cb,keepExisting,insertIndex);break;};},processException:function(response){this.fireLoadException(null,response);if(typeof response.argument.callback=='function'){response.argument.callback(this,false);}},fireLoadException:function(e,responseObj){this.onLoadException.fireDirect(this,e,responseObj);},fireLoadEvent:function(){this.fireEvent('load',this.loadedPage,this.getTotalPages());},addPreprocessor:function(columnIndex,fn){this.preprocessors[columnIndex]=fn;},getPreprocessor:function(columnIndex){return this.preprocessors[columnIndex];},removePreprocessor:function(columnIndex){this.preprocessors[columnIndex]=null;},addPostprocessor:function(columnIndex,fn){this.postprocessors[columnIndex]=fn;},getPostprocessor:function(columnIndex){return this.postprocessors[columnIndex];},removePostprocessor:function(columnIndex){this.postprocessors[columnIndex]=null;},loadData:function(data,callback,keepExisting,insertIndex){}});YAHOO.ext.grid.LoadableDataModel.XML='xml';YAHOO.ext.grid.LoadableDataModel.JSON='json';YAHOO.ext.grid.LoadableDataModel.TEXT='text'; + +YAHOO.ext.grid.XMLDataModel=function(schema,xml){YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this,YAHOO.ext.grid.LoadableDataModel.XML);this.schema=schema;this.xml=xml;if(xml){this.loadData(xml);} +this.idSeed=0;};YAHOO.extendX(YAHOO.ext.grid.XMLDataModel,YAHOO.ext.grid.LoadableDataModel,{getDocument:function(){return this.xml;},loadData:function(doc,callback,keepExisting,insertIndex){this.xml=doc;var idField=this.schema.id;var fields=this.schema.fields;if(this.schema.totalTag){this.totalCount=null;var totalNode=doc.getElementsByTagName(this.schema.totalTag);if(totalNode&&totalNode.item(0)&&totalNode.item(0).firstChild){var v=parseInt(totalNode.item(0).firstChild.nodeValue,10);if(!isNaN(v)){this.totalCount=v;}}} +var rowData=[];var nodes=doc.getElementsByTagName(this.schema.tagName);if(nodes&&nodes.length>0){for(var i=0;i0){return this.getNamedValue(node,name.substr(index+1),defaultValue);}}} +return nodeValue;},setNamedValue:function(node,name,value){if(!node||!name){return;} +var attrNode=node.attributes.getNamedItem(name);if(attrNode){attrNode.value=value;return;} +var childNode=node.getElementsByTagName(name);if(childNode&&childNode.item(0)&&childNode.item(0).firstChild){childNode.item(0).firstChild.nodeValue=value;}else{var index=name.indexOf(':');if(index>0){this.setNamedValue(node,name.substr(index+1),value);}}},setValueAt:function(value,rowIndex,colIndex){var node=this.data[rowIndex].node;if(node){var nodeValue=value;if(this.postprocessors[colIndex]){nodeValue=this.postprocessors[colIndex](value);} +this.setNamedValue(node,this.schema.fields[colIndex],nodeValue);} +YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this,value,rowIndex,colIndex);},getRowId:function(rowIndex){return this.data[rowIndex].id;},addRows:function(rowData){for(var j=0,len=rowData.length;j0){var ids=this.selectedRowIds.concat();this.clearSelections();this.selectRowsById(ids,true);}},selectRowsById:function(id,keepExisting){var rows=this.grid.getRowsById(id);if(!(rows instanceof Array)){this.selectRow(rows,keepExisting);return;} +this.selectRows(rows,keepExisting);},getCount:function(){return this.selectedRows.length;},selectFirstRow:function(){for(var j=0;j=0;j--){var row=this.grid.rows[j];if(this.isSelectable(row)){this.focusRow(row);this.setRowState(row,true,keepExisting);return;}}}},getSelectedRows:function(){return this.selectedRows;},getSelectedRowIds:function(){return this.selectedRowIds;},clearSelections:function(){if(this.isLocked())return;var oldSelections=this.selectedRows.concat();for(var j=0;j0;},isSelected:function(row){return row&&(row.selected===true||row.getAttribute('selected')=='true');},isSelectable:function(row){return row&&row.getAttribute('selectable')!='false';},rowClick:function(grid,rowIndex,e){if(this.isLocked())return;var row=grid.getRow(rowIndex);if(this.isSelectable(row)){if(e.shiftKey&&this.lastSelectedRow){var lastIndex=this.lastSelectedRow.rowIndex;this.selectRange(this.lastSelectedRow,row,e.ctrlKey);this.lastSelectedRow=this.grid.el.dom.rows[lastIndex];}else{this.focusRow(row);var rowState=e.ctrlKey?!this.isSelected(row):true;this.setRowState(row,rowState,e.hasModifier());}}},focusRow:function(row){this.grid.view.focusRow(row);},selectRow:function(row,keepExisting){this.setRowState(this.getRow(row),true,keepExisting);},selectRows:function(rows,keepExisting){if(!keepExisting){this.clearSelections();} +for(var i=0;ithis.maxValue.getTime()){dom.title=this.maxText.replace('%0',this.formatDate(this.maxValue));this.element.addClass('ygrid-editor-invalid');return false;} +if(this.disabledDays){var day=value.getDay();for(var i=0;ithis.maxValue){dom.title=this.maxText.replace('%0',this.maxValue);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.NumberEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.NumberEditor.superclass.show.call(this);if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.NumberEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{var value=this.element.dom.value;if(value.length<1){return value;}else{return this.fixPrecision(this.parseValue(value));}}};YAHOO.ext.grid.NumberEditor.prototype.parseValue=function(value){return parseFloat(new String(value).replace(this.decimalSeparator,'.'));};YAHOO.ext.grid.NumberEditor.prototype.fixPrecision=function(value){if(!this.allowDecimals||this.decimalPrecision==-1||isNaN(value)||value==0||!value){return value;} +var scale=Math.pow(10,this.decimalPrecision+1);var fixed=this.decimalPrecisionFcn(value*scale);fixed=this.decimalPrecisionFcn(fixed/10);return fixed/(scale/10);};YAHOO.ext.grid.NumberEditor.prototype.allowBlank=true;YAHOO.ext.grid.NumberEditor.prototype.allowDecimals=true;YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator='.';YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision=2;YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn=Math.floor;YAHOO.ext.grid.NumberEditor.prototype.allowNegative=true;YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.NumberEditor.prototype.minValue=Number.NEGATIVE_INFINITY;YAHOO.ext.grid.NumberEditor.prototype.maxValue=Number.MAX_VALUE;YAHOO.ext.grid.NumberEditor.prototype.minText='The minimum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.maxText='The maximum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.NumberEditor.prototype.nanText='%0 is not a valid number';YAHOO.ext.grid.NumberEditor.prototype.validationDelay=100;YAHOO.ext.grid.NumberEditor.prototype.validator=function(){return true;}; + +YAHOO.ext.DatePicker=function(id,parentElement){this.id=id;this.selectedDate=new Date();this.visibleDate=new Date();this.element=null;this.shadow=null;this.callback=null;this.buildControl(parentElement||document.body);this.mouseDownHandler=YAHOO.ext.EventManager.wrap(this.handleMouseDown,this,true);this.keyDownHandler=YAHOO.ext.EventManager.wrap(this.handleKeyDown,this,true);this.wheelHandler=YAHOO.ext.EventManager.wrap(this.handleMouseWheel,this,true);};YAHOO.ext.DatePicker.prototype={show:function(x,y,value,callback){this.hide();this.selectedDate=value;this.visibleDate=value;this.callback=callback;this.refresh();this.element.show();this.element.setXY(this.constrainToViewport?this.constrainXY(x,y):[x,y]);this.shadow.show();this.shadow.setRegion(this.element.getRegion());this.element.dom.tabIndex=1;this.element.focus();YAHOO.util.Event.on(document,"mousedown",this.mouseDownHandler);YAHOO.util.Event.on(document,"keydown",this.keyDownHandler);YAHOO.util.Event.on(document,"mousewheel",this.wheelHandler);YAHOO.util.Event.on(document,"DOMMouseScroll",this.wheelHandler);},constrainXY:function(x,y){var w=YAHOO.util.Dom.getViewportWidth();var h=YAHOO.util.Dom.getViewportHeight();var size=this.element.getSize();return[Math.min(w-size.width,x),Math.min(h-size.height,y)];},hide:function(){this.shadow.hide();this.element.hide();YAHOO.util.Event.removeListener(document,"mousedown",this.mouseDownHandler);YAHOO.util.Event.removeListener(document,"keydown",this.keyDownHandler);YAHOO.util.Event.removeListener(document,"mousewheel",this.wheelHandler);YAHOO.util.Event.removeListener(document,"DOMMouseScroll",this.wheelHandler);},setSelectedDate:function(date){this.selectedDate=date;},getSelectedDate:function(){return this.selectedDate;},showPrevMonth:function(){this.visibleDate=this.getPrevMonth(this.visibleDate);this.refresh();},showNextMonth:function(){this.visibleDate=this.getNextMonth(this.visibleDate);this.refresh();},showPrevYear:function(){var d=this.visibleDate;this.visibleDate=new Date(d.getFullYear()-1,d.getMonth(),d.getDate());this.refresh();},showNextYear:function(){var d=this.visibleDate;this.visibleDate=new Date(d.getFullYear()+1,d.getMonth(),d.getDate());this.refresh();},handleMouseDown:function(e){var target=e.getTarget();if(target!=this.element.dom&&!YAHOO.util.Dom.isAncestor(this.element.dom,target)){this.hide();}},handleKeyDown:function(e){switch(e.browserEvent.keyCode){case e.LEFT:this.showPrevMonth();e.stopEvent();break;case e.RIGHT:this.showNextMonth();e.stopEvent();break;case e.DOWN:this.showPrevYear();e.stopEvent();break;case e.UP:this.showNextYear();e.stopEvent();break;}},handleMouseWheel:function(e){var delta=e.getWheelDelta();if(delta>0){this.showPrevMonth();e.stopEvent();}else if(delta<0){this.showNextMonth();e.stopEvent();}},handleClick:function(e){var d=this.visibleDate;var t=e.getTarget();if(t&&t.className){switch(t.className){case'active':this.handleSelection(new Date(d.getFullYear(),d.getMonth(),parseInt(t.innerHTML)));break;case'prevday':var p=this.getPrevMonth(d);this.handleSelection(new Date(p.getFullYear(),p.getMonth(),parseInt(t.innerHTML)));break;case'nextday':var n=this.getNextMonth(d);this.handleSelection(new Date(n.getFullYear(),n.getMonth(),parseInt(t.innerHTML)));break;case'ypopcal-today':this.handleSelection(new Date());break;case'next-month':this.showNextMonth();break;case'prev-month':this.showPrevMonth();break;}} +e.stopEvent();},selectToday:function(){this.handleSelection(new Date());},handleSelection:function(date){this.selectedDate=date;this.callback(date);this.hide();},getPrevMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==0?new Date(--y,11,1):new Date(y,--m,1));},getNextMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==11?new Date(++y,0,1):new Date(y,++m,1));},getDaysInMonth:function(m,y){return(m==1||m==3||m==5||m==7||m==8||m==10||m==12)?31:(m==4||m==6||m==9||m==11)?30:this.isLeapYear(y)?29:28;},isLeapYear:function(y){return(((y%4)==0)&&((y%100)!=0)||((y%400)==0));},clearTime:function(date){if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0);} +return date;},refresh:function(){var d=this.visibleDate;this.buildInnerCal(d);this.calHead.update(this.monthNames[d.getMonth()]+' '+d.getFullYear());if(this.element.isVisible()){this.shadow.setRegion(this.element.getRegion());}}};YAHOO.ext.DatePicker.prototype.buildControl=function(parentElement){var c=document.createElement('div');c.style.position='absolute';c.style.visibility='hidden';document.body.appendChild(c);var html=''+'';c.innerHTML=html;this.shadow=getEl(c.childNodes[0],true);this.shadow.enableDisplayMode();this.element=getEl(c.childNodes[1],true);this.element.enableDisplayMode();document.body.appendChild(this.shadow.dom);document.body.appendChild(this.element.dom);document.body.removeChild(c);this.element.on("selectstart",function(){return false;});var tbody=this.element.dom.getElementsByTagName('tbody')[1];this.cells=tbody.getElementsByTagName('td');this.calHead=this.element.getChildrenByClassName('ypopcal-month','td')[0];this.element.mon('mousedown',this.handleClick,this,true);};YAHOO.ext.DatePicker.prototype.buildInnerCal=function(dateVal){var days=this.getDaysInMonth(dateVal.getMonth()+1,dateVal.getFullYear());var firstOfMonth=new Date(dateVal.getFullYear(),dateVal.getMonth(),1);var startingPos=firstOfMonth.getDay();if(startingPos==0)startingPos=7;var pm=this.getPrevMonth(dateVal);var prevStart=this.getDaysInMonth(pm.getMonth()+1,pm.getFullYear())-startingPos;var cells=this.cells;days+=startingPos;var day=86400000;var date=this.clearTime(new Date(pm.getFullYear(),pm.getMonth(),prevStart));var today=this.clearTime(new Date()).getTime();var sel=this.selectedDate?this.clearTime(this.selectedDate).getTime():today+1;var min=this.minDate?this.clearTime(this.minDate).getTime():Number.NEGATIVE_INFINITY;var max=this.maxDate?this.clearTime(this.maxDate).getTime():Number.POSITIVE_INFINITY;var ddMatch=this.disabledDatesRE;var ddText=this.disabledDatesText;var ddays=this.disabledDays;var ddaysText=this.disabledDaysText;var format=this.format;var setCellClass=function(cal,cell,d){cell.title='';var t=d.getTime();if(t==today){cell.className+=' today';cell.title=cal.todayText;} +if(t==sel){cell.className+=' selected';} +if(tmax){cell.className=' ypopcal-disabled';cell.title=cal.maxText;return;} +if(ddays){var day=d.getDay();for(var i=0;ithis.maxLength){dom.title=this.maxText.replace('%0',this.maxLength);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +if(this.regex&&!this.regex.test(value)){dom.title=this.regexText;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.TextEditor.prototype.initEvents=function(){YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this);var vtask=new YAHOO.ext.util.DelayedTask(this.validate,this);this.element.mon('keyup',vtask.delay.createDelegate(vtask,[this.validationDelay]));};YAHOO.ext.grid.TextEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.TextEditor.superclass.show.call(this);this.element.focus();if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.TextEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{return this.element.dom.value;}};YAHOO.ext.grid.TextEditor.prototype.allowBlank=true;YAHOO.ext.grid.TextEditor.prototype.minLength=0;YAHOO.ext.grid.TextEditor.prototype.maxLength=Number.MAX_VALUE;YAHOO.ext.grid.TextEditor.prototype.minText='The minimum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.maxText='The maximum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.TextEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.TextEditor.prototype.validator=function(){return true;};YAHOO.ext.grid.TextEditor.prototype.validationDelay=200;YAHOO.ext.grid.TextEditor.prototype.regex=null;YAHOO.ext.grid.TextEditor.prototype.regexText=''; diff --git a/www/extras/yui-ext/examples/README.txt b/www/extras/yui-ext/examples/README.txt new file mode 100644 index 000000000..deffb6350 --- /dev/null +++ b/www/extras/yui-ext/examples/README.txt @@ -0,0 +1,3 @@ +The examples can be browsed by opening index.html in the docs folder. + +Some examples use XHR. Those examples will need to be on a webserver to run since XHR can't access the local file system. \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/blog.html b/www/extras/yui-ext/examples/dialog/blog.html new file mode 100644 index 000000000..e4f8461f9 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/blog.html @@ -0,0 +1,85 @@ + + + + +Comment Dialog Example + + + + + + + + + + + + + + + +
    +

    Comment Dialog Example

    + +

    This is a more complex example that shows how to implement a comment dialog similar to the one on my blog. + The dialog retrieves the comments in JSON format and renders them to the "View Comments" tab. The "Post Comment" tab posts the comment + to a file on the server that just returns a dummy response (not what you type in) in JSON format. The reason for the dummy response + is so the example can easily be dropped in whatever your environment is and work.

    +

    Note that the js is not minified so it is readable. See post.js for the full source code.

    +
    This example was sponsored by Dharmesh Shah of http://onstartups.com/. Thanks Dharmesh!
    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +

    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras imperdiet felis id velit. Ut non quam at sem dictum ullamcorper. Vestibulum pharetra purus sed pede. Aliquam ultrices, nunc in varius mattis, felis justo pretium magna, eget laoreet justo eros id eros. Aliquam elementum diam fringilla nulla. Praesent laoreet sapien vel metus. Cras tempus, sapien condimentum dictum dapibus, lorem augue fringilla orci, ut tincidunt eros nisi eget turpis. Nullam nunc nunc, eleifend et, dictum et, pharetra a, neque. Ut feugiat. Aliquam erat volutpat. Donec pretium odio nec felis. Phasellus sagittis lacus eget sapien. Donec est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +
    + + + + + diff --git a/www/extras/yui-ext/examples/dialog/comments.txt b/www/extras/yui-ext/examples/dialog/comments.txt new file mode 100644 index 000000000..a758d94b5 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/comments.txt @@ -0,0 +1,44 @@ +{"comments": [{ + id: "1", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "2", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "3", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "4", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "5", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "6", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + },{ + id: "7", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + } +]} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/hello.html b/www/extras/yui-ext/examples/dialog/hello.html new file mode 100644 index 000000000..d267957d4 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/hello.html @@ -0,0 +1,68 @@ + + + + +Hello World Dialog Example + + + + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Hello World Dialog

    +

    This example shows how to create a very simple modal BasicDialog with "autoTabs".

    +

    +
    This example and the gray theme were sponsored by Dharmesh Shah of http://onstartups.com/. Thanks Dharmesh!
    +

    Note that the js is not minified so it is readable. See hellos.js for the full source code.

    +Here's snapshot of the code that creates the dialog: +
    dialog = new YAHOO.ext.BasicDialog("hello-dlg", { 
    +        modal:true,
    +        autoTabs:true,
    +        width:500,
    +        height:300,
    +        shadow:true,
    +        minWidth:300,
    +        minHeight:300
    +});
    +dialog.addKeyListener(27, dialog.hide, dialog);
    +dialog.addButton('Close', dialog.hide, dialog);
    +dialog.addButton('Submit', dialog.hide, dialog).disable();
    +
    + + + +
    + + diff --git a/www/extras/yui-ext/examples/dialog/hello.js b/www/extras/yui-ext/examples/dialog/hello.js new file mode 100644 index 000000000..17df47493 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/hello.js @@ -0,0 +1,45 @@ + +// create the HelloWorld application (single instance) +var HelloWorld = function(){ + // everything in this space is private and only accessible in the HelloWorld block + + // define some private variables + var dialog, showBtn; + + var toggleTheme = function(){ + getEl(document.body, true).toggleClass('ytheme-gray'); + }; + // return a public interface + return { + init : function(){ + showBtn = getEl('show-dialog-btn'); + // attach to click event + showBtn.on('click', this.showDialog, this, true); + + getEl('theme-btn').on('click', toggleTheme); + }, + + showDialog : function(){ + if(!dialog){ // lazy initialize the dialog and only create it once + dialog = new YAHOO.ext.BasicDialog("hello-dlg", { + //modal:true, + autoTabs:true, + width:500, + height:300, + shadow:true, + minWidth:300, + minHeight:250, + proxyDrag: true + }); + dialog.addKeyListener(27, dialog.hide, dialog); + dialog.addButton('Close', dialog.hide, dialog); + dialog.addButton('Submit', dialog.hide, dialog).disable(); + } + dialog.show(showBtn.dom); + } + }; +}(); + +// using onDocumentReady instead of window.onload initializes the application +// when the DOM is ready, without waiting for images and other resources to load +YAHOO.ext.EventManager.onDocumentReady(HelloWorld.init, HelloWorld, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/images/comment-bg.gif b/www/extras/yui-ext/examples/dialog/images/comment-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1b04161ac73c0ce13fa85337d722033b6442d93 GIT binary patch literal 838 zcmZ?wbhEHbWMt4_XlG#f{Q2{jFJHcX{rc_Ox9{J-|M>Ca=g*(Ne*OCW`}dzefBydc z`|sbs|Ns9pjDpb+7>*&J_>%?bt^W)GtgG!e zc3)q6(jSiUw{1m`TOtUeK(%G`~LjHk7w_{zxwp^ z<;Ndyzx;ah`RB_I-#&c%{r>B(*PnlW`u_Xlw_oqS{P^R`0EzD(82|tP literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/dialog/images/warning.gif b/www/extras/yui-ext/examples/dialog/images/warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..806d4bc09385a98ef1ac19d25e30a21310964e7e GIT binary patch literal 960 zcmZ?wbhEHb6krfwXlDR{f&hVn2muENhm@owhyM-@5dsqm1SVuCOej#8P@%A(LSO-q zY!KMcp>SY^z=a6{7Zxa7SYhyB1;c|43=ehyk-&!?1`l=wJUAfm;Do@30|Fm_AFI_r#;p+LTS5IEMaRKbDQDQU%2#0{;PZnkd237_gkWx^dVBna` zz|A4!v0=eMCPx*A6NM8NOc1gSve|KQ1H(iiYYu@O7ZQ#gR8*}I_~Dqq(8*@R^@`(W z@)HIIWfz?e!wVeVa#HbKFBUvx;Axbo`SPIg5jz8ey-mRe1I2~|N`gTPEE1a-8hE@l zIU)=NI+%skoc{dSsL0&PpvCnl!Qs*I)AH$&GFuihv|L@Lt98xe!$KzpaZ%Pw4hauj N9~|!BW@BNn1^{&szCZu~ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/dialog/layout.html b/www/extras/yui-ext/examples/dialog/layout.html new file mode 100644 index 000000000..e56245e24 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/layout.html @@ -0,0 +1,43 @@ + + + + +Layout Dialog Example + + + + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Layout Dialog Example

    +

    This example shows how to create a modal dialog with an embedded BorderLayout using LayoutDialog.

    +

    +

    Note that the js is not minified so it is readable. See layout.js for the full source code.

    + + + + + diff --git a/www/extras/yui-ext/examples/dialog/layout.js b/www/extras/yui-ext/examples/dialog/layout.js new file mode 100644 index 000000000..d43c3e271 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/layout.js @@ -0,0 +1,64 @@ + +// create the LayoutExample application (single instance) +var LayoutExample = function(){ + // everything in this space is private and only accessible in the HelloWorld block + + // define some private variables + var dialog, showBtn; + + var toggleTheme = function(){ + getEl(document.body, true).toggleClass('ytheme-gray'); + }; + // return a public interface + return { + init : function(){ + showBtn = getEl('show-dialog-btn'); + // attach to click event + showBtn.on('click', this.showDialog, this, true); + + getEl('theme-btn').on('click', toggleTheme); + }, + + showDialog : function(){ + if(!dialog){ // lazy initialize the dialog and only create it once + dialog = new YAHOO.ext.LayoutDialog("hello-dlg", { + modal:true, + width:600, + height:400, + shadow:true, + minWidth:300, + minHeight:300, + west: { + split:true, + initialSize: 150, + minSize: 100, + maxSize: 250, + titlebar: true, + collapsible: true, + animate: true + }, + center: { + autoScroll:true, + tabPosition: 'top', + closeOnTab: true, + alwaysShowTabs: true + } + }); + dialog.addKeyListener(27, dialog.hide, dialog); + dialog.addButton('Close', dialog.hide, dialog); + dialog.addButton('Submit', dialog.hide, dialog); + + var layout = dialog.getLayout(); + dialog.beginUpdate(); + layout.add('west', new YAHOO.ext.ContentPanel('west', {title: 'West'})); + layout.add('center', new YAHOO.ext.ContentPanel('center', {title: 'Inner Tab'})); + dialog.endUpdate(); + } + dialog.show(showBtn.dom); + } + }; +}(); + +// using onDocumentReady instead of window.onload initializes the application +// when the DOM is ready, without waiting for images and other resources to load +YAHOO.ext.EventManager.onDocumentReady(LayoutExample.init, LayoutExample, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/post.css b/www/extras/yui-ext/examples/dialog/post.css new file mode 100644 index 000000000..e1ccba241 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/post.css @@ -0,0 +1,124 @@ +body{ + font: normal 9pt verdana,tahoma,arial,helvetica; +} +.post{ + padding:15px; +} +.post h2{ + font:normal 22px times; + margin-bottom:10px; +} +.post p{ + margin-bottom:10px; + line-height:18px; +} + +.loading-indicator { + font-size:8pt; + background-image: url('../../images/grid/loading.gif'); + background-repeat: no-repeat; + background-position: left; + padding-left:20px; + margin:5px; +} + +/** Posting messages */ +.ydlg-ft{ + position:relative; +} + +#dlg-msg { + position:absolute; + left:0px; + top:0px; + width:40%; +} +.posting-msg{ + display:none; + font:normal 8pt tahoma, arial; + color:black; +} +#post-error-msg{ + color:red; +} +.active-msg{ + display:block; +} + +/** Comment Box (with links) */ +#comment-box{ + float:right; + clear:none; + border:2px solid #aca899; + background-color:#f3f2e7; + padding:10px; + margin:15px; +} +#comment-box li{ + margin:4px; +} +#comment-box a{ + text-decoration:none; +} +#comments-list{ + margin:0px; + padding:0px; +} +/** Comment Post Form */ +#post-tab .inner-tab{ + margin:10px; + margin-top:5px; +} +#comment-form label { + margin:4px; + margin-left:0px; + display:block; + color:#333333; + font:normal 10px arial,helvetica; + line-height:14px; +} +#comment-form .textinput{ + border:1px solid #6593cf; + width:98%; + padding:1px; + margin-bottom:2px; + font:normal 11px tahoma, arial; +} +#comment { + width:480px; + height:205px; + font:normal 11px tahoma, arial; +} + +/** Comment List */ +.commentmetadata { + margin: 0; + display: block; + font-size: 9px; + font-weight:normal; + color:gray; + margin-bottom:10px; + float:right; + clear:none; +} +.cuser{ + float:left; + clear:none; + font:bold 12px tahoma, arial; + padding-left:21px; + background: url(images/comment.gif) no-repeat; +} +.cuser a{ + font:bold 12px tahoma, arial; +} +.cheader{ + height:20px; +} +#comments-list li { + display:block; + background: url(images/comment-bg.gif) repeat-x; + background-position:0px -5px; + padding:15px; + padding-bottom:18px; + font-size:12px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/post.js b/www/extras/yui-ext/examples/dialog/post.js new file mode 100644 index 000000000..1873e5f64 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/post.js @@ -0,0 +1,152 @@ +var Comments = function(){ + var dialog, postLink, viewLink, txtComment; + var tabs, commentsList, postBtn, renderer; + var wait, error, errorMsg; + var posting = false; + + return { + init : function(){ + // cache some elements for quick access + txtComment = getEl('comment'); + commentsList = getEl('comments-list'); + postLink = getEl('post-comment'); + viewLink = getEl('view-comments'); + wait = getEl('post-wait'); + error = getEl('post-error'); + errorMsg = getEl('post-error-msg'); + + this.createDialog(); + + postLink.addHandler('click', true, function(){ + tabs.activate('post-tab'); + dialog.show(postLink); + }); + + viewLink.addHandler('click', true, function(){ + tabs.activate('view-tab'); + dialog.show(viewLink); + }); + }, + + // submit the comment to the server + submitComment : function(){ + postBtn.disable(); + wait.radioClass('active-msg'); + YAHOO.util.Connect.setForm(document.getElementById('comment-form')); + + var commentSuccess = function(o){ + postBtn.enable(); + var data = renderer.parse(o.responseText); + // if we got a comment back + if(data){ + wait.removeClass('active-msg'); + renderer.append(data.comments[0]); + dialog.hide(); + }else{ + error.radioClass('active-msg'); + errorMsg.update(o.responseText); + } + }; + + var commentFailure = function(o){ + postBtn.enable(); + error.radioClass('active-msg'); + errorMsg.update('Unable to connect.'); + }; + + YAHOO.util.Connect.asyncRequest('POST', 'post.php', + {success: commentSuccess, failure: commentFailure}); + }, + + createDialog : function(){ + dialog = new YAHOO.ext.BasicDialog("comments-dlg", { + autoTabs:true, + width:500, + height:300, + shadow:true, + minWidth:300, + minHeight:300 + }); + dialog.addKeyListener(27, dialog.hide, dialog); + dialog.addButton('Close', dialog.hide, dialog); + postBtn = dialog.addButton('Post', this.submitComment, this); + + // clear any messages and indicators when the dialog is closed + dialog.on('hide', function(){ + wait.removeClass('active-msg'); + error.removeClass('active-msg'); + txtComment.dom.value = ''; + }); + + // stoe a refeence to the tabs + tabs = dialog.getTabs(); + + // auto fit the comment box to the dialog size + var sizeTextBox = function(){ + txtComment.setSize(dialog.size.width-44, dialog.size.height-264); + }; + sizeTextBox(); + dialog.on('resize', sizeTextBox); + + // hide the post button if not on Post tab + tabs.on('tabchange', function(panel, tab){ + postBtn.setVisible(tab.id == 'post-tab'); + }); + + // set up the comment renderer, all ajax requests for commentsList + // go through this render + renderer = new CommentRenderer(commentsList); + var um = commentsList.getUpdateManager(); + um.setRenderer(renderer); + + // lazy load the comments when the view tab is activated + var commentsLoaded = false; + tabs.getTab('view-tab').on('activate', function(){ + if(!commentsLoaded){ + um.update('comments.txt'); + commentsLoaded = true; + } + }); + } + }; +}(); + +// This class handles rendering JSON into comments +var CommentRenderer = function(list){ + // create a template for each JSON object + var tpl = new YAHOO.ext.DomHelper.Template( + '
  • ' + + '
    ' + + '
    {author}:
    ' + + '' + + '
    {text}
  • ' + ); + + this.parse = function(json){ + try{ + return eval('(' + json + ')'); + }catch(e){} + return null; + }; + + // public render function for use with UpdateManager + this.render = function(el, response){ + var data = this.parse(response.responseText); + if(!data || !data.comments || data.comments.length < 1){ + el.update('There are no comments for this post.'); + return; + } + // clear loading + el.update(''); + for(var i = 0, len = data.comments.length; i < len; i++){ + this.append(data.comments[i]); + } + }; + + // appends a comment + this.append = function(data){ + tpl.append(list.dom, data); + }; +}; + +YAHOO.ext.EventManager.onDocumentReady(Comments.init, Comments, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/dialog/post.php b/www/extras/yui-ext/examples/dialog/post.php new file mode 100644 index 000000000..7d8a5e295 --- /dev/null +++ b/www/extras/yui-ext/examples/dialog/post.php @@ -0,0 +1,10 @@ +{"comments": [{ + id: "10", + author: "Jack Slocum", + link: "http://www.jackslocum.com/", + date: "October 29th, 2006 9:21pm", + text: "New posted comment. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa." + } +]} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/examples.css b/www/extras/yui-ext/examples/examples.css new file mode 100644 index 000000000..f15ab14fc --- /dev/null +++ b/www/extras/yui-ext/examples/examples.css @@ -0,0 +1,33 @@ +body { + font-family:verdana,tahoma,helvetica; + padding:20px; + font-size:13px; + background-color:#fff !important; +} +p { + margin-bottom:15px; +} +h1 { + font-size:large; + margin-bottom:20px; +} +.example-info{ + float:right; + width:150px; + border:1px solid #c3daf9; + border-top:1px solid #DCEAFB; + border-left:1px solid #DCEAFB; + background:#ecf5fe url('info-bg.gif') repeat-x; + font-size:10px; + padding:8px; +} +pre.code{ + background: #F8F8F8; + border: 1px solid #e8e8e8; + padding:10px; + margin:10px; + margin-left:0px; + border-left:5px solid #e8e8e8; + font-size: 12px !important; + line-height:14px !important; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/PropsGrid.js b/www/extras/yui-ext/examples/grid/PropsGrid.js new file mode 100644 index 000000000..91b780040 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/PropsGrid.js @@ -0,0 +1,194 @@ +YAHOO.ext.grid.PropsDataModel = function(propertyNames, source){ + YAHOO.ext.grid.PropsDataModel.superclass.constructor.call(this, []); + if(source){ + this.setSource(source); + } + this.names = propertyNames || {}; +}; +YAHOO.extendX(YAHOO.ext.grid.PropsDataModel, YAHOO.ext.grid.DefaultDataModel, { + setSource : function(o){ + this.source = o; + var data = []; + for(var key in o){ + if(this.isEditableValue(o[key])){ + var vals = [key, o[key]]; + vals.key = key; + data.push(vals); + } + } + this.removeAll(); + this.addRows(data); + }, + + getRowId: function(rowIndex){ + return this.data[rowIndex].key; + }, + + getPropertyName: function(rowIndex){ + return this.data[rowIndex].key; + }, + + isEditableValue: function(val){ + if(val && val instanceof Date){ + return true; + }else if(typeof val == 'object' || typeof val == 'function'){ + return false; + } + return true; + }, + + setValueAt : function(value, rowIndex, colIndex){ + var origVal = this.getValueAt(rowIndex, colIndex); + if(typeof origVal == 'boolean'){ + value = (value == 'true' || value == '1'); + } + YAHOO.ext.grid.PropsDataModel.superclass.setValueAt.call(this, value, rowIndex, colIndex); + var key = this.data[rowIndex].key; + if(key){ + this.source[key] = value; + } + }, + + getName : function(propName){ + if(typeof this.names[propName] != 'undefined'){ + return this.names[propName]; + } + return propName; + }, + + getSource : function(){ + return this.source; + } +}); +YAHOO.ext.grid.PropsColumnModel = function(dataModel, customEditors){ + YAHOO.ext.grid.PropsColumnModel.superclass.constructor.call(this, [ + {header: 'Name', sortable: true}, + {header: 'Value'} + ]); + this.dataModel = dataModel; + this.bselect = YAHOO.ext.DomHelper.append(document.body, { + tag: 'select', cls: 'ygrid-editor', children: [ + {tag: 'option', value: 'true', html: 'true'}, + {tag: 'option', value: 'false', html: 'false'} + ] + }); + YAHOO.util.Dom.generateId(this.bselect); + this.editors = { + 'date' : new YAHOO.ext.grid.DateEditor(), + 'string' : new YAHOO.ext.grid.TextEditor(), + 'number' : new YAHOO.ext.grid.NumberEditor(), + 'boolean' : new YAHOO.ext.grid.SelectEditor(this.bselect) + }; + this.customEditors = customEditors || {}; + this.renderCellDelegate = this.renderCell.createDelegate(this); +}; + +YAHOO.extendX(YAHOO.ext.grid.PropsColumnModel, YAHOO.ext.grid.DefaultColumnModel, { + isCellEditable : function(colIndex, rowIndex){ + return colIndex == 1; + }, + + getRenderer : function(col){ + if(col == 1){ + return this.renderCellDelegate; + } + return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer; + }, + + renderCell : function(val, rowIndex, colIndex){ + if(val instanceof Date){ + return this.renderDate(val); + }else if(typeof val == 'boolean'){ + return this.renderBool(val); + }else{ + return val; + } + }, + + getCellEditor : function(colIndex, rowIndex){ + var propName = this.dataModel.getPropertyName(rowIndex); + if(this.customEditors[propName]){ + return this.customEditors[propName]; + } + var val = this.dataModel.getValueAt(rowIndex, colIndex); + if(val instanceof Date){ + return this.editors['date']; + }else if(typeof val == 'number'){ + return this.editors['number']; + }else if(typeof val == 'boolean'){ + return this.editors['boolean']; + }else{ + return this.editors['string']; + } + }, + + getCellEditor : function(colIndex, rowIndex){ + var val = this.dataModel.getValueAt(rowIndex, colIndex); + if(val instanceof Date){ + return this.editors['date']; + }else if(typeof val == 'number'){ + return this.editors['number']; + }else if(typeof val == 'boolean'){ + return this.editors['boolean']; + }else{ + return this.editors['string']; + } + } +}); + +YAHOO.ext.grid.PropsColumnModel.prototype.renderDate = function(dateVal){ + return dateVal.dateFormat('m/j/Y'); +}; + +YAHOO.ext.grid.PropsColumnModel.prototype.renderBool = function(bVal){ + return bVal ? 'true' : 'false'; +}; + +YAHOO.ext.grid.PropsGrid = function(container, propNames){ + var dm = new YAHOO.ext.grid.PropsDataModel(propNames); + var cm =new YAHOO.ext.grid.PropsColumnModel(dm); + dm.sort(cm, 0, 'ASC'); + YAHOO.ext.grid.PropsGrid.superclass.constructor.call(this, container, dm, cm); + this.container.addClass('yprops-grid'); + this.lastEditRow = null; + this.on('cellclick', this.onCellClick, this, true); + this.on('beforeedit', this.beforeEdit, this, true); + this.on('columnresize', this.onColumnResize, this, true); +}; +YAHOO.extendX(YAHOO.ext.grid.PropsGrid, YAHOO.ext.grid.EditorGrid, { + onCellClick : function(grid, rowIndex, colIndex, e){ + if(colIndex == 0){ + this.startEditing(rowIndex, 1); + } + }, + + render : function(){ + YAHOO.ext.grid.PropsGrid.superclass.render.call(this); + this.getView().fitColumnsToContainer(); + }, + + autoSize : function(){ + YAHOO.ext.grid.PropsGrid.superclass.autoSize.call(this); + this.getView().fitColumnsToContainer(); + }, + + onColumnResize : function(){ + this.colModel.setColumnWidth(1, this.getView().wrap.clientWidth - this.colModel.getColumnWidth(0)); + }, + + beforeEdit : function(grid, rowIndex, colIndex){ + if(this.lastEditRow && rowIndex != this.lastEditRow.rowIndex){ + YAHOO.util.Dom.removeClass(this.lastEditRow, 'ygrid-prop-edting'); + } + this.lastEditRow = this.getRow(rowIndex); + YAHOO.util.Dom.addClass(this.lastEditRow, 'ygrid-prop-edting'); + }, + + setSource : function(source){ + this.dataModel.setSource(source); + }, + + getSource : function(){ + return this.dataModel.getSource(); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/array-grid.html b/www/extras/yui-ext/examples/grid/array-grid.html new file mode 100644 index 000000000..040759f0b --- /dev/null +++ b/www/extras/yui-ext/examples/grid/array-grid.html @@ -0,0 +1,29 @@ + + + +Array Grid Example + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Array Grid Example

    +

    This example shows how to create a grid from Array data. For more details on this example, see the blog post.

    +

    Note that the js is not minified so it is readable. See array-grid.js.

    + + +
    + + + diff --git a/www/extras/yui-ext/examples/grid/array-grid.js b/www/extras/yui-ext/examples/grid/array-grid.js new file mode 100644 index 000000000..395bf09a2 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/array-grid.js @@ -0,0 +1,87 @@ +var Example = { + init : function(){ + // some data yanked off the web + var myData = [ + ['3m Co',71.72,0.02,0.03,'9/1 12:00am'], + ['Alcoa Inc',29.01,0.42,1.47,'9/1 12:00am'], + ['Altria Group Inc',83.81,0.28,0.34,'9/1 12:00am'], + ['American Express Company',52.55,0.01,0.02,'9/1 12:00am'], + ['American International Group, Inc.',64.13,0.31,0.49,'9/1 12:00am'], + ['AT&T Inc.',31.61,-0.48,-1.54,'9/1 12:00am'], + ['Boeing Co.',75.43,0.53,0.71,'9/1 12:00am'], + ['Caterpillar Inc.',67.27,0.92,1.39,'9/1 12:00am'], + ['Citigroup, Inc.',49.37,0.02,0.04,'9/1 12:00am'], + ['E.I. du Pont de Nemours and Company',40.48,0.51,1.28,'9/1 12:00am'], + ['Exxon Mobil Corp',68.1,-0.43,-0.64,'9/1 12:00am'], + ['General Electric Company',34.14,-0.08,-0.23,'9/1 12:00am'], + ['General Motors Corporation',30.27,1.09,3.74,'9/1 12:00am'], + ['Hewlett-Packard Co.',36.53,-0.03,-0.08,'9/1 12:00am'], + ['Honeywell Intl Inc',38.77,0.05,0.13,'9/1 12:00am'], + ['Intel Corporation',19.88,0.31,1.58,'9/1 12:00am'], + ['International Business Machines',81.41,0.44,0.54,'9/1 12:00am'], + ['Johnson & Johnson',64.72,0.06,0.09,'9/1 12:00am'], + ['JP Morgan & Chase & Co',45.73,0.07,0.15,'9/1 12:00am'], + ['McDonald\'s Corporation',36.76,0.86,2.40,'9/1 12:00am'], + ['Merck & Co., Inc.',40.96,0.41,1.01,'9/1 12:00am'], + ['Microsoft Corporation',25.84,0.14,0.54,'9/1 12:00am'], + ['Pfizer Inc',27.96,0.4,1.45,'9/1 12:00am'], + ['The Coca-Cola Company',45.07,0.26,0.58,'9/1 12:00am'], + ['The Home Depot, Inc.',34.64,0.35,1.02,'9/1 12:00am'], + ['The Procter & Gamble Company',61.91,0.01,0.02,'9/1 12:00am'], + ['United Technologies Corporation',63.26,0.55,0.88,'9/1 12:00am'], + ['Verizon Communications',35.57,0.39,1.11,'9/1 12:00am'], + ['Wal-Mart Stores, Inc.',45.45,0.73,1.63,'9/1 12:00am'], + ['Walt Disney Company (The) (Holding Company)',29.89,0.24,0.81,'9/1 12:00am'] + ]; + var dataModel = new YAHOO.ext.grid.DefaultDataModel(myData); + + // example of custom renderer function + function italic(value){ + return '' + value + ''; + } + + // example of custom renderer function + function change(val, suffix){ + suffix = suffix || ''; + if(val > 0){ + return '' + val + suffix + ''; + }else if(val < 0){ + return '' + val + suffix + ''; + } + return val; + } + // example of custom renderer function + function pctChange(val){ + return change(val, '%'); + } + + // example of custom renderer function, this hideous code was grabbed off the web + function money(mnt) { + mnt -= 0; + mnt = (Math.round(mnt*100))/100; + mnt = (mnt == Math.floor(mnt)) ? mnt + '.00' : ( (mnt*10 == Math.floor(mnt*10)) ? mnt + '0' : mnt); + return "$" + mnt; + } + + // sortTypes provide support for custom sorting comparison functions + // not needed for this table but here for demonstration + var sort = YAHOO.ext.grid.DefaultColumnModel.sortTypes; + + // the DefaultColumnModel expects this blob to define columns. It can be extended to provide + // custom or reusable ColumnModels + var colModel = new YAHOO.ext.grid.DefaultColumnModel([ + {header: "Company", width: 200, sortable: true, sortType: sort.asUCString}, + {header: "Price", width: 75, sortable: true, renderer: money}, + {header: "Change", width: 75, sortable: true, renderer: change}, + {header: "% Change", width: 75, sortable: true, renderer: pctChange}, + {header: "Last Updated", width: 85, sortable: true, renderer: italic} + ]); + + // create the Grid + var grid = new YAHOO.ext.grid.Grid('example-grid', dataModel, colModel); + grid.render(); + + grid.getSelectionModel().selectFirstRow(); + } +} +YAHOO.ext.EventManager.onDocumentReady(Example.init, Example, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/custom-grid.html b/www/extras/yui-ext/examples/grid/custom-grid.html new file mode 100644 index 000000000..4c2b58662 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/custom-grid.html @@ -0,0 +1,31 @@ + + + +Customizing the Grid + + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Customizing the Grid

    +

    This example shows how to extend the grid to create a customized grid. The customized grid is an implementation of a Visual Studio Properties Editor.

    +

    Note that the js is not minified so it is readable. See custom-grid.js for the grid creation code +and PropsGrid.js for the extended grid code.

    + + +
    + + + diff --git a/www/extras/yui-ext/examples/grid/custom-grid.js b/www/extras/yui-ext/examples/grid/custom-grid.js new file mode 100644 index 000000000..cb5030c24 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/custom-grid.js @@ -0,0 +1,18 @@ +var Example = { + init : function(){ + var propsGrid = new YAHOO.ext.grid.PropsGrid('props-grid'); + // The props grid takes an object as a data source + propsGrid.setSource({ + "(name)": "Properties Grid", + "grouping": false, + "autoFitColumns": true, + "productionQuality": false, + "created": new Date(Date.parse('10/15/2006')), + "tested": false, + "version": .01, + "borderWidth": 1 + }); + propsGrid.render(); + } +} +YAHOO.ext.EventManager.onDocumentReady(Example.init, Example, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/edit-grid.html b/www/extras/yui-ext/examples/grid/edit-grid.html new file mode 100644 index 000000000..02715cb27 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/edit-grid.html @@ -0,0 +1,42 @@ + + + +Editor Grid Example + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Editor Grid Example

    +

    This example shows how to create a grid with inline editing. For more details on this example, see the blog post.

    +

    Note that the js is not minified so it is readable. See edit-grid.js.

    + +

    The data in the grid is loaded from plants.xml.

    + + + + + +
    + + + diff --git a/www/extras/yui-ext/examples/grid/edit-grid.js b/www/extras/yui-ext/examples/grid/edit-grid.js new file mode 100644 index 000000000..0fcc29568 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/edit-grid.js @@ -0,0 +1,92 @@ +EditorExample = function(){ + var dataModel; + var grid; + var colModel; + + var formatMoney = function(value){ + value -= 0; + value = (Math.round(value*100))/100; + value = (value == Math.floor(value)) ? value + '.00' : ( (value*10 == Math.floor(value*10)) ? value + '0' : value); + return "$" + value; + }; + + var formatBoolean = function(value){ + return value ? 'Yes' : 'No'; + }; + + var formatDate = function(value){ + return value.dateFormat('M d, Y'); + }; + + var parseDate = function(value){ + return new Date(Date.parse(value)); + }; + + return { + init : function(){ + var yg = YAHOO.ext.grid; + var cols = [{ + header: "Common Name", + width: 160, + editor: new yg.TextEditor({allowBlank: false}) + },{ + header: "Light", + width: 130, + editor: new yg.SelectEditor('light') + },{ + header: "Price", + width: 70, + renderer: formatMoney, + editor: new yg.NumberEditor({allowBlank: false, allowNegative: false, maxValue: 10}) + },{ + header: "Available", + width: 95, + renderer: formatDate, + editor: new yg.DateEditor({format: 'm/d/y', minValue: '01/01/06', disabledDays: [0, 6], + disabledDaysText: 'Plants are not available on the weekends', + disabledDates : ['^07', '04/15', '12/02/06'], + disabledDatesText : 'The plants are pollinating on %0, choose a different date.'}) + },{ + header: "Indoor?", + width: 55, + renderer: formatBoolean, + editor: new yg.CheckboxEditor() + }]; + colModel = new YAHOO.ext.grid.DefaultColumnModel(cols); + colModel.defaultSortable = true; + + var schema = { + tagName: 'plant', + id: 'use-index', + fields: ['common', 'light', 'price', 'availability', 'indoor'] + }; + dataModel = new YAHOO.ext.grid.XMLDataModel(schema); + dataModel.addPreprocessor(2, parseFloat); + dataModel.addPreprocessor(3, parseDate); + dataModel.addPreprocessor(4, Boolean); + dataModel.setDefaultSort(colModel, 0, "ASC"); + + grid = new YAHOO.ext.grid.EditorGrid('editor-grid', dataModel, colModel); + // to use double click to edit: + //grid.getSelectionModel().clicksToActivateCell = 2; + grid.render(); + + dataModel.load('plants.xml'); + }, + + // filtering support, regex, function or text match + filter : function(e){ + var mfilter = function(value){ + return (value == 'Shade'); + } + dataModel.filter({0: /^B.*/i, 1: mfilter}); + }, + + // hide columns + hide : function(e){ + colModel.setHidden(1, true); + } + }; +}(); + +YAHOO.ext.EventManager.onDocumentReady(EditorExample.init, EditorExample, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/paging-grid.html b/www/extras/yui-ext/examples/grid/paging-grid.html new file mode 100644 index 000000000..b6bbac8d4 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/paging-grid.html @@ -0,0 +1,22 @@ + + + + +Paging Grid + + + + + + + + + + + + +

    Paging and Remote Datasets

    +

    Unfortunately paging requires a server-side script for your environment and a static example can't be created. + However, there is a great explanation of the paging system, how it works and how to use it available in the blog post.

    + + diff --git a/www/extras/yui-ext/examples/grid/plants.xml b/www/extras/yui-ext/examples/grid/plants.xml new file mode 100644 index 000000000..dfb0ea556 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/plants.xml @@ -0,0 +1,327 @@ + + + + Bloodroot + Sanguinaria canadensis + 4 + Mostly Shady + 2.44 + 03/15/2006 + true + + + Columbine + Aquilegia canadensis + 3 + Mostly Shady + 9.37 + 03/06/2006 + true + + + Marsh Marigold + Caltha palustris + 4 + Mostly Sunny + 6.81 + 05/17/2006 + false + + + Cowslip + Caltha palustris + 4 + Mostly Shady + 9.90 + 03/06/2006 + true + + + Dutchman's-Breeches + Dicentra cucullaria + 3 + Mostly Shady + 6.44 + 01/20/2006 + true + + + Ginger, Wild + Asarum canadense + 3 + Mostly Shady + 9.03 + 04/18/2006 + true + + + Hepatica + Hepatica americana + 4 + Mostly Shady + 4.45 + 01/26/2006 + true + + + Liverleaf + Hepatica americana + 4 + Mostly Shady + 3.99 + 01/02/2006 + true + + + Jack-In-The-Pulpit + Arisaema triphyllum + 4 + Mostly Shady + 3.23 + 02/01/2006 + true + + + Mayapple + Podophyllum peltatum + 3 + Mostly Shady + 2.98 + 06/05/2006 + true + + + Phlox, Woodland + Phlox divaricata + 3 + Sun or Shade + 2.80 + 01/22/2006 + false + + + Phlox, Blue + Phlox divaricata + 3 + Sun or Shade + 5.59 + 02/16/2006 + false + + + Spring-Beauty + Claytonia Virginica + 7 + Mostly Shady + 6.59 + 02/01/2006 + true + + + Trillium + Trillium grandiflorum + 5 + Sun or Shade + 3.90 + 04/29/2006 + false + + + Wake Robin + Trillium grandiflorum + 5 + Sun or Shade + 3.20 + 02/21/2006 + false + + + Violet, Dog-Tooth + Erythronium americanum + 4 + Shade + 9.04 + 02/01/2006 + true + + + Trout Lily + Erythronium americanum + 4 + Shade + 6.94 + 03/24/2006 + true + + + Adder's-Tongue + Erythronium americanum + 4 + Shade + 9.58 + 04/13/2006 + true + + + Anemone + Anemone blanda + 6 + Mostly Shady + 8.86 + 12/26/2006 + true + + + Grecian Windflower + Anemone blanda + 6 + Mostly Shady + 9.16 + 07/10/2006 + true + + + Bee Balm + Monarda didyma + 4 + Shade + 4.59 + 05/03/2006 + true + + + Bergamot + Monarda didyma + 4 + Shade + 7.16 + 04/27/2006 + true + + + Black-Eyed Susan + Rudbeckia hirta + Annual + Sunny + 9.80 + 06/18/2006 + false + + + Buttercup + Ranunculus + 4 + Shade + 2.57 + 06/10/2006 + true + + + Crowfoot + Ranunculus + 4 + Shade + 9.34 + 04/03/2006 + true + + + Butterfly Weed + Asclepias tuberosa + Annual + Sunny + 2.78 + 06/30/2006 + false + + + Cinquefoil + Potentilla + Annual + Shade + 7.06 + 05/25/2006 + true + + + Primrose + Oenothera + 3 - 5 + Sunny + 6.56 + 01/30/2006 + false + + + Gentian + Gentiana + 4 + Sun or Shade + 7.81 + 05/18/2006 + false + + + Blue Gentian + Gentiana + 4 + Sun or Shade + 8.56 + 05/02/2006 + false + + + Jacob's Ladder + Polemonium caeruleum + Annual + Shade + 9.26 + 02/21/2006 + true + + + Greek Valerian + Polemonium caeruleum + Annual + Shade + 4.36 + 07/14/2006 + true + + + California Poppy + Eschscholzia californica + Annual + Sunny + 7.89 + 03/27/2006 + false + + + Shooting Star + Dodecatheon + Annual + Mostly Shady + 8.60 + 05/13/2006 + true + + + Snakeroot + Cimicifuga + Annual + Shade + 5.63 + 07/11/2006 + true + + + Cardinal Flower + Lobelia cardinalis + 2 + Shade + 3.02 + 02/22/2006 + true + + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/sheldon.xml b/www/extras/yui-ext/examples/grid/sheldon.xml new file mode 100644 index 000000000..dc50e285f --- /dev/null +++ b/www/extras/yui-ext/examples/grid/sheldon.xml @@ -0,0 +1 @@ +
    18CZWZFXKSV8F601AGMF1.05041599273682
    TrueSidney SheldonBooks203210446355453http://www.amazon.com/gp/redirect.html%3FASIN=0446355453%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446355453%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookMaster of the Game0446613657http://www.amazon.com/gp/redirect.html%3FASIN=0446613657%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446613657%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookAre You Afraid of the Dark?0446357421http://www.amazon.com/gp/redirect.html%3FASIN=0446357421%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446357421%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookIf Tomorrow Comes0446607207http://www.amazon.com/gp/redirect.html%3FASIN=0446607207%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446607207%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner VisionBookTell Me Your Dreams0446357448http://www.amazon.com/gp/redirect.html%3FASIN=0446357448%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446357448%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookBloodline0446532673http://www.amazon.com/gp/redirect.html%3FASIN=0446532673%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446532673%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookThe Other Side of Me0446356573http://www.amazon.com/gp/redirect.html%3FASIN=0446356573%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446356573%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookA Stranger in the Mirror0060198346http://www.amazon.com/gp/redirect.html%3FASIN=0060198346%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0060198346%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWilliam Morrow & CompanyBookThe Sky Is Falling0446354732http://www.amazon.com/gp/redirect.html%3FASIN=0446354732%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446354732%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookNothing Lasts Forever0446341916http://www.amazon.com/gp/redirect.html%3FASIN=0446341916%26tag=ws%26lcode=xm2%26cID=2025%26ccmID=165953%26location=/o/ASIN/0446341916%253FSubscriptionId=1A7XKHR5BYD0WPJVQEG2Sidney SheldonWarner BooksBookThe Naked Face
    \ No newline at end of file diff --git a/www/extras/yui-ext/examples/grid/xml-grid.html b/www/extras/yui-ext/examples/grid/xml-grid.html new file mode 100644 index 000000000..5855f5a11 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/xml-grid.html @@ -0,0 +1,34 @@ + + + +XML Grid Example + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    XML Grid Example

    +

    This example shows how to load a grid with XML data. For more details on this example, see the blog post.

    + +

    This grid also uses autoHeight and autoWidth to dynamically size to fit it's data and columns.

    + +

    Note that the js is not minified so it is readable. See xml-grid.js.

    + +

    The data in the grid is loaded from sheldon.xml, which is directly from an Amazon.com search.

    + + +
    + + + diff --git a/www/extras/yui-ext/examples/grid/xml-grid.js b/www/extras/yui-ext/examples/grid/xml-grid.js new file mode 100644 index 000000000..9ecd1db28 --- /dev/null +++ b/www/extras/yui-ext/examples/grid/xml-grid.js @@ -0,0 +1,28 @@ +var XmlExample = { + init : function(){ + var schema = { + tagName: 'Item', + id: 'ASIN', + fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup'] + }; + dataModel = new YAHOO.ext.grid.XMLDataModel(schema); + + // the DefaultColumnModel expects this blob to define columns. It can be extended to provide + // custom or reusable ColumnModels + var colModel = new YAHOO.ext.grid.DefaultColumnModel([ + {header: "Author", width: 120, sortable: true}, + {header: "Title", width: 180, sortable: true}, + {header: "Manufacturer", width: 115, sortable: true}, + {header: "Product Group", width: 100, sortable: true} + ]); + + // create the Grid + var grid = new YAHOO.ext.grid.Grid('example-grid', dataModel, colModel); + grid.autoWidth = true; + grid.autoHeight = true; + grid.render(); + + dataModel.load('/blog/examples/sheldon.xml'); + } +} +YAHOO.ext.EventManager.onDocumentReady(XmlExample.init, XmlExample, true); diff --git a/www/extras/yui-ext/examples/info-bg.gif b/www/extras/yui-ext/examples/info-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..362d65bfca706fa6859de3903ad086011bd9f8f2 GIT binary patch literal 852 zcmZ?wbhEHbWMoKTXlG!!`{v(0AbR`n{@Z^K-u-(BMDPDSdjIb+5PkUf$enK-?qc!hy!4>;g&|Qw|g|wQ?yqcgc8eT5@u-hBq4vgEas{ ClTpC{ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/complex.html b/www/extras/yui-ext/examples/layout/complex.html new file mode 100644 index 000000000..9941ba5c5 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/complex.html @@ -0,0 +1,163 @@ + + + Complex Layout + + + + + + + + + + + + + + +
    +
    + Hi. I'm the west panel. +
    +
    + north - generally for menus, toolbars and/or advertisements +
    +
    + The layout manager will automatically create and/or remove the TabPanel component when a region has more than one panel. Close one of my panels and you can see what I mean. +
    +
    +

    Show West Region

    +

    My closable attribute is set to false so you can't close me. The other center panels can be closed.

    +

    The center panel automatically grows to fit the remaining space in the container that isn't taken up by the border regions.

    +
    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +

    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras imperdiet felis id velit. Ut non quam at sem dictum ullamcorper. Vestibulum pharetra purus sed pede. Aliquam ultrices, nunc in varius mattis, felis justo pretium magna, eget laoreet justo eros id eros. Aliquam elementum diam fringilla nulla. Praesent laoreet sapien vel metus. Cras tempus, sapien condimentum dictum dapibus, lorem augue fringilla orci, ut tincidunt eros nisi eget turpis. Nullam nunc nunc, eleifend et, dictum et, pharetra a, neque. Ut feugiat. Aliquam erat volutpat. Donec pretium odio nec felis. Phasellus sagittis lacus eget sapien. Donec est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +
    +
    +

    Done reading me? Close me by clicking the X in the top right corner.

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +
    +
    +
    +
    + south - generally for informational stuff, also could be for status bar +
    +
    + + diff --git a/www/extras/yui-ext/examples/layout/feed-proxy.php b/www/extras/yui-ext/examples/layout/feed-proxy.php new file mode 100644 index 000000000..e4654dce4 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-proxy.php @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/www/extras/yui-ext/examples/layout/feed-viewer.css b/www/extras/yui-ext/examples/layout/feed-viewer.css new file mode 100644 index 000000000..f7cb8e1bd --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.css @@ -0,0 +1,221 @@ +html, body { + font: normal 9pt tahoma; + margin: 0px; + padding:0px; + border:0px; +} +.ylayout-panel-south{ + background:#c3daf9; + border:0px none; + border-top:1px solid #ddecfe; +} +.ytheme-gray .ylayout-panel-south{ + background:#f3f2e7; + border:0px none; +} +.ylayout-panel-north, .ytheme-gray .ylayout-panel-north{ + background-image: url(images/header.gif); + background-repeat: repeat-x; + color:#FFF; + font:bold 12px verdana, helvetica; + overflow:hidden; + padding:4px; + border:0px none; + border-bottom:2px solid #c3daf9; +} +.ytheme-gray .ylayout-panel-north{ + border-bottom:2px solid #f3f2e7; +} +.ylayout-panel-hd-text{ + font: bold 11px tahoma,verdana,helvetica; + color:#083772; +} +.ytheme-gray .ylayout-panel-hd-text{ + font: bold 11px tahoma,verdana,helvetica; + color:#333333; +} +#preview-body{ + background:white; +} +#main .ylayout-panel-center{ + border-bottom:1px solid #98c0f4; +} +#preview-body { + padding:10px; + overflow:auto; + line-height: 18px; +} +#preview-body p{ + margin:5px; + margin-bottom:10px; +} +.ytoolbar{ + border:0px none; + background-color:#D8E7FB; + border-bottom:1px solid #c3daf9; + padding-bottom:1px; +} +#preview-tb .view-tab,#preview-tb .view-window,#myfeeds-tb .add-feed{ + background-position: 0px 0px; + background-repeat: no-repeat; + padding-left:18px; + padding-top:1px; + width:auto; + display:block; +} +.view-tab{ + background-image: url('images/new_tab.gif'); +} +.view-window{ + background-image: url('images/new_window.gif'); +} +.add-feed { + background-image: url('images/add-feed.gif'); +} +#myfeeds-body{ + overflow:auto; +} +#preview-tb .view-tab,#preview-tb .view-window{ + background-position: 0px 0px; + background-repeat: no-repeat; + padding-left:18px; + padding-top:1px; + width:auto; + display:block; +} +.view-tab{ + background-image: url('images/new_tab.gif'); +} +.view-window{ + background-image: url('images/new_window.gif'); +} +.feed-list{ + padding:1px; +} +.feed-list a{ + border:1px solid white; + display:block; + -moz-outline:none; + margin-bottom:2px; + text-decoration:none; +} +.feed-list a .body{ + padding:5px 2px 5px 22px; + background-image:url(images/rss.gif); + background-position: 2px 5px; + background-repeat: no-repeat; + font:bold 12px tahoma, verdana, helvetica; + color: #2d5593; + display:block; + -moz-outline:none; +} +.feed-list a .desc{ + font:normal 11px tahoma, verdana, helvetica; + color: #222222; +} +.feed-list a:hover, .feed-list .selected{ + text-decoration: none; + border:1px solid #c3daf9; + background-color:#ddecfe; +} +.feed-list .selected{ + background-image: url('images/post-bg.gif'); + border:1px solid #c3daf9; +} +#feed-grid { + overflow:auto; +} +#add-feed{ + background-image: url('images/post-bg.gif'); + border:2px solid #c3daf9; + position:absolute; + z-index:10006; + font-size:8pt; + width:300px; + padding:5px; + overflow:auto; + left:-1000px; + top:-1000px; +} +#add-feed input{ + font:normal 8pt arial,helvetica; +} +#add-feed .eg{ + display:block; + padding:3px; + color:#1e4e8f; +} +#feed-url{ + width:240px; +} +#add-feed-close{ + position:absolute; + right:2px; + top:2px; + cursor:pointer; +} +#add-feed p{ + height:18px; + display:none; +} +#add-feed p.active-msg{ + display:block; +} + +#status { + font-size:8pt; + background-image: url('/blog/images/grid/loading.gif'); + background-repeat: no-repeat; + background-position: left; + padding-left:20px; + padding-top:3px; + height:18px; +} +#status.done { + background-image: url('/blog/images/grid/done.gif'); +} +.ylayout-collapsed-west{ + background-image:url(images/myfeeds.gif); + background-repeat:no-repeat; + background-position:center; +} +.ylayout-collapsed-east{ + background-image:url(images/suggested.gif); + background-repeat:no-repeat; + background-position:center; +} +#main .ylayout-collapsed-south{ + background-image:url(images/preview.gif); + background-repeat:no-repeat; + background-position:center; +} + +/** Comment List */ +.item-date { + margin: 0; + display: block; + font-size: 10px; + font-weight:normal; + margin-bottom:3px; +} +.item-title{ + font:bold 11px "sans serif", verdana; + color:#444444; +} +.feed-item { + display:block; + margin:5px; + padding:5px; + font-size:11px; + border:1px solid white; + border-bottom:1px solid #dddddd; + color:#222222; + cursor:pointer; + line-height: 18px; + -moz-user-select: none; + -khtml-user-select:none; +} +.selected-article{ + background:#ecf5fe url('images/post-bg.gif') repeat-x; + border:1px solid #c3daf9; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/layout/feed-viewer.html b/www/extras/yui-ext/examples/layout/feed-viewer.html new file mode 100644 index 000000000..cc79e6abc --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.html @@ -0,0 +1,37 @@ + + + RSS Feed Viewer 2.0 + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + diff --git a/www/extras/yui-ext/examples/layout/feed-viewer.js b/www/extras/yui-ext/examples/layout/feed-viewer.js new file mode 100644 index 000000000..43aad2933 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/feed-viewer.js @@ -0,0 +1,312 @@ +String.prototype.ellipse = function(maxLength){ + if(this.length > maxLength){ + return this.substr(0, maxLength-3) + '...'; + } + return this; +} + +var Viewer = function(){ + // a bunch of private variables accessible by member function + var layout, statusPanel, south, preview, previewBody, feedPanel; + var grid, dm, sm; + var addFeed, currentItem, tpl; + var suggested, feeds; + var sfeeds, myfeeds; + var seed = 0; + + // feed clicks bubble up to this universal handler + var feedClicked = function(e){ + // find the "a" element that was clicked + var a = e.findTarget(null, 'a'); + if(a){ + e.preventDefault(); + Viewer.loadFeed(a.href); + Viewer.changeActiveFeed(a.id.substr(5)); + } + }; + + return { + init : function(){ + // initialize state manager, we will use cookies + YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider()); + + // initialize the add feed overlay and buttons + addFeed = getEl('add-feed'); + var addBtn = getEl('add-btn'); + addBtn.on('click', this.validateFeed, this, true); + var closeBtn = getEl('add-feed-close'); + closeBtn.on('click', addFeed.hide, addFeed, true); + + // create Elements for the feed and suggested lists + feeds = getEl('feeds'), suggested = getEl('suggested'); + + // delegate clicks on the lists + feeds.mon('click', feedClicked); + suggested.mon('click', feedClicked); + + //create feed template + tpl = new YAHOO.ext.DomHelper.Template('{name}
    {desc}
    '); + + // collection of feeds added by the user + myfeeds = {}; + + // some default feeds + sfeeds = { + 'jvs':{id:'jvs', name: 'JackSlocum.com', desc: 'Using the Yahoo! UI Library- Beyond the Examples.', url:'http://www.jackslocum.com/yui/feed/'}, + 'ajaxian':{id:'ajaxian', name: 'Ajaxian', desc: 'Cleaning up the web with Ajax.', url:'http://feeds.feedburner.com/ajaxian'}, + 'yui':{id:'yui', name: 'YUI Blog', desc: 'News and Articles about Designing and Developing with Yahoo! Libraries.', url:'http://feeds.yuiblog.com/YahooUserInterfaceBlog'}, + 'sports':{id:'sports', name: 'Yahoo! Sports', desc: 'Latest news and information for the world of sports.', url:'http://sports.yahoo.com/top/rss.xml'} + }; + + // go through the suggested feeds and add them to the list + for(var id in sfeeds) { + var f = sfeeds[id]; + tpl.append(suggested.dom, f); + } + + // create the main layout + layout = new YAHOO.ext.BorderLayout(document.body, { + north: { + split:false, + initialSize: 25, + titlebar: false + }, + west: { + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + autoScroll:false, + useShim:true, + cmargins: {top:0,bottom:2,right:2,left:2} + }, + east: { + split:true, + initialSize: 200, + minSize: 175, + maxSize: 400, + titlebar: true, + collapsible: true, + animate: true, + autoScroll:false, + useShim:true, + collapsed:true, + cmargins: {top:0,bottom:2,right:2,left:2} + }, + south: { + split:false, + initialSize: 22, + titlebar: false, + collapsible: false, + animate: false + }, + center: { + titlebar: false, + autoScroll:false, + tabPosition: 'top', + closeOnTab: true, + alwaysShowTabs: true, + resizeTabs: true + } + }); + // tell the layout not to perform layouts until we're done adding everything + layout.beginUpdate(); + layout.add('north', new YAHOO.ext.ContentPanel('header')); + + // initialize the statusbar + statusPanel = new YAHOO.ext.ContentPanel('status'); + south = layout.getRegion('south'); + south.add(statusPanel); + + // create the add feed toolbar + var feedtb = new YAHOO.ext.Toolbar('myfeeds-tb'); + feedtb.addButton({id:'add-feed-btn', text: 'Add Feed', className: 'add-feed', click: this.showAddFeed.createDelegate(this)}); + + layout.add('west', new YAHOO.ext.ContentPanel('feeds', {title: 'My Feeds', fitToFrame:true, toolbar: feedtb, resizeEl:'myfeeds-body'})); + layout.add('east', new YAHOO.ext.ContentPanel('suggested', {title: 'Suggested Feeds', fitToFrame:true})); + + // the inner layout houses the grid panel and the preview panel + var innerLayout = new YAHOO.ext.BorderLayout('main', { + south: { + split:true, + initialSize: 250, + minSize: 100, + maxSize: 400, + autoScroll:false, + collapsible:true, + titlebar: true, + animate: true, + cmargins: {top:2,bottom:0,right:0,left:0} + }, + center: { + autoScroll:false, + titlebar:false + } + }); + // add the nested layout + feedPanel = new YAHOO.ext.NestedLayoutPanel(innerLayout, 'View Feed'); + layout.add('center', feedPanel); + + innerLayout.beginUpdate(); + + var lv = innerLayout.add('center', new YAHOO.ext.ContentPanel('feed-grid', {title: 'Feed Articles', fitToFrame:true})); + this.createView(lv.getEl()); + + // create the preview panel and toolbar + previewBody = getEl('preview-body'); + var tb = new YAHOO.ext.Toolbar('preview-tb'); + tb.addButton({text: 'View in New Tab', className: 'view-tab', click: this.showInTab.createDelegate(this)}); + tb.addSeparator(); + tb.addButton({text: 'View in New Window', className: 'view-window', click: this.showInWindow.createDelegate(this)}); + + preview = new YAHOO.ext.ContentPanel('preview', {title: "Preview", fitToFrame:true, toolbar: tb, resizeEl:'preview-body'}); + innerLayout.add('south', preview); + + // restore innerLayout state + innerLayout.restoreState(); + innerLayout.endUpdate(true); + + // restore any state information + layout.restoreState(); + layout.endUpdate(); + + // load the default feed - setTimeout for FireFox Mac? + setTimeout(function(){ + this.loadFeed('http://www.jackslocum.com/yui/feed/'); + this.changeActiveFeed('jvs'); + }.createDelegate(this), 50); + }, + + createView : function(el){ + function reformatDate(feedDate){ + var d = new Date(Date.parse(feedDate)); + return d ? d.dateFormat('D M j, Y, g:i a') : ''; + } + + dm = new YAHOO.ext.grid.XMLDataModel({ + tagName: 'item', + id: 'use-index', + fields: ['title', 'pubDate', 'link', 'description'] + }); + dm.addPreprocessor(1, reformatDate); // add preprocessor to col 1 to parse dates + dm.on('load', this.onLoad, this, true); + + var tpl = new YAHOO.ext.DomHelper.Template( + '
    ' + + '
    {title}
    ' + + '
    {date}
    ' + + '{desc}
    ' + ); + + var view = new YAHOO.ext.View(el, tpl, dm, {singleSelect:true, selectedClass:'selected-article'}); + view.prepareData = function(data){ + return { + title: data[0], + date: data[1], + desc: data[3].replace(/<\/?[^>]+>/gi, '').ellipse(350) + }; + } + view.on('click', this.showPost, this, true); + view.on('dblclick', this.showFullPost, this, true); + }, + + onLoad : function(){ + if(dm.getRowCount() < 1){ + preview.setContent(''); + } + statusPanel.getEl().addClass('done'); + statusPanel.setContent('Done.'); + }, + + loadFeed : function(feed){ + statusPanel.setContent('Loading feed ' + feed + '...'); + statusPanel.getEl().removeClass('done'); + dm.load('feed-proxy.php', {'feed': feed}); + }, + + showPost : function(view, dataIndex){ + var node = dm.getNode(dataIndex); + var link = dm.getNamedValue(node, 'link'); + var title = dm.getValueAt(dataIndex, 0); + var desc = dm.getNamedValue(node, 'description', 'No Description Available.'); + currentItem = { + index: dataIndex, link: link + }; + preview.setTitle(title.ellipse(80)); + previewBody.update(desc); + }, + + showFullPost : function(view, rowIndex){ + var node = dm.getNode(rowIndex); + var link = dm.getNamedValue(node, 'link'); + var title = dm.getValueAt(rowIndex, 0); + if(!title){ + title = 'View Post'; + } + var iframe = YAHOO.ext.DomHelper.append(document.body, + {tag: 'iframe', frameBorder: 0, src: link}); + var panel = new YAHOO.ext.ContentPanel(iframe, + {title: title, fitToFrame:true, closable:true}); + layout.add('center', panel); + }, + + showInTab : function(){ + if(currentItem){ + this.showFullPost(grid, currentItem.index); + } + }, + + showInWindow : function(){ + if(currentItem){ + window.open(currentItem.link, 'win'); + } + }, + + changeActiveFeed : function(feedId){ + YAHOO.util.Dom.removeClass(suggested.dom.getElementsByTagName('a'), 'selected'); + YAHOO.util.Dom.removeClass(feeds.dom.getElementsByTagName('a'), 'selected'); + YAHOO.util.Dom.addClass('feed-'+feedId, 'selected'); + var feed = sfeeds[feedId] || myfeeds[feedId]; + feedPanel.setTitle('View Feed (' + feed.name.ellipse(16) + ')'); + }, + + showAddFeed : function(){ + getEl('feed-url').dom.value = ''; + getEl('add-title').radioClass('active-msg'); + addFeed.alignTo('add-feed-btn', 'tl', [3,3]) + addFeed.show(); + }, + + validateFeed : function(){ + var url = getEl('feed-url').dom.value; + getEl('loading-feed').radioClass('active-msg'); + var success = function(o){ + try{ + var xml = o.responseXML; + var channel = xml.getElementsByTagName('channel')[0]; + var titleEl = channel.getElementsByTagName('title')[0]; + var descEl = channel.getElementsByTagName('description')[0]; + var name = titleEl.firstChild.nodeValue; + var desc = (descEl.firstChild ? descEl.firstChild.nodeValue : ''); + var id = ++seed; + myfeeds[id] = {id:id, name:name, desc:desc, url:url}; + tpl.append('myfeeds-body', myfeeds[id]); + this.changeActiveFeed(id); + addFeed.hide(); + dm.loadData(xml); + }catch(e){ + getEl('invalid-feed').radioClass('active-msg'); + } + }.createDelegate(this); + var failure = function(o){ + getEl('invalid-feed').radioClass('active-msg'); + }; + YAHOO.util.Connect.asyncRequest('POST', 'feed-proxy.php', {success:success, failure:failure}, 'feed='+encodeURIComponent(url)); + } + }; +}(); +//YAHOO.ext.EventManager.onDocumentReady(Viewer.init, Viewer, true); +YAHOO.util.Event.on(window, 'load', Viewer.init, Viewer, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/layout/images/Thumbs.db b/www/extras/yui-ext/examples/layout/images/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..8b954594a5bc158475a0225d60631bbc13a82fcc GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/article.gif b/www/extras/yui-ext/examples/layout/images/article.gif new file mode 100644 index 0000000000000000000000000000000000000000..abcebe5f1cc7e911662cc96db23e86b5c9b871b2 GIT binary patch literal 954 zcmZ?wbhEHb6krfwXlDQc1CIoU{|*fe4HFh@Xqa)KVZnt73l2DzK&}Mk2?mbo46Gb79vc=gu=5L9WgOUWu!)sJKt`cpL-WyYar2xD z7Ze*B*ku_yL^1;xv+;=ASRI&AsLVD+PC7=$VYAv`0p@z>l21iFd70QG6WQVvM_@@t^*=Kd4hpMfq@Z7Y)ClB ez{1PrGUI~6;Wlo0tCSTJl3Y93MVUA_7_0&JKM*zm literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/cancel.gif b/www/extras/yui-ext/examples/layout/images/cancel.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb734917ba7f69e614e554590976f48305770f69 GIT binary patch literal 1282 zcmZ?wbhEHbG+_{CXlGzhP*6}-R#sJ2RZ~;b(9qBX0WB>pZ5y0 z3rirdvb40ev$J<{a&~rhadmZbbMx@<@bdEy@b?c02nY%e2@MO62n&x)N=i*j&q~k8 z%F52m$<5EsDagw&DlRE6E3d4qs;RE2Gs{|6UDHro*H~NE`J%8{|4QtnL+OT=s#!cHd zZQiwc+s>W4_w3$tV9)+T2M!%OaOlK=LnjX(J$3B(*<;7g9X)yG*oia8Po6t*=KRT1 z7fzqOa^~Ena~G~(xOna2(9?We}Db?_vg>QfB*jf`ws#PqhQd7fZ|UUW(Edr1|5(~L3x6K<3B_A1__T13l27O z2y2;W7Fi{e*zPHukgYoTy^fuz@#6&DwKOx9Ap#ik-{6tLK9uGiL8p(_~HZDQQX)^mM* ze5MD-gas@&HfLO}VqGA1MruOlz7un`&D)sef;wg_IK6#+{7!~{b)L*ZyweYN@JGLB ztT>&>%)oZ$0aHUuBb&nxjhO}qn5L_VF}X-MS#HcUQ8=FwdA4dRllIzh>%vFOO=1lC z6AqkMpxVr#;#c*!Aj$dg+Z$`oH|R`Wy7Tihjx{#tnT|5IFfwdPIq#%e-Kctwo8i8M zy~FP>&r=<`b{^Vi`z>)9|IV3d_m zJj}$@!q6aSy=_M_uTfCK5q=2rl~gl<;DxgBr=v|y3NYk)cI^y-l3Dr=44&6bPLvD*?4ST&9;N-^XuQeOkdFa fFEV3(`?`-8xztTwy;wZKP3z^7DNehb92l$tCa<$v literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/comment-bg.gif b/www/extras/yui-ext/examples/layout/images/comment-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1b04161ac73c0ce13fa85337d722033b6442d93 GIT binary patch literal 838 zcmZ?wbhEHbWMt4_XlG#f{Q2{jFJHcX{rc_Ox9{J-|M>Ca=g*(Ne*OCW`}dzefBydc z`|sbs|Ns9pjDpb+7>*&J_>%?bt^W)DzK&}Mk2?mbo46Gb79vc=gu=5L9WgOUWu!)sJKt`cpL-WyYar2xD z7Ze*B*ku_yL^1;xv+;=ASRI&AsLVD+PC7=$VYAvLCjt~2+6CmxUd(9$L?xV-C0v%JTvlb=AXLt6UCskS6+AW-yf&4* zHdTDKKvd0d2Shaj_CQoC=ujuNL=D1DK-4JW+$7@MEb0P8En==f)GF=L_R>&$1n;;Lx5f(p!kyoXw`oP9gu~f zJi)+G1Ee_w91b)zvv6sc6g*&PV&M|gNw~0JQ8T-QqDzN@;~^F<1?`Xx2@jh*c_f2Y zT{*BR^)#_>C*M<(ev-q z513#OG}$nCs!`~4ldzel5wp!A=bA^)w}@G26}Q+reyL63a@(Yp45MH)1cq7&DE?#t yI{80?4#?r4Ji)*r&tMp{A)xUP3#XuhO~HkRgG{WP0x|{x4F?z)85vku7_0%1mM3oj literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/myfeeds.gif b/www/extras/yui-ext/examples/layout/images/myfeeds.gif new file mode 100644 index 0000000000000000000000000000000000000000..d41d32a91549210eca88baf27962bc58aada0b88 GIT binary patch literal 1220 zcmZ?wbhEHb6k?dh(9XahYMv}^nJQ(IA#0bV;FzQ2lCSDksNq?x?OmqpS78uPZ5&){ z8dh%+(PSOnVi()ykkILz)a{nq>z6wvq-bVX$(+dYc`=m>;%gQs)-O$OS(VkcCZ}^< ze)q=m$vdj1?W&)>ziIBl)&)m879ZiSDFHeH#$<@&tsHy7-> zy?D>PW&0njJosq!k*Dj9J>Pip)s{1Fww-&o^Ww)nmp|{j_VwV6ABS)KWEcgbAwbm- zQ2fcl%)nsDpaU`$lqVQC{xcMF$arj6aIl#}SS#klhJ}aQ1(dz!cx+sBv|B-!fuWJhO=Hf7;0K*-T%0KxAH$zFOf@Ysaa-t+*vzTNa6zH*LDL~Yf93-b z5=o2{f?}MMVHmf zIcOYaZl2Gb5OAQBDfh!=2JsbT%pB} zOmZ$a1bBsI1e&V&IvpIC_zng*GT7*p+Htew1Q`-BZ=_TT=0{ql_4*Jj?oG4t`6wio9cKHcv6 zaCg$D`%`|u?Em&);{P`je!rgi=k4tOAAA0Pobdm{Eefa+kPxVCRza*-`MYfx#L8kn+hn literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/new_window.gif b/www/extras/yui-ext/examples/layout/images/new_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..f3883546ac374f554990cbdf274304e28e164eef GIT binary patch literal 1019 zcmeIx`Ad@l7{Kv&x;!fKHKdfFQlvvX32h?iRPc%dQDXfNnIcw5VS$Auy=Hl2n#UBE zD5i;td6c52kxeD7Jf@jW=X~AXojTq1?mhOt+uQsj`mHY?o?jn$;7LqQ;6&a80T3t! zfbit3kj$B|?77JM^5}eon~x+sR-_anT!wq4NO849$tzW6R;hCN>g;;+9f2jkNt4%X zdDw;(b`opdev-a3@K7*36ao*2ZH`Mi z4IQIzy1usbPCoA@EBdYNgA1KwlJ3uLaB*OAV{Asc`nyrGB7nsLWVS@J0GT8& z4boZ@%%`-kv8@_LS555*=-np9_=+)BGln|GSjU(f%*q~A(?_aX33WT6>A-dd8De~L z9{#xm|5!24uA%em=+f$zcta+VqDz~WW!Ulu##Ut5n%n_jM=*&3mnw0o3g1-Yu$o|~ zNrsxlWhlS-Xcr6bk5R?Qx%)mycCYTIDlF;F_Ab>m0{8dq{{-MB24a`RsjTTrAGf0c={)~<50B_TF)yhm5e$hNWtX$wvWgG5 z9|pZ4XrjdTNmZ^0l25VSJx_8#2yzAeC42Bx=u0HfrfZ_K03_r3!iDPCvJd!IVU&pC49!j0af+n@X&On5>qoYY#y bi$li(GMf@YouFOG$i1|Uxv`6S2#ER%&4ZxQ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/post-bg.gif b/www/extras/yui-ext/examples/layout/images/post-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..362d65bfca706fa6859de3903ad086011bd9f8f2 GIT binary patch literal 852 zcmZ?wbhEHbWMoKTXlG!!`{v(0AbR`n{@Z^K-u-(BMDPDSdjIb+5PkUf$enK-?qc!hy!4>;g&|Qw|g|wQ?yqcgc8eT5@u-hBq4vgEas{ ClTpC{ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/preview.gif b/www/extras/yui-ext/examples/layout/images/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..31e34139dc1c1640581fa542d75813e556554723 GIT binary patch literal 1196 zcmZ?wbhEHboW>x;(9XahYMv}%l`3VEA#0zd;FzQAlCSDksNq?x?OmqlS78uXZ5&){ z7FKT^-Qt+g>73NX`?U$Z!|erbBks+`Vs zMSYt~Cv2^qv8R6a{-(JHTNfPeSahsw>51MIrzfvHKXv`38Jn)m-F|by&fClOKUi__ z(Yj;LH=caC`Sj~;=icqS@L~7m&-<=@J$U2$;afi$M!{$Z&@2QLf3h$$FqksvfNTKe z2?mb;4A~qq9vc=MY~~QwiaD`i;o)`xWv@9N8y6kzmN3q`b7JG-3=E!|mbgq* zVmFXz3|w+@x`A+4&PAqHCI&UVOFbtyFZXWLVDMO>_{pVdqN$sSM8Jcl9zF&wo;3^y z4*M_lnS0HE;ejhJA49+u4@L&Z^P2_guXQjcFa|O(#Lhh$2A!-88qv-lJEfEuTq>d;7d< z4u%N3d9?vgdc@QPcrqNT7BEcF$ZlX*u<#f&gNnz0HoGEYX5rP0I}|QV-B#LkfZgZB zooIzpF_ZFRodN|6ZVgPv9`*d^tF;+;m=icoFf<(e`a3^*hsKI+#tkBDz6=elt2v)c zN@5Tz31<+I5Dzc>5qbT-!{509@mxkT7Bo1hE?Cmks2q8Mp-qZwi4=p|{gL9Y&x zdVMC=gA5E33{4KkA`hfGj4ov?c9_j7(41Cq^1`Eu9%?I}O!6^%`DAiHk%$0;H2{IP B?~VWf literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/rss.gif b/www/extras/yui-ext/examples/layout/images/rss.gif new file mode 100644 index 0000000000000000000000000000000000000000..e41d0f764175d22090b8cc42303a7439b8295f5c GIT binary patch literal 1041 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 A<^TWy literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/images/toolbar.gif b/www/extras/yui-ext/examples/layout/images/toolbar.gif new file mode 100644 index 0000000000000000000000000000000000000000..8280d66239e6458cdc1da42abe44256f4b65c663 GIT binary patch literal 859 zcmZ?wbhEHbWMYtGXlGz}`0(MQM~@yqe*EOglc!IgK701;`Sa&5Uc7ku^5v^nuU@}? z{pQV^w{PFRd-v}B`}ZF{eE9$WKf@>(4T0ej0*XIbfL{5}pab#{C{HkOSTHC$R5*NS zY;NY0(#ScmK(U#XTf`$|!h$3w770O_8x;o{+?iRq1SC8Y8cs4Y1#xj4Fam03WMr@g E0OFTJ6aWAK literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/layout/nested.html b/www/extras/yui-ext/examples/layout/nested.html new file mode 100644 index 000000000..fe950d1f5 --- /dev/null +++ b/www/extras/yui-ext/examples/layout/nested.html @@ -0,0 +1,120 @@ + + + Complex Layout + + + + + + + + + + + +
    + +
    +
    +

    This layout uses the gray theme. To make a layout use the gray theme, add the class .ytheme-gray to the body or a container element.

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +
    +
    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +
    +
    + + diff --git a/www/extras/yui-ext/examples/layout/simple.html b/www/extras/yui-ext/examples/layout/simple.html new file mode 100644 index 000000000..1fc442f5d --- /dev/null +++ b/www/extras/yui-ext/examples/layout/simple.html @@ -0,0 +1,124 @@ + + + Simple Layout + + + + + + + + + + + +
    + + +
    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +

    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras imperdiet felis id velit. Ut non quam at sem dictum ullamcorper. Vestibulum pharetra purus sed pede. Aliquam ultrices, nunc in varius mattis, felis justo pretium magna, eget laoreet justo eros id eros. Aliquam elementum diam fringilla nulla. Praesent laoreet sapien vel metus. Cras tempus, sapien condimentum dictum dapibus, lorem augue fringilla orci, ut tincidunt eros nisi eget turpis. Nullam nunc nunc, eleifend et, dictum et, pharetra a, neque. Ut feugiat. Aliquam erat volutpat. Donec pretium odio nec felis. Phasellus sagittis lacus eget sapien. Donec est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +

    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras imperdiet felis id velit. Ut non quam at sem dictum ullamcorper. Vestibulum pharetra purus sed pede. Aliquam ultrices, nunc in varius mattis, felis justo pretium magna, eget laoreet justo eros id eros. Aliquam elementum diam fringilla nulla. Praesent laoreet sapien vel metus. Cras tempus, sapien condimentum dictum dapibus, lorem augue fringilla orci, ut tincidunt eros nisi eget turpis. Nullam nunc nunc, eleifend et, dictum et, pharetra a, neque. Ut feugiat. Aliquam erat volutpat. Donec pretium odio nec felis. Phasellus sagittis lacus eget sapien. Donec est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna. Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit. Quisque dolor magna, ornare sed, elementum porta, luctus in, leo.

    +

    Donec quis dui. Sed imperdiet. Nunc consequat, est eu sollicitudin gravida, mauris ligula lacinia mauris, eu porta dui nisl in velit. Nam congue, odio id auctor nonummy, augue lectus euismod nunc, in tristique turpis dolor sed urna. Donec sit amet quam eget diam fermentum pharetra. Integer tincidunt arcu ut purus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla blandit malesuada odio. Nam augue. Aenean molestie sapien in mi. Suspendisse tincidunt. Pellentesque tempus dui vitae sapien. Donec aliquam ipsum sit amet pede. Sed scelerisque mi a erat. Curabitur rutrum ullamcorper risus. Maecenas et lorem ut felis dictum viverra. Fusce sem. Donec pharetra nibh sit amet sapien.

    +

    Aenean ut orci sed ligula consectetuer pretium. Aliquam odio. Nam pellentesque enim. Nam tincidunt condimentum nisi. Maecenas convallis luctus ligula. Donec accumsan ornare risus. Vestibulum id magna a nunc posuere laoreet. Integer iaculis leo vitae nibh. Nam vulputate, mauris vitae luctus pharetra, pede neque bibendum tellus, facilisis commodo diam nisi eget lacus. Duis consectetuer pulvinar nisi. Cras interdum ultricies sem. Nullam tristique. Suspendisse elementum purus eu nisl. Nulla facilisi. Phasellus ultricies ullamcorper lorem. Sed euismod ante vitae lacus. Nam nunc leo, congue vehicula, luctus ac, tempus non, ante. Morbi suscipit purus a nulla. Sed eu diam.

    +

    Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Cras imperdiet felis id velit. Ut non quam at sem dictum ullamcorper. Vestibulum pharetra purus sed pede. Aliquam ultrices, nunc in varius mattis, felis justo pretium magna, eget laoreet justo eros id eros. Aliquam elementum diam fringilla nulla. Praesent laoreet sapien vel metus. Cras tempus, sapien condimentum dictum dapibus, lorem augue fringilla orci, ut tincidunt eros nisi eget turpis. Nullam nunc nunc, eleifend et, dictum et, pharetra a, neque. Ut feugiat. Aliquam erat volutpat. Donec pretium odio nec felis. Phasellus sagittis lacus eget sapien. Donec est. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;

    +

    Vestibulum semper. Nullam non odio. Aliquam quam. Mauris eu lectus non nunc auctor ullamcorper. Sed tincidunt molestie enim. Phasellus lobortis justo sit amet quam. Duis nulla erat, varius a, cursus in, tempor sollicitudin, mauris. Aliquam mi velit, consectetuer mattis, consequat tristique, pulvinar ac, nisl. Aliquam mattis vehicula elit. Proin quis leo sed tellus scelerisque molestie. Quisque luctus. Integer mattis. Donec id augue sed leo aliquam egestas. Quisque in sem. Donec dictum enim in dolor. Praesent non erat. Nulla ultrices vestibulum quam.

    +

    Duis hendrerit, est vel lobortis sagittis, tortor erat scelerisque tortor, sed pellentesque sem enim id metus. Maecenas at pede. Nulla velit libero, dictum at, mattis quis, sagittis vel, ante. Phasellus faucibus rutrum dui. Cras mauris elit, bibendum at, feugiat non, porta id, neque. Nulla et felis nec odio mollis vehicula. Donec elementum tincidunt mauris. Duis vel dui. Fusce iaculis enim ac nulla. In risus.

    +

    Donec gravida. Donec et enim. Morbi sollicitudin, lacus a facilisis pulvinar, odio turpis dapibus elit, in tincidunt turpis felis nec libero. Nam vestibulum tempus ipsum. In hac habitasse platea dictumst. Nulla facilisi. Donec semper ligula. Donec commodo tortor in quam. Etiam massa. Ut tempus ligula eget tellus. Curabitur id velit ut velit varius commodo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nulla facilisi. Fusce ornare pellentesque libero. Nunc rhoncus. Suspendisse potenti. Ut consequat, leo eu accumsan vehicula, justo sem lobortis elit, ac sollicitudin ipsum neque nec ante.

    +

    Aliquam elementum mauris id sem. Vivamus varius, est ut nonummy consectetuer, nulla quam bibendum velit, ac gravida nisi felis sit amet urna. Aliquam nec risus. Maecenas lacinia purus ut velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Suspendisse sit amet dui vitae lacus fermentum sodales. Donec varius dapibus nisl. Praesent at velit id risus convallis bibendum. Aliquam felis nibh, rutrum nec, blandit non, mattis sit amet, magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Etiam varius dignissim nibh. Quisque id orci ac ante hendrerit molestie. Aliquam malesuada enim non neque.

    +
    + +
    + + diff --git a/www/extras/yui-ext/examples/resizable/basic.html b/www/extras/yui-ext/examples/resizable/basic.html new file mode 100644 index 000000000..d010c5b11 --- /dev/null +++ b/www/extras/yui-ext/examples/resizable/basic.html @@ -0,0 +1,185 @@ + + + +Resizable Examples + + + + + + + + + + + + + + + +
    + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
    +

    Resizable Examples

    +

    These examples show how to apply a floating (default) and pinned Resizable component to a standard element.

    +

    Note that the js is not minified so it is readable. See basic.js for the full source code.

    + +

    + Basic Example
    + This is a basic as you get. To resize the box, position your mouse anywhere near the bottom, + right or border right edge of the box. This example uses the default "floating" handles. +

    +
    Resize Me!
    +
    var basic = new YAHOO.ext.Resizable('basic', {
    +        width: 200,
    +        height: 100,
    +        minWidth:100,
    +        minHeight:50
    +});
    +
    +

    + Wrapped Elements
    + Some elements such as images and textareas don't allow child elements. In the past, you had + to wrap these elements and set up a Resizable with resize child. As of yui-ext .33 RC2, Resizable will + wrap the element, calculate adjustments for borders/padding and offset the handles for you. All you have to + do is set "wrap:true". The manual way of specifying a "resizeChild" is still supported as well. +

    + Pinned Handles
    + Notice this example has the resize handles "pinned". This is done by setting "pinned:true". +

    + Dynamic Sizing
    + If you don't like the proxy resizing, you can also turn on dynamic sizing. Just set "dynamic:true". +

    +

    + Here's a textarea that is wrapped, has pinned handles and has dynamic sizing turned on. +

    +

    +And look how simple the code is, even my grandma could write it. +
    var dwrapped = new YAHOO.ext.Resizable('dwrapped', {
    +    wrap:true,
    +    pinned:true,
    +    width:450,
    +    height:150,
    +    minWidth:200,
    +    minHeight: 50,
    +    dynamic: true
    +});
    +
    +

    +Preserve Ratio
    + For some things like images, you will probably want to preserve the ratio of width to height. Just set preserveRatio:true. +

    + +
    var wrapped = new YAHOO.ext.Resizable('wrapped', {
    +    wrap:true,
    +    pinned:true,
    +    minWidth:50,
    +    minHeight: 50,
    +    preserveRatio: true
    +});
    +
    +

    +Transparent Handles
    + If you just want the element to be resizable without any fancy handles, set transparent to true. +

    + +
    var transparent = new YAHOO.ext.Resizable('transparent', {
    +    wrap:true,
    +    minWidth:50,
    +    minHeight: 50,
    +    preserveRatio: true,
    +    transparent:true
    +});
    +
    +

    + Customizable Handles
    + Resizable elements are resizable 8 ways. 8 way resizing for a static positioned element will cause the element to be positioned relative and taken out of the document flow. For resizing which adjusts the + x and y of the element, the element should be positioned absolute. You can also control which handles are displayed by setting the "handles" attribute. + The handles are styled using CSS so they can be customized to look however you would like them to. +

    +

    + This image has 8 way resizing, custom handles, is draggable and 8 way preserved ratio (that wasn't easy!).
    + Double click anywhere on the image to hide it when you are done. +

    + +
    +
    var custom = new YAHOO.ext.Resizable('custom', {
    +    wrap:true,
    +    pinned:true,
    +    minWidth:50,
    +    minHeight: 50,
    +    preserveRatio: true,
    +    dynamic:true,
    +    handles: 'all', // shorthand for 'n s e w ne nw se sw'
    +    draggable:true
    +});
    +
    +

    + Snapping
    + Resizable also supports basic snapping in increments. +

    +
    +
    var snap = new YAHOO.ext.Resizable('snap', {
    +    pinned:true,
    +    width:250,
    +    height:100,
    +    handles: 'e',
    +    widthIncrement:50,
    +    minWidth: 50,
    +    dynamic: true
    +});
    +
    +Warning: Snapping and preserveRatio conflict and can not be used together. +
    +

    + Animated Transitions
    + Resize operations can also be animated. Animations support configurable easing and duration. + Here's a very basic clone of the first element, but with animation turned on. I used a "backIn" + easing and made it a little slower than default. +

    +
    Animate Me!
    +
    var animated = new YAHOO.ext.Resizable('animated', {
    +    width: 200,
    +    height: 100,
    +    minWidth:100,
    +    minHeight:50,
    +    animate:true,
    +    easing: YAHOO.util.Easing.backIn,
    +    duration:.6
    +});
    +Warning: for obvious reasons animate and dynamic resizing can not be used together. + + diff --git a/www/extras/yui-ext/examples/resizable/basic.js b/www/extras/yui-ext/examples/resizable/basic.js new file mode 100644 index 000000000..ec75d171b --- /dev/null +++ b/www/extras/yui-ext/examples/resizable/basic.js @@ -0,0 +1,82 @@ +var ResizableExample = { + init : function(){ + + var basic = new YAHOO.ext.Resizable('basic', { + width: 200, + height: 100, + minWidth:100, + minHeight:50 + }); + + var animated = new YAHOO.ext.Resizable('animated', { + width: 200, + pinned: true, + height: 100, + minWidth:100, + minHeight:50, + animate:true, + easing: YAHOO.util.Easing.backIn, + duration:.6 + }); + + var wrapped = new YAHOO.ext.Resizable('wrapped', { + wrap:true, + pinned:true, + minWidth:50, + minHeight: 50, + preserveRatio: true + }); + + var transparent = new YAHOO.ext.Resizable('transparent', { + wrap:true, + minWidth:50, + minHeight: 50, + preserveRatio: true, + transparent:true + }); + + var custom = new YAHOO.ext.Resizable('custom', { + wrap:true, + pinned:true, + minWidth:50, + minHeight: 50, + preserveRatio: true, + handles: 'all', + draggable:true, + dynamic:true + }); + var customEl = custom.getEl(); + + customEl.on('dblclick', function(){ + customEl.hide(true); + }); + customEl.hide(); + + getEl('showMe').on('click', function(){ + customEl.center(); + customEl.show(true); + }); + + var dwrapped = new YAHOO.ext.Resizable('dwrapped', { + wrap:true, + pinned:true, + width:450, + height:150, + minWidth:200, + minHeight: 50, + dynamic: true + }); + + var snap = new YAHOO.ext.Resizable('snap', { + pinned:true, + width:250, + height:100, + handles: 'e', + widthIncrement:50, + minWidth: 50, + dynamic: true + }); + } +}; + +YAHOO.ext.EventManager.onDocumentReady(ResizableExample.init, ResizableExample, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/resizable/sara.jpg b/www/extras/yui-ext/examples/resizable/sara.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0f5e0f891c82f4c88cc264e6cb874a4b4242a81 GIT binary patch literal 122603 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%0AddM7oM|KHxFv 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

    =}3FOg|1=8(f~!aorisYA1Hz`O3Y3c_n?&$Q50@ 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 VD z&pyO~!Xe7x%<+k1f)krlhSQ6)h!e&|!u5zNn5&j+mz$B>h&!IUi~9!gE43p}4$llP z0j~;gFmD6zAs-u`C0{z0l zfwJG^z;cRmQF8tA1oFD_Y4X1m=oM@giWK%01r_}jzbT<8sVc=QO(;_1JF>`NYt2n%<|avaib=x=3~ut z%~dU4tpKeqZ9;8x?LzHSorgMcIy1WWbvvJjCW0nmCgY|oraq?KW)x_bp{DQ!Tfw9#|z=ZCFcMCs?o9NZKUWtlLW3CfaV;N!z8^Z9`?DY0v|E zCHpMDm&hR|+`N|8$7oT5ZzI1rm7t9l!5PTe>AJPy?9r_}4>6PNEqA=Vr zx3GzD@$jq&d$=G|4AUD{as z!}PKYs*K2tv-ei-hch2!mS$0BMQ2@nfPR?#sQ9tw6Z5B(Y}9P8?A08-oUUAv+=4uc zyy(2^eCPay&sv{53WN&^3aJX?ijayti#Cc)iU&*NO6p2EOFx#8ltq65zIcAwEPqly zUZGmiRw+_hTE$eAQB7DKRRgN=t=X@&t6iuwtQ)FV`G44Z>%XS{Kl~r01XL6l9ZH9w zG@}%y29E9&$$_IA1VyDJgfWycKo|oCYzS<`2&FqWI+X5i>-FXH4}3p=z~}w@IX|6q zZs&SlkLz*28rq1eL_(uUielXqb0FN3c$oWXYM#AN zU*o~NDq<#AetgQX0yfGs-ihHNGgHOoNYJVTng!voRnk{hu?kJ~(KX<82Vv@mFF&e# zd6}2 zRDp%z^={i<2T5MJq`Xq68d{2FW#Et(k+TT>?TPjCJL$cmoa@cDO@(;oQFU;mw~dhI z5z?a)ZC?<&_Vg+So2Tl+)2N?e?E>4j;)04~OBeYx7|2e&c8E+L3NK5xCHGo@=PH6G z7;uet{#`0d$mh#aPiKlwgj0KUM)6ft87d5bn=@{}^6A2zkWyLhJ=jR_rd2;KC%YC# z6t>gibl84>wrL%JE_`YQ^Vfb?oAUkM8;a+Y3uqBIF;_~t+uWojIme9S2}7mxOk!*A zv>-sk!aX3*Zs@R!U9e!8dV)F0zgp?tE7Y3K`dRdCXxm{gZ=jVC^a*4q+j{!*?CTC# zD=iGlrFtX#73fdijP_)`ch?lJ7cgf^AMUFDS4?B;>X&x=(s_MrMfak)vecodA&aipAe? zj!y++CNcthqRKr2nC?gvr#WP9Lb0sM=g#6`oC#^$XnJGML!#HF+3>|-o}6^+`&OEo z?rj6OlTL6^QD%YF3pQ}v>lb$`P_4%j@>nMo+;?!p|pjtO^Dl zp6u8oDRf3Cwj}Air+IlW#iK(%+A1jRzZ&aOp*_((I|Je7pJdjF^DWLVC{1rYeNk5o zn_JCUZBB)?-@?3{NuGt@Grmnp9@m%rWV#6w4uL?9TM8n4g?0R}@6BxV=TIf=k-0BF zJ$Tbgo%(J)O}|SqqedatYGka+m=Zqs#pnA8cDxXm;2%+>xAG5kFYR!E<_!`%E@+ zq0Y?B#um!GDqy6F*J$=G%tVmeZ|C*qwL1q36)Fn~spi&SYeb1G7q4e7?mO^54%4pq zqx#}1y>)-?PNvSvU+>WZVP5F~{STPnK$cFYJC&kL9NEz20Goh_r0zQ(z$krdSNO1a zzRh^kGo750`(JGvIx?68g#!Z(n0HcKGeSL@E?nAXm|h35;Ji~a#iN*=D>;$oY8B{HRLxBV(m^+M!nb1M&rN3R04R-_A!11S5B-z-$G1$c>V zTV*A*)hEcFQJkxnbA6cZ#hY7cU_RqMKN7ziyd{A$5q9_PnMmlo{m__>XE|?SJekGU zlHIC$#JN^b)Mu{)t20xhIOi4ud?7=z*q|;qQ<*D2!}UIQ)Ln^6GB%V4d1K5nL$6*( z36cbzc=DKzu2vFMuCo~|pjJ0d{R`x3^*$!7M34&Y!7T#B|0O$)&6x0{gNVTN_BTkM zGhCU189Y11bBJNG3SK(9$Q5kLH?dB~^N}7avO4Tu_qg~nm^}G!z%|L8&-n$_o>_Xg zFV|6 zWOlT<{f7tV-xa11Jy<&Zv3SXZEqnE`r6>wjH z=Vs4LL9SE#OFR^%{&|Dt6!*DY!#%LC!i`%?`h*;3c?^RXKY8t+7EyA=isBe|xWmJC zZAVgvy>CdFvlAjzIHoz=UoHxJcBgoxWR>@7y|d_~Q3Sw~jyMRXd(Ry{6pr&UFhk{J zv+bU2P`iU}U2=a^mo)NRfj4Gs1AkX(g9;#&3?+h?;Y|zWF7RCaphyE=Qk(OM0Uu?n zD37I=^p+)ed3l3;d!M_YZ>Di6#i>HSiTsS4iJ|Y)k4fWWOYRo_Z}YU>e@K8)#VBK| z#4#JzS8qNZ{E)jHBe9X0Vapjg2A@VrXHS4D%>JfNpr*TAQVewF6PF0qE7#5ZzN>|l z<~1_q=Q;(ttILW{{xweyO!;zbClL_IlU^>ik>C>~kS+E`Q(0r&c$Mf`f3XOnFE9oVfixx~pBMB;>D>7~`n1@?% zCx~WvV~nBcDoGJ2#e?fV?_Va!+yL>uDih{*kTHYl?;LLvZj4<`^HzW~Ir9xH6 z!eql6*&M$uZcdIKb?>YIGoq@v;kJ%>ojvB|o=|>UO#o<~DzgFS2I6876JlN$q^i(1&5oSQv4Rmp;hjp+;#~1dyYx5ag==W0hrp? zZBXaO_$7quOF2ZcL3OG>T`0AsPaz4A%EllQYaYDTusW zcZJ5J`_A1O!v~JbaEiJ|i$+EfaG~7ve7PL*5BsuGp`Scr0>lCnRc%fkX(kub*$AU+ zUGIxr;Ok#barOOhn^537>v;Aqg1H^7&D$~L*5dygPlY+fm71^EBAJ`e9#u_hPgVMM z@BOwQzoVgP(c9Lw=u>q00J8D4tQ(O&#rz|MHjqNrM5$;qJ&9>%!11J%(d`-ayp%<6 z`DTQChM$t|En2&|NtBMv7c8Kv)7G$MAkAo0Atn(~G#nm!29=!;6iR-WUU{w^)FvGY z^>j9^@a$R}Js418hZJlo_Pvyvq8Fly>yG&B{7E5iDa9N$ICuJ2u3hnLLi(Jcs)$F7 zDhs!+Z3@D>h&TQ&el-M#231^V}r)YSEJP3s&dfF}4v0&osK-R$jU{T!oi$aGZpUaaF4gaw+yc0Nfv5aO!DOqx`~<0J zcSCR6xNvEwKNBf9keXv(%a$VK|JAk2<_*uS&wx<^4Co>bE*@}@?a}p_lwkN6CgcL# zwJD1lUeMJlD=$i%GSt*gQe%k)ZFxuQoazmQj;$uh$G*FdsSQzmEvl-mpIS%g4U5Z4 zd#ZWQlj8xrk(Vk4pwKrd)q^ZrY?$>_q}SN(kj?6O@sNTJ9rOeNRSXPlJc9o*Dyg8+ ze6i+SFPnEAgQWo%*GeD}k$@Au0{okI$?VBD@@TZ6KnH-0wpZ^SHFLRu9t9Omyide< zuXou!kZ6$ef^Ctr14x;}*vPh5+Nw~+!p<}CUL6E*>j|79u+w$fEy#7DR!e{_LAEQD zjXF6mUS16JD9nCPex=WdeR@XMbLu1T`|oi)ETejAGP~FF9QeCGVQ{`>0t|adqwCc+ z7@3;_ffOoVK02F7|hqIF?6cdl@*SUWGmP*Z097DVKi0Ar+fs&2cLnBHM5lI zjanik<1QU1MTS4jK^`I*sBWk$RzCl6xajh}j#9ADn;+ZOW~7*BM9L zm;kFDYi+E79ay1@!8Q!JbFQu@YX$n2a+txGAe8jDhldjq>8D~DH5sD9dP43&*vH-M z9gZHqSw0Og0-x$qRys?SXvW?$yuRsx7s90v+s#`Z1Jwb1+U#;Z3m{|4-AzMO=8vYp zF=#p88`s|yLw-h_3U?fsl>$sc^u8$;lBl5GeQ8b8Ti(Kv8|Ib5;an45wf#52L-4!pV`{;H%N&*rO1h`TN72cd?W_8PsSBvHknz3TR9kXpKdxZL=+7{ zFb0nCX3pw=SGIjAeKibSU#9ySec(4 zkHb{dRkp^ZQdTNgZ>;M2sF&kptE=U571XB-&`$%GKGg5Nn3L+Kg_8qxi@m+XEiz1j zULe!Aki5m9+FCX$?Xg9fZid$(2lnR*8%L!!f*COIg2$`Hd0PHk8%ip9rIdMpZYH$T z&_(=6H%l@CKNB|5w@mGpiL3yXItVv6eU2|4(b)CaowwZa?)j3Ve38QZBSd( zH#tNmAb|Gg6>Uu&Mh;B2Bjf963_ItF0%Idg2C$`%0xaD=f0F1Vg_6liBIEg*ZD66# z!&Txd(gOh?9zJg;*W!KVRpA0jJBr7W$3eaS%;$yBU(ll70)OK&NPOl#Qm>gJ#!ak7 zRxui2n=$E+hp)@94H0?3rCRg(F)iX|d2h-$yzkCs0i4l?E-$Ry1X^ou2X)AUEMBTL zTh1()&fZPm9b!_o_WwnOh;2cJP?B;6Pw|SOh?Ihu2h1N$;uqFSstTiUR_Q#%K)r2z zibC{oh0R>zw^5J#nA^ibuKshT)v&b$w6G{!YF(?}Y~|ToRZ8LN8rQ&774xo}{XLQ( z?Cq&O$C`f{qx$xE}?aTNWKe92ZI zqNTFPbCgLVGVF7HQ-_}hoS>A!8;h9oq|mVT*7 z+FTyg*b1&o<(Nk@>%sOAiDsaA*-iY;=xmsGx1!8-sA%3j;&b}wYrpxuwoo*5p_p8o z2T8(AJQqJeachj8xQ@1QrJC|!p%Vbw`dBLYAxYnGoiTKIR$J#zmpKhJ5LVgj|0G|M zR6zbAOPpF(*iY)c3fkM1c4w7v+hKhH&@O~S1iPC0;c|QEjCmq@%kEvnF^taeVb0~Uz*9g zPA1bn%I$Jd1?6eejdNQmTErlYx(koW>9Fcu*EyI1k%vY-eB0q+dojt5rv~=UHi>+i z8`Cb+BE5Sj!J?Nk!hfu)V=K^jcT)M-gE1BS=;?3LtHW-=y#0XcbAU?U`l*+4tSVxC4S3`PUifz*zpI$C3LG8B* zG2A(iGyHiy#|bV$Q=2DPqCr(oQafGX4Vw{+Qz-8bc}OnQ(=VeoZoI3~gIUPLUgW&> zWqzX;x6e-CCkaah{9gmGHr)_)dWPoDV*_}geBv4M0K^3<)h*Ry)ytu5D^>Rdb|u& zf744BxqV;IHE|%j{+ugHz444>rDAgm`1l2$+0i8Nn%1Z}1fyZb`%a7 zyzM#q$oSyk#u(aarjbiUdT8L6U0ZB-`^3jq=H2v<^2vT6g&i}3`mi*5D|qC@m*I2e zp5xx?lUZM35U)4!1E_XL;t({=+H&_|U~XQ!$VN_8OL3R(3(l6nGfz?xcOEl@c-kL? zBTOboB=`xo`?%a6Q_Dz5oj^sKV4zl*7`u z8yCTDZ+97wqzxpKl?VaEs$?HWK9(GRy^GALThYvHsxP-GA_Hg#s&naSZ-=h zPYoI61lmdltdwCyt9W3x65cNCCJP(id{IL``&^=#?()I$o}K0Q`iMz2Dp19N4m2B(~=%&OJ$Ne-I6aiZ&j5}b!nZueRVPWzJ#*Y z@Te+Ut3UvALpzDPMWI~odB$_4_i}#6leQghC%a$^WNCY{mEtM|x-FiR$ zdoOGnPIhe@lny??ZKk*UKpuXgprvp1$I8#qjL{r`%tc9|grdUSGxhxMF^nyO7hPJf zn4UBtZq5yDuXg2|&Y69Z=2I%&8MGH7LGscA4}Q1vaUT~PR(AYVSMdDI0&%}FYey2~ zpD0ss&EH!*cKKkMQW?7P!bz!}M5$tk2@a0XxdGF;6~oYLfnnc|zh7C^XRs(a@AF9F zhZX4VMuCpvKY+<639F~Mtc3)%|0p_~XcQRf`Sy*yb2fz>7VMw-=e5O~^g74_?Oh6% z6AymdHIfl?)&@MDQw*<<)HfxDHsu|ZkGcl=P8Va|TiNn3`eW=Cn$Ep$+@Zg2!H3l< z>odxh(V-W~PFYr`Iu{u_+E{RmwYg`hY93*sq=>f^3Go@^d&Crbn)1Z2YPz3O>SMiV z(r~tC2T8vZ?9`Tbk0hC^ z9oehM^3@YPse&(*#Ca?~e%X?C1x{u<$vs^jSsO)o(wh$Xy??VjfivgbNzS$I*Q(I< zU%Y$3$rHQ9xYtXOgs6u&X_^vb{cU+?@-P3cqu zP$yq|q;gzl)`To5AiYCmOf3;??&&Q*ehZ(`TcJ9|LF(jZH-boO?{L5Jo*#dO&qAmb zHHWUB;Uqqqj^@2{-wg+FDpkkLQ02WlQAl3Lj((G^cDtzsm1v+!Em24@(5p~PoLj@a zT+5E_0L&AgpI)u1>*p9a#GE3d@_2kaW+LVFP*#thM)iX~t+ZYgSfp*1N zHWDvfp6|pER+`#Y-lqxWW3Fy)9Y?Yy5QEU7;e1AwTfekdl7B&K@DkCcD@-Gn%(#V= z+}rIKr9il~c1ND8e-{?{ntrXYsDa>;#T%uUpsA9@ojR_r>s4x?H7hwqU`@xmsgs%M zQbB$ckI=$E&0_)e4{&nIsMJ6;ZPI1ar5%c;GvrC5*FaLHAYD*|&xd8K)sv$ovQ%=` zB}EIcGuU)BqBi_!4F*wXiX3aQ@QCr??Id)V-uzPi_E;DK4CFAk@9mmFm>3EDY?x!s z0BCOS+eTUeT;mG(;vtI{_elRyjG^z&^*kxPiwvA-^!(=Dkly#ROtqwHdx0a?Zae=z zxE}Nxv?Do!0$PN)19nh-X%^omp(l3qQc^|6qs6=zm#@mp0#`?tN=Ywh+YAGZ`aNZJ-TDq za5r@N4G8sbuI)1GP0gNMYbakr*vc5Axaaewx2z&sz6Feilk|>wXejdjdJklln1TdJ zL5qN(iclh5d$>R>ceD00f0>_rO40HX5?K}N7)vR6x3ChkDpH1>Dn&IwmGS5ENE4u# zqzEMbZA49v0(ZwpAQBVIFUd02gn--U4sB>Q+jKY>sP_|RyStz0M!X+Xz>MDn6eVBo zXqR!W`WdQtpur%;OdI3U;+@ndzs!^<&nk<(=@n>~T?!vsRl9>^3M2rZZ~Y9exLh2k z&M=&i-yO;REb*Gkg?e3qK5}TFn4FuV!syz|cy462yKAc>rI-$jz^A5mjcK{6K1*kb zyBl0iMqXmBHX*0$Mx-6&E|T&+?pO|)jpg!s6x{R{9l-%Q)*zetd@l-p zC^3HD_fA5a&=*)5w#r2&Mz0%Vg*qt=)o(uqt5r^NEY

      ZYNdJ&*Q<)Am*4x>>Q=-_WxUuK71uVfDg?sMmm%DG6zyy7nAsZowQ29VPH1+Vn! zF2JSl&0mSqRtJn6!zr>bJICcGugxD#+z&}cPic2oNS#aSx(2*6NnZ|sr%9L{EaJr< zPi2_p?7_9r*W*y+_8T?PP+|rzM?@+Xo~kLC90VcuzW%bz_Etab5gkMZln;BII1R?Ji)QUJLpZeL~BFz#+Q2X1AoWrOUen30Mqka(-$I3s%tN zXC?KXo>W{rAW=Z%fNdnmppD<@&Ird3n=Jkn}!wts!7ahZ~eu(uTh%*WVMd} z{xz_B(WONS4-Y;`#EI=f)j<>-*LwEzE{rFA@0FxVhMCm|@kLRZqL*4fsHGGbGl_K> z3)e+BWdU=KPdXidinsw6PLS=>VE%Z^2wv=tt;na)(m^h_Jq8+z-&|cqE9iYjm_vw$ z`W64hh~4|s(Pt?f+C3^ma|XXIsyu}@l(BktY`6awv74XG-68aeT24%jXY$$0r5w35 zS;$ly;ow11lT5I8#f<%>l_hqKf+JS4FgL7SE4hk6+*WrXhVBs*q{ia$H-6domj3Tt z^LecfIMuhSA(^#TdTyqh%MeCCYKFg{h4G^QV0KBb<`ttOp;?+rKA?w9+t<*Wut6>g z)NXWgnK*?&uNBT#+;dRe9j5xBV2ht6>!a3My3@S83K#2ctF`I)DKCGiRK%MTJPNey zTl;hzu%+;H<98M-4Lpbhv(?Zi#AF}sa&4hd2&#czn*Cq1bMF?s>$W=olOn6xGq0nffQvD&Mpa)~HV7WBv;X@2u(N zNie^*ewSv`{^$d^$P*oD-)`=?Mt|4$Dyl)Hl?KM$NF!BEWkFb zn-~Ldveku^{L{Z$t5$E0kd}sp;A8Htq#0q3C^}4H8r((paejCbUpQL4q#&TZ691w9 z=ORNB>?ZOj4d+@ypOmM#Nt#r8$Ro z<4FEh+j7-L&Pe%*;;wj%CSO0;mY)DQ;$e3_*6}XRB-vLS%P2#fa(Ph~rblfuxG?9v z%AhsiE97O2i9@;%Vl{n`8{~jB{L$8OKU}Txm8QRlUuszEiN-1Z-XN}zB`$ zx=@+ft{?Zq<~r5^Eqvufn0Sjd(E4m!J!Db`@9>^k+n!FOnS*RH&cjl?wwI=Q$dsIK zoTsJZVJvG@*&JZi8TcS*7p=- z>dRMxo8D(008hTx9^8HCx(QTqi0>7n>Eym(U9DBP>#~HhQPhN24(!_#l!?xnx`DyS zAJLzZzDgEh3Q`^%*WcY{Y7Qd3dyaRvP)A2<9qn`ddFDMhVYwqvmlj)fgIS#>z^V*Y zsB^L*pQ9#f0y7?GOptQqnA&4Z^&TiKF^UZ!YYudg7N@?Q@z`#f-oUeDlP zq4BE=E;-6QcW(nLHFY!8O5>GGY+B;2iXma2JB+ec6DZO$m+O{Izsyd>-*U}SiNpeY zq$oYr63uVhuM07ZnqED*9LJsGW*4Ijg&24i(9kB$H)1V!mZ(~oIX;{neIN2b0k!}S zc^>Z0D?_@p%C=}+SdYG`T*4N?-VVBVNY~cvL+|7|<3J95==yieiaKcv#X!ddt zQqAe(BlO5$*ZH)x+|oREvS%ULE+wa0qwt_BEpRC^^DVP(Ne5M7olP31Qn6T=6l#YU zD=NF<6V6;@`#LY~QvJKLt;Fm_{3JKXZ>ml=RzgqbSRywS_N(gME9A3p?;I)O&h(_Y z_-i~v=Ga7O15`4=5f(Cr8BvvHaY!I6GcR7|aCzCSt1jfnjcC43;R)^@VtqU+WU8gT z0V_VX>Nr-scKE4wOhqvEK({SXo{>AU*#@e;tduQO$8^+v!fPnWMc7pjR>%aJC7Y10 zm_lz{$ytNC=#0ch0n3RgclW5P#*( z5s9J}=cIlfFfMVj>KY-}-ZkMtyodxP3e|z6Z$IUjq2L$>Oai;ag~G=VS_UB)l2>ik z!vf|up%l$~x`&AJPNCFCr3RKnWQAokpmCn9;Q5OyMVbBk90@wEdtA ziyi5AW{0Vi&QyF}7_Z3L9$C%E-8s`xyFeero0IYup(n>elDVJFI^6~~8|wUXFX+>(Q@xURW>-Ojk{NGXwsP;75~q0^JTom5OLZQTpJXNd zXQK4}(@%Ham|0~IAGx+%{{z)fI6xDcw^~ICO2j~J9@MpTj^UL)%J}j9hGqSDp-R>W zi!(H!o%1=jF_Kn!D00Fy)1#p}z*gyna^=5Xd0Ih1{W;#hdZ(CRmWW$He{snq8|p&4 z59xS;YhRd_I=v4iYk&myKD=6;<8O=Z8O;Yrxzm#00sW>jKHE>Lb2S{;;#u!JY1tUL zM!%98wrRheE;5QE{?r!t?Nypoj!GdM7rXbWH;%wiHY;(6R(3{2e zdEmWYXE+8@&|jPRc(epjZcdH=L1Hc{MJi-AR@tIgpkCN^0;Y?)an16omE)?R*I{8! z3a@nbu|vQJu7As$&&MOg^Q&BmdjvA?2H3C5eQXiI_r}5x+o=GE)JAkOiA~pfKKTAu zc1=ib%0`nb`CXh$`l-SLx^mA2`atW|)3oV2{cNgk#yiN@w3O%_VK;7G^6V8DTIbtu zB@h=!x=`$V>J{4oF%*QR3k)Nf{&49gJbIJGB|NlRYml9};!FM7(=;;&oU-_US2Zti z$(PbA)*=iAG$FWHP&{Z3dJ!W9_{~z$w+s}C zd7`)rOQ`ycGi|3Rx32%T)h;vMWZ3LhagNFZnv1sMwy{FH%;4ljlz(PsOi$?l zW9fl^m}Gg!IrgdHL1hP)|F>P+#2JzQ!y;$i0FQ2v>hj1ht_c7i?{8xFp>FPe6wB!O zUSJ+q>@qk{&-dBKSGl!)8Q1s}|83%aDLkJa@FG|HN1}?y6@(i!%uQvIH1y`eOLIdO z-e?Q&t4r&8uu8J$OD4D6Qo02(G-M-AZLC{Dc#Gj>;QOQPEV7-+)K1SP9l39>;B`!k z5zWKTNAcU{RAv+V%wuDK9!s@1N&CsTO2OEoIe6i~pwW_44X6C@O*shBJY3eEW}xPH zB*G%nEmC~|Km!Om1tv(TJzdHs{g$2xBO}ABnf)GNjfB=!dvm&q%*};DReak#v7ci+ z2WsYCod<-KovCdtTHWF3I+P*QpMY?moY%e1(WVSJL=m3x4A4&4LV1~kqk(`X zw>A}zv+g{OE6H+IZ!1N^Dx3$~m3IG~de`D>P`{O6G0A;lLZ0M#b+%Va>BAfa-#}qq zlr#Z5Ed1n~g*%6ttvO za2xd4yl8MrPgDl%nikGAWUpD4mFbK|OvZ{;q^f zgb3WL7XHW#>`^=3bhuN5!O~f1Yq$;@k??E{_}?yCL!Ex{bZ>WmO&k=jN*UVLn80E3 z&Ie6DJbr6Q^qmdXXG}@Fg0#VE+kz31iBP3|5z=0^BfZYJbE;9vSh3U-a8Fk zfLIwf`kcwVdjJ?)$Axi!w?s%KbKPLBNpKn(mv$;TVp{yg&?jvg8u?F$z~u{nnO3eQ z=iyc|1u6qEKQ6y>G!pE*ZEqnsEGZKF#EW6)uoV^4rj2uS_@QUoV3p8mh$vmAgwvZ^nl}l(>++>rfRF@+6ALa z(c2}a+m7_7;_M-7oU^;bng;2m$8z%}9K|SRel~E)-=w`6F&k;<)H_$@UtH^BveoVf z1P7-3HRP%3t|3Ny`;~iCE#5hZBMJFTc$x*pAZ>ohoL#qCjc)GL<}9Lk4(91(g?~Bl z%BfhNY#wi)l0jg_!Ti}f!7DUU1KJx z6kj*%!G@FJ=`3h=ZtYxKBmOKGs{ZHnt-v`+y}_;Q4h+$2J;&Q;(d~g?nSMA>ZBhvR zr(&moZBlY>G3o;G_*;`8is~u?_rS9lp)=l4T;aNH3!ZQ5xbZB*F;?(#Onk!`&TCK; zGBTEFN03j`ysFhGEsPTsu7}vi>ZqJo%GLxcq@P-=fF8+h4&Mk2nfy#ZfozsT?EjSM>f2*_)w2hcM4DHkW|x_0<2~kI)~mVR(tsCN zjn~AQ&w}$GT-4}6Mcf%%=dMdA^Gs@SM_^MKGAk}kN19zq4SapwDj;&|gw+~owne>f z1i@s~DzVe)MoH07+-&D3Ij_V(ObwWK>0NqN?-_1DZXKp~v^^R$k@V|RFRt^YtT4mmHB0GvrB^DaXi#`> z?PaQ9$62~{e)VP-Sm!L7n=auW0j@n5R^%(Pj+#31{*QwCLrM4^trIW`Ht1*g;p)$v z8wzj@;Hryv#^0=-yL5HEO?%T#LSNF%)56rMVV(U<*t%TInC{srpkJO)JvRe0v^01c zM}8ik+wmHx#)3Fn2Y1#Ey$_c%QY9BWSuJp+<2bGG5}5(#j$W~CX{t`U)vx2MK+@c*7G7@vJi5Qc~gti3NWC~^Fc!gYQ+qfLEa zfLn-ZIxLz{3 zI8z7c9+ih{=1?S?hy`Hvh&ffHL5`efklR!@HVl}j=lmxK@5#0d2tK#US-U5-B#HNV zbNrutsh5>;T<7}R7=pC>&gjxVu|sBjKw{w&9UDpx(X?%Q=@8<}F}^KmzIa$kN43+C z)RIwt$fP9fs|VWOJj1T0k%_fpOg(1N>Ag!8N%&B))RtRI)l`vs@6qzUeE`B6E(qxr z$x(fDYnoGmdzck3U{GHB&>HpenL(cG)hlX`-sD(Ntr-m}mkgJ_8>b}O%}5(e;cht$ z{NwpHU%?F{D}Vk|M+$(eW2Jt&Do zFmmAMC1#Y*%9dsIUWHcxw1EKxfBDsNHR&H#E##HoFA+JdJSF!RTS7QDP@8s^U0r-D zq4MVDOS4mFHwFHqu$f>}1vB3SRhT>uNN09?v>;M_wv{p)`qJxdj!!p!N;jqeB0Fod zc`&_ojN6nJzPEPOC9`cYbVy%PxnkB1lCPEj^JtMVt>#tB@<2m<&U(0;;~EjNu(uwp zTxN$@5U6jdtNATYVuY&s4RzBRIa^PbeW{3$cQ2|GY%Qs2Am^BcJ&SRB2@~IX%quy( z4z=Gc5gpvC=4ZILi9@BC!UJyv+~N9YxYf7IdyxDh&6+UgqQqt;E6D=oX8ZoV)0fXi zvcsgt(p{q&!iJTqg;B{VtgKq|DdHmj%9zf8@%CI1^5OXjJ8|iigT5vB;=$`rbnkuy z;&jEqbH+t^6%GPYA!~oZNGpMdfgHUn5#y1%fP(UNv$BfO32#UCrsl+a<2TRB9uCA) zA6k|x@p7({`!2b?&BJ^XunJ&-7gEItJ>%S>4E>3b&OZ7^K8u%_`mKuaM@d=g(OpYG z=!=XXemTlxrRHE#mo};=kJ;Q|^ym^2C5fBeQq(MTjna$1hzrM}Y&54|TIf4Yuz5@^ zP#xxG6;LaEtw*e8($bY7gDOpvb0YGdqIxcEHrOMUFiOlflTi|K8CD9_AtCj-%0J+! z*Au7k&ktpNEJcN=VEIN~OC1IVB0*+pT4o0!*?i5Fnx11X>*_RID~ya)trVmjrt<{K zO1P)aO7W3)^M*Dy2G@J^TKR(*x*ulRn&_`%;ilj~CCqLf=fO;E2ZJVmC>1t51)phD zR5(6*A{yT$E~t}IBXkEL$j-}Tl=0BYx#|NG z&0Z~KB&F)gU(SF8L@mhn*u4ne+6(|4^>f##tCT6oAhh($Oi0!Wi}lw~W5ye%or8X^T_H?cV*50$@(^ z>FMp-&(7u6k;>&M?cgoApr*7WE+h_R+l;oqWf=1}c+;$O z6~G!k4yjEGJm`W2`ZX4YAeNl7L<^a)5ka^m5>NuHIiJIP;i&2zUfgh$StX>nQ}xH| zZ>Hkbi!zC7qFTH4*!!YMs|WNlE|ReGG;E+{OSe}ZA`eu4eLi38nhOlMJk#{Y=srBV zm@f~p5pLKFDD|)~X>t|kAF9uRIMPM2!a~*J?P>z!-TU6g%1tztZFcF}ha>dY>0&;H z2plj8oh>yW%&a_Ixl3{BL%@(178fUU=m3i*2W+7AFxY5(KR&`ezr=Bi7@e!;sx4{o zFzQdfB0#qa@XJBM2RY+;aS0;F%gRR?ES3WmB-IU-NAFmpst@a8s1Ak|l*_KHeuo>L zO6>j8CE{)vrwh>zELA7V45*olPF+VOEm~4+;e+A&Gv9>wgE{9U0;B&cMygvs9%}py zsk*9^BwN6L$nLR{(1%jDe6~9kXQJcKzAqB7(K-yFZ0qUP#61-OQLs5APjqQNi3?hs zeRms%sF|mL!gFt`V$@JE$vBg4?fDus#`Pf*2PW z*Ceu=@Sub%|;DxBHF>!#C-C+zB2-S;eFKry<^w-oO7^>Mh!= zCd(K*3BNgAs^7LU^pY(2^^fJ|Q>rYWzEhL0%lKm6e-uw^ZFW|(43^OMQdsEOd7}ww zb;efdmu5aFAF(#g3a@9ATxTWz7!Wccl$m{d*JhX>s6!r48Ru}^*^+lqHMg6MoJ|*$ zNY;51{a9VbT6_?Dvk>K7^a}Fx0oPVY=gSt-Sy;aW-s?@Y(|0Q{H+a6FO#eZ)*DE=6 zuUps~sVpYE(S(j#+EBAs6viRD3zlO)aALB!R!52+kHNGHYQ0V{K0L*h1-r0&3W$oe zStV)298ToE!g?8ZuIr!e1eBIApaA{0h7}DjL!7t7rLMXO+d;I*yC$)U$&_#GVZ}>3 z5!PX;}{8h`gQ7T3^F905-J@A03eA2tJH|JKq zW>(ah_USBE@TFnqrUUF*zVJMmX5o3K`EoJXpIln`l?215$AB+_xiuk?rMfL^rmi#X zh`z9JkriU@K}J?uP)JrDM;y5!RVcv@$L@79$T!$2R#Tj-I$cmV^8~~`%y~0alLw(M zF6!dw7BafDAa#(;PO+x`2M*!yr8Y4&`tML_3b`>$F2B}}y9p6l=cNw-TdxMI(~Mi|zW%}{ zbPL`uCRSck4Jcg7WP0>%wCJ*H{tGfg_iBaF(AT6v!&@=jC=oxQ9Xg$h5?W5Tt}j&w zI}?a}+)I*v7H=Q)QBtg&w80)KCZejm1jP2x>ha|xj8spLYeaa

      ^teRvg!8DA6NGkoD5ZWso50n+f~w^O~~Lzv#=% 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 z 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/resizable/zack.jpg b/www/extras/yui-ext/examples/resizable/zack.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1358be9c648353ab8f570a8729fbd1d80fe1e593 GIT binary patch literal 120514 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 #OJPR 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%0AY{oP^vrK8MP;?b~_C#;D^I~6Uvr9 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 aT<~l4DmlG6uudzX`0g(##89Z?WB=I&53?Wu literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/examples/tabs/ajax1.htm b/www/extras/yui-ext/examples/tabs/ajax1.htm new file mode 100644 index 000000000..1e4b18185 --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/ajax1.htm @@ -0,0 +1,9 @@ +I'm am content loaded via AJAX. I was set up using the UpdateManager and the onActivate event like this: +

      var tab2 = jtabs.addTab('jtabs-2', "Ajax Tab 1");
      +var updater = tab2.getUpdateManager();
      +updater.setDefaultUrl('ajax1.htm');
      +tab2.onActivate.subscribe(updater.refresh, updater, true);
      +
      +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. diff --git a/www/extras/yui-ext/examples/tabs/ajax2.htm b/www/extras/yui-ext/examples/tabs/ajax2.htm new file mode 100644 index 000000000..c182bf428 --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/ajax2.htm @@ -0,0 +1,7 @@ +I'm am content loaded via AJAX. I was set up using the setUrl() method on my YAHOO.ext.TabPanelItem object: +
      var tab3 = jtabs.addTab('jtabs-3', "Ajax Tab 2");
      +tab3.setUrl('ajax2.htm', null, true);
      +
      +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. +Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure. diff --git a/www/extras/yui-ext/examples/tabs/tabs-example.css b/www/extras/yui-ext/examples/tabs/tabs-example.css new file mode 100644 index 000000000..72f2b71fc --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-example.css @@ -0,0 +1,26 @@ +.list {list-style:square;width:500px;padding-left:16px;} +.list li{padding:2px;font-size:8pt;} + +/* hide the tab content while loading */ +.tab-content{display:none;} + +pre { + font-size:11px; +} + +#tabs1 {width:400px;} +#tabs1 .yui-ext-tabbody {border:1px solid #999;border-top:none;} +#tabs1 .yui-ext-tabitembody {display:none;padding:10px;} + +#jtabs {width:600px;} +#jtabs .yui-ext-tabbody {border:1px solid #999;border-top:none; height:200px;overflow:auto;} +#jtabs .yui-ext-tabitembody {display:none;padding:10px;font-size:11px;} + +/* default loading indicator for ajax calls */ +.loading-indicator { + font-size:8pt; + background-image:url('../../resources/images/grid/loading.gif'); + background-repeat: no-repeat; + background-position: left; + padding-left:20px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tabs/tabs-example.js b/www/extras/yui-ext/examples/tabs/tabs-example.js new file mode 100644 index 000000000..e6450347e --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs-example.js @@ -0,0 +1,33 @@ +var TabsExample = { + init : function(){ + // basic tabs 1, built from existing content + var tabs = new YAHOO.ext.TabPanel('tabs1'); + tabs.addTab('script', "View Script"); + tabs.addTab('markup', "View Markup"); + tabs.activate('script'); + + // second tabs built from JS + var jtabs = new YAHOO.ext.TabPanel('jtabs'); + jtabs.addTab('jtabs-1', "Normal Tab", "My content was added during construction."); + + var tab2 = jtabs.addTab('jtabs-2', "Ajax Tab 1"); + var updater = tab2.getUpdateManager(); + updater.setDefaultUrl('ajax1.htm'); + tab2.onActivate.subscribe(updater.refresh, updater, true); + + var tab3 = jtabs.addTab('jtabs-3', "Ajax Tab 2"); + tab3.setUrl('ajax2.htm', null, true); + + var tab4 = jtabs.addTab('jtabs-4', "Event Tab"); + tab4.setContent("I am tab 4's content. My content was set with setContent() after I was created. I also have an event listener attached."); + tab4.onActivate.subscribe(function(){ + alert('Tab 4 was activated.'); + }); + + jtabs.addTab('tabs1-5', "Disabled Tab", "Can't see me cause I'm disabled"); + jtabs.disableTab('tabs1-5'); + + jtabs.activate('jtabs-1'); + } +} +YAHOO.ext.EventManager.onDocumentReady(TabsExample.init, TabsExample, true); \ No newline at end of file diff --git a/www/extras/yui-ext/examples/tabs/tabs.html b/www/extras/yui-ext/examples/tabs/tabs.html new file mode 100644 index 000000000..c7f8901ed --- /dev/null +++ b/www/extras/yui-ext/examples/tabs/tabs.html @@ -0,0 +1,79 @@ + + + + +Tabs Example + + + + + + + + + + + + + + + + + + + +
      + To view the source of this page, right click (Mac users control+click) in this frame and select "View Source" or "This Frame"->"View Source". +
      +

      Tab Panel Examples

      +

      Note that the js and css is not minified so it is readable. See tabs-example.js for the tab creation code +and tabs-example.css for the css.

      + +

      Tabs without fixed height that resize to the content. Built from existing markup.


      + +
      +
      + Here's my script: + + +
      +var tabs = new YAHOO.ext.TabPanel('tabs1');
      +tabs.addTab('script', "View Script");
      +tabs.addTab('markup', "View Markup");
      +tabs.activate('script');
      + + +
      +
      + + +
      +<div id="tabs1">
      +    <div id="script" class="tab-content">
      +        (Content goes here)
      +    </div>
      +    <div id="markup" class="tab-content">
      +        (Content goes here)
      +    </div>
      +</div>
      + + +
      +
      + +
      +

      Tabs with fixed height that scroll the content. Built entirely with javascript.

      +
        +
      • Tab 1 is a normal tab with content passed when adding it.
      • +
      • Tab 2 is loaded via Ajax. It was set up using the standard UpdateManager functionality. It reloads it's content every time it's activated.
      • +
      • Tab 3 is loaded via Ajax too. It was set up using setUrl() a convenience method that will do everything done on tab 2 and also has the ability to set it to load only once.
      • +
      • Tab 4 has an event listener attached.
      • +
      • Tab 5 is disabled.
      • +

      + + +
      +
      + + + \ No newline at end of file diff --git a/www/extras/yui-ext/layout-lib.js b/www/extras/yui-ext/layout-lib.js new file mode 100644 index 000000000..51c22c62a --- /dev/null +++ b/www/extras/yui-ext/layout-lib.js @@ -0,0 +1,105 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.ext.LayoutManager=function(container){YAHOO.ext.LayoutManager.superclass.constructor.call(this);this.el=getEl(container,true);this.id=this.el.id;this.el.addClass('ylayout-container');this.monitorWindowResize=true;this.regions={};this.events={'layout':new YAHOO.util.CustomEvent(),'regionresized':new YAHOO.util.CustomEvent(),'regioncollapsed':new YAHOO.util.CustomEvent(),'regionexpanded':new YAHOO.util.CustomEvent()};this.updating=false;YAHOO.ext.EventManager.onWindowResize(this.onWindowResize,this,true);};YAHOO.extendX(YAHOO.ext.LayoutManager,YAHOO.ext.util.Observable,{isUpdating:function(){return this.updating;},beginUpdate:function(){this.updating=true;},endUpdate:function(noLayout){this.updating=false;if(!noLayout){this.layout();}},layout:function(){},onRegionResized:function(region,newSize){this.fireEvent('regionresized',region,newSize);this.layout();},onRegionCollapsed:function(region){this.fireEvent('regioncollapsed',region);},onRegionExpanded:function(region){this.fireEvent('regionexpanded',region);},getViewSize:function(){var size;if(this.el.dom!=document.body){this.el.beginMeasure();size=this.el.getSize();this.el.endMeasure();}else{size={width:YAHOO.util.Dom.getViewportWidth(),height:YAHOO.util.Dom.getViewportHeight()};} +size.width-=this.el.getBorderWidth('lr')-this.el.getPadding('lr');size.height-=this.el.getBorderWidth('tb')-this.el.getPadding('tb');return size;},getEl:function(){return this.el;},getRegion:function(target){return this.regions[target];},onWindowResize:function(){if(this.monitorWindowResize){this.layout();}}}); + +YAHOO.ext.LayoutRegion=function(mgr,config,pos){this.mgr=mgr;this.position=pos;var dh=YAHOO.ext.DomHelper;this.el=dh.append(mgr.el.dom,{tag:'div',cls:'ylayout-panel ylayout-panel-'+this.position},true);this.titleEl=dh.append(this.el.dom,{tag:'div',unselectable:'on',cls:'yunselectable ylayout-panel-hd ylayout-title-'+this.position,children:[{tag:'span',cls:'yunselectable ylayout-panel-hd-text',unselectable:'on',html:' '},{tag:'div',cls:'yunselectable ylayout-panel-hd-tools',unselectable:'on'}]},true);this.titleEl.enableDisplayMode();this.titleTextEl=this.titleEl.dom.firstChild;this.tools=getEl(this.titleEl.dom.childNodes[1],true);this.closeBtn=this.createTool(this.tools.dom,'ylayout-close');this.closeBtn.enableDisplayMode();this.closeBtn.on('click',this.closeClicked,this,true);this.closeBtn.hide();this.bodyEl=dh.append(this.el.dom,{tag:'div',cls:'ylayout-panel-body'},true);this.events={'invalidated':new YAHOO.util.CustomEvent('invalidated'),'visibilitychange':new YAHOO.util.CustomEvent('visibilitychange'),'paneladded':new YAHOO.util.CustomEvent('paneladded'),'panelremoved':new YAHOO.util.CustomEvent('panelremoved'),'collapsed':new YAHOO.util.CustomEvent('collapsed'),'expanded':new YAHOO.util.CustomEvent('expanded'),'panelactivated':new YAHOO.util.CustomEvent('panelactivated'),'resized':new YAHOO.util.CustomEvent('resized')};this.panels=new YAHOO.ext.util.MixedCollection();this.panels.getKey=this.getPanelId.createDelegate(this);this.box=null;this.visible=false;this.collapsed=false;this.hide();this.on('paneladded',this.validateVisibility,this,true);this.on('panelremoved',this.validateVisibility,this,true);this.activePanel=null;this.applyConfig(config);};YAHOO.extendX(YAHOO.ext.LayoutRegion,YAHOO.ext.util.Observable,{getPanelId:function(p){return p.getId();},applyConfig:function(config){if(config.collapsible&&this.position!='center'&&!this.collapsedEl){var dh=YAHOO.ext.DomHelper;this.collapseBtn=this.createTool(this.tools.dom,'ylayout-collapse-'+this.position);this.collapseBtn.mon('click',this.collapse,this,true);this.collapsedEl=dh.append(this.mgr.el.dom,{tag:'div',cls:'ylayout-collapsed ylayout-collapsed-'+this.position,children:[{tag:'div',cls:'ylayout-collapsed-tools'}]},true);if(config.floatable!==false){this.collapsedEl.addClassOnOver('ylayout-collapsed-over');this.collapsedEl.mon('click',this.collapseClick,this,true);} +this.expandBtn=this.createTool(this.collapsedEl.dom.firstChild,'ylayout-expand-'+this.position);this.expandBtn.mon('click',this.expand,this,true);} +if(this.collapseBtn){this.collapseBtn.setVisible(config.collapsible==true);} +this.cmargins=config.cmargins||this.cmargins||(this.position=='west'||this.position=='east'?{top:0,left:2,right:2,bottom:0}:{top:2,left:0,right:0,bottom:2});this.margins=config.margins||this.margins||{top:0,left:0,right:0,bottom:0};this.bottomTabs=config.tabPosition!='top';this.autoScroll=config.autoScroll||false;if(this.autoScroll){this.bodyEl.setStyle('overflow','auto');}else{this.bodyEl.setStyle('overflow','hidden');} +if((!config.titlebar&&!config.title)||config.titlebar===false){this.titleEl.hide();}else{this.titleEl.show();if(config.title){this.titleTextEl.innerHTML=config.title;}} +this.duration=config.duration||.30;this.slideDuration=config.slideDuration||.45;this.config=config;if(config.collapsed){this.collapse(true);}},resizeTo:function(newSize){switch(this.position){case'east':case'west':this.el.setWidth(newSize);this.fireEvent('resized',this,newSize);break;case'north':case'south':this.el.setHeight(newSize);this.fireEvent('resized',this,newSize);break;}},getBox:function(){var b;if(!this.collapsed){b=this.el.getBox(false,true);}else{b=this.collapsedEl.getBox(false,true);} +return b;},getMargins:function(){return this.collapsed?this.cmargins:this.margins;},highlight:function(){this.el.addClass('ylayout-panel-dragover');},unhighlight:function(){this.el.removeClass('ylayout-panel-dragover');},updateBox:function(box){this.box=box;if(!this.collapsed){this.el.dom.style.left=box.x+'px';this.el.dom.style.top=box.y+'px';this.el.setSize(box.width,box.height);var bodyHeight=this.config.titlebar?box.height-(this.titleEl.getHeight()||0):box.height;bodyHeight-=this.el.getBorderWidth('tb');bodyWidth=box.width-this.el.getBorderWidth('rl');this.bodyEl.setHeight(bodyHeight);this.bodyEl.setWidth(bodyWidth);var tabHeight=bodyHeight;if(this.tabs){tabHeight=this.tabs.syncHeight(bodyHeight);if(YAHOO.ext.util.Browser.isIE)this.tabs.el.repaint();} +this.panelSize={width:bodyWidth,height:tabHeight};if(this.activePanel){this.activePanel.setSize(bodyWidth,tabHeight);}}else{this.collapsedEl.dom.style.left=box.x+'px';this.collapsedEl.dom.style.top=box.y+'px';this.collapsedEl.setSize(box.width,box.height);} +if(this.tabs){this.tabs.autoSizeTabs();}},getEl:function(){return this.el;},hide:function(){if(!this.collapsed){this.el.dom.style.left='-2000px';this.el.hide();}else{this.collapsedEl.dom.style.left='-2000px';this.collapsedEl.hide();} +this.visible=false;this.fireEvent('visibilitychange',this,false);},show:function(){if(!this.collapsed){this.el.show();}else{this.collapsedEl.show();} +this.visible=true;this.fireEvent('visibilitychange',this,true);},isVisible:function(){return this.visible;},closeClicked:function(){if(this.activePanel){this.remove(this.activePanel);}},collapseClick:function(e){if(this.isSlid){e.stopPropagation();this.slideIn();}else{e.stopPropagation();this.slideOut();}},collapse:function(skipAnim){if(this.collapsed)return;this.collapsed=true;if(this.split){this.split.el.hide();} +if(this.config.animate&&skipAnim!==true){this.animateCollapse();}else{this.el.setLocation(-20000,-20000);this.el.hide();this.collapsedEl.show();this.fireEvent('collapsed',this);} +this.fireEvent('invalidated',this);},animateCollapse:function(){},expand:function(e,skipAnim){if(e)e.stopPropagation();if(!this.collapsed)return;if(this.isSlid){this.slideIn(this.expand.createDelegate(this));return;} +this.collapsed=false;this.el.show();if(this.config.animate&&skipAnim!==true){this.animateExpand();}else{if(this.split){this.split.el.show();} +this.collapsedEl.setLocation(-2000,-2000);this.collapsedEl.hide();this.fireEvent('invalidated',this);this.fireEvent('expanded',this);}},animateExpand:function(){},initTabs:function(){this.bodyEl.setStyle('overflow','hidden');var ts=new YAHOO.ext.TabPanel(this.bodyEl.dom,this.bottomTabs);this.tabs=ts;ts.resizeTabs=this.config.resizeTabs===true;ts.minTabWidth=this.config.minTabWidth||40;ts.maxTabWidth=this.config.maxTabWidth||250;ts.preferredTabWidth=this.config.preferredTabWidth||150;ts.monitorResize=false;ts.bodyEl.setStyle('overflow',this.config.autoScroll?'auto':'hidden');this.panels.each(this.initPanelAsTab,this);},initPanelAsTab:function(panel){var ti=this.tabs.addTab(panel.getEl().id,panel.getTitle(),null,this.config.closeOnTab&&panel.isClosable());ti.on('activate',function(){this.setActivePanel(panel);},this,true);if(this.config.closeOnTab){ti.on('beforeclose',function(t,e){e.cancel=true;this.remove(panel);},this,true);} +return ti;},updatePanelTitle:function(panel,title){if(this.activePanel==panel){this.updateTitle(title);} +if(this.tabs){this.tabs.getTab(panel.getEl().id).setText(title);}},updateTitle:function(title){if(this.titleTextEl&&!this.config.title){this.titleTextEl.innerHTML=(typeof title!='undefined'&&title.length>0?title:" ");}},setActivePanel:function(panel){panel=this.getPanel(panel);if(this.activePanel&&this.activePanel!=panel){this.activePanel.setActiveState(false);} +this.activePanel=panel;panel.setActiveState(true);if(this.panelSize){panel.setSize(this.panelSize.width,this.panelSize.height);} +this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&panel.isClosable());this.updateTitle(panel.getTitle());this.fireEvent('panelactivated',this,panel);},showPanel:function(panel){if(panel=this.getPanel(panel)){if(this.tabs){this.tabs.activate(panel.getEl().id);}else{this.setActivePanel(panel);}} +return panel;},getActivePanel:function(){return this.activePanel;},validateVisibility:function(){if(this.panels.getCount()<1){this.updateTitle(' ');this.closeBtn.hide();this.hide();}else{if(!this.isVisible()){this.show();}}},add:function(panel){if(arguments.length>1){for(var i=0,len=arguments.length;i0){if(m>(inc/2)){newValue=value+(inc-m);}else{newValue=value-m;}} +return Math.max(min,newValue);},resizeElement:function(){var box=this.proxy.getBox();this.el.setBox(box,false,this.animate,this.duration,null,this.easing);this.updateChildSize();this.proxy.hide();return box;},constrain:function(v,diff,m,mx){if(v-diffmx){diff=mx-v;} +return diff;},onMouseMove:function(e){if(this.enabled){try{var curSize=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=curSize.width,h=curSize.height;var ow=w,oh=h;var mw=this.minWidth,mh=this.minHeight;var mxw=this.maxWidth,mxh=this.maxHeight;var wi=this.widthIncrement;var hi=this.heightIncrement;var eventXY=e.getXY();var diffX=-(this.startPoint[0]-Math.max(this.minX,eventXY[0]));var diffY=-(this.startPoint[1]-Math.max(this.minY,eventXY[1]));var pos=this.activeHandle.position;switch(pos){case'east':w+=diffX;w=Math.min(Math.max(mw,w),mxw);break;case'south':h+=diffY;h=Math.min(Math.max(mh,h),mxh);break;case'southeast':w+=diffX;h+=diffY;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case'north':diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'west':diffX=this.constrain(w,diffX,mw,mxw);x+=diffX;w-=diffX;break;case'northeast':w+=diffX;w=Math.min(Math.max(mw,w),mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'northwest':diffX=this.constrain(w,diffX,mw,mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;x+=diffX;w-=diffX;break;case'southwest':diffX=this.constrain(w,diffX,mw,mxw);h+=diffY;h=Math.min(Math.max(mh,h),mxh);x+=diffX;w-=diffX;break;} +var sw=this.snap(w,wi,mw);var sh=this.snap(h,hi,mh);if(sw!=w||sh!=h){switch(pos){case'northeast':y-=sh-h;break;case'north':y-=sh-h;break;case'southwest':x-=sw-w;break;case'west':x-=sw-w;break;case'northwest':x-=sw-w;y-=sh-h;break;} +w=sw;h=sh;} +if(this.preserveRatio){switch(pos){case'southeast':case'east':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);break;case'south':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'northeast':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'north':var tw=w;w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);x+=(tw-w)/2;break;case'southwest':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);var tw=w;w=ow*(h/oh);x+=tw-w;break;case'west':var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);y+=(th-h)/2;var tw=w;w=ow*(h/oh);x+=tw-w;break;case'northwest':var tw=w;var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);y+=th-h;x+=tw-w;break;}} +this.proxy.setBounds(x,y,w,h);if(this.dynamic){this.resizeElement();}}catch(e){}}},handleOver:function(){if(this.enabled){this.el.addClass('yresizable-over');}},handleOut:function(){if(!this.resizing){this.el.removeClass('yresizable-over');}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;}});YAHOO.ext.Resizable.positions={n:'north',s:'south',e:'east',w:'west',se:'southeast',sw:'southwest',nw:'northwest',ne:'northeast'};YAHOO.ext.Resizable.Handle=function(rz,pos,disableTrackOver,transparent){if(!this.tpl){var tpl=YAHOO.ext.DomHelper.createTemplate({tag:'div',cls:'yresizable-handle yresizable-handle-{0}',html:' '});tpl.compile();YAHOO.ext.Resizable.Handle.prototype.tpl=tpl;} +this.position=pos;this.rz=rz;this.el=this.tpl.append(rz.el.dom,[this.position],true);this.el.unselectable();if(transparent){this.el.setOpacity(0);} +this.el.mon('mousedown',this.onMouseDown,this,true);if(!disableTrackOver){this.el.mon('mouseover',this.onMouseOver,this,true);this.el.mon('mouseout',this.onMouseOut,this,true);}};YAHOO.ext.Resizable.Handle.prototype={afterResize:function(rz){},onMouseDown:function(e){this.rz.onMouseDown(this,e);},onMouseOver:function(e){this.rz.handleOver(this,e);},onMouseOut:function(e){this.rz.handleOut(this,e);}}; diff --git a/www/extras/yui-ext/resources/css/README.txt b/www/extras/yui-ext/resources/css/README.txt new file mode 100644 index 000000000..928fbdf18 --- /dev/null +++ b/www/extras/yui-ext/resources/css/README.txt @@ -0,0 +1,8 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +2006-11-21 jvs: +yui-ext.css contains all of the other css files combined and stripped of comments. + diff --git a/www/extras/yui-ext/resources/css/basic-dialog.css b/www/extras/yui-ext/resources/css/basic-dialog.css new file mode 100644 index 000000000..96159557d --- /dev/null +++ b/www/extras/yui-ext/resources/css/basic-dialog.css @@ -0,0 +1,291 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.ydlg-proxy { + background-image: url('../images/gradient-bg.gif'); + background-color:#c3daf9; + border:1px solid #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ydlg-shadow{ + background:#aaaaaa; + position:absolute; + left:0;top:0; +} +.ydlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; +} +body.masked{ + overflow:hidden; +} +body.masked select { + visibility:hidden; +} +body.masked .ydlg select { + visibility:visible; +} +.ydlg{ + z-index:10001; + overflow:hidden; + position:absolute; + left:300;top:0; +} +.yresizable-proxy{ + z-index:10002; +} +.ydlg .ydlg-hd { + background: url(../images/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color:navy; + color:#FFF; + font:bold 12px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; + padding:5px; +} +.ydlg .ydlg-hd-left { + background: url(../images/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; + padding-left:3px; + margin:0px; +} +.ydlg .ydlg-hd-right { + background: url(../images/basic-dialog/hd-sprite.gif) no-repeat right 0px; + padding-right:3px; +} +.ydlg .ydlg-dlg-body{ + background:url(../images/layout/gradient-bg.gif); + border:1px solid #6593cf; + border-top:0px none; + padding:10px; +} +.ydlg .ydlg-bd{ + overflow:hidden; +} +.ydlg .ydlg-ft{ + overflow:hidden; + padding:5px; + padding-bottom:0px; +} +.ydlg .yui-ext-tabbody{ + background:white; + overflow:auto; +} +.ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #6593cf; + border-top:0px none; +} +.ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #6593cf; + border-bottom:0px none; +} +.ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ydlg .inner-tab{ + margin:5px; +} +.ydlg .ydlg-button{ + font:normal 11px arial, tahoma, verdana, helvetica; + margin-right:5px; + float:right; + cursor:pointer; + clear:none; +} +.ydlg-button-left, .ydlg-button-right{ + font-size:1px; + line-height:1px; +} + +.ydlg-button-left{ + width:3px; + height:21px; + background:url(../images/basic-dialog/btn-sprite.gif) no-repeat 0px 0px; +} +.ydlg-button-right{ + width:3px; + height:21px; + background:url(../images/basic-dialog/btn-sprite.gif) no-repeat 0px -21px; +} +.ydlg-button-focus{ + text-decoration:none !important; + color:black !important; +} +.ydlg-button-center{ + background:url(../images/basic-dialog/btn-sprite.gif) repeat-x 0px -42px; + font:normal 11px "san serif",tahoma,verdana,helvetica; + vertical-align: middle; + text-align:center; + padding:0px 5px; + cursor:pointer; + white-space:nowrap; + -moz-user-select: none; + -khtml-user-select: none; +} +.ydlg-button-over .ydlg-button-left{ + background-position:0px -63px; +} +.ydlg-button-over .ydlg-button-right{ + background-position:0px -84px; +} +.ydlg-button-over .ydlg-button-center{ + background-position:0px -105px; +} +.ydlg-button-click .ydlg-button-center{ + background-position:0px -126px; +} + +.ydlg-button-disabled{ + cursor:default; +} +.ydlg-button-disabled .ydlg-button-center{ + color:gray; + cursor:default; +} +.ydlg-draggable .ydlg-hd{ + cursor:move; +} +.ydlg-closable .ydlg-hd{ + padding-right:22px; +} +.ydlg .ydlg-close { + position:absolute; + top:4px; + right:4px; + z-index:6; + height:15px; + width:15px; + margin:0px; + padding:0px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; + background-image:url(../images/basic-dialog/close.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/basic-dialog/e-handle.gif); + border:0px; + background-position:right; + margin-right:0; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/sizer/s-handle-dark.gif); + border:0px; + height:6px; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/basic-dialog/e-handle.gif); + border:0px; + background-position:1px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-northeast, .ytheme-gray .ydlg div.yresizable-handle-northeast{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-northwest, .ytheme-gray .ydlg div.yresizable-handle-northwest{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} + +/** gray theme */ + +.ytheme-gray .ydlg-proxy { + background-image: url('../images/layout/gray/gradient-bg.gif'); + background-color:#EAE8D5; + border:1px solid #b3b6b0; +} +.ytheme-gray .ydlg-shadow{ + background:#aaaaaa; +} +.ytheme-gray .ydlg-proxy .tabset{ + background:url(../images/layout/gray/gradient-bg.gif); +} +.ytheme-gray .ydlg .ydlg-hd { + background: url(../images/basic-dialog/gray/hd-sprite.gif) repeat-x 0px -82px; + background-color:#333333; +} +.ytheme-gray .ydlg .ydlg-hd-left { + background: url(../images/basic-dialog/gray/hd-sprite.gif) no-repeat 0px -41px; +} +.ytheme-gray .ydlg .ydlg-hd-right { + background: url(../images/basic-dialog/gray/hd-sprite.gif) no-repeat right 0px; +} +.ytheme-gray .ydlg .ydlg-dlg-body{ + background:#efefec; + border:1px solid #b3b6b0; + border-top:0px none; +} +.ytheme-gray .ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-top:0px none; +} +.ytheme-gray .ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-bottom:0px none; +} +.ytheme-gray .ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ytheme-gray .ydlg .ydlg-close { + background-image:url(../images/basic-dialog/gray/close.gif); +} +.ytheme-gray .ydlg div.yresizable-handle-east{ + background-image:url(../images/basic-dialog/gray/e-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-south{ + background-image:url(../images/basic-dialog/gray/s-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-west{ + background-image:url(../images/basic-dialog/gray/e-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-southeast{ + background-image:url(../images/basic-dialog/gray/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ytheme-gray .ydlg div.yresizable-handle-southwest{ + background-image:url(../images/sizer/gray/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} +.ytheme-gray .ydlg div.yresizable-handle-north{ + background-image:url(../images/s.gif); + border:0px none; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/grid.css b/www/extras/yui-ext/resources/css/grid.css new file mode 100644 index 000000000..180d325fe --- /dev/null +++ b/www/extras/yui-ext/resources/css/grid.css @@ -0,0 +1,687 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.ygrid-cell-text { + display: block; + font: normal 8pt arial; + overflow: hidden; + padding: 3px 5px; + white-space: nowrap; +} +.ygrid-col{ + cursor: default; + height:21px !important; + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + display:block; + -moz-outline: none; + -moz-user-focus: normal; + overflow: hidden; + border-left: 1px solid #f1efe2; +} +.yeditgrid .ygrid-col{ + -moz-outline: normal; +} +.ygrid-col, .ygrid-hd { + font: normal 8pt arial; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.ygrid-col-0{ + border-left: 0px; +} +.ygrid-col-last{ + border-right: 1px solid #f1efe2; +} +.ygrid-editor{ + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + visibility:hidden; + font: normal 8pt arial; + border: 1px solid #afbdc9; + z-index:10; +} +.ygrid-editor input{ + font: normal 8pt arial; + border: 0px; + padding-top:2px; + padding-left:3px; +} +.ygrid-editor-container{ + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-editor .pick-button{ + width:15px; + height:20px; + position:absolute; + display:block; + right:0; + top:0; + z-index:2; + background-image: url(../images/grid/pick-button.gif); + background-repeat: no-repeat; +} +.ygrid-editor-invalid{ + background-image: url(../images/grid/invalid_line.gif); + background-repeat: repeat-x; + background-position: bottom; + border: 1px solid #afbdc9; +} +.ygrid-checkbox-editor{ + text-align: center; + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-checkbox-editor input{ + margin-top:3px; + height:13px; + width:13px; +} +select.ygrid-editor{ + padding: 0px; + -moz-outline: none; + border: 1px solid #afbdc9; +} +.ygrid-num-editor{ + text-align:right; + padding-top:2px; + padding-left:3px; +} +.ygrid-text-editor{ + padding-top:2px; + padding-left:3px; +} +.ygrid-hd{ + background-color: #ebeadb; + border-bottom: 1px solid #cbc7b8; + box-sizing: border-box; + -moz-box-sizing: border-box; + display: block; + position: absolute; + overflow:hidden; +} +.ygrid-column-sizer { + width:1px; + border-right:1px dashed #6593cf; + background:none; + cursor: col-resize; +} +.ygrid-drag-proxy{ + width:150px; + height:24px; + background-color:#3366cc; + border: 1px solid #002266; + position:absolute; + visibility:hidden; + z-index:10000; +} +.ygrid-drag-text{ + font: normal 8pt arial; + color:white; + position:absolute; + top:0px; + left:26px; + padding:3px; + display:block; +} +.ygrid-drop-icon{ + position:absolute; + top:0px; + left:0px; + display:block; + width:24px; + height:100%; + background-position: center; + background-repeat: no-repeat; +} +.ygrid-drop-nodrop{ + background-image: url(../images/grid/drop-no.gif); +} +.ygrid-drop-ok{ + background-image: url(../images/grid/drop-yes.gif); +} +.ygrid-hd .sort-asc { + background-image: url(../images/grid/sort_asc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd .sort-desc { + background-image: url(../images/grid/sort_desc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd-body { + border-bottom: 2px solid #d6d2c2; + cursor: default; + display: block; + font: normal 8pt arial; + left: 0; + overflow: hidden; + padding: 3px 5px; + position: relative; + top: 0; + white-space: nowrap; +} +.ygrid-hd-body span { + font: normal 8pt arial; + white-space: nowrap; +} +.ygrid-hd-over{ + border-bottom: 2px solid #fcc247; +} +.ygrid-hd-over .ygrid-hd-body{ + background-color: #faf9f4; + border-bottom: 1px solid #f9a900; +} +.ygrid-hd-split { + background-image: url(../images/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} +.ygrid-hrow{ + background-color: #ebeadb; + display: block; + height: 22px; + left: 0; + position: relative; + top: 0; + width: 10000px; + overflow:hidden; + z-index:2; +} +.ygrid-hrow-frame{ + height: 22px; + left: 0; + display:block; + position: absolute; + top: 0; + width: 10000px; + z-index:1; +} +.ygrid-footer .ytoolbar{ + border:0px; +} +.ygrid-page-number{ + width:24px; + height:14px; +} +.ygrid-page-first{ + background-image: url(../images/grid/page-first.gif); +} +.ygrid-loading{ + background-image: url(../images/grid/done.gif); +} +.ygrid-page-last{ + background-image: url(../images/grid/page-last.gif); +} +.ygrid-page-next{ + background-image: url(../images/grid/page-next.gif); +} +.ygrid-page-prev{ + background-image: url(../images/grid/page-prev.gif); +} +.ytb-button-disabled .ygrid-loading{ + background-image: url(../images/grid/loading.gif); +} +.ytb-button-disabled .ygrid-page-first{ + background-image: url(../images/grid/page-first-disabled.gif); +} +.ytb-button-disabled .ygrid-page-last{ + background-image: url(../images/grid/page-last-disabled.gif); +} +.ytb-button-disabled .ygrid-page-next{ + background-image: url(../images/grid/page-next-disabled.gif); +} +.ytb-button-disabled .ygrid-page-prev{ + background-image: url(../images/grid/page-prev-disabled.gif); +} +.ygrid-mso{ +} +.ygrid-mso .ygrid-hd{ + background:none; + border-bottom:0px; +} +.ygrid-mso .ygrid-footer { + border-top: 1px solid #6593cf; +} + +.ygrid-mso .ygrid-footer .ygrid-fbutton{ + border:0px; +} +.ygrid-mso .ygrid-hd-body { + border-bottom:0px; +} +.ygrid-mso .ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-mso .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; +} +.ygrid-mso .ygrid-hd-split { + background-image: url(../images/grid/grid-blue-split.gif); +} +.ygrid-mso .ytoolbar .ytb-sep { + background-image: url(../images/grid/grid-blue-split.gif); +} +.ygrid-mso .ygrid-hrow{ + background: url(../images/grid/mso-hd.gif); + border-bottom: 1px solid #6593cf; + height: 21px; +} +.ygrid-mso .ygrid-row{ + color: black; + border-bottom: 1px solid #ddecfe; +} +.ygrid-mso .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-mso .ygrid-row-selected{ + background-color: #b3c8e8 !important; + color: black; +} +.ygrid-mso .ygrid-row-selected span{ + color: black !important; +} +.yprops-grid .ygrid-col-1{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-1 .ygrid-cell-text{ + background-color: white; +} +.yprops-grid .ygrid-col-0{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-0 .ygrid-cell-text{ + background-color: white; + margin-left:10px; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0 .ygrid-cell-text{ + background-color: #316ac5; + color: white; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0{ + color: white; +} +.yprops-grid .ygrid-num-editor{ + text-align:left; +} +.ygrid-row{ + border-bottom: 1px solid #f1efe2; + overflow: visible; + white-space: nowrap; + height:21px; + width:10000px; + box-sizing: border-box; + -moz-box-sizing: border-box; + display:block; + position:absolute; +} +.ygrid-row-alt{ + background-color: #fcfaf6; +} +.ygrid-row-over{ + background-color: #f1f1f1; + color: black; +} +.ygrid-row-selected{ + background-color: #316ac5 !important; + color: white; +} +.ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista{ + border:1px solid #535353; +} +.ygrid-vista .ygrid-hd{ + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-body { + border-bottom: 1px solid #b3bcc0; +} +.ygrid-vista .ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-split { + background-image: url(../images/grid/grid-split.gif); +} +.ygrid-vista .ygrid-hrow{ + background: url(../images/grid/grid-vista-hd.gif); + height: 21px; +} +.ygrid-vista .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-vista .ygrid-row-selected{ + background-color: #535353 !important; + color: white; +} +.ygrid-vista .ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista .ygrid-wrap-body { +} +/* + To have the scrollbars overlap the header, change .ygrid-wrap top style to 0 and + and ygrid-wrap-body top to 22px + Then grid.getView().scrollbarMode = YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP; + */ +.ygrid-wrap { + height: 100%; + left: 0; + overflow: auto; + position: relative; + top: 22px; + width: 100%; +} +.ygrid-footer{ + display: block; + padding:0px; + border-top: 1px solid #cbc7b8; +} +.ygrid-wrap-footer { + display: block; + overflow: hidden; + width:100%; + height:25px; + box-sizing: border-box; + -moz-box-sizing: border-box; + background-color: #ebeadb; + position:absolute; + bottom:0px; +} +.ygrid-wrap-body { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + display: block; +} +.ygrid-wrap-headers { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + z-index: 12; +} +/* +The grid first check if a column style is defined as: +#your-grid .ygrid-col-0 +if it doesn't find it, it uses one of the generic empty rules below. +If you have more than one grid on your page - you MUST define you columns +like above - #container-id .ygrid-col-0 and they must each be a separate rule +*/ +.ygrid-col-0{ +} +.ygrid-col-1{ +} +.ygrid-col-10{ +} +.ygrid-col-11{ +} +.ygrid-col-12{ +} +.ygrid-col-13{ +} +.ygrid-col-14{ +} +.ygrid-col-15{ +} +.ygrid-col-16{ +} +.ygrid-col-17{ +} +.ygrid-col-18{ +} +.ygrid-col-19{ +} +.ygrid-col-2{ +} +.ygrid-col-20{ +} +.ygrid-col-3{ +} +.ygrid-col-4{ +} +.ygrid-col-5{ +} +.ygrid-col-6{ +} +.ygrid-col-7{ +} +.ygrid-col-8{ +} +.ygrid-col-9{ +} + +.ygrid-header-0{ +} +.ygrid-header-1{ +} +.ygrid-header-10{ +} +.ygrid-header-11{ +} +.ygrid-header-12{ +} +.ygrid-header-13{ +} +.ygrid-header-14{ +} +.ygrid-header-15{ +} +.ygrid-header-16{ +} +.ygrid-header-17{ +} +.ygrid-header-18{ +} +.ygrid-header-19{ +} +.ygrid-header-2{ +} +.ygrid-header-20{ +} +.ygrid-header-3{ +} +.ygrid-header-4{ +} +.ygrid-header-5{ +} +.ygrid-header-6{ +} +.ygrid-header-7{ +} +.ygrid-header-8{ +} +.ygrid-header-9{ +} +/* The styles below are for the examples and can be removed */ +#grid-example{ + border: 1px solid #cbc7b8; + left: 0; + position: relative; + top: 0; +} +#grid-example .ygrid-col-0 { +} +#grid-example .ygrid-col-1 { + text-align: right; +} +#grid-example .ygrid-col-2{ + text-align: right; +} +#grid-example .ygrid-col-3 { + text-align: right; +} +#grid-example .ygrid-col-4 { + text-align: right; +} +#grid-example.ygrid-mso{ + border: 1px solid #6593cf; +} +#grid-example.ygrid-vista{ + border: 1px solid #b3bcc0; +} +#xml-grid-example{ + border: 1px solid #cbc7b8; + left: 0; + position: relative; + top: 0; +} +#xml-grid-example .ygrid-col-0 { +} +#xml-grid-example .ygrid-col-1 { +} +#xml-grid-example .ygrid-col-2{ +} +#xml-grid-example .ygrid-col-3 { +} +#xml-grid-example.ygrid-mso{ + border: 1px solid #6593cf; +} +#xml-grid-example.ygrid-vista{ + border: 1px solid #b3bcc0; +} +#editor-grid .ygrid-col-2{ + text-align:right; +} +.ypopcal{ + background: white; + padding:2px; + border: 1px solid gray; +} +.ypopcal-shadow { + background: #dddddd; + filter: progid:DXImageTransform.Microsoft.Blur(MakeShadow=true,pixelradius=1) Alpha(opacity=35,style=1,startX=0,finishX=200,FinishOpacity=35); + padding: 0px; + position:absolute; +} +.ypopcal-head{ + width:150px; + background: #93b5e4; +} +.ypopcal-head td{ + padding:1px; +} +.ypopcal-month{ + color: white; + font: bold 7pt verdana; + text-decoration: none; + text-align:center; +} +.ypopcal-head .ypopcal-arrow{ + width:16px; + text-align:center; + cursor:pointer; + -moz-user-select: none; +} + +.ypopcal-head .next-month{ + width:16px; + background-image: url(../images/grid/arrow-right-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} +.ypopcal-head .prev-month{ + width:16px; + background-image: url(../images/grid/arrow-left-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} + +.ypopcal-table { + background:white; + border-bottom: 1px solid #cccccc; +} +.ypopcal-table tr{ + +} +.ypopcal-table td{ + box-sizing: border-box; + -moz-box-sizing: border-box; + border: 1px solid white; + text-align:right; + color:#aaaaaa; + cursor:pointer; + font:normal 8pt arial; + background:white; + padding:1px 2px; + width:12px; + height:12px; +} +.ypopcal-table td.today{ + border: 1px solid darkred; +} +.ypopcal-table .ypopcal-daynames td{ + text-align:center !important; + border:0px; + border-bottom: 1px solid #cccccc; + font-size: 8pt; + font-weight: normal; + text-align:right; + color:black; + cursor:default; +} +.ypopcal-table td.active{ + cursor:pointer; + color:black; +} +.ypopcal-table td.ypopcal-disabled{ + cursor:default; + background:#eeeeee; + border: 1px solid #eeeeee; + color:#bbbbbb; +} +.ypopcal-table td.selected{ + background: #ddecfe; + border: 1px solid #c3daf9; +} +.ypopcal-today{ + color: black; + cursor: hand; + display: inline-block; + font: normal 8pt arial; + margin-left: 2px; + text-decoration: none; + margin-top:0px; +} + +.ygrid-simple-view .ygrid-col{ + height:100% !important; + position:static; + display:table-cell; + display:inline-block; +} +.ygrid-simple-view .ygrid-row{ + position:static; + display: table-row; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/layout.css b/www/extras/yui-ext/resources/css/layout.css new file mode 100644 index 000000000..d19fe97a7 --- /dev/null +++ b/www/extras/yui-ext/resources/css/layout.css @@ -0,0 +1,273 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.ylayout-container{ + width:100%; + height:100%; + overflow:hidden; + background-color:#c3daf9; +} +.ylayout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + background-color:#c3daf9; + width:20px; + height:20px; + overflow:hidden; + border:1px solid #98c0f4; + z-index:20; +} +.ylayout-collapsed-over{ + cursor:pointer; + background-color:#d9e8fb; +} +.ylayout-collapsed-west .ylayout-tools-button{ + float:right; +} +.ylayout-collapsed-east .ylayout-tools-button{ + float:left; +} +.ylayout-collapsed-north, .ylayout-collapsed-south{ + text-align:right; +} +.ylayout-collapsed .ylayout-tools-button{ + margin:2px; + width:12px; + text-align:center; +} +.ylayout-inactive-content{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; +} +.ylayout-active-content{ + visibility:visible; +} +.ylayout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.ylayout-panel-east, .ylayout-panel-west { + z-index:10; +} +.ylayout-panel-north, .ylayout-panel-south { + z-index:11; +} +.ylayout-collapsed-north, .ylayout-collapsed-south, .ylayout-collapsed-east, .ylayout-collapsed-west { + z-index:12; +} +.ylayout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.ylayout-panel-body{ + overflow:hidden; +} +.ylayout-grid-wrapper{ + +} +.ylayout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:#c3daf9; +} +.ylayout-panel-hd{ + background-image: url(../images/layout/panel-title-light-bg.gif); + color: black; + border-bottom:1px solid #98c0f4; + position:relative; +} +.ylayout-panel-hd-text{ + font:normal 11px tahoma, verdana, helvetica; + padding: 4px; + padding-left: 4px; + display:block; +} +.ylayout-panel-hd-tools{ + position:absolute; + right:0px; + top:0px; + text-align:right; + padding-top:2px; + padding-right:2px;width:40px; +} +.ylayout-tools-button{ + z-index:6; + padding:2px; + cursor:pointer; + float:right; +} +.ylayout-tools-button-over{ + padding:1px; + border:1px solid #98c0f4; + background-color:white; +} +.ylayout-tools-button-inner{ + height:12px; + width:12px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + background-position:center; +} +.ylayout-close{ + background-image:url(../images/layout/panel-close.gif); +} +.ylayout-collapse-west,.ylayout-expand-east{ + background-image:url(../images/layout/collapse.gif); +} +.ylayout-expand-west,.ylayout-collapse-east{ + background-image:url(../images/layout/expand.gif); +} +.ylayout-collapse-north,.ylayout-expand-south{ + background-image:url(../images/layout/ns-collapse.gif); +} +.ylayout-expand-north,.ylayout-collapse-south{ + background-image:url(../images/layout/ns-expand.gif); +} +.ylayout-split-h{ + background-image:url(../images/sizer/e-handle.gif); + background-position: left; +} +.ylayout-split-v{ + background-image:url(../images/sizer/s-handle.gif); + background-position: top; +} +.ylayout-panel .ytab-wrap{ + background:url(../images/layout/gradient-bg.gif); +} +.ylayout-panel .yui-ext-tabbody { + background-color:white; + overflow:auto;height:100%; +} +.ylayout-component-panel, .ylayout-nested-layout { + position:relative; + padding:0px; + overflow:hidden; + width:200px; + height:200px; +} +.ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #98c0f4; +} +.yui-ext-repaint{ + zoom:1; + background-color: transparent; +} +.ylayout-panel-dragover { + border: 2px solid #6593cf; +} +.ylayout-panel-proxy { + background-image: url('../images/layout/gradient-bg.gif'); + background-color:#c3daf9; + border:1px dashed #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ylayout-slider { + z-index:15; + overflow:hidden; + position:absolute; +} + +/** gray theme */ + +.ytheme-gray,div.ytheme-gray,.ytheme-gray .ylayout-container{ + background-color:#f3f2e7; +} +.ytheme-gray{ + background-color:#f3f2e7; +} +.ytheme-gray .ylayout-collapsed{ + background-color:#f3f2e7; + border:1px solid #aca899; +} +.ytheme-gray .ylayout-collapsed-over{ + background-color:#fbfbef; +} +.ytheme-gray .ylayout-panel{ + border:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ytheme-gray .ylayout-split{ + background-color:#f3f2e7; +} +.ytheme-gray .ylayout-panel-hd{ + background-image: url(../images/layout/gray/panel-title-light-bg.gif); + border-bottom:1px solid #aca899; +} +.ytheme-gray .ylayout-tools-button-over{ + border:1px solid #aca899; +} +.ytheme-gray .ylayout-close{ + background-image:url(../images/layout/gray/panel-close.gif); +} +.ytheme-gray .ylayout-collapse-west,.ytheme-gray .ylayout-expand-east{ + background-image:url(../images/layout/gray/collapse.gif); +} +.ytheme-gray .ylayout-expand-west,.ytheme-gray .ylayout-collapse-east{ + background-image:url(../images/layout/gray/expand.gif); +} +.ytheme-gray .ylayout-collapse-north,.ytheme-gray .ylayout-expand-south{ + background-image:url(../images/layout/gray/ns-collapse.gif); +} +.ytheme-gray .ylayout-expand-north,.ytheme-gray .ylayout-collapse-south{ + background-image:url(../images/layout/gray/ns-expand.gif); +} +.ytheme-gray .ylayout-split-h{ + background-image:url(../images/sizer/gray/e-handle-dark.gif); +} +.ytheme-gray .ylayout-split-v{ + background-image:url(../images/sizer/gray/s-handle-dark.gif); +} +.ytheme-gray .ylayout-panel .ytab-wrap{ + background:url(../images/layout/gray/gradient-bg.gif); +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #aca899; +} +.ytheme-gray .ylayout-panel-dragover { + border: 2px solid #aca899; +} +.ytheme-gray .ylayout-panel-proxy { + background-image: url('../images/layout/gray/gradient-bg.gif'); + background-color:#f3f2e7; + border:1px dashed #aca899; +} + +.yunselectable{ + -moz-user-select: none; + -khtml-user-select: none; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/reset-min.css b/www/extras/yui-ext/resources/css/reset-min.css new file mode 100644 index 000000000..0fb86c1ad --- /dev/null +++ b/www/extras/yui-ext/resources/css/reset-min.css @@ -0,0 +1,6 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/resizable.css b/www/extras/yui-ext/resources/css/resizable.css new file mode 100644 index 000000000..144b89f90 --- /dev/null +++ b/www/extras/yui-ext/resources/css/resizable.css @@ -0,0 +1,174 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.yresizable-handle { + position:absolute; + z-index:100; + /* ie needs these */ + font-size:1px; + line-height:6px; + overflow:hidden; + background:white; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.yresizable-handle-east{ + width:6px; + cursor:e-resize; + right:0px; + top:0px; + height:100%; + margin-right:-1px; /*IE rounding error*/ +} +.yresizable-handle-south{ + width:100%; + cursor:s-resize; + left:0px; + bottom:0px; + height:6px; + margin-bottom:-1px; /*IE rounding error*/ +} +.yresizable-handle-west{ + width:6px; + cursor:w-resize; + left:0px; + top:0px; + height:100%; +} +.yresizable-handle-north{ + width:100%; + cursor:n-resize; + left:0px; + top:0px; + height:6px; +} +.yresizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-over .yresizable-handle, .yresizable-pinned .yresizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-east{ + background:url(../images/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-west, .yresizable-pinned .yresizable-handle-west{ + background:url(../images/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-south{ + background:url(../images/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-north, .yresizable-pinned .yresizable-handle-north{ + background:url(../images/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-southeast, .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/sizer/se-handle.gif); + background-position: top left; +} +.yresizable-over .yresizable-handle-northwest, .yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/sizer/nw-handle.gif); + background-position:bottom right; +} +.yresizable-over .yresizable-handle-northeast, .yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/sizer/ne-handle.gif); + background-position: bottom left; +} +.yresizable-over .yresizable-handle-southwest, .yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/sizer/sw-handle.gif); + background-position: top right; +} +.yresizable-proxy{ + border: 1px dashed #6593cf; + position:absolute; + overflow:hidden; + visibility:hidden; + left:0;top:0; + z-index:1001; +} +.yresizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + background:white; + z-index:20000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); + border:1px solid red; +} + +/** gray theme */ +.ytheme-gray .yresizable-over .yresizable-handle-east, .ytheme-gray .yresizable-pinned .yresizable-handle-east{ + background:url(../images/sizer/gray/e-handle.gif); + background-position: left; +} +.ytheme-gray .yresizable-over .yresizable-handle-east,.ytheme-gray .yresizable-pinned .yresizable-handle-west{ + background:url(../images/sizer/gray/e-handle.gif); + background-position: left; +} +.ytheme-gray .yresizable-over .yresizable-handle-south,.ytheme-gray .yresizable-pinned .yresizable-handle-south{ + background:url(../images/sizer/gray/s-handle.gif); + background-position: top; +} +.ytheme-gray .yresizable-over .yresizable-handle-south,.ytheme-gray .yresizable-pinned .yresizable-handle-north{ + background:url(../images/sizer/gray/s-handle.gif); + background-position: top; +} +.ytheme-gray .yresizable-over .yresizable-handle-southeast, .ytheme-gray .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/sizer/gray/se-handle.gif); + background-position: top left; +} +.ytheme-gray .yresizable-over .yresizable-handle-northwest,.ytheme-gray .yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/sizer/gray/nw-handle.gif); + background-position:bottom right; +} +.ytheme-gray .yresizable-over .yresizable-handle-northeast,.ytheme-gray .yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/sizer/gray/ne-handle.gif); + background-position: bottom left; +} +.ytheme-gray .yresizable-over .yresizable-handle-southwest,.ytheme-gray .yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/sizer/gray/sw-handle.gif); + background-position: top right; +} +.ytheme-gray .yresizable-proxy{ + border: 1px dashed #615e55; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/tabs.css b/www/extras/yui-ext/resources/css/tabs.css new file mode 100644 index 000000000..ccec0663b --- /dev/null +++ b/www/extras/yui-ext/resources/css/tabs.css @@ -0,0 +1,168 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.ytab-wrap { + border-bottom:1px solid #6593cf; + padding-top:2px; +} +.ytab-wrap table{ + position:relative; + top:0; left:0; +} +.ytab-strip td{ + padding:0px; + padding-left:2px; +} +.ytab-strip a, .ytab-strip span, .ytab-strip em { + display:block; +} +.ytab-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} +.ytab-strip .ytab-text { + font:bold 11px tahoma,arial,helvetica; + color:#666; + overflow:hidden; + white-space: nowrap; + cursor:pointer; + text-overflow: ellipsis; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#083772; +} +.ytab-strip .disabled .ytab-text { + cursor:default; + color:#aaaaaa; +} +.ytab-strip .ytab-inner { + padding:4px 10px; +} + +.ytab-strip .on .ytab-right { + background: url(../images/tabs/tab-sprite.gif) no-repeat right 0px; +} +.ytab-strip .on .ytab-left { + background: url(../images/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.ytab-strip .ytab-right { + background: url(../images/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytab-strip .ytab-left { + background: url(../images/tabs/tab-sprite.gif) no-repeat 0px -150px; +} + +.ytab-strip a { + position:relative; + top:1px; left:0; +} +.ytab-strip .on a { + +} +.ytab-strip .on .ytab-inner { + padding-bottom:5px; +} +/** closable tabs */ +.ytab-strip .ytab-closable .ytab-inner{ + padding-right:22px; + position:relative; +} +.ytab-strip .ytab-closable .close-icon{ + line-height: 1px; + font-size:1px; + background-image:url(../images/layout/tab-close.gif); + display:block; + position:absolute; + right:5px;top:4px; + width:11px;height:11px; + cursor:pointer; +} +.ytab-strip .on .close-icon{ + background-image:url(../images/layout/tab-close-on.gif); +} +.ytab-strip .ytab-closable .close-over{ + background-image:url(../images/layout/tab-close-on.gif); +} + +.ytabs-bottom .ytab-wrap { + border-top:1px solid #6593cf; + border-bottom:0px none; + padding-top:0px; + padding-bottom:2px; +} +.ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip a { + position:relative; + top:0; left:0; +} +.ytabs-bottom .ytab-strip .on a { + margin-top:-1px; +} +.ytabs-bottom .ytab-strip .on .ytab-inner { + padding-top:5px; +} + +/** gray theme */ + +.ytheme-gray .ytab-wrap { + border-bottom:1px solid #aca899; +} +.ytheme-gray .ytab-strip .on .ytab-text { + cursor:default; + color:#333333; +} +.ytheme-gray .ytabs-top .ytab-strip .on .ytab-right { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat right 0px; +} +.ytheme-gray .ytabs-top .ytab-strip .on .ytab-left { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat 0px -100px; +} +.ytheme-gray .ytabs-top .ytab-strip .ytab-right { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat right -50px; +} +.ytheme-gray .ytabs-top .ytab-strip .ytab-left { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat 0px -150px; +} +.ytheme-gray .ytab-strip .ytab-closable .close-icon{ + background-image:url(../images/layout/gray/tab-close.gif); +} +.ytheme-gray .ytab-strip .on .close-icon{ + background-image:url(../images/layout/gray/tab-close-on.gif); +} +.ytheme-gray .ytab-strip .ytab-closable .close-over{ + background-image:url(../images/layout/gray/tab-close-on.gif); +} + +.ytheme-gray .ytabs-bottom .ytab-wrap { + border-bottom:0px none; + padding-top:0px; + border-top:1px solid #aca899; +} +.ytheme-gray .ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/tabs/gray/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytheme-gray .ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/tabs/gray/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytheme-gray .ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/tabs/gray/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytheme-gray .ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/tabs/gray/tab-btm-left-bg.gif) no-repeat bottom right; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/toolbar.css b/www/extras/yui-ext/resources/css/toolbar.css new file mode 100644 index 000000000..e8fa1e91c --- /dev/null +++ b/www/extras/yui-ext/resources/css/toolbar.css @@ -0,0 +1,65 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +.ytoolbar{ + background-color: #ebeadb; + border: 1px solid #cbc7b8; + display: block; + padding:2px; +} +.mso .ytoolbar, .ygrid-mso .ytoolbar{ + border: 0px none; + background: url(../images/grid/mso-hd.gif); +} +.ytoolbar td,.ytoolbar span,.ytoolbar input,.ytoolbar div{ + font:normal 8pt arial,helvetica; +} +.ytoolbar .ytb-button-disabled .ytb-button-inner{ + color:gray; + cursor:default; +} +.ytoolbar .ytb-button-inner{ + background-position: center; + background-repeat: no-repeat; + display: block; + height: 16px; + width: 16px; + cursor:pointer; + white-space: nowrap; +} +.ytoolbar .ytb-text{ + padding:2px; +} +.ytoolbar .ytb-button{ + padding:2px 3px; + display:block; +} +.ytoolbar .ytb-button-over{ + background:#c3d3ed url(../images/toolbar/btn-over-bg.gif) repeat-x; + border:1px solid #6593cf; + padding:1px 2px; +} +.ytoolbar .ytb-sep { + background-image: url(../images/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0px 2px 0px; + border:0px; +} +.mso .ytoolbar .ytb-sep, .ygrid-mso .ytoolbar .ytb-sep{ + background-image: url(../images/grid/grid-blue-split.gif); +} + +.ytheme-gray .ytoolbar{ + border:0px none; + background: #efefe3 url(../images/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} \ No newline at end of file diff --git a/www/extras/yui-ext/resources/css/yui-ext.css b/www/extras/yui-ext/resources/css/yui-ext.css new file mode 100644 index 000000000..69808561f --- /dev/null +++ b/www/extras/yui-ext/resources/css/yui-ext.css @@ -0,0 +1,1624 @@ +/* + * yui-ext .33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';} +.ytab-wrap { + border-bottom:1px solid #6593cf; + padding-top:2px; +} +.ytab-wrap table{ + position:relative; + top:0; left:0; +} +.ytab-strip td{ + padding:0px; + padding-left:2px; +} +.ytab-strip a, .ytab-strip span, .ytab-strip em { + display:block; +} +.ytab-strip a { + text-decoration:none !important; + -moz-outline: none; + outline: none; + cursor:pointer; +} +.ytab-strip .ytab-text { + font:bold 11px tahoma,arial,helvetica; + color:#666; + overflow:hidden; + white-space: nowrap; + cursor:pointer; + text-overflow: ellipsis; +} +.ytab-strip .on .ytab-text { + cursor:default; + color:#083772; +} +.ytab-strip .disabled .ytab-text { + cursor:default; + color:#aaaaaa; +} +.ytab-strip .ytab-inner { + padding:4px 10px; +} + +.ytab-strip .on .ytab-right { + background: url(../images/tabs/tab-sprite.gif) no-repeat right 0px; +} +.ytab-strip .on .ytab-left { + background: url(../images/tabs/tab-sprite.gif) no-repeat 0px -100px; +} +.ytab-strip .ytab-right { + background: url(../images/tabs/tab-sprite.gif) no-repeat right -50px; +} +.ytab-strip .ytab-left { + background: url(../images/tabs/tab-sprite.gif) no-repeat 0px -150px; +} + +.ytab-strip a { + position:relative; + top:1px; left:0; +} +.ytab-strip .on a { + +} +.ytab-strip .on .ytab-inner { + padding-bottom:5px; +} + +.ytab-strip .ytab-closable .ytab-inner{ + padding-right:22px; + position:relative; +} +.ytab-strip .ytab-closable .close-icon{ + line-height: 1px; + font-size:1px; + background-image:url(../images/layout/tab-close.gif); + display:block; + position:absolute; + right:5px;top:4px; + width:11px;height:11px; + cursor:pointer; +} +.ytab-strip .on .close-icon{ + background-image:url(../images/layout/tab-close-on.gif); +} +.ytab-strip .ytab-closable .close-over{ + background-image:url(../images/layout/tab-close-on.gif); +} + +.ytabs-bottom .ytab-wrap { + border-top:1px solid #6593cf; + border-bottom:0px none; + padding-top:0px; + padding-bottom:2px; +} +.ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/tabs/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/tabs/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/tabs/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/tabs/tab-btm-left-bg.gif) no-repeat bottom right; +} +.ytabs-bottom .ytab-strip a { + position:relative; + top:0; left:0; +} +.ytabs-bottom .ytab-strip .on a { + margin-top:-1px; +} +.ytabs-bottom .ytab-strip .on .ytab-inner { + padding-top:5px; +} + + + +.ytheme-gray .ytab-wrap { + border-bottom:1px solid #aca899; +} +.ytheme-gray .ytab-strip .on .ytab-text { + cursor:default; + color:#333333; +} +.ytheme-gray .ytabs-top .ytab-strip .on .ytab-right { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat right 0px; +} +.ytheme-gray .ytabs-top .ytab-strip .on .ytab-left { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat 0px -100px; +} +.ytheme-gray .ytabs-top .ytab-strip .ytab-right { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat right -50px; +} +.ytheme-gray .ytabs-top .ytab-strip .ytab-left { + background: url(../images/tabs/gray/tab-sprite.gif) no-repeat 0px -150px; +} +.ytheme-gray .ytab-strip .ytab-closable .close-icon{ + background-image:url(../images/layout/gray/tab-close.gif); +} +.ytheme-gray .ytab-strip .on .close-icon{ + background-image:url(../images/layout/gray/tab-close-on.gif); +} +.ytheme-gray .ytab-strip .ytab-closable .close-over{ + background-image:url(../images/layout/gray/tab-close-on.gif); +} + +.ytheme-gray .ytabs-bottom .ytab-wrap { + border-bottom:0px none; + padding-top:0px; + border-top:1px solid #aca899; +} +.ytheme-gray .ytabs-bottom .ytab-strip .ytab-right { + background: url(../images/tabs/gray/tab-btm-inactive-right-bg.gif) no-repeat bottom left; +} +.ytheme-gray .ytabs-bottom .ytab-strip .ytab-left { + background: url(../images/tabs/gray/tab-btm-inactive-left-bg.gif) no-repeat bottom right; +} +.ytheme-gray .ytabs-bottom .ytab-strip .on .ytab-right { + background: url(../images/tabs/gray/tab-btm-right-bg.gif) no-repeat bottom left; +} +.ytheme-gray .ytabs-bottom .ytab-strip .on .ytab-left { + background: url(../images/tabs/gray/tab-btm-left-bg.gif) no-repeat bottom right; +} +.ytoolbar{ + background-color: #ebeadb; + border: 1px solid #cbc7b8; + display: block; + padding:2px; +} +.mso .ytoolbar, .ygrid-mso .ytoolbar{ + border: 0px none; + background: url(../images/grid/mso-hd.gif); +} +.ytoolbar td,.ytoolbar span,.ytoolbar input,.ytoolbar div{ + font:normal 8pt arial,helvetica; +} +.ytoolbar .ytb-button-disabled .ytb-button-inner{ + color:gray; + cursor:default; +} +.ytoolbar .ytb-button-inner{ + background-position: center; + background-repeat: no-repeat; + display: block; + height: 16px; + width: 16px; + cursor:pointer; + white-space: nowrap; +} +.ytoolbar .ytb-text{ + padding:2px; +} +.ytoolbar .ytb-button{ + padding:2px 3px; + display:block; +} +.ytoolbar .ytb-button-over{ + background:#c3d3ed url(../images/toolbar/btn-over-bg.gif) repeat-x; + border:1px solid #6593cf; + padding:1px 2px; +} +.ytoolbar .ytb-sep { + background-image: url(../images/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + display: block; + font-size: 1px; + height: 16px; + width:4px; + overflow: hidden; + cursor:default; + margin: 0px 2px 0px; + border:0px; +} +.mso .ytoolbar .ytb-sep, .ygrid-mso .ytoolbar .ytb-sep{ + background-image: url(../images/grid/grid-blue-split.gif); +} + +.ytheme-gray .ytoolbar{ + border:0px none; + background: #efefe3 url(../images/toolbar/gray-bg.gif) repeat-x; + padding:3px; +} +.yresizable-handle { + position:absolute; + z-index:100; + + font-size:1px; + line-height:6px; + overflow:hidden; + background:white; + filter:alpha(opacity=0); + opacity:0; + zoom:1; +} +.yresizable-handle-east{ + width:6px; + cursor:e-resize; + right:0px; + top:0px; + height:100%; + margin-right:-1px; +} +.yresizable-handle-south{ + width:100%; + cursor:s-resize; + left:0px; + bottom:0px; + height:6px; + margin-bottom:-1px; +} +.yresizable-handle-west{ + width:6px; + cursor:w-resize; + left:0px; + top:0px; + height:100%; +} +.yresizable-handle-north{ + width:100%; + cursor:n-resize; + left:0px; + top:0px; + height:6px; +} +.yresizable-handle-southeast{ + width:6px; + cursor:se-resize; + right:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northwest{ + width:6px; + cursor:nw-resize; + left:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-northeast{ + width:6px; + cursor:ne-resize; + right:0px; + top:0px; + height:6px; + z-index:101; +} +.yresizable-handle-southwest{ + width:6px; + cursor:sw-resize; + left:0px; + bottom:0px; + height:6px; + z-index:101; +} +.yresizable-over .yresizable-handle, .yresizable-pinned .yresizable-handle{ + filter:alpha(opacity=100); + opacity:1; +} +.yresizable-over .yresizable-handle-east, .yresizable-pinned .yresizable-handle-east{ + background:url(../images/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-west, .yresizable-pinned .yresizable-handle-west{ + background:url(../images/sizer/e-handle.gif); + background-position: left; +} +.yresizable-over .yresizable-handle-south, .yresizable-pinned .yresizable-handle-south{ + background:url(../images/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-north, .yresizable-pinned .yresizable-handle-north{ + background:url(../images/sizer/s-handle.gif); + background-position: top; +} +.yresizable-over .yresizable-handle-southeast, .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/sizer/se-handle.gif); + background-position: top left; +} +.yresizable-over .yresizable-handle-northwest, .yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/sizer/nw-handle.gif); + background-position:bottom right; +} +.yresizable-over .yresizable-handle-northeast, .yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/sizer/ne-handle.gif); + background-position: bottom left; +} +.yresizable-over .yresizable-handle-southwest, .yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/sizer/sw-handle.gif); + background-position: top right; +} +.yresizable-proxy{ + border: 1px dashed #6593cf; + position:absolute; + overflow:hidden; + visibility:hidden; + left:0;top:0; + z-index:1001; +} +.yresizable-overlay{ + width:100%; + height:100%; + display:none; + position:absolute; + left:0; + top:0; + background:white; + z-index:20000; + -moz-opacity: 0; + opacity:0; + filter: alpha(opacity=0); + border:1px solid red; +} + + +.ytheme-gray .yresizable-over .yresizable-handle-east, .ytheme-gray .yresizable-pinned .yresizable-handle-east{ + background:url(../images/sizer/gray/e-handle.gif); + background-position: left; +} +.ytheme-gray .yresizable-over .yresizable-handle-east,.ytheme-gray .yresizable-pinned .yresizable-handle-west{ + background:url(../images/sizer/gray/e-handle.gif); + background-position: left; +} +.ytheme-gray .yresizable-over .yresizable-handle-south,.ytheme-gray .yresizable-pinned .yresizable-handle-south{ + background:url(../images/sizer/gray/s-handle.gif); + background-position: top; +} +.ytheme-gray .yresizable-over .yresizable-handle-south,.ytheme-gray .yresizable-pinned .yresizable-handle-north{ + background:url(../images/sizer/gray/s-handle.gif); + background-position: top; +} +.ytheme-gray .yresizable-over .yresizable-handle-southeast, .ytheme-gray .yresizable-pinned .yresizable-handle-southeast{ + background:url(../images/sizer/gray/se-handle.gif); + background-position: top left; +} +.ytheme-gray .yresizable-over .yresizable-handle-northwest,.ytheme-gray .yresizable-pinned .yresizable-handle-northwest{ + background:url(../images/sizer/gray/nw-handle.gif); + background-position:bottom right; +} +.ytheme-gray .yresizable-over .yresizable-handle-northeast,.ytheme-gray .yresizable-pinned .yresizable-handle-northeast{ + background:url(../images/sizer/gray/ne-handle.gif); + background-position: bottom left; +} +.ytheme-gray .yresizable-over .yresizable-handle-southwest,.ytheme-gray .yresizable-pinned .yresizable-handle-southwest{ + background:url(../images/sizer/gray/sw-handle.gif); + background-position: top right; +} +.ytheme-gray .yresizable-proxy{ + border: 1px dashed #615e55; +} +.ygrid-cell-text { + display: block; + font: normal 8pt arial; + overflow: hidden; + padding: 3px 5px; + white-space: nowrap; +} +.ygrid-col{ + cursor: default; + height:21px !important; + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + display:block; + -moz-outline: none; + -moz-user-focus: normal; + overflow: hidden; + border-left: 1px solid #f1efe2; +} +.yeditgrid .ygrid-col{ + -moz-outline: normal; +} +.ygrid-col, .ygrid-hd { + font: normal 8pt arial; + -o-text-overflow: ellipsis; + text-overflow: ellipsis; +} +.ygrid-col-0{ + border-left: 0px; +} +.ygrid-col-last{ + border-right: 1px solid #f1efe2; +} +.ygrid-editor{ + box-sizing: border-box; + -moz-box-sizing: border-box; + position:absolute; + visibility:hidden; + font: normal 8pt arial; + border: 1px solid #afbdc9; + z-index:10; +} +.ygrid-editor input{ + font: normal 8pt arial; + border: 0px; + padding-top:2px; + padding-left:3px; +} +.ygrid-editor-container{ + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-editor .pick-button{ + width:15px; + height:20px; + position:absolute; + display:block; + right:0; + top:0; + z-index:2; + background-image: url(../images/grid/pick-button.gif); + background-repeat: no-repeat; +} +.ygrid-editor-invalid{ + background-image: url(../images/grid/invalid_line.gif); + background-repeat: repeat-x; + background-position: bottom; + border: 1px solid #afbdc9; +} +.ygrid-checkbox-editor{ + text-align: center; + overflow:hidden; + display:block; + background-color:white; +} +.ygrid-checkbox-editor input{ + margin-top:3px; + height:13px; + width:13px; +} +select.ygrid-editor{ + padding: 0px; + -moz-outline: none; + border: 1px solid #afbdc9; +} +.ygrid-num-editor{ + text-align:right; + padding-top:2px; + padding-left:3px; +} +.ygrid-text-editor{ + padding-top:2px; + padding-left:3px; +} +.ygrid-hd{ + background-color: #ebeadb; + border-bottom: 1px solid #cbc7b8; + box-sizing: border-box; + -moz-box-sizing: border-box; + display: block; + position: absolute; + overflow:hidden; +} +.ygrid-column-sizer { + width:1px; + border-right:1px dashed #6593cf; + background:none; + cursor: col-resize; +} +.ygrid-drag-proxy{ + width:150px; + height:24px; + background-color:#3366cc; + border: 1px solid #002266; + position:absolute; + visibility:hidden; + z-index:10000; +} +.ygrid-drag-text{ + font: normal 8pt arial; + color:white; + position:absolute; + top:0px; + left:26px; + padding:3px; + display:block; +} +.ygrid-drop-icon{ + position:absolute; + top:0px; + left:0px; + display:block; + width:24px; + height:100%; + background-position: center; + background-repeat: no-repeat; +} +.ygrid-drop-nodrop{ + background-image: url(../images/grid/drop-no.gif); +} +.ygrid-drop-ok{ + background-image: url(../images/grid/drop-yes.gif); +} +.ygrid-hd .sort-asc { + background-image: url(../images/grid/sort_asc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd .sort-desc { + background-image: url(../images/grid/sort_desc.gif); + background-position: right; + background-repeat: no-repeat; + display: none; + height: 14px; + width: 16px; +} +.ygrid-hd-body { + border-bottom: 2px solid #d6d2c2; + cursor: default; + display: block; + font: normal 8pt arial; + left: 0; + overflow: hidden; + padding: 3px 5px; + position: relative; + top: 0; + white-space: nowrap; +} +.ygrid-hd-body span { + font: normal 8pt arial; + white-space: nowrap; +} +.ygrid-hd-over{ + border-bottom: 2px solid #fcc247; +} +.ygrid-hd-over .ygrid-hd-body{ + background-color: #faf9f4; + border-bottom: 1px solid #f9a900; +} +.ygrid-hd-split { + background-image: url(../images/grid/grid-split.gif); + background-position: center; + background-repeat: no-repeat; + cursor: e-resize; + display: block; + font-size: 1px; + height: 16px; + overflow: hidden; + position: absolute; + top: 2px; + width: 6px; + z-index: 3; +} +.ygrid-hrow{ + background-color: #ebeadb; + display: block; + height: 22px; + left: 0; + position: relative; + top: 0; + width: 10000px; + overflow:hidden; + z-index:2; +} +.ygrid-hrow-frame{ + height: 22px; + left: 0; + display:block; + position: absolute; + top: 0; + width: 10000px; + z-index:1; +} +.ygrid-footer .ytoolbar{ + border:0px; +} +.ygrid-page-number{ + width:24px; + height:14px; +} +.ygrid-page-first{ + background-image: url(../images/grid/page-first.gif); +} +.ygrid-loading{ + background-image: url(../images/grid/done.gif); +} +.ygrid-page-last{ + background-image: url(../images/grid/page-last.gif); +} +.ygrid-page-next{ + background-image: url(../images/grid/page-next.gif); +} +.ygrid-page-prev{ + background-image: url(../images/grid/page-prev.gif); +} +.ytb-button-disabled .ygrid-loading{ + background-image: url(../images/grid/loading.gif); +} +.ytb-button-disabled .ygrid-page-first{ + background-image: url(../images/grid/page-first-disabled.gif); +} +.ytb-button-disabled .ygrid-page-last{ + background-image: url(../images/grid/page-last-disabled.gif); +} +.ytb-button-disabled .ygrid-page-next{ + background-image: url(../images/grid/page-next-disabled.gif); +} +.ytb-button-disabled .ygrid-page-prev{ + background-image: url(../images/grid/page-prev-disabled.gif); +} +.ygrid-mso{ +} +.ygrid-mso .ygrid-hd{ + background:none; + border-bottom:0px; +} +.ygrid-mso .ygrid-footer { + border-top: 1px solid #6593cf; +} + +.ygrid-mso .ygrid-footer .ygrid-fbutton{ + border:0px; +} +.ygrid-mso .ygrid-hd-body { + border-bottom:0px; +} +.ygrid-mso .ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-mso .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; +} +.ygrid-mso .ygrid-hd-split { + background-image: url(../images/grid/grid-blue-split.gif); +} +.ygrid-mso .ytoolbar .ytb-sep { + background-image: url(../images/grid/grid-blue-split.gif); +} +.ygrid-mso .ygrid-hrow{ + background: url(../images/grid/mso-hd.gif); + border-bottom: 1px solid #6593cf; + height: 21px; +} +.ygrid-mso .ygrid-row{ + color: black; + border-bottom: 1px solid #ddecfe; +} +.ygrid-mso .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-mso .ygrid-row-selected{ + background-color: #b3c8e8 !important; + color: black; +} +.ygrid-mso .ygrid-row-selected span{ + color: black !important; +} +.yprops-grid .ygrid-col-1{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-1 .ygrid-cell-text{ + background-color: white; +} +.yprops-grid .ygrid-col-0{ + background-color: #f1efe2; +} +.yprops-grid .ygrid-col-0 .ygrid-cell-text{ + background-color: white; + margin-left:10px; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0 .ygrid-cell-text{ + background-color: #316ac5; + color: white; +} +.yprops-grid .ygrid-prop-edting .ygrid-col-0{ + color: white; +} +.yprops-grid .ygrid-num-editor{ + text-align:left; +} +.ygrid-row{ + border-bottom: 1px solid #f1efe2; + overflow: visible; + white-space: nowrap; + height:21px; + width:10000px; + box-sizing: border-box; + -moz-box-sizing: border-box; + display:block; + position:absolute; +} +.ygrid-row-alt{ + background-color: #fcfaf6; +} +.ygrid-row-over{ + background-color: #f1f1f1; + color: black; +} +.ygrid-row-selected{ + background-color: #316ac5 !important; + color: white; +} +.ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista{ + border:1px solid #535353; +} +.ygrid-vista .ygrid-hd{ + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-body { + border-bottom: 1px solid #b3bcc0; +} +.ygrid-vista .ygrid-hd-over{ + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-over .ygrid-hd-body{ + background-color: transparent; + border-bottom:0px; +} +.ygrid-vista .ygrid-hd-split { + background-image: url(../images/grid/grid-split.gif); +} +.ygrid-vista .ygrid-hrow{ + background: url(../images/grid/grid-vista-hd.gif); + height: 21px; +} +.ygrid-vista .ygrid-row-alt{ + background-color: #f5f5f5; +} +.ygrid-vista .ygrid-row-selected{ + background-color: #535353 !important; + color: white; +} +.ygrid-vista .ygrid-row-selected span{ + color: white !important; +} +.ygrid-vista .ygrid-wrap-body { +} + +.ygrid-wrap { + height: 100%; + left: 0; + overflow: auto; + position: relative; + top: 22px; + width: 100%; +} +.ygrid-footer{ + display: block; + padding:0px; + border-top: 1px solid #cbc7b8; +} +.ygrid-wrap-footer { + display: block; + overflow: hidden; + width:100%; + height:25px; + box-sizing: border-box; + -moz-box-sizing: border-box; + background-color: #ebeadb; + position:absolute; + bottom:0px; +} +.ygrid-wrap-body { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + display: block; +} +.ygrid-wrap-headers { + left: 0; + overflow: hidden; + position: absolute; + top: 0; + z-index: 12; +} + +.ygrid-col-0{ +} +.ygrid-col-1{ +} +.ygrid-col-10{ +} +.ygrid-col-11{ +} +.ygrid-col-12{ +} +.ygrid-col-13{ +} +.ygrid-col-14{ +} +.ygrid-col-15{ +} +.ygrid-col-16{ +} +.ygrid-col-17{ +} +.ygrid-col-18{ +} +.ygrid-col-19{ +} +.ygrid-col-2{ +} +.ygrid-col-20{ +} +.ygrid-col-3{ +} +.ygrid-col-4{ +} +.ygrid-col-5{ +} +.ygrid-col-6{ +} +.ygrid-col-7{ +} +.ygrid-col-8{ +} +.ygrid-col-9{ +} + +.ygrid-header-0{ +} +.ygrid-header-1{ +} +.ygrid-header-10{ +} +.ygrid-header-11{ +} +.ygrid-header-12{ +} +.ygrid-header-13{ +} +.ygrid-header-14{ +} +.ygrid-header-15{ +} +.ygrid-header-16{ +} +.ygrid-header-17{ +} +.ygrid-header-18{ +} +.ygrid-header-19{ +} +.ygrid-header-2{ +} +.ygrid-header-20{ +} +.ygrid-header-3{ +} +.ygrid-header-4{ +} +.ygrid-header-5{ +} +.ygrid-header-6{ +} +.ygrid-header-7{ +} +.ygrid-header-8{ +} +.ygrid-header-9{ +} + +#grid-example{ + border: 1px solid #cbc7b8; + left: 0; + position: relative; + top: 0; +} +#grid-example .ygrid-col-0 { +} +#grid-example .ygrid-col-1 { + text-align: right; +} +#grid-example .ygrid-col-2{ + text-align: right; +} +#grid-example .ygrid-col-3 { + text-align: right; +} +#grid-example .ygrid-col-4 { + text-align: right; +} +#grid-example.ygrid-mso{ + border: 1px solid #6593cf; +} +#grid-example.ygrid-vista{ + border: 1px solid #b3bcc0; +} +#xml-grid-example{ + border: 1px solid #cbc7b8; + left: 0; + position: relative; + top: 0; +} +#xml-grid-example .ygrid-col-0 { +} +#xml-grid-example .ygrid-col-1 { +} +#xml-grid-example .ygrid-col-2{ +} +#xml-grid-example .ygrid-col-3 { +} +#xml-grid-example.ygrid-mso{ + border: 1px solid #6593cf; +} +#xml-grid-example.ygrid-vista{ + border: 1px solid #b3bcc0; +} +#editor-grid .ygrid-col-2{ + text-align:right; +} +.ypopcal{ + background: white; + padding:2px; + border: 1px solid gray; +} +.ypopcal-shadow { + background: #dddddd; + filter: progid:DXImageTransform.Microsoft.Blur(MakeShadow=true,pixelradius=1) Alpha(opacity=35,style=1,startX=0,finishX=200,FinishOpacity=35); + padding: 0px; + position:absolute; +} +.ypopcal-head{ + width:150px; + background: #93b5e4; +} +.ypopcal-head td{ + padding:1px; +} +.ypopcal-month{ + color: white; + font: bold 7pt verdana; + text-decoration: none; + text-align:center; +} +.ypopcal-head .ypopcal-arrow{ + width:16px; + text-align:center; + cursor:pointer; + -moz-user-select: none; +} + +.ypopcal-head .next-month{ + width:16px; + background-image: url(../images/grid/arrow-right-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} +.ypopcal-head .prev-month{ + width:16px; + background-image: url(../images/grid/arrow-left-white.gif); + background-position: center; + background-repeat: no-repeat; + cursor:pointer; +} + +.ypopcal-table { + background:white; + border-bottom: 1px solid #cccccc; +} +.ypopcal-table tr{ + +} +.ypopcal-table td{ + box-sizing: border-box; + -moz-box-sizing: border-box; + border: 1px solid white; + text-align:right; + color:#aaaaaa; + cursor:pointer; + font:normal 8pt arial; + background:white; + padding:1px 2px; + width:12px; + height:12px; +} +.ypopcal-table td.today{ + border: 1px solid darkred; +} +.ypopcal-table .ypopcal-daynames td{ + text-align:center !important; + border:0px; + border-bottom: 1px solid #cccccc; + font-size: 8pt; + font-weight: normal; + text-align:right; + color:black; + cursor:default; +} +.ypopcal-table td.active{ + cursor:pointer; + color:black; +} +.ypopcal-table td.ypopcal-disabled{ + cursor:default; + background:#eeeeee; + border: 1px solid #eeeeee; + color:#bbbbbb; +} +.ypopcal-table td.selected{ + background: #ddecfe; + border: 1px solid #c3daf9; +} +.ypopcal-today{ + color: black; + cursor: hand; + display: inline-block; + font: normal 8pt arial; + margin-left: 2px; + text-decoration: none; + margin-top:0px; +} + +.ygrid-simple-view .ygrid-col{ + height:100% !important; + position:static; + display:table-cell; + display:inline-block; +} +.ygrid-simple-view .ygrid-row{ + position:static; + display: table-row; +} +.ylayout-container{ + width:100%; + height:100%; + overflow:hidden; + background-color:#c3daf9; +} +.ylayout-collapsed{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; + background-color:#c3daf9; + width:20px; + height:20px; + overflow:hidden; + border:1px solid #98c0f4; + z-index:20; +} +.ylayout-collapsed-over{ + cursor:pointer; + background-color:#d9e8fb; +} +.ylayout-collapsed-west .ylayout-tools-button{ + float:right; +} +.ylayout-collapsed-east .ylayout-tools-button{ + float:left; +} +.ylayout-collapsed-north, .ylayout-collapsed-south{ + text-align:right; +} +.ylayout-collapsed .ylayout-tools-button{ + margin:2px; + width:12px; + text-align:center; +} +.ylayout-inactive-content{ + position:absolute; + left:-10000px; + top:-10000px; + visibility:hidden; +} +.ylayout-active-content{ + visibility:visible; +} +.ylayout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.ylayout-panel-east, .ylayout-panel-west { + z-index:10; +} +.ylayout-panel-north, .ylayout-panel-south { + z-index:11; +} +.ylayout-collapsed-north, .ylayout-collapsed-south, .ylayout-collapsed-east, .ylayout-collapsed-west { + z-index:12; +} +.ylayout-panel{ + position:absolute;border:1px solid #98c0f4;overflow:hidden;background-color:white; +} +.ylayout-panel-body{ + overflow:hidden; +} +.ylayout-grid-wrapper{ + +} +.ylayout-split{ + position:absolute; + height:5px; + width:5px; + line-height:1px; + font-size:1px; + z-index:3; + background-color:#c3daf9; +} +.ylayout-panel-hd{ + background-image: url(../images/layout/panel-title-light-bg.gif); + color: black; + border-bottom:1px solid #98c0f4; + position:relative; +} +.ylayout-panel-hd-text{ + font:normal 11px tahoma, verdana, helvetica; + padding: 4px; + padding-left: 4px; + display:block; +} +.ylayout-panel-hd-tools{ + position:absolute; + right:0px; + top:0px; + text-align:right; + padding-top:2px; + padding-right:2px;width:40px; +} +.ylayout-tools-button{ + z-index:6; + padding:2px; + cursor:pointer; + float:right; +} +.ylayout-tools-button-over{ + padding:1px; + border:1px solid #98c0f4; + background-color:white; +} +.ylayout-tools-button-inner{ + height:12px; + width:12px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + background-position:center; +} +.ylayout-close{ + background-image:url(../images/layout/panel-close.gif); +} +.ylayout-collapse-west,.ylayout-expand-east{ + background-image:url(../images/layout/collapse.gif); +} +.ylayout-expand-west,.ylayout-collapse-east{ + background-image:url(../images/layout/expand.gif); +} +.ylayout-collapse-north,.ylayout-expand-south{ + background-image:url(../images/layout/ns-collapse.gif); +} +.ylayout-expand-north,.ylayout-collapse-south{ + background-image:url(../images/layout/ns-expand.gif); +} +.ylayout-split-h{ + background-image:url(../images/sizer/e-handle.gif); + background-position: left; +} +.ylayout-split-v{ + background-image:url(../images/sizer/s-handle.gif); + background-position: top; +} +.ylayout-panel .ytab-wrap{ + background:url(../images/layout/gradient-bg.gif); +} +.ylayout-panel .yui-ext-tabbody { + background-color:white; + overflow:auto;height:100%; +} +.ylayout-component-panel, .ylayout-nested-layout { + position:relative; + padding:0px; + overflow:hidden; + width:200px; + height:200px; +} +.ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #98c0f4; +} +.ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #98c0f4; +} +.yui-ext-repaint{ + zoom:1; + background-color: transparent; +} +.ylayout-panel-dragover { + border: 2px solid #6593cf; +} +.ylayout-panel-proxy { + background-image: url('../images/layout/gradient-bg.gif'); + background-color:#c3daf9; + border:1px dashed #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ylayout-slider { + z-index:15; + overflow:hidden; + position:absolute; +} + + + +.ytheme-gray,div.ytheme-gray,.ytheme-gray .ylayout-container{ + background-color:#f3f2e7; +} +.ytheme-gray{ + background-color:#f3f2e7; +} +.ytheme-gray .ylayout-collapsed{ + background-color:#f3f2e7; + border:1px solid #aca899; +} +.ytheme-gray .ylayout-collapsed-over{ + background-color:#fbfbef; +} +.ytheme-gray .ylayout-panel{ + border:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel { + border:0px none; +} +.ytheme-gray .ylayout-split{ + background-color:#f3f2e7; +} +.ytheme-gray .ylayout-panel-hd{ + background-image: url(../images/layout/gray/panel-title-light-bg.gif); + border-bottom:1px solid #aca899; +} +.ytheme-gray .ylayout-tools-button-over{ + border:1px solid #aca899; +} +.ytheme-gray .ylayout-close{ + background-image:url(../images/layout/gray/panel-close.gif); +} +.ytheme-gray .ylayout-collapse-west,.ytheme-gray .ylayout-expand-east{ + background-image:url(../images/layout/gray/collapse.gif); +} +.ytheme-gray .ylayout-expand-west,.ytheme-gray .ylayout-collapse-east{ + background-image:url(../images/layout/gray/expand.gif); +} +.ytheme-gray .ylayout-collapse-north,.ytheme-gray .ylayout-expand-south{ + background-image:url(../images/layout/gray/ns-collapse.gif); +} +.ytheme-gray .ylayout-expand-north,.ytheme-gray .ylayout-collapse-south{ + background-image:url(../images/layout/gray/ns-expand.gif); +} +.ytheme-gray .ylayout-split-h{ + background-image:url(../images/sizer/gray/e-handle-dark.gif); +} +.ytheme-gray .ylayout-split-v{ + background-image:url(../images/sizer/gray/s-handle-dark.gif); +} +.ytheme-gray .ylayout-panel .ytab-wrap{ + background:url(../images/layout/gray/gradient-bg.gif); +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-north { + border-bottom:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-south { + border-top:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-east { + border-left:1px solid #aca899; +} +.ytheme-gray .ylayout-nested-layout .ylayout-panel-west { + border-right:1px solid #aca899; +} +.ytheme-gray .ylayout-panel-dragover { + border: 2px solid #aca899; +} +.ytheme-gray .ylayout-panel-proxy { + background-image: url('../images/layout/gray/gradient-bg.gif'); + background-color:#f3f2e7; + border:1px dashed #aca899; +} + +.yunselectable{ + -moz-user-select: none; + -khtml-user-select: none; +} +.ydlg-proxy { + background-image: url('../images/gradient-bg.gif'); + background-color:#c3daf9; + border:1px solid #6593cf; + z-index:10001; + overflow:hidden; + position:absolute; + left:0;top:0; +} +.ydlg-shadow{ + background:#aaaaaa; + position:absolute; + left:0;top:0; +} +.ydlg-mask{ + z-index:10000; + display:none; + position:absolute; + top:0; + left:0; + -moz-opacity: 0.5; + opacity:.50; + filter: alpha(opacity=50); + background-color:#CCC; +} +body.masked{ + overflow:hidden; +} +body.masked select { + visibility:hidden; +} +body.masked .ydlg select { + visibility:visible; +} +.ydlg{ + z-index:10001; + overflow:hidden; + position:absolute; + left:300;top:0; +} +.yresizable-proxy{ + z-index:10002; +} +.ydlg .ydlg-hd { + background: url(../images/basic-dialog/hd-sprite.gif) repeat-x 0px -82px; + background-color:navy; + color:#FFF; + font:bold 12px "sans serif", tahoma, verdana, helvetica; + overflow:hidden; + padding:5px; +} +.ydlg .ydlg-hd-left { + background: url(../images/basic-dialog/hd-sprite.gif) no-repeat 0px -41px; + padding-left:3px; + margin:0px; +} +.ydlg .ydlg-hd-right { + background: url(../images/basic-dialog/hd-sprite.gif) no-repeat right 0px; + padding-right:3px; +} +.ydlg .ydlg-dlg-body{ + background:url(../images/layout/gradient-bg.gif); + border:1px solid #6593cf; + border-top:0px none; + padding:10px; +} +.ydlg .ydlg-bd{ + overflow:hidden; +} +.ydlg .ydlg-ft{ + overflow:hidden; + padding:5px; + padding-bottom:0px; +} +.ydlg .yui-ext-tabbody{ + background:white; + overflow:auto; +} +.ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #6593cf; + border-top:0px none; +} +.ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #6593cf; + border-bottom:0px none; +} +.ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ydlg .inner-tab{ + margin:5px; +} +.ydlg .ydlg-button{ + font:normal 11px arial, tahoma, verdana, helvetica; + margin-right:5px; + float:right; + cursor:pointer; + clear:none; +} +.ydlg-button-left, .ydlg-button-right{ + font-size:1px; + line-height:1px; +} + +.ydlg-button-left{ + width:3px; + height:21px; + background:url(../images/basic-dialog/btn-sprite.gif) no-repeat 0px 0px; +} +.ydlg-button-right{ + width:3px; + height:21px; + background:url(../images/basic-dialog/btn-sprite.gif) no-repeat 0px -21px; +} +.ydlg-button-focus{ + text-decoration:none !important; + color:black !important; +} +.ydlg-button-center{ + background:url(../images/basic-dialog/btn-sprite.gif) repeat-x 0px -42px; + font:normal 11px "san serif",tahoma,verdana,helvetica; + vertical-align: middle; + text-align:center; + padding:0px 5px; + cursor:pointer; + white-space:nowrap; + -moz-user-select: none; + -khtml-user-select: none; +} +.ydlg-button-over .ydlg-button-left{ + background-position:0px -63px; +} +.ydlg-button-over .ydlg-button-right{ + background-position:0px -84px; +} +.ydlg-button-over .ydlg-button-center{ + background-position:0px -105px; +} +.ydlg-button-click .ydlg-button-center{ + background-position:0px -126px; +} + +.ydlg-button-disabled{ + cursor:default; +} +.ydlg-button-disabled .ydlg-button-center{ + color:gray; + cursor:default; +} +.ydlg-draggable .ydlg-hd{ + cursor:move; +} +.ydlg-closable .ydlg-hd{ + padding-right:22px; +} +.ydlg .ydlg-close { + position:absolute; + top:4px; + right:4px; + z-index:6; + height:15px; + width:15px; + margin:0px; + padding:0px; + line-height:1px; + font-size:1px; + background-repeat:no-repeat; + cursor:pointer; + visibility:inherit; + background-image:url(../images/basic-dialog/close.gif); +} +.ydlg div.yresizable-handle-east{ + background-image:url(../images/basic-dialog/e-handle.gif); + border:0px; + background-position:right; + margin-right:0; +} +.ydlg div.yresizable-handle-south{ + background-image:url(../images/sizer/s-handle-dark.gif); + border:0px; + height:6px; +} +.ydlg div.yresizable-handle-west{ + background-image:url(../images/basic-dialog/e-handle.gif); + border:0px; + background-position:1px; +} +.ydlg div.yresizable-handle-north{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-northeast, .ytheme-gray .ydlg div.yresizable-handle-northeast{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-northwest, .ytheme-gray .ydlg div.yresizable-handle-northwest{ + background-image:url(../images/s.gif); + border:0px; +} +.ydlg div.yresizable-handle-southeast{ + background-image:url(../images/basic-dialog/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ydlg div.yresizable-handle-southwest{ + background-image:url(../images/sizer/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} + + + +.ytheme-gray .ydlg-proxy { + background-image: url('../images/layout/gray/gradient-bg.gif'); + background-color:#EAE8D5; + border:1px solid #b3b6b0; +} +.ytheme-gray .ydlg-shadow{ + background:#aaaaaa; +} +.ytheme-gray .ydlg-proxy .tabset{ + background:url(../images/layout/gray/gradient-bg.gif); +} +.ytheme-gray .ydlg .ydlg-hd { + background: url(../images/basic-dialog/gray/hd-sprite.gif) repeat-x 0px -82px; + background-color:#333333; +} +.ytheme-gray .ydlg .ydlg-hd-left { + background: url(../images/basic-dialog/gray/hd-sprite.gif) no-repeat 0px -41px; +} +.ytheme-gray .ydlg .ydlg-hd-right { + background: url(../images/basic-dialog/gray/hd-sprite.gif) no-repeat right 0px; +} +.ytheme-gray .ydlg .ydlg-dlg-body{ + background:#efefec; + border:1px solid #b3b6b0; + border-top:0px none; +} +.ytheme-gray .ydlg .ytabs-top .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-top:0px none; +} +.ytheme-gray .ydlg .ytabs-bottom .yui-ext-tabbody{ + border:1px solid #b3b6b0; + border-bottom:0px none; +} +.ytheme-gray .ydlg .ylayout-container .yui-ext-tabbody{ + border:0px none; +} +.ytheme-gray .ydlg .ydlg-close { + background-image:url(../images/basic-dialog/gray/close.gif); +} +.ytheme-gray .ydlg div.yresizable-handle-east{ + background-image:url(../images/basic-dialog/gray/e-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-south{ + background-image:url(../images/basic-dialog/gray/s-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-west{ + background-image:url(../images/basic-dialog/gray/e-handle.gif); + border:0px none; +} +.ytheme-gray .ydlg div.yresizable-handle-southeast{ + background-image:url(../images/basic-dialog/gray/se-handle.gif); + background-position: bottom right; + width:8px; + height:8px; + border:0px; +} +.ytheme-gray .ydlg div.yresizable-handle-southwest{ + background-image:url(../images/sizer/gray/sw-handle-dark.gif); + background-position: top right; + margin-left:1px; + margin-bottom:1px; + border:0px; +} +.ytheme-gray .ydlg div.yresizable-handle-north{ + background-image:url(../images/s.gif); + border:0px none; +} diff --git a/www/extras/yui-ext/resources/images/basic-dialog/btn-sprite.gif b/www/extras/yui-ext/resources/images/basic-dialog/btn-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..8d657dbf7c323f868d6aa825055ef88e46fcc240 GIT binary patch literal 1186 zcmeH`{ZA7I7{{M$%WH&O*-{$?0vKX+{J@MPAZ9y}AQ+c)WXrlAmed$Q9C5<-!@w7= zzEB(+;0TJ{LMn3^TOx5&q#;AfOM;TEI26WPZF}vNv!(6z`oi6{SG@iY`*GiV^7-+b zC(o1TSWQ)F*-0t%f(`%_`bGdbFGyJ;aGNmU~Bz`A2HFu_N4A1uuHM znj5d-MV{2~CKYe`ke^iX(`tT3-9KdrHame@k; zcLR5S8h-Tq=;O!Z;}f%U6XvxE^SZF86&9}u%Qu9z?zp8dZq@tN?+dmcOjFNhpP5bb zmbHKXURt&;TB+4_yX6&Ou{v#*mxOi6Nvt@DRgze9Io4ec%ZAfJk*_Gy>ZcZ1?~84E z-bPT44bN+r&AnlBQ+7`R!sB*$JmjXwxtXxb>vnlJNuSr{^KMXXzu!lBybSGsP5az5 zE#e8#?ttjPW-#Dm7%#*4fQW+Pkt7R#}0 zgk`sQp5u8w8s)i|APBK|T!<&KEk-=o|M_n>kk84a0Lf64s7?F?q;5k-5&FP@$&o`! zM0GFKlz$Y`!JeD))J zJtf0$?nWASRHK*{0X!$IuF`nZUfGefFLOrO?I`JaQN2`A)=3uj_nvugs->g8z;INT zTe+(kw6X@Z9IZ@-yx}%u#6G6`Ja@SMFQADeTu}r=YQ!W z#Rz1bK|z*DleZhxA1zN`Z!fu`F8C&GN}bnbM^<)y|MQVMid(0(D_Q!&$rbrPhFqU@ huu8K>R;sVMdwu5s<>ctiHi)3 zeJnf$GLj7pP5o;2lUO#gW zSa7hJLs%>3#D;~3+Xa-p=6GyebhKN-IP1=djf;=>D>!$_cy3y9a}Xwye0g*kiI*?5Qm)FE0;R>^0YG>#D1(BQ|H< zJ+*c9_4NsdyJDpj4jkCT#Kz^3z2VJGh8)H^~xm(V6*Or%;r!q4!SOWk8%504Q literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/gray/close.gif b/www/extras/yui-ext/resources/images/basic-dialog/gray/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..116234711fa716bf062135b054253090917b3cea GIT binary patch literal 893 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/gray/e-handle.gif b/www/extras/yui-ext/resources/images/basic-dialog/gray/e-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..48877e748d8fd70185e08c4847b16c932d653664 GIT binary patch literal 995 zcmZ?wbhEHbWM#O(-p&95YgWws|NlRjIZBL%z{m;##h)z9ARp_12vDA2;5fj*$RXpg zVZp&>4q>gB6B`yDZWmDYn&Yu?(a~-Rdwi{%g@huXy%gj+Op!}VvosMv8T4Iyu3VMvDaL$t*frCj@X=a z_te(a*ViW;?uwOCIB;MS6C0OD_J%h%8FCoc*uDr;h}v4nd5yIo{K1`#4b0qfK07u% yJlr9y9d~BO#>dAeD0|QI*}3WI=^4h^_s;Cx{QUd^=WaRQU0YsWp32O`U=09jY;5ZQ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/gray/hd-sprite.gif b/www/extras/yui-ext/resources/images/basic-dialog/gray/hd-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f84f7330f8ceb70c739e03f5b04c8adf9d5273d GIT binary patch literal 1060 zcmZ?wbhEHbWM-&lXlGzhRn=5e(^6B@R#(^7(9qG;)Ya0`)7IA4);7@5G1S#H($h26 z*EcaRFf}wZGc+_eG6EtCV`EDb6Dw0wYcn$&b8}k@3p-0odrM0PD=Q#!w6=D#v2jjM zFMjsyKf@>(4S_)%0*XIbm>C%48FWBy1my_^j{gjb4nH0^CbaVjSQL2dC^*c`qEbG!_4H%jj7zLPE8WwKQy6dVhLG`n5eXi`84^ISC8aygYEZ(~4DFjl$O_ z9GzsUeWCezv#dzhvj+vvF1#YfF-I0`{L0!d<`kyjIh*Mer*^S-1!wRxpV@pxT=^F! rGhTSi-JxZ1%I07Yiyyzs+`I)@jB9Ri7RY`GZMeaZ%E-dV!e9*m?<{#= literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/gray/s-handle.gif b/www/extras/yui-ext/resources/images/basic-dialog/gray/s-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..c13c9cdc0561773f3684528ca64dc6286eeda5b5 GIT binary patch literal 992 zcmZ?wbhEHbyui-N(9Qq?YgWws|NlRjIZBL%z{m;##h)z9ARp_12vDA2;MmK+$RXpg zVZp&>4q>gB6B`yDZWmDYn&Yu?(a~-Rdwi{%g@huXy%gj+Op!}VvosMv8PJX8yJ}8yR~vTWL;hzu{rDR zsjaK8uTMDKCF{Ly&CSgjmsiD}{=Bkb72~~Kt-q(Oy}P^O^Q*h3x39myzk!)s&S%Gl v#FJSK2bm`zya0vPFVPO+Hzo=EoiUW<# zt-R7&85aT+o!hu13_^AkENo)sW?~Im5RiDNg-b{!q(fjK6AOo^oXv^{2OL}3c(n`? z0um24adC-+cuZKp#Ka=XC$l2qfI}-2tCoO5K;nT0E+&=`4uJ(sK-Uz9X;c_IJk-Xo z?6;=E@bR%edFMWzN~5Qzrs*f2TT>bQ{@gtKWw+(i!R!IjKB)<%j$y1Z!Zof6-y9;DGq~5NJ}7gDVJu-S5NBXy HWUvMRItY+| literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/s-handle.gif b/www/extras/yui-ext/resources/images/basic-dialog/s-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..c17db09702d8e39a25df3e1cfa847b7ddd004e84 GIT binary patch literal 992 zcmZ?wbhEHbyui-N(9Qq?p^ZEL|NjqWjuN9GFtS2G@h1y2$j3S$0+c5hIQB9ya>#gW zSa7hJLs%>3#D;~3+Xa-p=6GyebhKN-IP1=djf;=>D>!$_cy3y9a}Xwye0g*kiI*?5UFU1_q}2ZmnDnS(jHwY|grS zYU}Fj>k|%l$$D>Fb8~aX+fl6@9wVn{Oa!M?d$LFZ(!z@^VzW> vaVFC%HL)EM4v!B{Q1+hZvvbqa(=&{-@15DX`T6+;&fRjpySAKdV6X-NNI7nx literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/basic-dialog/se-handle.gif b/www/extras/yui-ext/resources/images/basic-dialog/se-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..f730f604387bda5aebf25f2222b2f2b0b3310ba3 GIT binary patch literal 833 zcmZ?wbhEHbWM^P!XlDR{(8irF-hBfzM~Tr87+E2p_>+Yh5$9C8ed96SOJ f3mlu6c(_C+Oi*BG=V#_{*kPdP+{(qw#9$2o$Qcew literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/gradient-bg.gif b/www/extras/yui-ext/resources/images/gradient-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8134e4994f2a36da074990b94a5f17aefd378600 GIT binary patch literal 1472 zcmeIx`%jZs7{KwDTLnZd*hMh7R3%&{VK|xh5d@TrMjeTpnq?_&b8`}Bh(kowLJ^R= zwLrP_Mz6F*N-1{`N?)K@6i}uD1>V*|OIv8)A|*;9JN<2c#7;i>=A7rpCpmEmrw$)U zc7mcXc@UIVGnG~gOy34*)9Li-becMyuD$~>)ERVj219+9F_Xbm-(}8ZvefrjGxzFd z?gQ+Z2W-&U2kcoQXO_sF&Em{uap$rD-W-Vsija6n4j*~Q*W?J0hYp%tpk9;bpv@I( z@`Tz)B2B(fn=b+vZGl)@(4Z|8YYQ8+MGfzZp1v;z8bNg>jk*$vu2iBclgyVj>B^es z9|O{PvUGvmyzs<9PmwK9WcqTTMPJ^kuV~R%wCXE?Ha*qBP}OFjwi~K|4nuYOVl`;T zVhzx_SPOK48f&|ZG@#o^cQDa=jErs*qsPQ}W@7f3n4r(hETGq1*K1~j_Lq?Dr%LqcFxvPW zut}by5*6B{LZvEO(+Ju$Vv_!sOuZvAc4ePkK}Mg^X|R8{wv3g3jV&Qm0~*o(w;!4zGtP^}q4TE3f=4jcq2s zNTj41IT7{z(FAgK^iIzZ@_2j+Ir8!+!Q#r@%9(ju7k_5|Ghf7eqx2?7%YoH4jP!wx7HA*Q43) zwFOW=pP6ly3pn=?dHpWVl+z~h4aA7q3Dbmfk>A9h*D=1j0=ZkaJtNDl4|Dy58=OQ4 zb=w|rEX#G|6q4dPk_gFV6VcYbmUmazi7x6i6Xb&As-j$U2PJ(S9-JDYvw05^=DZ2M z-q(%65iC7!Sf=Hfs~2MFb#cc_ASYbPO$Z9ewDx-)GFuhcxKI?v{g{Fd`2H?N2mNoG a(II?Zs7)DAnPM9b=8J95L)rdV=-9sjoxm#q literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/arrow-left-white.gif b/www/extras/yui-ext/resources/images/grid/arrow-left-white.gif new file mode 100644 index 0000000000000000000000000000000000000000..63088f56e1c33fd23437ab00ef3e10570c4a57fa GIT binary patch literal 825 zcmZ?wbhEHbWMSZBXlGz>`0uc0#Y_e;`2YVugfU8vhQJ630mYvz%pkAofCx~YVBipA cVC0bDXlQU?ViVMIiI|XhxRH&WjfKG)0LI-8@c;k- literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/arrow-right-white.gif b/www/extras/yui-ext/resources/images/grid/arrow-right-white.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9e06789044eacb8a695cd1df46449bcb2b9aa07 GIT binary patch literal 825 zcmZ?wbhEHbWMSZBXlGz>`0uc0#Y_e;`2YVugfU8vhQJ630mYvz%pkAofCx~YVBipA cVB}zNNKj~OV&PY_IbpESp@o^1jfKG)0Ls}94FCWD literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/done.gif b/www/extras/yui-ext/resources/images/grid/done.gif new file mode 100644 index 0000000000000000000000000000000000000000..a937cb22c84a2ac6ecfc12ae9681ab72ed83ca78 GIT binary patch literal 133 zcmZ?wbhEHb6krfwXl7towPL}p0*huu%~roJzC1V7qiQ)z(xVq;t8Q*e g@TwP&*%vbDj%DY0^FxMh_Sd^OqF)Bg*^}7&&A#5)LvkG7IyS zOnBJr%r7CL!Q$}XP&==XoWqO@51m;T- zPZpr7|1;=-+z!eU3>@+d`VlJv8V|8>3M$wXTxdAR#L6ikV-V2L(7?dJ#=^p24FK}3 BP__U7 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/grid-blue-hd.gif b/www/extras/yui-ext/resources/images/grid/grid-blue-hd.gif new file mode 100644 index 0000000000000000000000000000000000000000..862094e6803f522712e4d193c7becd8e9b857dd3 GIT binary patch literal 829 zcmZ?wbhEHbWMmL!XlGzJa`*r7`~Ocp_<#1%{|it4Uw-=k+VlT6U;e-I>i_*W{~x~l z|K$Du=O6#S`uzXxm;WEW{r~*q|F@t2fByde=kI?YU>F6XAuyCfK=CIF(E0xvbU>Z} m<=_zzU~q6?um%8<;zWG_ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/grid-blue-split.gif b/www/extras/yui-ext/resources/images/grid/grid-blue-split.gif new file mode 100644 index 0000000000000000000000000000000000000000..5286f58f6f798184c3eeacba1352cfd39b9ae03e GIT binary patch literal 817 zcmZ?wbhEHbWMbfDXlG!Ub?iS7FpPrH5Ezjmp!kyo=(oA`P8%SHjuGk&%@0ppYOTwO7TCppKD04vtxj( zk)8oFBLf42;y+oZ(#)I^h4Rdj3>8V47nBGRLn+Q9-(eXZMC@T`q-A zfguTok_rhvuF+B}YGk&S-hZ1Y!QP;7UE)!jv*adK6)hob2AOf}GE&w)<#=MknJHoV zY^}*Md|xE}K6*MO&RAU_^MUKk=Djk=g^pDJi6uprK3M%`#IdVL zUEAw4e{ zmg0{~p6|Ie&p`6H%mYO|r)_gjg|As;$iv1hQk=MZgX#CFjEx2xI6HUG&(-w8Y7Wpj zcm93g6udbnGzoX) literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/grid-vista-hd.gif b/www/extras/yui-ext/resources/images/grid/grid-vista-hd.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0972638e8305d32d4a2419b3dd317f3c8fd3fe2 GIT binary patch literal 829 zcmZ?wbhEHbWMmL!XlGzJe){5xGZ#;uy>#l_<(QpFT5;g3%Bd$|0cmlLhGf{|q`H nPk{0S1BVoYrq2Wc#zV~Pyb=r?3JDC2Ol*7#9t#p29T= ~NwO_yO%;SvZ5MdNYf|QNy-I*%yJaj+uTdt+qbZ z4E`Fzb8m}I&!N8OKmWEcCmrLs^Hs&3i)mt@hQVdcqghkaBs*D}tG_lKew4?rTjzIZ z9tSone1TS+TR7tu^CunG)Y7Jg#sw#)sG9C!c0I%LEzP)9;hqRf&)s$D8d5Db{TBs% zgl0~5QQ91luq4Q9tJgt4QLbaxZvAaKeCM9!oy85dg4k>TdBSVqjHub_PG=PO&J-rx z7oYTuF+kH|tG-UK+EkUhDjYx?zW?T|lx>+aOQm zzL$v$zBLo4Cj=G&tw{H}dW?tlTkS)SY4<#NS92z*EY-MMB6Ftp`R=*=*Ev7cS+X%W zMCur^FdlokL}1Y+&aasU2J4#EOuNlnb9CmqgLCGTSY!1BD42pkHY^XidQ5=>YQx%` z*%Pm9D!CkBu&tMWm(%-ejACVWGS2RX5=QOJ$1*tr7F}F+*-OA+Ly&Isg|AEuUYicA z#%IG6kPXkHt{zk2M6zK@Vu^4Q(1zE$?yY6M!^&jQ+2^E?!p7{g*|X6}vuRC3p@jk0 W117c83?+LXEZI4G$p&LV25SKE>nb+@ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/mso-hd.gif b/www/extras/yui-ext/resources/images/grid/mso-hd.gif new file mode 100644 index 0000000000000000000000000000000000000000..669f3cf089a61580a9d1c7632a5b1309f8d0439a GIT binary patch literal 875 zcmZ?wbhEHbWMYtKXlGzpd-4Cei~rYO`oH1Q|BaXbZ@T<{^OgTwuKwS8_5ZeO|94#b zzw`S4UDyBbzVUz0&HsCE{@-`&|NdM558VEL!C+hQ;zA>HJFm1! z#)%1x%x&D_IuR=Z8kt%-g@N({4h;>A%p3w50S6iynb`#tJSI3aHnDO`7-U>H(Adn* Pui(%j;MmmCz+epk$!Kdz literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/nowait.gif b/www/extras/yui-ext/resources/images/grid/nowait.gif new file mode 100644 index 0000000000000000000000000000000000000000..4c5862cd554d78f20683709d0b450b67f81bd24d GIT binary patch literal 884 zcmZ?wbhEHb6k-r!XlGz>`0sG^=;33>fanOrC>RZa5f%c9KUtVTUe*B-pgh6A5y-&E zA>*-O!NDdb7MYkC1`iK4@=0rzWCSQRbnt4Ywd@dF=+rMIANR*%(jvDmG5%#TnwOp& kU}SchrxH17*#QO%<_$5P0_ncfbgjEYUKG8!(7<2~0Pia+WB>pF literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-first-disabled.gif b/www/extras/yui-ext/resources/images/grid/page-first-disabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..1e02c419f5e73fc1ba5770df0448d44adf856288 GIT binary patch literal 925 zcmZ?wbhEHb6krfwXlGzZPfyRu$tfx-s;H=_udjFb@6g=b+}hgO*4EbE-rn8a-P_yS z*VotI-#=;6q{)*fPnj}h=FFM1XV0EDZ{Ga*^A|2$xOnm6B}gPhY%v@z$+dw{PFR zd-v{x2M-uV!Dt8!L;Mq+#E6<8x|aFW_O4e+3))3Q*|Q=94?bWMk!6jGP<+(r$fM>Xwqe7gmNr&4?FkK$jz>EMMFb>zJ~*Z~ zvMU=|C?p6pu`gocw@ENKkig96%Ptk5a9{xwcPOV4M}k2k%Q{v@i4+D0okN>5F7xql HFjxZs_zi%( literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-first.gif b/www/extras/yui-ext/resources/images/grid/page-first.gif new file mode 100644 index 0000000000000000000000000000000000000000..d84f41a91fca3a0ccc1107a78ffbf7b62c527afb GIT binary patch literal 925 zcmZ?wbhEHb6krfwXlGzh@tC0DJ54uuo^j+di-h&|8QW#kzUrr(*H68ylXk-(>4ag{ zZHv4+cEz{tOYf>=ebOm>XHxXSuI{Hx{sE`lD_*51{Hrf`RNeQhe(3PuA-LgMaLe7$ z)_W1{_x-!R`FH*eYuz6C>RX^ z>V<&fPZnkd21y1TkddG~!N5_)V9X)ov0=f%X7nX_llo;Ppa!i5VLFJ8Q4$&%&Em#6pV(z;0OW5pDfG_ z46F<~Am@Pc1OrC}12>0^$A$$5o7t@;-Y_UNJMxKf6&W}lT+k*Y$eyJjc<@21kdg?` z9)m}X2f37ODg+`IICZeGskVGL@ZdlLlaQT?!H)&bz6?zAIR*(A8e5nhSgkHN9C*OQ m>dC5ipkT8?(+Va*AAy7q4&fY(0%9#)p=)k#W@Tbxum%8@3U^Ha literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-last.gif b/www/extras/yui-ext/resources/images/grid/page-last.gif new file mode 100644 index 0000000000000000000000000000000000000000..3df5c2ba50b143fca7d168d5acbcc4404b903ee8 GIT binary patch literal 923 zcmZ?wbhEHb6krfwXlGzh@tC0DJ54uuo^j+di-h&|8QW#kzUrr(*H68ylXk-(>4ag{ zZHv4+cEz{tOYf>=ebOm>XHxXSuI{Hx{sE`lD_*51{Hrf`RNeQhe(3PuA-LgMaLe7$ z)_W1{_x-!R`FH*eYuz6C>RX^ z>V<&fPZnkd21y1TkddG~!N5_$V9X)ov0=f%X7)sh7DeV(M==$yO&0_YC2+|IvM<}Q z@ZbVY8B+}&lf=VK2L;XIwg}8jWa;H%bG(qjsCck}M+|z`(?y z1M&eVPcU$JFtBpScx+g3u$hC^!6V}XBXb*zY)A!1phGj4Fjq*7gQ62lFOR54M?r!E kLmQ{U6cz@-#wJD`MJWvdVWq}d0_-7oPHt8|*uY>70KTb0MF0Q* literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-next.gif b/www/extras/yui-ext/resources/images/grid/page-next.gif new file mode 100644 index 0000000000000000000000000000000000000000..960163530132545abe690cb8e49c5fef0f923344 GIT binary patch literal 875 zcmZ?wbhEHb6krfwXlGzh@tC0DJ54uuo^j+di-h&|8QW#kzUrr(*H68ylXk-(>4ag{ zZHv4+cEz{tOYf>=ebOm>XHxXSuI{Hx{sE`lD_*51{Hrf`RNeQhe(3PuA-LgMaLe7$ z)_W1{_x-!R`FH*eYuz6C>RX^ z>V<&fPZnkd21y1TkddG~!NB3cV9X)ov0=f%W)9;69vKr@Ionu*A5?G{Hgn3DYJ|un wK6d5q<#D`_!KiqUp-ntt3Jb$U#ts%8MWY1*!jGC}2?&SWIk{Q=U;~3S0KQg&YXATM literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-prev-disabled.gif b/www/extras/yui-ext/resources/images/grid/page-prev-disabled.gif new file mode 100644 index 0000000000000000000000000000000000000000..37154d62406ddc064dba311b95f554e49ad38003 GIT binary patch literal 879 zcmZ?wbhEHb6krfwXlGzZPfyRu$tfx-s;H=_udjFb@6g=b+}hgO*4EbD-QC;U+t=4O zY0{+0lPAxdIdk5;dGqJbU$}7L;>C-XELpN*#fp_HSMJ!cW9QDDr%#{0ef##^yLTBz z!Dt8!oe)s`$->OQz{;Qlaxy4SFmU)VaC69bY*=uxnSOV literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/page-prev.gif b/www/extras/yui-ext/resources/images/grid/page-prev.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb70cf8f6a3b7f524bbeb3656d875a823b27fd7c GIT binary patch literal 879 zcmZ?wbhEHb6krfwXlGzh@tC0DJ54uuo^j+di-h&|8QW#kzUrr(*H68ylXk-(>4ag{ zZHv4+cEz{tOYf>=ebOm>XHxXSuI{Hx{sE`lD_*51{Hrf`RNeQhe(3PuA-LgMaLe7$ z)_W1{_x-!R`FH*eYuz6C>RX^ z>V<&fPZnkd21y1TkddG~!NB3eV9X)ov0=f%W)AK)kBA8^Y;DZmPc|?ZI=9Q{X*oQZ zkbJD2lgIqQijPiCj2*mD6%7sx9yN0CvxS^laG;@KrlbJNftid9=jS`{vav8&0{~Hw Bh1385 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/pick-button.gif b/www/extras/yui-ext/resources/images/grid/pick-button.gif new file mode 100644 index 0000000000000000000000000000000000000000..6957924a8bf01f24f6930aa0213d794a3f56924d GIT binary patch literal 1036 zcmZ?wbhEHbA}e@6f*BUeEG-{mbu9UVeYtn)@A#A9pQ#+`IB&@5(0= zRzH}y`r(9CPbRH>G-dUZ>1!TLU-xM0+NU$tJ)FJ%!HkVh=4^U8ck{CaTb?f6`F!=h zms^g%-go-h&Rf5C-u=Dz!SB6~|L%M6=kVF*ht9t`fBVhRyMGQn`g7pPpQDfe9DDTl z(5wGPUi>@u`u~ZCzfU~=ed^KQvyc9qee&n@+yCcY{k`z?&xIF%F1`GB>D9kWZ~k3* z`RB^(KUZJ||Ns8~&oBx`LjW}d6o0ZXGcYhR=zxSld4hrCB?B{ujK>Cr zPF^XagaZi+ome=9Dmm#SD}7El7CSA;=KXekY^RG>e-{ zuuVYm(pR@|5zQ!{2@Y3s!WlFkEt+xRKzr=&*z_|U*@qgNWbB##KVWn?)_GXn$>4`} z#Rk5^9iqw$CMLJ{owi8Xkg$-crJaR6?!tz^#b0>Dw8Q57c+l9;Af%gcqV6G6E2r=p gYaW5X0}L(q1$Yc3_9+}>;A5Sv9e-|5r2~UC0H_cnr~m)} literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/refresh.gif b/www/extras/yui-ext/resources/images/grid/refresh.gif new file mode 100644 index 0000000000000000000000000000000000000000..254203b52ee25c86ef4a9424cc7d6866665c1a23 GIT binary patch literal 1015 zcmZ?wbhEHb6krfwXlGzB^-R`JI$@Z4*0Si4UD;!Yvd3=KPrPa$$4+2~o5YYjjlto+ zgJ0v5u(qcW?N5{Xp5;t=o;Uq@>eSC!GryM2eo;05W#Qbf^$TB?FZx!y{Kx9+MceNc zOd(?r_V}mu<^lb+3BWvifKDhF=r5{+_n;&#b+F7jHVTc+2_ayKk@F zd13AT+naCnZ@b;U@6Lw#2mWn4cyaULJG)QZU3BRG@yC7FUavoV?*6Gu_b*+4aO2Ly zv(K(wdwJ#Fo2&Pqyt(n{+ns0MZ$1Bi_vw%OFaO_r{r~yr%g?`Fe(?Oq!xujuz54(7 z_5UZYem;5q^ZC2~FW&xo@$Tn~cmH2~`2Xg^uQwllzxnk4{pUaLzx@CF?a$|Le?Ncw z|K(~F^zyJUG^Z(c1|9}4c`|}rw{{I7k z|Ns7j0K+I4njxV0lZBCiftx`GQ(}D!&&C7gE(+~Y%_;4`oEKAO% zDV*%`0uc0#Y~1#Fd70QG6WQVvM_@@t^*=Kd4hpMjDeAZMId2; VV>6?WoXd=Whlkn(_}N$(tO1K24D`0uc0#Y~1#Fd70QG6WQVvM_@@t^*=Kd4hpMoPm)=!oz@} Wp_zkK%;&@eg~RP^@=P2Y4AuaU4Gd)f literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/grid/wait.gif b/www/extras/yui-ext/resources/images/grid/wait.gif new file mode 100644 index 0000000000000000000000000000000000000000..471c1a4f93f2cabf0b3a85c3ff8e0a8aadefc548 GIT binary patch literal 1100 zcmZwFZA@EL90u^)S14;kcS~P51JcqXyBK7YjR|$m*3qt)1nqFnf*+(nyIT_zZIrbc zP70+hE$ePOAcE2K4FU;V;KM+=xUiQtnG(k(Qx;;(oQVNl47kM11c$9(j7iV=cuw*= z&;L26aeaM*8AVX!4nUmF3luezO5JukyN8Fbj*JY)E9#Hd|0*@ZIv{eO*Nb# z12yCIrOhLLJlbn33DTB}t(F_b2bV4~y*j=}%v9m90(t13QX1^b_==P$D+H{5*5Mu? z8gKY>BXXf^7@!+sCzFj+>XgJsqfc(1Ya(r=#J=3 zlZtj9{~(p*xA$9X2mMtN6e0bM#^36uHAhJ9Q&;+@HQ_ThCJ=yPPcaaStzMs1DHP_0 zvw_E92pgO+s83$0SnZp{u*pvQ$A3#Rftg(VD(=52XCTzUftd4T-22$PQrgIR*gHx4 z{43C_yk?5j?(i$Mual4dFf?{<9Wn}qfaB%>iNwkdu&q!m&h2IcZ$2Th!C8}<*_&Pr zyKl`OZw8N)3D^4?RK}UoD=o00gbKYHy=yv32mZ9Dl8aIS8x^Z$2?NwcBLzFmZOtoW zzN62&u*QDIz{Fy}^YAXY&Txmg7ATSAhAr8K5fZbFZ*SFa$_qE2L|VVFHOI{wKE8B_ zGXV2p-56OO`rc4Z7g3zbj)2_3YjK$((`OUqD%*mgvS`YELYsVW1or1)YW%;)D$oE>#r zQ3z|D(W$Eg`c?NY^+fD&+nctrc25@u47U__J8-QW7NqK!$T9C@*SpuaHyFRRpIGae rj_Lao#za}+eaj_<`F9!mRdtBiaY8;H`0o(Vu;KK>|7RZkKlk|m`6vG`Jo$g|>HkYl|6hLg|LXJq z*I)d<@$&!8m;Z0Q`hVy3e}+*o8Un*81QdU=FoV3K10q0qf`LPwfssSTW5a@j%?wOD iArS@)&h5PNMll*66^^tBbH?qtQJ{FJU!IwX!5RR^E;%az literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/expand.gif b/www/extras/yui-ext/resources/images/layout/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b6e1c1ef82bc36104018936848c3ebfa6e05e6b GIT binary patch literal 842 zcmZ?wbhEHb`0o(Vu;KK>|7RZkKlk|m`6vG`Jo$g|>HkYl|6hLg|LXJq z*I)d<@$&!8m;Z0Q`hVy3e}+*o8Un*81QdU=FoV3K10q0qf`LPwfssSTW5a@jO^j@6 iCK3sWhnx8sU0hxiEIiaD!s-`t;^Ttj{VdE(4AubXYdZG; literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gradient-bg.gif b/www/extras/yui-ext/resources/images/layout/gradient-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8134e4994f2a36da074990b94a5f17aefd378600 GIT binary patch literal 1472 zcmeIx`%jZs7{KwDTLnZd*hMh7R3%&{VK|xh5d@TrMjeTpnq?_&b8`}Bh(kowLJ^R= zwLrP_Mz6F*N-1{`N?)K@6i}uD1>V*|OIv8)A|*;9JN<2c#7;i>=A7rpCpmEmrw$)U zc7mcXc@UIVGnG~gOy34*)9Li-becMyuD$~>)ERVj219+9F_Xbm-(}8ZvefrjGxzFd z?gQ+Z2W-&U2kcoQXO_sF&Em{uap$rD-W-Vsija6n4j*~Q*W?J0hYp%tpk9;bpv@I( z@`Tz)B2B(fn=b+vZGl)@(4Z|8YYQ8+MGfzZp1v;z8bNg>jk*$vu2iBclgyVj>B^es z9|O{PvUGvmyzs<9PmwK9WcqTTMPJ^kuV~R%wCXE?Ha*qBP}OFjwi~K|4nuYOVl`;T zVhzx_SPOK48f&|ZG@#o^cQDa=jErs*qsPQ}W@7f3n4r(hETGq1*K1~j_Lq?Dr%LqcFxvPW zut}by5*6B{LZvEO(+Ju$Vv_!sOuZvAc4ePkK}Mg^X|R8{wv3g3jV&Qm0~*o(w;!4zGtP^}q4TE3f=4jcq2s zNTj41IT7{z(FAgK^iIzZ@_2j+Ir8!+!Q#r@%9(ju7k_5|Ghf7eqx2?7%YoH4jP!wx7HA*Q43) zwFOW=pP6ly3pn=?dHpWVl+z~h4aA7q3Dbmfk>A9h*D=1j0=ZkaJtNDl4|Dy58=OQ4 zb=w|rEX#G|6q4dPk_gFV6VcYbmUmazi7x6i6Xb&As-j$U2PJ(S9-JDYvw05^=DZ2M z-q(%65iC7!Sf=Hfs~2MFb#cc_ASYbPO$Z9ewDx-)GFuhcxKI?v{g{Fd`2H?N2mNoG a(II?Zs7)DAnPM9b=8J95L)rdV=-9sjoxm#q literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/collapse.gif b/www/extras/yui-ext/resources/images/layout/gray/collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..6273b43dfe2fa36eae42ffcfd90e525a1177abf5 GIT binary patch literal 842 zcmZ?wbhEHb_??HKjfkT~vnM1~7 p!-9j&j0`*>5dsX(?Y#0vF&ZBgj`> literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/expand.gif b/www/extras/yui-ext/resources/images/layout/gray/expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bcf242ce27018c925723efb2b4eab6883fc35a4 GIT binary patch literal 842 zcmZ?wbhEHb`0tPy7kc{P|1*#NpL_iO{FDC|p8UV~^#7%&|1UrLfA#tQ z>o5M_c=`Y4%m24t{lD}2Kf@>(4S``40*XIbm_gpr0TG})!N8%;z{nxvv0=f%CPp?j i6N!Yx!_EARE-o($79Q#nVf70+@o~ZNeimjX25SI}ygG{j literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/gradient-bg.gif b/www/extras/yui-ext/resources/images/layout/gray/gradient-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d311e7de678b9b299180cc43fd0e27aa094089ad GIT binary patch literal 1202 zcmZ?wbhEHbWMpt)YiD41`tmEVcn)kx zWMC9f}-qT zS9f*_H=dvG(9GpJVZn-vi#;Z5#qJ7eyu3VMvDaL$tyx!CBQ|H0F7?R<|;&Gp{C?(S~>Pfj;ZZ(o0Ze*-hOoKHkS%i#`T?J%8%8y_E^ zpzJ-*Vdti&r)L;v-#fF@xb^%3`)~>0U0YsWUJ<-nEqCG8*Vi{BpPuI{{jK%(j{M{s zXLoOZfB!%;x4fTC^T)?0CTqv9Te$P{^9u{}XZY>i_4W0Q&DrN4;om+G9EN?s6{N`;4ypg zpjp68V_}PONXElfi8Ko)PMNY758D;mB$7B)re!?p)L6FSQJ2oTj6>Z9$21;unq13x y+-tsQ!Q(!gZ!aGAJFsa!nc%`V^Uy^1RSTX>(pvN2$>abx&8JgB!X#527_0%M<4zp_ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/ns-collapse.gif b/www/extras/yui-ext/resources/images/layout/gray/ns-collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..c567131a0cf0bef3b0d5c72a1dc7f2c76f0997c3 GIT binary patch literal 842 zcmZ?wbhEHb`0tPy7kc{P|1*#NpL_iO{FDC|p8UV~^#7%&|1UrLfA#tQ z>o5M_c=`Y4%m24t{lD}2Kf@>(4S``40*XIbm_gpr0TG})!N8%;z{nxvv0;H@Gb0}t i&w&pKhuc^bnI=dCK6L3~mRIZ9@o~}7epY5C25SI>9XbX8 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/ns-expand.gif b/www/extras/yui-ext/resources/images/layout/gray/ns-expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..bf967e7480ec3206cd7d218b329ca101dfe5ed20 GIT binary patch literal 843 zcmZ?wbhEHb`0tPy7kc{P|1*#NpL_iO{FDC|p8UV~^#7%&|1UrLfA#tQ z>o5M_c=`Y4%m24t{lD}2Kf@>(4S``40*XIbm_gpr0TG})!N8%xz{nxvv0=f%Mn)!u j5Dx=IhITe#BO8m24_!LA<-=ljYknmbK5V>R(wmyk!^#qaiSiLO}5+3(z&}UbNe&Fw0C0UOPyhe` literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/panel-title-light-bg.gif b/www/extras/yui-ext/resources/images/layout/gray/panel-title-light-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9187e347597bc83593971d6a77df61e1bdfb635 GIT binary patch literal 842 zcmZ?wbhEHbWMnX6XlGzJcwohm!)s0)-+1Qut}~~$oj<$#@`VG}t{k~_{lwi{XCL0X z^z`BN7f)`#dH&$-%SZ2DKl%9f`KR|UzkGcC_4B)LUq1Z!_UYG;FTa0%|NH0Xzkk0O zM!{$Z45<)M{K*1z?|%jzkgGv?f`LPw!8l<@!a}B2P9Y_SiU$iAn_0Pp6f6=JFfcMQ SGVt6uv2pS7epzNF25SJ`)Kv=r literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/gray/screenshot.gif b/www/extras/yui-ext/resources/images/layout/gray/screenshot.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d32980aae6eb692953af1d42e6b6f397867cd3a GIT binary patch literal 55473 zcmV)HK)t_5Nk%w1VOs=V0*3$q0000006aJV05&`T002h-0Av6Fa}G3cHULF80C71! zMLsuj07XRrMQ;FcZ#+OoJV0_cWN}9T09yb6K>$2+003(MJYygLcRT<`07qE>ML_^$ zM*wqN0C7M!a&rJja{zI8JVj+Ua(X>+NJs!dK|FFs0Bb=!ad7}fMny$NZ&_nSL26`2 zb8}f^adAaOV_kA{b4O@qX8;q703DzRH;n*1m3bP+yFk=8eZ;#*!rOPi z`E%C$nnwVSK|F$J0Fz??zHk7SME$*T-oi%x)^di5kBgC>m6L^*nxBr8p^BHXl9;8OoWF~$ zwz`>(uBev2yswwB)QhnAsl3#*xx$*nn4I6go8h~!&4sJLn6<^2zTTU*%(uMyyN}J= zoWjJ(^*15yRw!_w|!sD&S_p93Zw#fFo z)b_CI+P?k$!<>!8u8+yOtm3+*{+QVQyY|k_g~h;_)ybIN-kQ$Mq{YOy#M-;p&b-~$ zyWZ-V+3~vm-kbZ~zWwT%{r$bg$;HIY*UQt`*3-k)*Vx0<=f&Ik)7jwC-TTn%+Rown z%JKc!<>l7q``-Qh^xW0{-1h3}!RzVS=JC`1>fHYQ-Rbmrdj5iXtJqhn^vCV4wQ7(Y3H4I z=BekNeD>+*pMVA`=%9oaYUrVeCaUP7j5g}%qfibh1TvIXYU!nzW~%9?oObHzr=W%^ z>ZqiaYU-(|rmE_ythVavtFXrZD(kGY)@tjmxaO+suDtf@>#xARDrvC97HjOW$R?}o zvdlK??6c5DEA6z@Rtv18=VXhMw%cl(47c89`z^TPmMbo|<94eqx#*IcuDj>5`|i5) zzB}%`?B=Vlx$DO3Z@c{7yDz^0|J(1u_7N?b9;7H5p{#us<2 zvBw;LEON*sgKYB1Czp)!$||><^2;p4>~hRB&up{IIM%{upNu)YZgyztIM`&=~7 zNFS~A!v?>Lt-3)|EbqTjL!Ix(QfFOo)%6aYw8d114KCMLbDVY8<)+It+74?i_Rj;y zE%)4X*KPORc;~J6-hB7}?f2h+2QK*Fgcol3;fU9bb;ClZo%rLBN4_`P;y%qV+-gsQ zfE;7DUG~9Ke-3amn#)o8*4kbI003(c%yi(CyY4x}r)N724#!+BJHhOhUOVOZjy}85 z#D8u4(#IE%{PM~-pZxR8L+^a_)K71{^w@*0JK4Nve|`1dhyU{KPrt5qyS4v5yUD_L zZ1&H-Z;m-O6SR)-<;pkCy}!Z#4oMeUvzPiDcd__!ZhhywU-u-(zy><-fe?(K1Sd$r z3R;kYi`!qnUU$I`dT?Nrvz*t~l|K13PJ5k;Tkui{H3Nq39MebuFLd{|zg5j#v7=b+ z#_@s!ZckgaLm{~TT*x@M{V;{!OQQIc2)-sV@rg@}q7$VE#VJ~`idEc~2Jyv3DthsX zUyPaSB&9hltd4cr5(frWXM^085dZ`jz!_~I3j~;Pb@l_D!0vEH0vr$$tMela?RdsK z0uqj#d!qq-aY#fC(sY}Hgb&1Z2LR$^9BTx?BGt%7HxhD@y;R@a3?c41tH6yzK6 zNIDaqZW;pUB)A%>NZ5*T-L3s{L&hZ$=1ZM7hnaNI;wZGob&q>-eT|wNa zP<#4FkY;P6-J+>YUFyr2G7N2445L)RNY$uTb*fg)Dpt38)voI7g+*nl=*C2B1qz2R|03{i(SGuyTJ`|T>tJ%_t zrm?SXg)9B?m`=dDb+R})9aGtQO%r-+rJN1zS~E)0zalnUn62Rg*U8$}y7slOjje16 zXHMS#-Eg+JrR~_#x=R01ohz%p;&c`)A2c0#{(`>1E#M|1l3DcEY zjS{udjdmd>eQLr*1G zeRxPZ-Z*aGjerat-N)^YnVLZ?F93v{Va}q@gvosG5W7q5KNcIf$_|74a*0N8DVy2A z4ff_P0naq*dd#!zWVDyL?xMzWb>;pxj5%7!F5COw_|CV!?HxO?v2fo2A6NPQ&BWBP z*s6-&snu%jU`kRJbqsg4#A!Y8h*SLH7SDLaH~w!Sx)0+V*ZBKH2;sshyPpmJq-(&* zY|)Mb{N*r@xy)xybI~=;ZAPs5l#?-V+k*V(8Mk@JhYob2i~Q(DPkPapj`WU0`QuHG zy3)@f!Y=B(%Km=()wj;|u6zCK7<4+$wGMXH_FSw|XL^E#uJ*R4{q0kayW8as_qo4s zgIeUD-RmA-TCA|Jt)JobPleE88Kz_sCcN@|4fK`VB`X_J7a)?R&rY-|v3^gBK|N@=GyW z$Co}hgXVhmyZ`<0kH44OC;x2yRxM*nuASfgl)yA~=F1Sb`>af+(1RD!76y*n%$j zf-o3^C76L5cn&gngE*LjB1nLc(t|$ugL%>mG`NAi0E9+(gh-f#O1Okf*o02_gisiT zOCp3CNQ6>&g;+=@y}*N6*o9trBviN#>yQjZ_=RS8hG>|EYPg1M*oI~phGSTUZa9ZN zxP{eMhT35rd6*r1xE+4Dhkw|IfH;VPScrjmh=hoUhM0(qxQLGbsEGQ|3+_;bHrR-e zXo;Bkh?#han%Ie)_=%esik>Knpg4-ASc<4fimG^utC)(c_=>I=i>)||utJHgj^Y@N$taHIc#hwAjHywM=-7_#SdC%Gf$unv^jMGfc#rs)kNUWe{CJJ= zD2@FXkou^OLcop};SLgkkQAYiK*5j==@SmQkPtbMJrR);VUY<*ksg7O8K{v5>5&~d z6c#y> zkwcl1Jb9EkDU?X*lS>JdOF5HHnUqA?lu9X;MroBVNtIKHl{CqfGZ~Q%Ns>bdkS+<8 zRmqWPDV1r-lvTNvZh4h&nU!q`mms;42T71rn2`v%moKT1e%X6!RI4N1Tbp9z?#8Jdup znUfirmD!rG`I@rnnzR|4wKYoR|i};`m2f&~I zxS9Fc1sRy0a`K<{nW6l7p+JzK7#f)KnSpyrpc{IiD4L=wx}q%FqAvQPFdCyWI-@jN zqc(b@IGUq6x}!YWpAEW~5GtWG$bsjXpMB(>8k(M_S)cD|1WVeZP#UEJx}ferrT_V( z2pOdGX`Yh^pYja5qQt=@X7 z>yWD4s(}#N3#`hm)M$~1|c+N-;&4j3S&+_0ub zY5>3xqSSx`_F7!ddaT>}tPe}A5$mwtO0nE(vEBNu&^ocz3a%Opu@&2~8ym78E3qWY zu_cSK*ebFhd$BBQvM!slFRQX1i?TNVd$Kqivp1`=Bs;PhyR$!=vq8(VL_4%byRtHy zv_OlrOIx$v3ZbizuF$%!6p8~GYN-B7uf7Vb$=azgo3UVvv|;P9V_U9dE4FBRwrXp( z3MvNa0H^e6u}~|uu6l=tDu$8J1?_+cg~m~AP*K2;4hcI82@tq^;0p#)4H>I1{O4w2vk zjvKG%khr58yV<+FRd~AD>%H3lYr5N8y5QTrocp=uJHDNpzM+f0=li|y8@}ADzV0i& z?F+y5%f9*>zvi32{7b+1JHPiUzvTPB1Khs?yubcyzx7+d3!K0PtiTZbzz#gY7F@v? zyuJ~b70{!BD%!iR!Uo_9IFJl_ ztbuV1$Rqr2Ho$VeV7re0o39Dr3UaK+i(JN%Jjs+?$(DS{n4HO)yvdy0$)5blpd8Ag zJj$e8%BD=jY&yw)s+*IdlnoXy;f&ECAt-`vgMJkH`=&f$E{ zGnyC>_u7{LQngxByKJ2yoC>49(80xC8yoIK9+5-PAdK z((SC&*UZyG?9&8TgB!R93LppTa0w3pK$x|G)6fRR)K>}M3)v#pn^Vk++tzIT)@~iw za6Q*@UDtGd*LI!Pc)izp-Pd&O&e;OkSl!mF+SU*X*Av>-NliaC5Y{k6*5hE-zA#zE z>{9D6P-2a|nO)164N}G|Xww@*XdMY{B-(N9*Qm|cs-4=bz1ptb+OYlFvK`yBJ=?Zj z+qiw(x}Dp+z1w)*+raJH!9ConMD$luHj;Q!s<0- z$N{-}CUgS@H7{^e1g_;e$1M+QNGfv;ylHaXU=3sv2d!FWfKIVU}=89{?HICka ze&~Atp6Gn8=zh-Vfd1o&UE__u=tb^c7>?+aKIxkN=$X#xn~vt59_pYz>X`oNr7r5H zPU?;h$3jj)hUK#xZtpk>b3srwC?M@KIt5&-dq0N#@^k?e(cIl z*A`yv$?n>B@ZQTl?axl_)?V${e(lI+y3p{9`4|t+iXsR<1X&#e(uXo=<1&C z?%wXbUG6pr@9$pk^nUO5p6~d+@A|&l{QmF#4)CaL;Q}A<2CwdTdD??r=nLQQ=6@O=OGdms3E-_`^V_=9iwh%fkwfB1^u_>BMfO~3e(@A#8{_*6^zm=F1x zfAe^$gP#BSpwECqYJ;I)`lf&SsGs_(zxu4-`mX=_DLDGDKl`-rfCShNxS#vFzx%x3 z`@aACz#sg=Km5dB{KkL$$e;YaPmb!*{LcUU&>#KMKmF8S{nmf|*q{B=Pmap}-~HbI z{oo(|;y?btkC)_s{^+0n>c9TQKcU+H{_r3F@<0FdU;p-h|M*}1A>Rw^-~ayq{{YcX z;6Q=}4IV_8P+`AbLv+xXA*9zriWMzh#F$azMvfgl_QL0G-MVwV=AA^DQsqjPEnU8Z z8B^v=nl)|S#FXP1y>fUIpwMou%G9mo36U+xMQ%v?y_pk9y;Ct zkU~p-Q0}_p!1>@S$(G@*piLHZutXC(bLuUX_vDkH;2P@(k2LJb!x0Ss@u2X|$nx+7oC+u$ zNKb*DgS1aed-D&pl<;_Q8w=7jFFus;YqQjtWTQrf9ye*=%acgmYducs+2(^=Qgu}{ z*)r(?&22zXW~Etcy;W7b$itOAmSBt$rDUUQrzJF3^72eET|3fLZU1V@o!k`dhtR?z zEzZ$O4fN_#bxr(ps}ZY7f*TNQ>98M1s}qaDO{z-+-Ek+C;M{cwR_jd_QThhhldKu% zo=SooQVHtNpw5kIBz6(ThXGKs6Ba7qc%E73;dNVWsq8V6B&1QngaTsWF%#$t2zKKp z?UF6wVCP}DlLbr&c^{jH{5WKi0Vn_kH|DV!Mxu7@Rm_q9Q~IWZoqPT{=%GCZxyekB zR+?$CdT@HRY`6S!Xdqn#vIZ%e#kCWRUlbXD22RM)=C;*oy6(F{g=tNb2mdM4d-0`E z!s^KCXJ4`Um6Tw~HEVYwa6o9JUp&f40yA(AB23Rs3Y@%j#XS2irD{C*GLsFIA(k2n zZpj44O?t>=c2A2{=T~K@dEIx{m0@vd!r4T%$V_UGX7+hf<>phSdsw~4O6aajw(3)o z{TAVq=p9(#VF&h`Pq&%CjcTtiJ1E(btX8G%oz)#!mBar%`0~$Be|_w0B2WCDrz+pE zZ+FQuPqm`dz1?M^Ro#n{?-ppR>p4&z-NV-LG#C{BgZ1Kb0s&WcBIT9Hna+e~sa&|| zAfSEqD?^y+hd0gv4kmc6L*^RDCKz`@9!8~uDY?h}QgXYK+`$b|nxHg-a1uN$O=bYV zQIybBJOOS{JT$Tq6mQWiB1r=RTH4syrj)H9f-fbVz=1lZRU<7*QB0UnB&a=c(!Jt178ei z24o#>fb5sIL?%Ttr4rwvgdQc^BsF;Cr7mj!vWb|WnfY$vrD@%+5@LYWDb;f}X-erH zmsCfWiXgymI&+LEX=bQ!Rmg09iko60;wIa9lJ>dpY<^rPkBo?tc$R0LZ>;Aw35m}* zB2q~F#0jd5b&^da^d!`Pj{2%JkL@kcnhu=@nlh2lDD86|^l0ZO)$~tswiG6r8YXkT z;y3`bAUVMV0Hl^fqGa~;A}RD~P=Vu_rwFT46?j4?5&*kTA(2Oylt%DAMa0@|aiKZ# zlnQp{Qre&lpgkfIEj|@Q=Dkj2|C@`fjw%K>-h!%w1f=(XwT%k6VSH!p=TG2+CUiD& zQ)_MOTdf*b-_g~sW}Vt1&$!W&Rh3EqOG@fScQ?HuNtJeP%bi=5R8?Hvl~c=8M`km~ zRnoeogF;1ZW`LSn)~02dP7({9I%DC;@b2Yd5^T*A4UKn;6CRx6umMz$Zy%Zd$uw6y{Pl42G}|iFz=e zOj0H)J@9Bs37!p$>Lim@N{5Bw9uUWdr9!cAT2GwemcA(&4~}q*HL_Y6*BB$O?Fj;9 z@-_9cct$I}B9L<;-HgFS#6lteGFo+VWS!`kE==~Z$!_x*8&~cNry6 zRt=baBxDYgxm05IGMi4TWi}gx#%*phj?+A6I@j6Gch;bbVGQRiznRZ{p0K9yJZM4} z+R%r#%aq~t=Qv}T(QKA8q9r|PN>|#_ELroT`|M~_OXYpY-T6h*~o@= zv8CPYXj6OE*2ea;r>$*YUs}!GQgEj|&1rGhI8&oWce>TRZg#iZ-S38XyyZP_de__D z_r`a=^}TOb^V{G526({#>5XcE7hK=omJv+LZDT(#oWYrPxQzFK%!%K!;qgLT1hw#QvsB#ms+;lEaCd^UJAdllC9d1EJGLW(Jog2d){b)ym z|1)#elAP$t4EfQ8Ds#y(onTHM7}R+vb){>@3++y4}NkWEVE6_rP(Bn?K^9Cu?E60LIKdQLLFKcDMgWF^=!7lEL0|v}EKt7Q zz`)B87X#^>4;(^!sQ|_qK?$jpJK2y95uvl#KMSM?k3$B%JBI-DLIRAvz@t4ZERh8y zL+#MK`Rj)NFQ^#mh{E{m2W|MdLrg>+BnVE31MVoZ5&hw8MkYLe>kwWcb3I>jzcPvs=u)&J)H40lfOMY|O^ztG@GNgcnK+>RnlL^|k~J}8U`EC_!@KILP^KzW0KM3ie(L$6TAfy@Y7ltzKbMK3%D zzU#&RFl-7cd&mYP#*F+8%_GQb1W9MyMuITN66DB)V7W~wgMbl;2{gx2Y{@$OptMj& za1=+I1fdk%5Kb|sWi#9EQpkR zgHUuzr=&}N5x#<8#7gXk!F0rLsDd5bNrEs;#ViO&TtqO~21IPfbW8}UbiTiQ%1KEV z>~KY2xJGf&p;)5A&dExy#LJEFIAZ`yu$)M~I|gGgON+z}1WZlJ*~r^OjF2lyxfIF& zKRe27v_TfcM1c^>$k0JX ztjx{8Ljx%eLDbCVgia8mLTCid;$TK)^v$EJh^~~z)y%oqC{~V9Nld z3eXEC$T7_X#YW!)#r7l6<1C2!lgfXLzX)VVocg`!Bna!HzH{sc4rNE_lRi%D#Om`t zdlAAAg#r>?$D*XqzzoEEIl|_o(6Yc#ri?%Q69^r>m)?4V`9#eJT?qWNJf7=MzmvU- zTr?p)i~(iR?nuigMGU=^yV6rU*0RrH^f-6mxh^$J*-VEpj8Z9et=uHj0)5N>Gc}AX zEm6{IJS`M|FcnRRw&w(-axQKi!Bu)zpLl&`#xuL$%B|b<@-mRV?&4i?~#huuV|iR5Nwe zpBmFx1=K=qIa^gbO|3but2{5ohkgJ#C2dt&y)wqoC1TxFJVn+}#nsX|Rit!0UF`>~ zbBC?7*1qe9aq!b+^;B5pR)pxFeGu1iCD(E_*KQ~tsRK1 z_1dllTczb%vHe=I4coCr+p^`_iKAMprP{YuTDV2pwxwIJJzA(;+orACs7>3mW!kAV z+r35GeYo4W4cosBT&^u##noHCJzK(U+_|k<#0A`|MO@33+{pb}s)bz4t=iA+TeB72 z&?Q~9HC@LY-P287)a_fr4cc6+S-0T3%A-w;3O z$!%QTJ>KL+-sM%^=4IaJbzbLX+sp-C&!t?<-Q3T;-n*S%#${aS72fF0-sinIz-8X# zEnf5WUhyT`io0Iy72V*~+~|#8zAak!onQ53U+~@E{^j5Q_1^$KU*(-yuEV+4k4yOrGV6<)bbU+ZOE)h*o)2I18e;SV0&&fQ+>onI7g-r>bt zwKZYmU0f3O-PLtnu!UUY&0G%NV62Vd9(LUBt=`BDV9#A&93Ee!o!;uzUk_&D5GLU# zZsHM+Vkov?wT0c9-9j)-QcQ*5K7HUW?x6SG;S4U`4VK^k{8ix-2H-Uo;5KGs@Wo#a zzFgux;;|)TIIdqFW?${SU?Ili3ASJzzGM6KW9jYRK2BT~?&G@cT|!=3ARc2ncH>EY zV@kHIwq+z(b?SFT)Q-eENU%8+F+6c zro}&_oxk@TTsz8U*LzLp4$lYX`~(M#>tn1ZfP`bUtLz=oaSbnzUjU8YbtKrE0$f5#?~#i z-E%$&laAHh&Dw5Ig2@QlmmXxVm25+PIvqy2{eDTsrt_UiJRgL$@Og4SfM1qUh^zrWq> zNF3T5?7<&A$9+Cz0?u00wg=TlNZF=ZCFF-EoDiaJ?QVE&)^_dOhTlT2+F!2V%;gA$A4cE4*6Rzm@C>(Mq0YmzM%qvO!~{=+p$$z&k&IJZ@2K|Wrftlk&A}{SZlQ(D z#no^`&RS!(2S>04t6tg{?`@$i$LH3>ABSIB7F=TvaZ&8oEW88pm+|G5_Y*?P$tNht}-X+FerpUJL%dUB)KrDeoM9 zXvOIHiVG2M(ya1#U~43-hVf25^6qX7Io+6c??s1ijE>{7wt;sz+WE6?eKcBTJk_)XMXqJ#pYy!KkI zTU;jEJW@&=oo!%0_}m7Upe=ZUyq%K|YIpzhZYTn+ymOeoV6uMaF}HZ27y2?E`lA)> z18#G}esgda2*q~QbzW^_iVmGmcY=rTK#_xrilx?0S_bc&dYE@-Y-DM#_OiEj0fyvZ zC+!jM24(+SO($9^@AV1aY^rW?@7(H0L`+~%;`i=(w`KLL&il3I@#dCH$_#axuH?U` zTmZ-PY;0S$ZhN&}S}G6CwAOm^p3jOWDy zw61bJANCy>^sQe;2vGLPhph9)_8lr>73?VXy zGHvSgDb%P^arVOJ5~j?8_Vg?hC~(t{Zb{yClK{X#S4#i@$l(XB0ssdU+9DKNZLGaI zzWS9t+tr{~g@FhE3ocCfu;Ijr7b|Ye__5>2kPm;9Xphd?AN}yGU7Lm(z__y9Nx-cJ14_VQ(4Ssd+!%THXZ? zZk@P9fuZH(_2m^DX~N*UhW0$3pJ~zk(zksZcdl5nW8(`yxbL+_>-G2R@6Z3ge*q5m zQAi^tbIyS$q12BmRb7?LQd3DdA%zuM$Wu{AB^BX?9eVg7h(0+8Q%s5FcVb5ssfgl6 zEv}d%i!ZtuBaJZHIAccl8McWWHRAZAj6wFJV_`lDdE=1|1x93bNE-R%jZ5N(Uy@Zq z38Y5+RMrsxl~-EnB$!x+`K6d;3Um)hBN=#(NyenKQcEwD7$Ti@+Sy@-NGWwEpMCl{ z)QDJR2ONNf3V5iYi6Xk_ep?dCD5SzUI%TAlB1X`pk1D!pW0(SGDX0Jz*JP-ra(b$% zta)0XNC_f{Qc4Y4^%8`C+IlOlGv&EquD$wd=ZGR@H7J?IdU@=a$d+krvKvv${O{Y$cI83w`6bKM(z5(K{>6V$w%1 zjpVaVOWpI+Mu$nDnj)2C(wp?k88gjc{|mF&WwRXcupq1LG23f(!tHjXbH}}@ z-E<>-vEFz4t#-TTkgWBq3Z^{kIxCyK_`PH^{&=r8_p%S=m0Nx}=9z20Ip>{w{yFHO zi#|H(rJH^_>Zz-~I_s^w{yOZj%RW2pwc8$gyMwREbu#nDDJbN@+v>RR#ovjx@yXv= z8RN_^?!4L18!x@`)z1|8Ir?b7y@Ii-47T;*OGUi+5U)b9o_fRIQ z2mP;t2^^pYD~P@jl5ijt%-0F=mBM?i&}A(wA+E4@4*l&kOP#^Ge)8RO%!~*Vcisc)j6$6;WKW))ZUF_2reHF$mR!D|4 z%pb~b_%$-tuZnC`o)2q+hcp~SEc9T)J7yA}oP>q|dx6Rx-zXI6g+?>|PzwMI8JaiH z1d)d9$9O&@z1YlVCiYl_Y_>2EPGs^{la$RIXu_LH9wayYxFi%bi5pddh>&alVdN?E zu$M^EB$AiO3{BDlOI==QjDnO36ES#_V|Wj7iuMZvYDj1!U-K#L@6c?Dp6!wT8lq$V#phi`!4 z9s0Bt^uRICdfu}i&w-?E2J($5#KE9juty_+ah!t2b0**Pr!4t0mbbujCLGPCB{XBs zgMi}$zPRQxN_tXkTF95&Y>FArm`1Mw@1@C8rcKQj$C=>a4VHjqH&kE(0PLU|LNx#_ z#^OjlvUDJQIO$QBfk--*QspvO;tM${&`nJYwr0Z^LYwXU^HC`7Z+(C6fp5e=mi^emxO#U3&ZZiVYW9!t^2 zj;E?8J?mbUdR5Gb69BLTic51El)&i@L2TmR25Hqn(UuLTtfg5q(@L5>N|P)Z*h_8I zicXqze35`352BXOMiaV!Oy^`P1igbsCzOB9 z=0c;O*S*e!yNvK|DM^_dQ=)PUbFGs%n|m2LK2^5aRV#K6vfG~Smz*1&?QJ*V$K8VV zwYSP$$q>}N{;ko#kaMkrTej1IFm^MHtSxQlW0vR+WWTT6V}FJJyM%%CbgP&RBx|X+ zi84swobqkwK}y`=7sC?2Ev1Qh(VNzJ8gx4U z&BgFE#gYlM6gQepwJ?aW9G~Eh*uo}eD~gwEld>wd!US%tbhWzMDN{(U{mko3zEOqo z9+|sdZ6XquoN2%dPMQLKiICr#h3)bu+6MDByB#CjEa{$mWl7%EG zWP4c?N``Wxqx4O5I!WI0f)b(G9A&_d?9hQIxs^@!Y|^oQUv-v;>XGE-dS2QAb@;P6J70c3yozxiLC69Bp5fK2{Ko}v+LN96dy8kYh7|w# ze#N#|k6$_FwLU+}hcETX);ycoWH>b%e)RZSw(a{g;oP&3^{fB=<#|6L!Mkd~Xg;R! zBbWF$C;xbIMt1Xw== zB!BsjxBU3us`T{d)A}cre+lh>D*dpb4fR2!>7wuHXyS zpbEO62;$%j>L3rspbzHY5AI+P_8<@zp%5DXArX!s5n@e(aUS_hrvxG`b|JAy zM$=GCFKVJ6PNEk+hNG~eE5acv4hJj(Vr-W;)N(6Is%Lp{^B6+p)ltE;W5hNYP{kux?(I2V;UABCSHUj${{a~VJliA zjBJb<4kXUR;yo7Qw74T53L+yqBp51Viv(jdieWvzqbfe6EV>~v`XVG!O+ShxN&d)3 zij2DyNW3h_C$1xisG~~)inF1j9b)9CAf!MhWQ$zNN%EvTMk6;)BS5-MGAblTCgL_m zNo%NxD$XKEQX@qo<3a)@R5D{g+9YN4$3$+VBQE4eVk36wV^De{S;mc~V2wBy&J)&N zOzO)hwq*jg<1^x;K+@wY(jr#wV=YExHLhZc7~)o1O+_N*T|Pu5CZ(z{4MY+q8bW1P z7UqfsO=wf@MTVrb%A^BxP#kJPu?>c1t{h=12oN z<4`Uoe^@1BCZ=u{V|5s$VcKO`hUYgL1`{^nOdT62%H~hRrg{ocJ5tIV0cT^_ub#3(P$_3& zMq4-%KLnKtAeDys1wSBbH*{5wD#Vs51RlIt8W1bhC2Le6>wl&wj(&zhoJT)sLpvOj zXC$i<6su=xtGGh{tF$_3e6ELsda02r#KwRHj|?j|QHo*}M5*2eN)>0NB28iR6)+S8 zKjlMS*@Gk4LWgE4V6w5HPI;1~$J7$5xYYEV2W(&~zoe#dN$ zMY2+WFKj}7!W`5pRyRm(vL*pHgy|uL#eXeBz>;g;twnQzMjBL8)Djn|YAt;<+GnWL zzp50#LajoKZLUcz)lO{>WG!*!TG)>5Y?-Q@QtaO(W6s$Cb!-9ym_@w`1i7L|xP|F0e6SD+3jrtZ9>4!inSO&z(XEc0$uc3L16G9 zwS@<3Fk&9d#ykfR8kR{DMWvlIim1B9D|TLj0@WE`}$cY@sH~q+F~* zg_;hxuqLAlp^OVEqnax7gQn>)L8RKMeJ*ESCwYb;u=Xx?u_3vJvS0`oUg$+6+i@dP z$5S>$whUuJ#F5f5rGTlRUd2ak$|V#~E! zGjlyo%uPDyV=wO}Z}kbk;X!~gdX6P3_h8T` zSqivhn8xD*_)@m^aI<$j4tJ0?ID&6srbKw9wCaLWxOid;eRs828z6t{H~4)xhP>xW z!?$^#xQW9kh`zVaWJ`+sjA)iPi<3!=uXucK%g)X?itD(~o{5$i_eEU)PZ-}SSUWe; zq78&!xRPUdaO4e>4~Gmdc_K#nldB4qO8`|ss=qmFBrle4d8)9>hTmd`HMMbbf#jrm`v1=Eu+IoEl`KQy% zpo=l0lRB>2->#cb`jySGH$}GVU$WEpNrF0|SG%tCx|#nvqHp_9p!*4jqV>_XY15J| z&)XT&Qbk(D!PO$&+dy!gD3x7WCDhpUo6wKiVU1EKwHH1i*4x2S+{KzYNw!7lUD-;W z|2_P&GkdN>yRRGkhuhy(L6e>M9m@B_+3N&~Rg<4F9aE$|0M0I(2Jc8cSJ9Cw@}>n$}`>n|%U#4Ckm zM(&^6RPlxH%f4m=62&SqZ6fFJ$3eW3%u&BQnTFlN-aQR6<2A3=r`Ig(^alP6K8RC)3qKbJ21@r%jv zUN3j<)~!3&Yh_QLKY<1nI#gw^Av$Qx5WRa%M(x=P{~ykCJ2`>_vFzYGh#7os zA`tdR*M(`ifrXfa-Uo%2$_muVmBX^R84p&gJGZM@OK8=0+q<8)ztwnOlqlDX{}W%5Os=B(h68y zjniKblB7h8%sObBPB$@Nv?6aLw#$Uj92Q6*6H0bj6p_@@#)7Qv?90X2oH9mB3sWph z6FGv>%TAa3bdxv!YV)if8bCyKw8=$m9Kk!hp5q=h9lj3gYqI3ALVqfUU%6<_&x}Lixdw4#~a(GRARE)t*|Gk zQyoogaueLKkcOg?UCe5jLkYDGhdQLymoVZ7#Tkwx@6wqHk4Qr#vT%t$bRwz{^g@=g z?m;tr;uXhpLo9CbR#kKz7exg`dz8XeO{AF_XNE?ZsquAe1S9QSXeySa3TAJ#qfoSX zM?FsEK|R~!A5*AAK{9cRZUiLF|4=uRDYEV+?y%w^A-S`o$f}2tjO6XUXh}_C#E`Y> zB&|OAs!*PBlPruQgBV1|N0!o(d1PfP`uI8LC{KY?rg7P$CsHMLPP? zmxpv^G5?6kN+R=(z3h-PIRwoONwbX1)Y&ON;xZY^(wba6W;fr+!+ngCoaG$nJj|I+ zb*dAc=UnGI;pt9!?xUUbBxgPGc~5=LGoSq2r#<}{P=F4!p9KA9K@s}Sdd9Py1!d?% zAG%P8LR6v?b?8JXdQgmRG@~5#=tn^sQj8{4pd>YDNi~X6m7bKPCUxmQ8w%4XDspwh zTopL=_)VN{QJHeg$O~zz|2m)w^`}K$&{2cwQ=dxFsHZ|@Q=fWNsX7&^Rh?>7sd`nb zW|ga0eX2)>id3bBRjNc?s#s|n)UNgetZFqYQ6u63+uJ?mTN zs#Q+v)vkU8Y+ns4*R&p1t$9`KT?5Nk$<|e{liez1En8X4Znmgooe4H!_%dSd)SHvM z8EL`DL$`Kzt!7; zwvD~5RvBwtp`ymPxJ4{r$%@?Ax|ON`Sz3X*vd*SKvX;4too!|j%vsG|mca{laDtm!-@v|i!p=Qz zcq=Pm+Fm%To_+3tnR?Xa64?!aE_6v8V4t?NxZi!Sf+2k42IrW^ zIDV>UK|4pD-PFHW>~E24$iwjpIL0<^ZivAfUn$FX%2lSaZ@X*b1quIWz!*2}h zh~y_8S0Vz9={o0myU+FUjxViaP4^hn43;pIo1ESsdl%G}jWdT|yyU8iTFqG1 zu%uJXT0FP8|Fx2RHD{T8XT%N~#iX7|nk`K0OmlkE!!~xOi!Eu;o+`h~Y&7f`{cLE* zvKMC-^pmf9;y`cv+TG^1awpyDS^K)zss^{2vmItn|CTG9LRnD@gTb?^m0W{%Xm z%+Dc7{|(_AWb*b=8`#36)RrN7v=Ogev<;s#)dIB}O4wa6 zX(N-rfWra`k$f7G8gdYeo8SZYeCOM{+)daZ6BUsIeP&)fWd+klbb!0+mqBTG(^s(I z07N{x@pPni;}1jcMk1^(h-lQ6)gPvPjluDUsjJQ&gop=Cc|Y_`D5ClCaC)wJOK&|h zX!HXyJCI=i!tld|?5>x2<-4%~yP#kFhqX3}PmOBOf1dvHhc8kOzOubiF+}=Jyy73u z+5T^4CQgy?Kn^Sc?q=dI6r^_qLO~c%k@BJic*W(~XZ7Aq?=+C_Hqh^qZRaFo6UNTw z|CT{_Y~kh>5c6ij1W{1_yw1~{>-Wgc`Antx3;`NAE)iz%`AqBuw~VV+E~)IH5S&hq za*w8L5C^BP`UYX>e9*EyD+nWy0sn#pV{bvMkmercF@WYu_@U++Zz3u}gqZBORt)Dl zuhBTl?-9XFH3Sg?$uK6;E+$+9He3$vP!QCayl98Cx*Y^o|=-XZm8o z6c zgf;S!0cQjQBXA~QBpTAzHd|%l;w~E>=lkB$8HuqH z&%!hJ(H9gEIP(GTnsO=IP$~Ux=jMh?>_!?D&@Oc{KgO;mos;Rp%Jy(?`DjWNHL?_k zuGC)gRDey6NHQlAQxiIJ>&kNnWzZt`4ye*hCoN~}GII}aZZU|;TM!Zb>Ov>IMkt9A z!wgf^mUBCsb3ylR9LaI2REaim(}t?DLSu*8YVh%L(&Zu$8e8N#|J`zVf+QE1iPjORrB-kFR^Hm7V{DZ z`;tkWF)>@R{*E-Mx}TdeXzad}9!sbKV8DfCV`6mFLYR4B~L9iSu1r}|0xv)50zP;Q`nldQQ1mb zFSSo)0@$FHP(|@ty;WJK6$)PyDi?{7`cD9jl|n!@T?+&&9Z^@|byo$>-r|+KL{eUP z^6TlP~~_Gs1Bi+Vw%oc3v-z4mLt zwrZCxl~hYHEH!WiuC7fdV{c6Qfob9ZR*)^u|hkNCED z`RE*F7kNqIcll;@RriUUmmPy_@HCWpANP2%mv*lgFJPldoJJ&oh$PsKe-d_4fQMe} z=jD`zBhtizc-MabXd?zl3Y6o44p$=*C_4IqI2NX128KJlLpthC_@6&1NGpi ze+v69mSe70nA|NKW!9;OqbU|KgI%MJmr*4Hk)E-Hka3xGnk9RI7a5eQq(st*rr-A z1xMg!Z_?FW#-u)mr5?N@0Rj4$wWM#e^H5is-#GkcFkkP+rM3VEXs84M)m9V$A4E#^|ld5AFQD|-1et%i6+ z28B}MitF%o&DCgKxn^4VtvBMH|H+0fsCa{lrk@KU5s`;`(x(E@qHNArZs=G#zXv}Q zx{^;CU7q(iWLR+YgcIgqaHiR!V|a%Zr%yJfkRfMcDx0e-MV6Q0a!A@Xz=djlF)XxKV*x&mql{pddfI9c3L4mNR5-Ze0zI@`nW>n2Sz7@o%biK z&!Rr+#fW=jeg#Nj9LT!!ce)j5VBn;HAR9P5TDqZIgfQrZ?}AIWP;VYsgz7|l%yfd9 z*PZWH$QDkfznG>kShkx2Cmq*ak~xifw~biWr3;p58P~q;Ij(KHA2^sOv@)sHR;~Rw zdM|gtU;CXURKFKoBk+5B|22HW$%DduH^6g9!v7DptyfhLyrvc0wi_J8Il{!_hr~-q z#vS^??>4qYt8w4D!?E|nVZ2&JT)>CC#N}K6J{QP0+{c;s#e;k|XgrCEyoPK%;@Da? z>F~)hg2|CroV@m;!uF+BO3Yg-rOJHF*$Jk?HloZN%(K?bz} zx@wHC-VDKf_62qA(~;8nw#sMQZO>wD-&l;?8Vg_zjO0kR)+>F^o~nAa_*}J|BN9D# zM>W0V?@`Ti)yqpY|5Y?-Taz$VmDD$HyFh))JQl5H&BdB5**{LM=j+%{ zQ{4zM+>vhXqWvR3Qp8aG-x?7?_uW~KUEHi)PkBwok}5qV9pnG~*8QFH2)4j89Jl42 z!RcMDgI(zyoz`W|*g4NULyg^~G*!c`*r^>NwN2Uye&jMN?Z5d<3pb8mou!cJf08z$+doVv9jyQ zt=nb3;5qE)*L`5Q%jd(L?#+GMM3Lwp-Qdv_&S35DERFJKp6Z`|)4BcIwcY7oXi;B% z>SZ77VfCfyTg6X)gHyi8|5m7o+o!;R3GyM>GA~EiM(6vH-`jocncweV5~*5F@>=8z zd*u%qnEF{{9<5d7?rMKu=z*-RJG=wcmEP{F>L~5x`vFKMz+Zs3Kqffh{c8>2&!6HN zV(hMz8SiTCl-up3B<=tL0Dw3A`WY-(uwO!i2MsEGxbUIEeGMB%gji9c#)KOka{TBq zWJZu9|3!8ziSndMk}FNJ1j*3gJ$^K6YINA|UN3j<)~!3&3#ZVbM2i|diZrRxrA(VT zeF}AHuOT{U%n%YZs@APsyL$Z!)@Uz$J%0v`h$l@ya29+qEZ8l{yO+LC#$g%B z$BrRNMhNZ-uy0mWE9|7@oxMiDIBn@?Z_%8WfJ3r|Y?$Ila8#t&zP*JXI4sL>>*n2Q z%Wh!PpBJ{+8hm7pn{4Q=hDoNEX2PTqfdy^y!zOYRWQmd@;qk_Q^Ql!3oq>UQW=LxG^9>l+ z0h16XaTH`IM2UX)U7zBaG$BOxIARNRfpupnqH$!m9V3T!8Cajl85Ai(al)x&oc8Ep z%Zv-H+Nytd%D9YXdGIHfJ-5yWWj99xaM?h19cU4Ob{06MqssEhY_iRk`RuY{|1vZa zg$7>OqEE?~xMH{7ehcD=R$&Ehx#pf5RkmgU<`+Zj&Dc#5@3b3dHx#62uP@+yz+Vx0 z{VNx(`7RV!HTuoC-+Vtn_+Y~fKkRU$2pO9v0Os+7M;Tg<)|Xy`(R$Zk#768IVA&bO z$Z)siR?i}zN@wXw!#ez^gd)N0okE;IF`RY5#St77TLk*our-I5Tu7AZMu(DpxV4t6 z7=e5c)%>uj5S?u1`Nq4o-n&TvzHHKifDv8PPo&414RPBfzwLJ1tQ|BVg#hBD6Hgj) zi*Db3|1EBbe-BQ$x!JyW)BWz)= z2g%n%h={|aL4;`A;a|%5@r^1pZ)Qmh-^317J@I7fAjB(3ptd2X|0muoZsMUBL}-V# zf*>(!wiy^iYz4U)j;)0+%%2_i1fGWc2_-u0V-^4CN5{nxlDWNGoK5z2}kg@ zlLtC7k_1&`BMXYqM{Y2257|+Yq;n+)R6q{w>CumZBp3CR|3FJhDj1Wv5z&dpGlsd^ zRsBFHwLk)LrG8|cMjW~@UOluQ?_(qRB&VeJsdSzV=>!ybhBJN`52!=^>8Dtlm||hk zQq>#kr-rIBenhi-Mf2YdONJJK$U%;YB{T9so!*g?8knAjOx* zks)=bbFHg``q`+QEHt5f&EP@%3fKrvGI8}RT?zSz&&1wyvHMi)7~%RBH#s(+DFGhZ z7)#lfFvPN%#jL1Uhgi>wwy{@S-DFQY+Rl>JfC;n~T>#1xcOWjXv>n`EYl~aMWoTVg zd=M|~3S7Dh7hTn}gTzUq#Z9KH$amm;}=Pp;J|9?{MbFVvH;L?qdXftGnW}Dma ze(Sd4EiZ}&i!9Zu7qzQhZ)&AwM)$V2C3}3YeW%sU!m>A?(o64t|7$a&0eHUmm9KnT z+s{HeaBt>qFa@bHu7Nsu!d+RYfv}6=>}I%+)z$C~A!}R@&uw}l{xFF*TvyT@5f6S8CDYvj=)xxnmQGLVx@Dku;6 z$xOa4UPqS)12Xuhq%O6oPmStSQ##Lj9!lPL0$xJPx*uPjwV(HD>sd<%u)FSSulf4x@CG~A zkYsgU7aVJ1hq>0u-Z6Tc{pVp9RN4fkb|kGGSZqUEg2s+9pBcREE;Bpa6CO)C(m`W# zb6MMqWVa&Sok(~iRNm@7m$3_}SG^^>-sKLog!wJrvAn?z`v$m!>3u+(lLa{ z$Q^RK_EG5_DDryfm-1`MScWqOX`EV?hIofyP4Tr)joXDn%-T34_{$i4aQHrS;LE0% z!(YDe0W}5Xaf&zHA-v;zl>7Cx2Q)Z|4`}F9n&I;coayvES2YOey zNKMysu16)BlXd*U9$k|G_!3IvSA=D#dN@%qp@cB}awB60e}&g0LRfaV*EB+bBa`Qa zAo6P`BTWtgh{R(M)yIN;hj)ZXgD69Hh5~qYH#CBRgV)D2YVkCM7=)M@f^4LFW2ZHq zh&k^dFlA^;So0K5sD&>E|6}VHP(1g3sR%e(2#fKD56SQ%U6@f0;ZgZRN@f>|GzE%q zR5`xrfS+?KeK?0i@j4O^iXTWm=F@;eK__MxjVJPliHLlI$al=+H`mCBf{2Yovw{x6 zJy4JvDpGjR$a}okeLlE`!03ynIF0q=PHmNoPB@Dnf_XQQWwuyw`A9hO2aty24()e( zoT!UU5*NJ)KQ$zep_opVBZ5M)i-?De=r?RW6em9-R%zFSWH&^a=!Y!`gC=MYE*M2A zn0F*OC@(lDJM&XepgboD24M6KifD~S@rlDHlDyXqWk``ln1GuALTG4@tmhP{sD5JiIn(Am0ux+u2z5d_n84Xm8ID?T zf_CK7058BFDZo((`GpCn9uw$7A~|)x)_5Rkc814^H`RcqID$jrch%>2MJ1CfDR+Cf z7Ss_u)~SLsxrp0ij-APvX=ix37nvYvJ8Uv z^cjmJB53+~|1M+Uk5$);fOY;U@kJu0PSDr|CkA+AMnyOpDO>ZNY#r#!}| zy`XA^I%@L}X^1Lmins;kPXni{FEnrNY!rm^*pftoIWYO7wVWenv!R^&XrYD4MuJwCP?c_d&) zLmc{rtN{{Q#@Zz^<2-aWCKskzWa6u3qGHRMRE)x`kCm)S)U3pMEO;a_#$iBi_N<6y zTH)iY%_^*qG7m?SRI6iW^$J~lVx`|!tGViBxXQ0AGN|NQ639WV{^hRaIp)DRRgQBXhN+n zD_8HTtrD?EYx6x)hO~W~_OCqVuR*I6aayu4%Qn*Wt}M&2!Fnwyi)Ba) z|0YqJu)z8(1>0XAYp^EEv@tuc#8Ia5bW zCnT%3ENicMd#_@WulWXReM+=P!KH!g5Ecfk8r!W@l(ZqMTx#1}j;l>K%eZtauO4fz z9lJkqwy*??xb;M}JbSo}k+_trvRGDRM=QFGE3wrIx(chTUc0Pl8?4aESr9U1x0|!9 zr5NyrY=BF+L@~I(+hd!1xnp#!Rtv3F8?g=xt?b&Z)|$L*E3Z(CyiT^YE$g~mE4h$@ zy5IV%vCFjxw6c#2y~?|@mRk}XHn)Nlx7wt%Y|9tPb+_<)XL<`aDRB?|fDh^L|02kc z49Eb$0Bj8I&=2kKrN1i`LyN$`JE+fVxhFfl-@Cdpo4V5bt)ntG9SgzQDzL%ow#56i zF-yLzTNf2Ow$FINU)n84^zN0I;Bup4~8?xD3tP=~qA^Z{b#k^FDyE^;B`g9l+ zkq%^WZs%s90NfAba7Z$`zy=Y#ggd+n@pu3rHVN@t4V4GEkQnu2Kb{K?OyEi}AxHaT zL}eVeH~h7;3lg9s5mz_0>npbuyb$s$b_;PT?AaNBQFb!LF)BPaBU=}9_ZCCt9BLFZ zql+Mh)juGSMG6r#LW3xGM;efbDA8fIG0YMwc2l*(RYaslt^!k$Wq4;L|15HBvn+dJ z=v%+7j9n#>zvsXcNX)+%_rJ-|58|Mv>Gs4)5ygQ!W)D$Q1Or2ovMb2aE=%*WtG5@3 zN3D%B8qOTP8mzs=s~FOpHABQN+)BraJk9wf%r-E4a?lqNFhuzA8E;{GCA1mj%)+KK z!+=422oZy@(H#CU$C>Wl} ziJSQ2#`I`*8bSqa{{6HXK7IIDL#X-Q-)$kys+$eeetD(d9o7p9^W_p$O%nv(p>1 z5%dT-;BYHje%vsm;+Y{Yn^_H(gE0i*=Ie1QrQud(G!o0$j5&4Y2*J}iWghjNu$1jm z3?V#1MRy5N4|Bl@lm5t)yCBd)vYEa-vJpJFaeNR_|Bl|%=vT!NoNUGClRjRhiLe2O z2_ZiiBL}lCPJPaqfiA&ed%pI&+DO$9`HKwapajJ}?8s2;K3?0qoZG#;+d@QL?-mU?X%38eEVmt|k!jH7Td5m!o$z^_M)?dtSF{j)4IW!W;f}=` z9d_|4sWZwWRhSG#H5o>e4)MCnu>i8-%R^2l4j1TMM4&B4|6WJvE;7d}@ge5XG_Lbh zcDWQW?8I*D$^PT2(8NPdPIVH>vcieyG&P8SnP}fmcYjABTf6k@>$&gv!hVa%ZtTfm49h-a&3@!9 z?b5+)%3Af=U>W#pr`6}F)mRKeKSIuMR8b;>BhPQMBOe9CDer& zQf%eS*^iqI!J0Bv{ke`88`XC1DN+dt|0iXmU%=CNrh+Gr2M}`lfdjFuAHRN<(jdeG z0Kkua2O~<1h_K>Bixf3xM96R7#fY7tK$*i29F}GL7>$f0@nlMn8!^s|$#G^!i8v2_ zq=@jPNt7!`LTM>?W)S z(E<<%t^xoD736eF@{X?Ex>lpw^avHFO{jsT0v^2AuwcT84;MzfSaIXN$da8qmrTiJ zWX6&iL)K4KFMRIStvlCi;%U^WRj+2<+VyMLv1QMuUE8+nUPE-ym?6aUZQ#L$4<}yS zIBU?NDVx^YJm>Sj(4|MGKHYkC|LoVbXXn1%JNLWYacbq-b9&XDo8;&e|J{9ioaotK zg#X_DV}$$a@4w$aqkj7Q6Ocdt?w)=$tBf)wl1b(mV>t6HInqiy z?n4km6mdk^a@(!9-$+z(MHX9}jYHCydyX+0AFI(Z92?W|#vN_+aiY6!L<^!HdD5%L z9C=idBlHgZ5lJYgnvtp`pIov^!}_{1N-Mi`tjQz2*K#QAQUP56ng*tq#CL9YwU#egL#| z)BX(P^iu&T4O3E5K{d71|9&9kOfpuH$t=UpJ_~I$4+pjNR$M3Q6UAJ6^;J(8OB>b9 zG>at@&0~!vHrbg(Wp-I;=K<+RWT8FOye6yFwpd85Rd(Bmq`ekgZ=WUi+;1&{&>dIX zb(OOW-I24^&SymHJh*F1C1H}@QKm&q3WUa?0vy;qUzRDE^UTX+3+*khM{cG_#V{dU}Q*L`>1 zd-wf!;A3BfjXH-fo_KeR4}N*(n|JI`gH7VEj@eg_XK#fb?g*>wDH3y z|9tb)FMoaX*;l`P_}`b`efs0Ce}4P($AAC(``6!p{{2sY0VE&*4LCsYy}=FrNQVOZ zu?`0|aDnLn-vJAVKnz|`gBIjq20OSx4~7tgBm7_qMQFlxgsyulbkX)$_(Bqi>>M4U zA!TYfLmTE0|A#xgVGniaLmvK6h(RPG5REv*BNh>fOH^VLllVj?LeYs)q~a8Sswj3 z9Dq?qkb@*-Aq{y*L?%*^i)3UY9r;K|MpBZKq+}&6c}YxWQj?qHWG6lONl=DTl%oWt z3jcV@;J6T#tE7#{dhtqF#!{BEq-8B_c}ra8QkT2rWiNgCOJD|5n8PGyF^zdlWF}LY z%VcIVo%u{?M$?(9GZZVW`Jz4Y>YCd;*{qh+M{b5woZ}>CIk^d;*o5qk<_xDQ*?CP@ zzEhs_|DR5BdQ?sU3t!q80R`HXq9YbEqhtfL5Q%1y^LirBbg0}6|*gb>}b6=(9%TKw5w%p z|7%^OS=wMS@hyqEkpW+v*B7u+Z#dQ4UX#5Sy~C03dK(Jg z58>Cb^+lzAWuq#|%=S%i3N30?J6`fW7s07CaAffSk%?FW!t9;zY5cpI3y-cF5-@;4 z`q2#zcsMoujc%2b-Bx*uS!Q)n|$CUBS*oBZe@d8 z;}$A^IK&aLghSYjWeGTB2lSxBj;n#*^Txm-Foth^OAYD_h`KD5F3X5B4FDcf+S2O{ zwL{Xt>O7y<5u+9{t1qo<0KD149H7N~y?pBQqI$io2EeaVZEIYEIRm?PNTgk?X{P|Y z+NrrVtb5##u{1l`>+N=|TZ4x;;33Z+R(3?f&1PgLge=Zh^{s8Kns<*I%kyP6y`grue==4uFmC_#NfW_Q>Dt@^&Mf-Sv+4hhLp%p0k_b z#isU~F%E2D18LH!!MM9=Zku~}>@^^xDQ+2E8zq1JH04drgDDMROPoB!;5f6C`RsBD ztlR8B*EhS<8~1*oCC^a)GTX_`=Y*(z85`bvtNG4icgH&I*$y${{TyNmOM37MSGIpG z(P6^p-SEP8Jm0}haENq1>Sq5urBB{&(vyBQUfIOy^^FJD$6Ml<$GhJ1KKj^G-o6p0 zec|^Wb*bCp%yg;7)OkPok2_wyes_DH7cY6)+dS}$Uk0QH;sn_*|G({f{<7!|lKRj~ z0K%RJlK3NXc-?#7`rvQ^Yc7v`o39`HCI-LJC%p3Hw|n-3ul?q$UjZs(ztSr`?WpqCD-7)DI18kld`R_ zKK!#e_(H$@t2_Q`Fa1)%h+sYx)HfN_KQFUE^02WT1i)iUKmC(B_{+iFi$J?8wZ_vu zkwde!13(tkLE}q}O@IjIt1lZQF)Lfbnw!BB)Iu7AK4TlhBOJD6P&ah*GBD%9DEv4Y zL=7I?is-YuIP`_q`?l;uuQzPMHpDVEL_+CHLLvOPJM^(X|5UF+3`8Y_KWTfxEi6JZ zOhhCM!jJRA>N~+648zpWv2CkE75uYQ`LC|~t`9sJ4=hC{t0@tDG$5QbP9!b78m#F|^dTBJq&n#Ee2L)1Vw zcgwZP8${_-M$98aK%7J!Oh%4dMqkuKOWZKbn>21b#&BFOU0k<`2*x*lw{Khikh)akG|AVyp`ptyU$l0{cggD3u)GzO>&WemQ z<-9oZ#6{vXLo;O0|5H!#Tt3u%Oo=nM(oD`vTfyCwKNaLpV7yPojJN1yLbjAm`t(Zq z1IYIiPyl_+>kK_j6wrpGwDu&!20hS9JWu`PP5R5uZdihe@Vwom&is+@t*kjSl}aLvMF7ZBK!sBS|Aj@WySgfM(5s8Nl#@4aOVlKNPAMZ(ij>qU zjWW<@*8VD1e}S!wItRjvsf=1K15?)2=uEL|NqI`v zs^Zqz@K$TZBXA8A&3aaTf>u^3GOr8QmH}2@9aeUYS9w(_Tpgrn{i;|Q#imkLZ2dZI zomYSjSnP3D7KK*JR98|A*M4O*c%3ns#IP_NSKByNiG@tzsMvr+R$KMfE5q12V^;S9 z+1ao&F%wy^@z@b5S9>+sbfwl_|Bcs$O|*Zt*x-<}aZNLnB@RaQwr`}bAspF_HQ9bN zFQILXoTb@4*;(Kt+Jyv>qy4KDEm(I!*nJJwm|e1ltyr5aTB9x6r>)rvBTkGZSqgjD zo-JDy0oSMf+A6Csw9r(hU0bf@trZ2ybH&#eT~~I!S|poUW%SWxqqashI$MLUd;>bc zeS^Qn!)IGHfLm2r6Ss_mHBR%i3adKQcsiDARQV!0nR8gR3|vDMI>O~yM|CzUtwcr@ zQE?2pT3g05b={E*P0PKx>_m(DL{&|zTx|PN3xhbj$beiJ$Ltik*R{7+i(EEa+-iJM zCN$p0MP7IWUBo;~83bOD|4UrD47#g3RLO<9Wk5LQrMd|tOXyv?e_Y+-bX3Xpv!g>? zas*yX#a{e-IeUrP?5YeG=E7fOKJMeg=)}7Tb+_>AGTk#_z?;bz4&mVh zJvgM{pH+?K?7!a=;RH0t_x#1o?LE!wVGfQ*ARI&(?miEuJIjl@5$3-J#85_Dy@J5c z<5NDY3}N?MS}+a3`RiZ^TViBe;+gc|U%}tI^{Tv0SZn3m1)JIJCB(u^Pk;2v1wK`# zL_SZHP>QTWy~IR0{~Sa*rQW$iP$GQ8I=oOi^kW$Y%N8V0F|5Q!hTHmmVL$fEzRTns z98LqTrZ(7od|)Kas>uPLLuJxowM&S5p=O8d&hhowZjnM#pL7S7vR)*$`T|pyMWsBT4ehlV&9NZerW?>{` zJ)TOkaN!PpNI=cAjf~0&xcYfz~CJSt&WdGXcPM%b<$WV$~XPJ!W*5$QA z9@;OS#d%&zCmv|nMdEIrM-yAeAGI&^jo`&RcuIk-u>M%=ccvd#EylQ|HOta<6 zSGZ!eCS{<+&sU~Gk0x0mj_bQFX2RMhWUyO&?F?nE+IMZ~lx*15WY7W*V-&Sx*hFl& zb?e?OADj(8*r555>ap9MIg9>J|1)Ib z{k^UD9_$m*tGzumL=)JRA-_2z>4K{0Uvcw(f%8F8<2J!t_!evcp6^nuZ!}k#wb*4p z|59&O@(Oz)bbm2)pu=rXq-ArmMJZaxmyTug{4&R02ijQ% z_FLVo390ivkUlcQ`|LAXD`0vdmPclb7AwXJ^<~KVpB`by@%RYxkEj>q_jwFLST;uHAR0McUKJ zV}j3jK?!&fIod8qSFmFCd4*#H^IPI|3eEN0R@1g93sr_=;*eX_7<^yhC0+za!ox*1 z?f->XjbAtD%|GUxs_M?r$COFhwFOY zg|(B%`9Q?n8EZO&pu3+}w}l(sMfJHaBV9(F-t2|N>#a(4Uk!r2Tf7bIX7|i_m)Ux+ zb_i}f9=<&(PCTbb;VCv_4mE8szUu?dy}KJfFVpFy|Q%^!wt*4R)RRzEI|V)?_bD3;6OH^ASuecB(-vy4A3Rt?{0Vf(9IGyjfa z9FOWDu41+{K%Hzp0~LMgv;LekK(STg++R*Kmi;Nt{stX?($DF?)BfX7*_AyiPH+5d zeSEBqcIsVZJ+4cD$l$AAziu3sbrVQ%VLxyc-Y`r!u;4+776oqF@owS8i4qA)bO^Da zz>XjlGUTZ6YT1(GOP(uH0+lIqC_y|Baq66C zFHg{tRwvr*mvLiKiU?r}q`ATDepU$E0iUD^|36!}4`3IBw#waoJ`S8rY;$tvM?<_DZ+r;=g@`UjH4ev@h${ z{qFTcc5e1;*~yY2%iWJvuU_ulty_1lm+Rujk0Vd6d^z*x&Rh2yqJzc^A;h0!&#rwt z_wL7g;R8OqH|v%T0iZ|!#;(z}KvBD|xhZ{`)g3!p(ufxR`?sJoAJv{*bfjkhWBs`` z(0u6C*H>r#;8EXw{=GF|fd{e|QGiR`rIkjVotGW}>s>V(L-}!K-&IL12ta)yruPPl zlEJ7Re}YvY;)tVV_>nyXqG#ZZAGO$^O*1|gACdGml%t3wCdl897xGx4Qbnq$yU5BWnk3t%0P2d419C>c06_;b|wX}(lFa-vnl0|i7+JBRUsby%J28h^Z zTQVhQHxh`bQBRb?YMDoQWyorKboulO2+Ks3(uAw}r5|8u#;R*drlM4sWbjGbm4*U_ zMA@qeUYixPyE1!MwxJ=GD_r1K$?a+g0#&Z6)naW{BEU}=uiY7z(nkFi{`*pY- zo#)s|Tb{_^hRklg{T67Wl0qD@#MvoIoplpqoUz8PQ7YVU57#splHQ!tTM z38h3ROa1fGM5B~6h8z0I;i`B5K=sHarxw||RX5~>$~0&Ba?C%SO;gSyD@(FiTMu-0 zx=O|5_1=+%esoUzTOkMP6e#;2bhTe`9G%WGUQqs&7e zJ*3Eg+?plm>32PPt#e8%dQ_XKpNV9vw-%7%m$;JmPzsIxJ1v%>P>3z0&uyE4Z`fiB z2f>M6{Hj7IMoo#@kG!NZlgv*{>G@y(0IHpS3vS)K@D2zA0sg$6k=f^*G$9We6Bq0mQoQ{nLWZjXIA(!)@MwTaF zkhIAoCppPVMvRdg(Ja+)Vma+I2lWu zfMZy_6!<&pHNAo1P_Glo&Ea)ef0o!vQ~dC*lP6qWGg=TGP9)3*L|qHMj1 z18~(*=-mjZclGFAsVW(NK`4%RO=?NSwf|9zA_}ZtC9GEGGZM!xwy%GE4kHy?$Y?TdBoRO${(XdZ?(r zr&f?^scqs36XJ+B{? zx~g4ciI*$o#maXVqNeOUw|;d=FM6Nq)CR40HTk`+0ceq2WqtQX`PEQu({S4lh7h+G z^oV%rAzj~Ij*D6O(QHw)T%OQ3fJGFrgaO7ar;_2pRh%zyse2Uej_AEB>~MRDYn0;} zhVK#X{E^(lwI6@ zVh=qG)0f0j%ZwH?tCV?)F^RiyO1xHP@saAICXSK>guAkueOX>v9$*m7H7>bexm#W4 z-{Po77%S&_&&2AoVX-3UW3>y=b5_fhmyx(G1~D&(ZgZjs(&)g}8GwS0NRr{iWMcKX zwP<#s*U6HZ(qmZA|IT zS@yV}JWlpGgUTAH94<9>HL_?nG}T@aC0q$oO-ecg?aNT*!rwY6UKR~*o2i+sZyQpY z)%9n3iH+N6Da>3zwdl;z`~NVTYfN>^g6?-^ZeN)*O}^VwaBAUu+MGN037w95Y*<%Z@oY<=UDD zr54eyP92r3U1C^bIG3YRW%yC9xf_)xr>6mmoM%*DiMNfs?r>_7OHd) zFT3x&D9`tM^Ib#X6WNO7%HMhD*9@Q6lYN=JiV5)TI(*4Sj84PO(`Ik{a?fVI=Aj*A z{A>PW(;kUxBI$_aM#neu$_};xovUHaNPJFMIL_Eq9i$Ni$*9__{U6di9Rv1*1E!6a zwAy5?OQ@ZS`G^kXj0DpZ&fJh51(M9$px{^}pb4G>3XYDzd5Pa#U{h$#3aTIpKAH^r zS_7iZwk2Tyfgla;U*LS>Y((j9I+8w!YEYb)!#T_-W&qc=A{W87!b=K&=nyb z1ErD4lpqb6kqx;I6akF@shff=7@0ZMQzVglq)|<{mPx1(6n@fBXjcdF%o6?Kib#=U zG}n1CL?|}b5tZ3fRpN?>k%mcODJtS4G9qiOq6jG>Dz;)1Eg1Ci+;ovw47nl?Vb6%^ z;t65mR-H){YLR7=)Cv0~OfoFY z`^A$Tc2gay<1N`7cUV?CGEY3pV@0LhE%l33-J>|=qam#v`x#ptmeyR=qb0FpK^o*h z5@d4FBmY7g6Z$zMb~Gd*ki%ei6wPCTjU&Fv(M8eWRiew?ZV@aZ9N~+{a z5|nJ*2|&W3TEQGkHWEqFB=g|mP3q)M@+3;O;lU(>F}NH^rejY^k4+lo#GGVe?PH{9 z6hubPRBZ=h#T-U1A3#y1#AMYy%1Tp)6K1iWp6G^5hGbIW7wO61oehf`sf zR(hqzNM&I`B_PqGQ;k(X!R1CCN@dL@ULMm`!KGk9%2oa38w%w)5@lMdrKBL`V@AqS zW(T#|<3vCf#8{C*3`*F2QBaE!(JtOdfLY0aaT;)0 zCv@tUgpp!&7T1iKk=^6tr#-lk#ul0r3m|Brl$f>;>o(ks{~C1!X^Pqq|TX{q9EfOA>064-!ZD6O_`p0#j1&_msu)e zhNI-gDCG?#j&2NYx+fx>eX|ei(uQuWFMa}8ChXA^(*a%{(ecip;JiB-Eyek zow(ti45dyLWvoIBtXga!-5*7fRfag7wxu0~{^>(x9o;<%2kBl)d~C^@i`zX**f}27 z3Eq=X+sYDOnFt*OtqtRCo8vW*gdoMo{;X2D>5`}&%aYFEk;Da18MR$y%47 zY?erb;VtTl@N3M1$-h#cRDwp>9v0Q5j3(x+%Q`LB!kfbul&ZGhv2AR|D&>vJ?OH0N zU$KYj9bO3%=+Fsk@_C5w%$r>ytF($M=$#8+m7lv+-?VgV$r&!k;fuEDEaCvJwVvjd zeUh8xwk+Uk2-CXd;LhH(s%DtU>){%m;7+O7fS-MWP5L%SX?__Q)TL~fnI$C5j;TT>cX-XjnMk(YJ zs#2ukUQ#dLxL^>n4j1mr3Z6~*mf-qosVH)(KxAPA(oW@ei2HsZ7hYi#9+{)9;4y|K z3DNHr&Tr|kVCfp!7_MQ4WG`lJZ=iNBSLn^GbzA=K%-vXT>3FT7^5BJSu$xwJ)&LCz zk1(eqMFU?Y^|GJ>Lyj3X$HTg3_-6~%G6yl&A;xOuvB3>iaN!f?$ z=XiRMW1ym6^l$?)P&X1wF2d(Rm?Ag&A>WST`M_=5eG9TyDDz9BKZcIf|RxJDSO?Gn2!7U9h z^PpgCG#ke$Q}Z=DiY#NZPqwWs>&6UQQz&oqA(8SpJIAb=b2@8>Hmh?%{^P;ivP|w& zJ2%HP({rLk?=Yv^W%||fWaT1`Gdth2I>P81elw1h<^Moeb2%$?aiB9+jct=HhNwi< zKW|cpq*P#9tUxz({MB-dZq_HuVMi}CFV`kXTeCkO76+g}**-47-X%=`(Npr3I&(Bh z(_B9EgFE0+Pv?d)7(+Vr12HVrJmWOSF!WK|#6w?KcNr*$CbD#z=rXvLi*l=f@x-=R zB8n1kbVVqPVf7c`S94~V)CkvDqbGZcm{rtPjCrtx_NK^Eu_B9Sd}Zhy-n3Hp*gdF1 zaTLQnfbvOqv^@`WN_P;L#aNLd_N7i5sP=DD9mLd#-qqdj)4er=l`W#S4U!%NsqTv| zaoMPmY8!Rhx-BxB@hGKEGA9ZRlBKqvT3%l3_5Wzy13##O8@NFms6rd$c5dIcD(C}X z?@>4lc0&{PJu~&(*(#pWYql0Fw^r|ZXmz?xH1UoRzNSdEZfjFKMNVk90c9QQo;JJi ztHLqvWD6k8$@Xl+Rc-Ubd%t%-@WVpPH$ez@+_HCH95+21Hqs`r+V*kJ?bSr*M>R~h zdkC#{>ucNj?AC?R(Lvpl46T2UHyPz_;DP9wd~mX*2f3n0e(RWf!?%1BM13#BeM2*d zKU7kKcye#ta@#KOQZ8f@%a4R{sz~nRUUrfoU*?jF>VY=te(jcsH;%tac_Xggj-HA$ zd7+5-h?_V=2zNCZb(8nQez$XfM-d4#AO8yqSnXiocv;+hfVmLroSA9P7Vb>QCF%;> zAS{}V_a>mg2Ay|nux6j{2N$rKcTE6pNNZYopeM(Z&v&7d_=y*_IOjK(tFwzIg(Q#0 zH-g;~8KM(iqs9G5j2*HhTCy_E@rocKiAiB|g(ByYx*{SXTvE-ZJF(W*ZYMr+7Ja&` z-}nFmx}f8_YY@7j*93~^a+5Q9IvaMbSEfc2`?0?;e8+cvNBL{y6mjQzu$%KkBfE1D zbG2jpi7WfEm$;NCdT}eXw2$+!XM4GuyC`iti8s5mkF=GG`!-Yixy$>!OU$kx`n~)5 zIwS+Q7dDG8dOmw*KeuH}e^P2{;Qzrhq_GS9@BUOq6FfOp^ghGYR;KR5&q=y7drC}s zio3hNvo}){@ujY&#RGK0lRPEEGT)YbO-qVp8VAKYrNVdlL-Mm`dZk4(Jk4EuR@nQx zvwN%J`nzMZmOC)6ntZ^Ie6f>!U0!9%+x&UgJj<`t$u~V+GM3CA{m7ft&W{t<_d3R_ zySF3HzDK*q&$gq>nIo1pNpL8Dawv7em=8-eSZ9D&Z*qmIC_ye<>z*y=XKV;UB|UW zrYP>04~8E9RcfcoZ9A`PJVGn_$D6%g6MdSi8k>gIVskb^SgM%kk%)Ghu1Ye6 z_OJb1kv52yGLDfF>#a>G{r9i<<6iUGKQAe^we&wF0>qAY{km~j)=k2XehV4)vt;04 z244*qg8MMho}OjkD!l0j&WS^T1PykRC~{!Ig9#U!^kosF#(sE4x^&s{q@|h$8{S-q zN8wC`2!r|*`g15tiVb1*%eV|BNvJwgo@7Y$=SZqjZRXs$GUz6VMz^YL`gCSZi9TJ?Hhmg(YSpV*x9&AW2aOp*M7Oqm8+UHqyIptw9J)4RqxR^$VY^l$ zM~{n-zr486ULIe~l^^!m)T#95Mi*m`{<33F#SQUz+@#RE_VHaOaxd-(_4nyZAluo=3 zTVn9A5(9M1KMA3e&Oh$r+vq?FIka#)t1L|MqXXINFGdjI(y+%12|9^88t3EirX<(P zaJd3`b1bsSDF4F@GsrgcZJlI-dy>m8z5Ei)*J7J(OEAqm6U{UmC?tE{c}|(1*LR2QSBsku~fIJXi`2a%#~37QoR(=SNX&fP)tQE z7SKaIWmM8cD@FFy44q|9*j_WWkyl0SViwq4ouw$%Y86#-q9U_>c0VH3Z7^9s)yzyv z%j8{3vtHcs474)e-Iw2fZ4*;A+WZ}u;DSeE^S905R1Cgr*>%xR?5>JfM^kfT7ug*f zlXxkODgUzQ6%e4}7}|CPB(bm;S0%RN6J0zJ{mEFx)=l@*Bc*BR^gXriPd5$*FttqN7X6n2aZtAbsEjeqY$t@Y| zWA}|x%E}n3vR*7hGZ^o@3kH}>z5V_>O@!T4Sk?Em^$!mME(C{(fjH*xR&UPX52%GK zQJky@C8uw>lB4QJa>gCM2uJb&2JRh@Pz<~P|s{=rx;odBeJSV3GIYB;^?p{4GQ88s&SGP5^5<|)Yi7_ z)B>K&kVI2_#}uo`Iv@_Qhyr<{5TlqsD6Ua0L379rjlwA}P6djl!y-YLxSSvY;D|*8 zBo58E#~E&FPbqBAA03#+cfhfYj)Ww%c=!_*&e4byIpo8bc)A{DQe%uHBqp`uL;o!< zXOmn6fFcFi$RF+zlY?BFlSDbESuQY@{DRwLB$%1a+$&)p6y`7w2AhD5keJC7rr_SB zOfN;snSUGFZJ-%V3@XcD)#ME}^TthUdT^KXn%4xcgf9zz6P{&2x`fHzE`lmk?)K3hCbDR{R;AgaCP=~&2oe!1hnV3nqiCz?= z8P(`UIXcmBMzBg&vX?p8*-?`^CZZ=*X=&hT(UrawrZJW2Olb-)2vW(HEv@NHQ@T@_ zRke^FIxe@acAI+vQJcK_+42_TB_~5m;3mpaqd|hNK*3k|LHs9UkZl;jZLDR{!WVmPxn^0M#Nm zzz~_FV+<^$^O7OMRJ>M)z1!WTi1NQgGaHM)+e%-Iw*e-AYPrHJJ|OIm{2heuT`&e5iD=f$UP<+h#f2T8_|P zsZRF#q7=PE7;Dc#3uAisSEU#?Dtb)}0Hu=NWki`k4m+S~KT^-86k4e@+fSewSm_Bj z&oQIk751FaszBdm(EP+S(BSlI!d#j!w8~i7HZA2i&M7X!hX0GE6P>?EM^R&9iwQpi z`s%L?w9}SWcBmiS!s&=x*wdr-RK8v2q#>H0v{d%4Kho>KfNFLW+jeT6E7pbPtIr$d zbHE>}-NTa0NXMf0e+)w5@+@~jF#3=$rdc!@x$S3_?O4=qCh-+r@7)M8wVWCp>(>f9 zQs=?l#haS0_UI+y9cRq&E>!VlE3H_&<+yFv){~OwsjEA~xydwsz65*RWUDHA%Fz>~ zfu?%s7TRn2f@>BaP2A-`pZdw0V{?r)Y-tbTcf7M*NDyi@ZZ7@yZ;?c?4$!e!>oqTJ0j)xtS2?w z(t?$t-8v^8wn~8*D?DRwnM4!Pomu9-)ZlBC`q3v);fQoGxFCf+#9Q_C#=@22JJ!jf zxGV6gtc&H{T`blkEBAoy+idcvf_wQ#^>5gnn$ozRR#`RqiIZlWM7>6Ny~9Knd#1d_at5thQQmb`)snepeu zD3;0x92LY@_>mefDIrCZaL_G@X)Eh8gM1J#_mVIB(l4Q;7HyETbn!3q z(kBbkgSZbd7n3m?GY8?4UapcZ9sd(=?vgV5MK3Q%S;F$F&XTsyvOvB{H8}G$xJs%# z6SzbYH8V&wTf;Oza~98}HCqD!4TdW1OfJ!GGB1;0ER#1O$}3MZHd({4goO;#39v}7 z^H#H}xP+UEPPmwJUs#JYbK~yz0^%@FIy+HPkn#cvYB)!;hV%w9Lu#Q2^EZ3*Fw@gu zG7~kbGyF<(iyQ*H_aaX$m=um1Bp2?joO z?{E4oGIfeQ+jBiDbYK*-W$?=Y77Rm_Y#=j$Lp>BzXl(Wt)nCkD=-;>`qXNBI!HU@1jcth;I~!fr^*C?d_Ukw;A= zNfEIny zG8Ho~RA7OVq&QUpXJ$w4usb1CG_#XC;gt$ckq-%wTo2DXS57@vaO=P>{xS{gFxFvB zg<-kQST&ZAG*Ber&jRU`usY6ZFzyIxhUT{J&=5prmnKL?t|MHwHkA=&4NsGtZbl~d z<}BnXd&cS@aRsxp^kSA;jP_k1GrB0WVE4s0ul7mYQ)yc^VS%t~328I`Ggj8}`1CRP zHt_g}k7M_D*GPeS8j$wBfKTksaZkAeHuy0%T z=iD}B<|BG>mu6$eX7#TD^_B$1k2vs8)$}hr)eld6cLs?UW0JPxa`r{=gj}F@JRj7# z$gV0y3Yf5Rb!>+OnR`!6mzZ*QSlE+ zF=ZpTeu`EP7btvoWDOTWbwnf%2bgY=B@b_lce>|)8Zneo@o=pO*W`?YU(pToO@IR! z(%O%84F7ma!&Z9=F%!cOe*W|=ypV)f&|Ec<4XG!E*^pWy7;;pY2}7cQYnX?Hgniui zZ1gqOWN|9}wQ7NpfAyDO$GA&cmt|6tj2Px6W7l(1DIcxK$C?F->Zm1ElIPCG9OGDo z85bQ*&L97@9g}5{ZHzzQxQz)I{q8uBxsWV;C?zE_bOE3r*O5OOwM720kTKbj%+Y32 z=^v%XhY(pIUC5M(crV1!B}=&+@3=`J%p(!&BpK3=0p!Z;k?;zYjuG;8blGOsrcrmq zCPx>H?+jl~*NnYnf0J1?{Fj*oBOwn z$Nw2O(Ab>OvYsxgEm;Gf3=mD)5}O~Roh>V!+lgv*QjG7Jb<3HbL1|qlKxe`Q@t5F)IzaqDg9}O#`eWx~Cmt!YVAjy0jj<>r#xYtuHN1*Z-7( zozzB>0&19eD7dr0wuN!?LUMHjKd*Gl8G z`$k(lU^}?wOtv+uJg3jE|C%%c8={@L+d}c%(2d?eLPc{psjH(}xmD7pm{w1u(pYs^ zdv$tYcUOUJSi{yYU~Y=rf>aGfz55nlC68IH<5QWf+Dx!Jp>5rm;sZ&|WzQAcN)^J7 zcHQDNTs!fE*_*og6~npWz|Rf8k!>+ToQmbkU0=0r9b%|+E?Qmu-JU|*X8$##z8Snh zL!8CCA;`O-2YV*Wqv=9cX%f)45mc{<16@iEX{$NmVh-VmR&kBj5XS7;^J zVqqMAvZ`+X&Jh`d>4Mh%0=T_N=(L07LDFw$FHj|v{B1QZ<{nRWb#58dSIc2f{JIb0 z#yoSSR-*EmtMM1e7y44YdZPo{F@~n{DA#0`59flft>r{+HCM`SFK^{8Zm-<7v;1`} z-ODwcVyn<@Usw2`TGMgv_$F`CLtXVy9fhTlS^Dl=@Fego{cT$vQ4;spOSadm`PBE8 zNCn+Q=J9zeUuv1p|)D2g7Vr?%GwuQtXGHNe22v+h~IP+^SEL^5rHG-eOBIA4=3qg0)xx2 z#A_Z7ulR_)wc%sYdOZ9J3wM!R7$j0Y5=jQ<^&HHJg~iQH?Egdwlkw~?{(A;-2$#N^ z<*BB7T+u(CB7|I_iM(V^(zfl9k2%tJ1etI{C68>`wQ(7`;r|rK>V1*kTpihH@Jn`$ zN9nvOg_Kw6Z>xLZ*Jh6s*t9a zvgOBv2^X4lNfTwa489)T%vrN%&7D3e0(CfamXiesJOT<0p`=LxKhoCY;%}uiw9bL5d{F7qH>O zh*joYx3{oP2~+_XSeCdY+sBb7Bfjjjn}i$!zzf%950SKRdmeEFDVs8ys99?z^gcnT8 zc_-n7K|x0tg&1b27)*`H=hP;eiAL29@2uuXWdGe+Le+U%K?Xn?5aAKoc{iOnnTjjs zWC>^j;gQBrGUnJ1jsUPYU_&5MCL#bNnuuaUI2!30RWLpjr7ue|S)xN%I!TpPNX0-U zj#Zw;K_fikQO14!EZJm@lF^cZn37Qj)s$McNymsKVwDu0KW322o+DPn8jv&kg4Bs$ zP6QN@Qo0x@Pe9?>B$tUgwB(JMf+eY+Ia&Hnr7m8oRR)Y|HdIqPHss@?PY#(Woa#N~ z=9c{gS)`&#-Kr^}Od3k5dp63Ms-1t9imR)cLK-TnRH^D7oze~)s(1X=t0@fMY}g~$xfiPYEmon7PG%LYiDu8 zu@M~gp*S7grqUB#{4IeOLk+6fNw*xf#A9RZX__QX{q(~G>zpvwat}F~%M>xqW7S~^ zt`peS0uDGHb-#@?*<4m^<=-DOK5D{5^NTp!kV82#s2&3Tueif8Sl2^%A?Hqn^0p4I zyV*4NE_KH{Of^;)s-Jjj2u*ZirJTHloLxJtcw*H$}C|B=VT zpVsI%KcPVHf6rTn0O{A10`8=MXKSC^5|76_4lDZgxPF5bT0TMA|{9UboX&Y(}`h z$b6}48DpUIGD8{sSx|pS16I}$NU$Z2uZd240~BRg0Vh@kd}RzH6DQ_8udL8Be{&xe zrKq2&P)USNW0k4q*gp!g@&A2M%+ihah&Yf%rc9yHqTGfe$YqQXbas4^^CF2zJpM5( zRs@s(oY%+=e$kINv?Lu7h{;19&RTk+;u_cZKT49(jMSr{fB1;Q(k%!gJ!DL}ipb07 zgd{q#>!mQoQadC95PmEyq1~{Dr0wO+kK8LBn6`@8rjL|aJ#TI&e(CIE3-gGR1z7t%j!zC17$WmvS{E zb;;S~FlXwQA=31w#Q!{ELF{En*%&T^Q1r$*p!SfTS%OA|^c#L;B(w?+4yimbo8>Yp z9-wthltCS8*Gv|1n@rnQouJqA#C5JFeV^F|I26HJrC@85>oXrHS#biztzGmfRC@$~rd~3z z3?1iM4L79Ck`{%sDePynxV*zYv#3w~jYNWe_&uO-dxi zyEL?3S3SNWq5rcy)hH`9OS_oL5n0<arDAmMDy9t zrrtA|2mhVwR=fJuu#R(Ox-H&l(c`vd?Gpd6fT|pE3*vL+{vX@Pf zJD&qNw?0R%ld5X}5;-?Gk6>TG!RqG&1@@j8SXZ+c)ht!ii|?Bo^r1Q9NZ^z$#jG8wlU6 zkpOAZ+MjaHdEOZB<&=yhX^+s`d?9DaJ|X@c{=}QyD&BYq&-QYO+&LMT&h@SXK5$n2 zy3`9VqQZkdJ8(N(<@nA@&C4?Lj<)4DDQ5}?P$0CX`=#D2hk47he$$h4{pjn7=h9Cj z_W!868|=E7<WhpzY5H9R6&+JUg(R9`?LO21!Z zR8<1MrN9eIip7E!c1eX_8f!*d{u9-=6rUm?B^Z%@q87$5Z=+@8*i3Q?6`SUJ6FQ}V zOjb(rI=LIE5zzx!f}d8jkOj&wx*qn~)h_0Le@DVs>wlU*spL1VEG80Pk`5<)RSw5_ zfz0>wn~xRi=d}CPaEnjZ*L?E3l>NysI7f`9eN;PDV8maGDrCU@R)88Fhg|Q#p;pJaE%C8AUkulT9c%79U6%D%e4fWiZO;fth1{pYt)Jm1IhBAFaZ1 zP(nE~BT1vfJ$NHFF~~XYWP?|=UsfYChEy{GIo=Bw>5lb|*1_3ZZ}rcz~OBcLoP+6BtAin2GB0cV|aj^+ZU_lR~S-N)o40 zN%cl}g>KF>L&3$0%j7%WqdodZMp z2*nz>XjW3Qh@%LL5G63eg^JGTa_BTpDz!pqCSrHuKHSt5)EGkrG(#acUJ~U|0x^pT z1XrZE69$D!@}!K#_--r2i_lm@y=YwhK!A~`fOVG)#=w9M$caF-i3W)wMh8Gx^hh0O ziYP@wd{jzz6hY{vM*ibUA&6J7G-I|1MkpeY=CgW&$0nVWjZl$EHufa01d$Kf@t99H znQq=_j3dP!fRz*CgqMA}h2T_+eRPYxC6T%aV06G<1jRziC_^7mO%T&tG-r$)RhTdK zm?HL2whVK-|Qd%-CD6NltVWk4@Q` zd?|-!q9lu%k4|%&0@x2{c@AS)fYf#j#xRim(16tSmVWnT?;@QPxLk4x5zT`|f!J5k zs9URbLd~OEZG~Hug;+9)gJRV{yp^8LlT}1jgS0g`mjYb0L0VI_fB2Ce$uwIwNgzz+ zIb!8nN3)$chFj#hir~qcy)i#o#h~+! zm$JoBnDs!UXnhUSo*BAWCh3X9GEw)b^y!>73B1Q`Q+TZds+y;fV`VC>@AlKyi@~He@ZfTHNI=QT7fz zc1cE7K}}W^&QdsSnpCXkA~A#&K4yJSHbpfyq$RYDqftdM=9oU|bn}&BQ8svYnx;UZ zsQ;;BP4cGyi6@=KVpOqYDRxqKnqrK~p?o@WWJ;nV#wOlHm7&@)YYKon7N|^CUzd7) zErMh_d0}VDUAt1MuXJNSN~dLtren&Wt2%wV+NsbZ8vmNHsf((rVQHM4#&gIJrN&^1 zy?`7ChouonoexN@&ryNWHFnr4O!3C8+Xk)%d1vm>Y34eR%?WCF7nj|tAy?Y2h@quj zXLj)FT;EEsnJBKDcn{`q5yg;aYgw;ZYOMl0Aq!cs2%E49duVS_462|CZqNp*&<1W$ z3K9FT_^=NJxv&E}7}d$K!69e`F|s6EvL<`7D4Vh>yRt0XvM&3wFdMTnJF_%fvo?FP zIGeLNyR$sovp)N?KpV6|JG4X_w5p?RARDjN+6GM9v`+i9P#d*UJGE5%wA4|xSevz4 zyR}^Vv}D$`U>mkv8)jl#wq|>_Xq&cbyS8lGw*PMXws0G_ayz$lTeoVPcS#$v*7~Gv zP!4|kw}2bCf;+f`TeySU2GrID&Y=(efVfZkxR4vUk~_JSTe+5dxs*#?d~3Lz+qs_m zxqj=oirZz5i@BzIx~QAFs=K zTfXGWxZ|6?=BvKsD-hO;z3>~q@;kruTfg>uzxbQK`U|^w>$^(pvAwXpgF6m@OTdC_ zz@3Z0hHJd-%f1f0z7YJr`+K{Zo4B8=!2jM$xEM^h4E(?i48iC7!6NLz4=lkGe8MQ4 z!YaJNEZo8_jK96>zlQ<57Ca6%e8V?f4mhmCIBdf_+`~Xjz(L%@g}#F322 zkW0m$e8;Ao$XT4rK#a;`{K#dj4gVhS2EhEtvrNm#oXpC+%*@Qfa=giX(aC))4%A%D zpiIrrG}1`W>MT+rk^&*jX{>MYFq%+M0e&l9Z=5WUa(Ko26o z1rtrtt^Cmy?a}7!&&^!YCVkQYKMzy{|0)J4Dx_}~XdJ=IN3(zIMV$q>L6 zT+lKt17vLmJbl*U?9-|M)c?lo)cgDlH4p)BAk1vw)_+SIJp)osnzUCpK~1E{UgZN1N|E!1#r3Qus+w%q`@ zEdsjD+XrCOw*B6~kPmv$0QX$i`>YNk0N79M0r%_!`pw^1tqh0o-|IZwbnV_oz1rf< z)r|e%5FX(YzP~K}*#D6I($fsupZ(d*00XKp37!xJvM}1+UD?e|)?vU0Wc}QrZPTit z;V>=^efDlP++UE;#f+-*SF)7|2uz2PxF<41lFaJ>tMU8^|1s}rym{#+Oi z?(pM5kORtq1pl#p4(WZ*M3CtB>;;L=2Da1=C zv(60O?c&6s?K6GiTrLb6ehS`Q>(zei#{2AoUIV)D3_Lz5vIb?6r;0#O?*r=kVi1!01tp*X|B#hmGkLfAJWf@s8c;JrUWp{_!8r z>YmU9T8;%~zzW@6*0Vs?n4Jov4f0a{;xG^LxbE(@%>x8}07T#pdd>^$Ag#Ne&b1KL zxxNmkZ~#7V4nObi(N4)vKJ&GX?z9ftDK7)u?%krT3NHTvrx#f0;#F@3sj%5l5AIN3 z>ovdZu3hkK(DVOG|MNf214FOuYL6VJVAKKc4&|`l2vOTc?F}_>Q0070&S;|LJ2N?lKStT5k2>?gBC&@_Y~msF3b3ANo^2_PGA@ zYmX4@Oa$v-+sfYh1|Q`24DUbw-oBvv27l~JpALDy4oyGF(_Ri^-`uHA45;7)j^N=R zANs1m{LGK?od5B)AOoWS^`u|<#Blm~pZCrH?>yi4^)CAdK>NIX1HKUc1%KappZ*8H z1F4YvY_JYRKHTe2`|W=W?9T@6AOp4!^r-*)0Fg}KK!ODg9z>W>;X;ND9X^B@QQ}03 z6)j%Gm{I@ZMvfgle%#m#pSyME&h_e-QsqjPEnU8Z8B^v=nl)|S#FtytzEx{EfH_plRItS#+_UDZr(9_{tUV|Sy5uFC>KAD+&FUO z$&D|E&OADF%fm6lJ@+G`bnMf!O$sMI-MRGR(VMe(|9rjs>Sr^DSBt-- zTmAq2*`7Lp4e^O4+;K`QtE}-yAio4NOfknKvrM~$q)Y-P$Q0+Kvraqj z#M90vP2#gpKmP&qwrFL3tp_SFwU$^D9TW`MwGT329J+)kO&&?@SMUiC}&+1e;3*D63 zPz79IN1_cqblT;Y)pz5SmrZ)@CAeUN4@Nj6G|3IPVTa9CcOZDtDW_tKFUB}yjW_1_ z;(=v_w+)d;Cb?vjPewUql2y5tU~%0!PvSNx?zm=~Z?^g4b3#_RXPrn_#t@5VcCz4zw3Z@>Qr+-`jJ3cPT`4@W$4#TRG1amOErJaWk=r@a4i%P+?~ zbH)chNpsIX2R(70IvlBVcT7k9bk$R5eRbDchy8WgW2b#~+iS=DcHML5eRtn`2mW{A zgC~A?8*c0d+4?2etYk`2mgEV!zX`y^UFv7eD%p6 zJt$${hd+M#=cm7Z`|rm;fBpC8zkmP#2VejNI6wjx(0~U-U;-7mKnCV-6>JdJ10x7Q zcSx{-7sOx&HMl_zcF=<#1Yrn8I6`5yPY7$tOA6DX!ga9Fg)4+%3uE{~8P<@7H=JP( zZKy*W?$C!l1R@WG_`@Lvk%&h$ViJqEL?kj%iA{v!6Q$@xDn_x2Q?&nL7O^FDAY!w5z%rsIld)FK+Us75xX(T!_-V;kW(M>*Cpj(4OZ9_^S%KJJl;Cd^WlwnQaD z4$_cj4*g=tJ>I#Zg~)TTGZX-;*zQ=azJr#}U1 zP*wU;ec%J2MlI@5m6}whBGsu&eQHyoI#sDwHL6#oDpswURjzK;t6BwXSHt>Mv6hvr zXB}%=&8k+kuGOt=g)3X-`qsI|m9BTSYhLTRSG@97uYCpVUj^$|!UndmgEeeo5xdyK zHde8YW$a@mt1jzR*0PtyY-TmPS7tQ zJ6qb;*0#6BZEkhDTi*88x4#9hYbhIC;uhDq$3<>(mAn63<~G;4&xLMur8`~fR=2mq z#U5s*S31sam%Ekq?sqR6-tcO-v*jJ{dDYw9^==lumVGaH+pF35W|zJ9b?GMK#_W-^c2%wk4!nbUk`HMg0~ zZ(ehp-7IG~&)Lp(#xtGueCIvqna_XrbD;Y?Xh8oHTF`|?^r01PXhtWx(Tl#b7{pLI zNsGD3PF5HEs38CV0H6!_!-taDA!-tq+SI2;b*fdpYF4+})vtzitYtlGTGv|Dl6D8K z>vsTg;X@Y(kYA>Sr40@6!X4ajLOSrLQ*Ou)wO>0t!JI zb3c6E6Cd@!zy0oyZ+zDy-}%g^{qu`I{pC}?`Op`>^`nn{+-pDk)d&Cez2E)tZ-4yC z7k~M`pMLh6U;X57|N7k@fB4Ve{__9FfBo~1{`>3S|NKu2NmB~})V*=rJ7sGNb!iJs z5In_8vIKAiAP5b`qd**3JjD}@4Aj64rkU-if!u`O)?a)Fi%t9{Q!Y%~EFBC&BB*QQ)!!b0&G(^KSJi|6rLpNl@Hf_0)Wbf^!$0IhK=i{vB*Z~9L_tKvLQKR%RK!MP#7A7jNOVL=gv3d- z#7e|OO4P(l+{8@uwky1nbqN2rA3Q)VR6vuMh9E#iAgF~2Sc7$d1Rr2RUpR+Iuz_Qk z#c6OtT~tCI$&p{Yl3)bJVHCzCG#&873aTLdLB*$|!$8@3fkb@;;H(HDYdUL|Si-28p!eFEk8Ij0}+!2ek5sakBi{!|R?8uGu z$dCldk>rz)EJ=|(Ns^q%lw`@3bV-eDNtk>|lblJEtVxxW$(*D~owP}w#L1lm%AO3$ zpA^cXB+8?V$)QY2qg?+=q`b+dgvzIsN}r5Ms+>xtyh^6bN~g5SuEa{O)Jm}A%C98L zuq?~5G|RL^%eAb^vxG{$P^Unu5wUDbwX93F+{(Mu%e>@Ey6j80{7btGOuY2V!URmi z6imb<%)?~N#B9vPbj-+v%*otK#jMQ7yiCc=Ov)V0&GgL91Wn5f&HV^SEwRVbyhqej z&D3Pg)pX6)gw5BK&Df;P*|g2t#Le5(&D`Y8-So}g1kT?~##0o|;55$SM9$+>&g5jy z<#f*GgwE%b&gi7h>9o%3#7=fR33ZZ4Ve(F58m934PVofK@ifo!L{IWm&+}Z*^kmQX zbkF!~&-sK;`jr3A`oz!s)KB~5&-~1eQ}oXO-A@7S&jB^i0!2^)RnP-n&;(`B2X)X0 zZO{pYPzsgM3dK8BZ` z(HgbU8^zHa)zKa0(H`~D9|cmzQ75(`(jqm|BSq3ARnjG8(k6A%Cxy}|mC_IlT=$ zy$w2j13tA0J!KO>)l)#F2|p!LLKV|QRn$dg)JAnwBqdYZkW)le8#Sd=l>mnduv6a1 z)J?UJOWpqoQ0)g$?bLoK)i^!VQW4ZtRS8jTiBrW5P<2(9nAJzM)mz2YT-DWGb%{s~ zRaULlfU#6orBx1Ch6?EhW6h9YtqD<;Rb@@qV?|XoC6!gB)|6n@QB~I5kX2&MiEQQ7 za23~aCD(E_(kkr+3Fx#Pc!z$l2Rc~ScAeA=$OU*^*J{WBN9eRVy$L+nR|23`OXxI! z9o2l@*G(1Jf<#j@)mH;phJ;nvf?d-ywS*r~2|P#xm3Y@qbJ&dq0Cp|dhLu){W!QuD z*p9VVkS$pQpoI*Gflf<^@YYo zQ*Z!*r7`zKfZW?n3ERa~O*K^~0AKL!S~fl1L6v}+wcYjIR_qPm$qoNr z=VgiRwO*k`Uf-qGuEk&4ZQuEA3D!+r`&HZnM&JZi;BsYL@@-XM9bM(UUhRzu>Xldv zwud~(-V1izl*r%>#@YzZUW}#L$$j9U?OzdY3D?D5Hl0)zmRc7U+GtH*2&%8b;w}6=5EJ;iugMki}sg?%&-#(^DN(R_$F3*5Dl8TN@@+A=Y2ionSTPVJW6o z=*?jmUf?hm<1r>rE7v=zE zh+;18VI>w@HcsN~UE>&@Vx2u&={4j>mRdf(;gvvRHE!d}{b87pWHznjK^Fhp)0N{5 zcHIdM+NJgj$~H`*D|){TgK&FCKX?0VJw#5OP*B=*5VG9 z#gXEzGMRKWjFOy9A4;X24{0V-{7t0MV3tD+6lgEVnyS+=HDUyW@=q)3fAV44(#g{=e<@|xX#$J90xPFJW z2IrJ^=I7m4zDDYU^obFqXt9&SAN=;DU%=$7v37HeNU7c@TJ zQnBFSmR-W7?(YWg@D^{wweImY@AF3Q^j7cnPM70m@Aro9_?G|g`7Z17rtka4@BG&9 z{l-=M=I{Ro@BkO^0jE;;Ch!AC@B~-z1@8_2X7C4x@CcW10eA2Tx9|(c@C*m<3fJ%s z_wWw~@iOM{5GU~xH}MniZv#j16=(4lcX2Hp@fVlz8K?0YKbIJ{@f_Fj9p~|#!0{dj z@*o%T9sltmH}WG#auP4{Bxmv_ck%^a@+X(_DW`J!j`AwU@+{Z#@4oUa_wp|X^MUU2 zFemdeH}eA?^D|fTHD~h__dAAZ^Ej9DInUKJr}I0<^E^*dJJ<6*_wzqT7d{8{K_~P= zZyOai^h8(mMb8jHXY@yhbVhgdNT>8l_wz}&^i0?EHpl<;P51Oq|ME@;^-(AFCl~cn zNA*+>@>5s!R(JIoXZ2T?^;s|RSf}+{$Mp-h^<3xmUQh5{_w`^G_WcI-VK??;fA3;P z_GM@G@K*L_hxTY6?q`?wYPWWQruJ*s_H7sAZ0GiG2lvDE_HZZna^KZ)H}`Z`_eDkb zb$9o7-_mx6_j#xHCzbbl$M<|M@Hf}@e)o4b?+`fu_kkyPFTMAINBD%tkb_tFhIjbe zVEBiZ_=%s1h^P3A$M}@6_>AZHhu`>)2YH15_>d=ge;@ghNBMd``IKjQcVGFIhxu}U z`Ix79ZlC#@$N6f%`JCr@W|z?*1^S>D`k^QKqBsBgqeuFrS9+i~Ayfc`r-%Bem-?xv z`l`43tH=7R*ZQsJ`mXo-uLt|E7yGd%`?5Ftvq$^1SNpYR`?h!cw}<<hl*)_i)sGoF9+!-hw8Wf>&O1=*Z%G2{_gkw z?+5?z7yt1m|MEBg^GE;mSO4{A|MqwP_lN)g_?Q3rr~mr5|NH;`Y)F6ouYUd~fBy%F zY~%(KENHNxz<~)5GDJvlVZ(+CAx3nl@F7Nt8Oc$s=h&wwuwuuGmG=`Ky`N^Et|jaCE!?nFAJY12_ruT~9}_0qIIVGp%D`u0@X zxUb3%%2#H-ef$m&e{B3_W5_yr+UAZ)c{lXv(x+3eZv8s;rMjDLXWCu6>!;t9(*E?x zlX+0)KZWuXioK`V;eietW#;~6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui01E&M000P00DlP_NKl}>g9s4{d`IWkyNACTy%X5( zSCwBCFIN1ePMyV%9R;2n`Eleqf#u45yqHp;xQ{O{zWfEQ5lwL5BIf+nt*1|)1%v(y G2mm|n+a1fq{uZ2jn48o?zgxVBqGE@d#MZ z(99ty#S`H0kb#knn;}DEVv=)*u)3Vdj=;yqxu0#kX9cC0)w0klmAo1XIMn(o} E0NP7EbN~PV literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/ns-collapse.gif b/www/extras/yui-ext/resources/images/layout/ns-collapse.gif new file mode 100644 index 0000000000000000000000000000000000000000..df2a77e9cc50cdb15e8be856710f506d462a9677 GIT binary patch literal 842 zcmZ?wbhEHb`0o(Vu;KK>|7RZkKlk|m`6vG`Jo$g|>HkYl|6hLg|LXJq z*I)d<@$&!8m;Z0Q`hVy3e}+*o8Un*81QdU=FoV3K10q0qf`LPwfssSTW5WW+W=1|P io&z5e4!5x=GEI;OeCX1}EU(tHE{jAJP4AubO%sO%a literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/ns-expand.gif b/www/extras/yui-ext/resources/images/layout/ns-expand.gif new file mode 100644 index 0000000000000000000000000000000000000000..77ab9dad2948270706c9b982c5fcdce78940b4c4 GIT binary patch literal 843 zcmZ?wbhEHb`0o(Vu;KK>|7RZkKlk|m`6vG`Jo$g|>HkYl|6hLg|LXJq z*I)d<@$&!8m;Z0Q`hVy3e}+*o8Un*81QdU=FoV3K10q0qf`LPWfssSTW5a@jjf_kR jAsz;b4DD>fMm823AG&mK%ZJ76*!b{ZzXCfO3xhQP{>?dp literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/panel-close.gif b/www/extras/yui-ext/resources/images/layout/panel-close.gif new file mode 100644 index 0000000000000000000000000000000000000000..2bdd6239987b95025826fa39f37a036d73ae1c9a GIT binary patch literal 829 zcmZ?wbhEHbWM^P!XlG!MGRSrK@6dAaKf@>(4S|st0*XIbm>C!t8FWBi2jvL{4k-pk f4i1Na28TvQ9=?!{4GD)^*u|AnEG{HEFjxZs3+oT= literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/panel-title-bg.gif b/www/extras/yui-ext/resources/images/layout/panel-title-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d1daef54c578cced19b7f0c3074dd7a23d071cb1 GIT binary patch literal 838 zcmZ?wbhEHbWMoKTXlGzB%sOhAecUMblu_OpknmbK5V>R(wmyk!^#qaiSiLO}5+3(z&}UbNe&Fw0C0UOPyhe` literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/panel-title-light-bg.gif b/www/extras/yui-ext/resources/images/layout/panel-title-light-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c2c83d82536f2e1e8c1fa15ccdf6683047b1d34 GIT binary patch literal 835 zcmZ?wbhEHbWMoKUXlGzJdGFVm`@haV{B`m1uPaY~Uw`)d){EbFU;TOT=Fj7|f1bYo z^Wx***Ps8s`}&t*6pV(zunPgjpDaK>{b$et`3#gN7&sIdqzxh#C@?lLvvCPXC@3&A Wv)z|%kKX-x z_TkUV&wm+4!Dt8!#}H8b$pZA&e+C_p=RkRafy0-9okPYWK%u#rLy#**AmKn$J2Q)p zz={Nh21Zf+FqsJojYs=sS(PMy7OF5cvh&sKnGv+0v0q<*pG<%Q!&xR)rDrk@3zqxO MXKm)=;9#%@0E9$42LJ#7 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/layout/tab-close.gif b/www/extras/yui-ext/resources/images/layout/tab-close.gif new file mode 100644 index 0000000000000000000000000000000000000000..45db61e6000bedd9a4eacdd171d99a9af159389b GIT binary patch literal 859 zcmZ?wbhEHb+a1fq{uZ2jn48o?zgxVBqGE@d#MZ z(99ty#S`H0kb#knn;}DEVv=)*u)3Vdj=;yqxu0#kX9cC0)w0klmAo1XIMn(o} E0NP7EbN~PV literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/s.gif b/www/extras/yui-ext/resources/images/s.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d11fa9ada9e93505b3d736acb204083f45d5fbf GIT binary patch literal 43 scmZ?wbhEHbWMp7uX!y@?;J^U}1_s5SEQ~;kK?g*DWEhy3To@Uw0n;G|I{*Lx literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/e-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/e-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..b5486c1a95bcc0f39a88c15c10c04ef7c3c561dd GIT binary patch literal 1062 zcmZ?wbhEHb#gW zSa7hJLs%>3#D;~3+Xa-p=6GyebhKN-IP1=djf;=>D>!$_cy3y9a}Xwye0g*kiI*?5Qm)FE0;R>^0YG>#D1(BQ|H< zJ+*c9_4NsdyJWq$t+}~5+bHZ`26bb>Fw+9?{8q{mh;)M z;o;#9VePmxJJK5%IOMqVHRPj^sIT3W`5a^n+Y$P=Sr`RJG*P^>+2hm zPtWt+z3uJo9mTKjo!!0t{rv;Y-12^Vc6@w%VzPGpxjj2SKfkcpd%oY^U0+|{*qnX; T+}_>a-#<9q&HP*pKCAv-hK1$|Ns9CqhK@yMn(uI{$v4q z^gn|R$h)9C!NBpKfm=XAL80MbGZUwri^YZqhZs0z^?H5?BpvP&kx!db5t!`W$7S2b zqB-%Q$7EIBJeSUo%H9(-b?1e=ob=3RreXN4Gm*mSr)OK$9{O`qIOF^RkA5xFQ(IO9 zFA8Y)Qk9(g>dN%6%}IB6ZPp537_~c2R9fuK^(DT0C)w`)@-kv`_TxiyyRYTm+?Dlm z+u82#x%YQh|7ByF6IPITsO+X(*qn%W@yBY|oz3n@jiJwDpWpD!D2@#*RM zbouaqd#t{`KC@K){5zTIFYoRwZ~uS)Uu;d~r?Y35yRVo1RrUSt+WvO_e>SyWKknT> zJ%9fHy1zfqK96ts%NTLLo=K|Xej|%gL_(8*oyNju5wi@%W(mC&iq(=uJ08}`wQ)S^ zU@r4m)TA`+$HFenMHNXcqO(ps>K2aMv8dblS;yl(gIhO}`i(wCBu{X-7xARuS!$-r zBtxy6DwFLl{a7+3@KuG%R2RL@rISOsESFA=YWlf!dTg9#+RVgBGoQ{#TXpj3tc*=F z(`J{P%UnLE;@C>{IW_xUs!yq9`t^KTlbF|wh3RZvD`vN;S*=*yYqTq4ZlxC2%O&OS zey&(Dz3kM>?LPQFywyoHAYVDT0ajVyEf83S5 zYUk}~v)}G~z3g<}j<=J3>+SdwC9S{f)2`L|`~Ez7{eCaQVeNvw_itHmILNZPy5Jy> z_M8uUINa|T91(v1`~4w4?>U7>|FZqra8xea=i@Pz{v4wd67%mAp3VHu<2 zhTV5Ioz;IFV|>wdeI5}aFh%{jYv+pP@iy=AuwcHjMWHRrml`Q7q*+i$mvZu8$Qzn3`O RcKf}i-@V(HGcqz*0{{svxFG-l literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/e-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/e-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..eac9662eade56ad43732ddff31ebe463871c445e GIT binary patch literal 1062 zcmZ?wbhEHb4q>gB6B`yDZWmDYn&Yu?(a~-Rdwi{%g@huXy%gj+Op!}VvosMv8T4Iyu3VMvDaL$t*frCj@X=a z_te(a*ViW;?vnN1w&v#MjLWNHPj6d$dwap-Q**tyue-au;`6J!r?;=azrTT*Th3?4 zhKGkcgtg<&>_~55;E?Bb&`2;ka(p6lgjs~8(zE7Cn)zivZYI2Fo-4gN?(D9uudi=N zK0VKO_qMmUcND+AcXs#o_xBGpbIbef+41r5iOJgW=l1OU{QSaV@A-avcYS?*V{`WX Tb9;AxfB)ccH}iKX0S0RTywIF? literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/e-handle.gif b/www/extras/yui-ext/resources/images/sizer/gray/e-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2c9f538243ecbc0364b1afd7287248ce8f2c513 GIT binary patch literal 1586 zcmV-22F>|LNk%w1VG01y2ZsOv000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui015!m2LK5F0M(fb#|@jog8~U2L^!bELTm{gE{ymP zV#A6QA7-3*QDaAr3O$AdDUsnwlO+vqM2YbuOOYupo>b|Q=1iF}SK7>36KBhtI(@?Y z$rEVLph%A@HOjQ8Q=(9ZN+lVU>eQE3vtr%4vnp4iTDx8q8y4)>q)ok&J-hVjShH*6 z!kvrOZP~hN>9);__if+1d;JCmoK|pQ!gkpnR-9PwU&ed~LpI!4?_$T2F<-V^`LX8C znK?(^>{&GB(V$6(F3oziYt^t*%SKK6v~9$-ao?V-yEpIOpK}8@?K}8xffOkEo#kl2fezwDeD{e#JT~D!6iVD@GL|q$@_W+S)5Z!KyT@ zM#XyctE-hlD=MbZvRW;*(|Wopwy3_!t+d@UzWn0r@4W!SD{#Hv+B>kp1gm>+!3-;$@Vp2|+%Uuw@B8n<4ojSI#r+2S zu*Dv0O!3Afk8Co?7@yp6$|!%lvdb6495Tl-i`=r!FXLP@%`=yLGtVsN47AKa@9eYC zM;ooO(myBN^U_Z@4Rz5`BRw_ISnFIh(^gCEb=P2XE%w%AQ*CzELu-Au+GsnycG_^e k-S*XN*Bv+AcYi(h+j83v-FMz$mp!-Mg8PlPrvU)~JKnY_G5`Po literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/ne-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/ne-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..c9c041c45f673735de9f54f7967eddec62cde469 GIT binary patch literal 839 zcmZ?wbhEHb#gW lSa7hJgPTi$AwlsV10#z=iiLm@LpO)4)SL=|#|Ii1tN|md5{du- literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/ne-handle.gif b/www/extras/yui-ext/resources/images/sizer/gray/ne-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..942ae825357ebae7f68e5ef818d7ebc5de4c02cd GIT binary patch literal 854 zcmV-c1F8H+Nk%w1VF~~W0EYko000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui015yK000Ox0I>-iNU)&6g9r(R`}c1fLxQMK{fqby gBC2o^w-G#NZrs9(1Jj{1N0Feqbmt<5BNz|>J6tuIF8}}l literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/nw-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..23fced98bfa4e805e9e078fcad909735344b7957 GIT binary patch literal 839 zcmZ?wbhEHb#gW lSa7hJLy${=AtBL`k&(%PC%{07p_^G&Zcc}Qazg`yH2@eV5k3F_ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/nw-handle.gif b/www/extras/yui-ext/resources/images/sizer/gray/nw-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..d39b0c38d8994139e389a7da016506e0537aac66 GIT binary patch literal 853 zcmV-b1FHN-Nk%w1VF~~W0EYko000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui015yK000Ow0I>-iNU)&6g9s7+`?qajID-FBp^Au# f;5LcjBtrZbZk)Mu5G9&JmyTdYROiyE3kU!^<_nt% literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/s-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/s-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddc2e18ce48da6338fb4e065effd31f769ae3e34 GIT binary patch literal 1060 zcmZ?wbhEHbyui-I(9Qq?YgWws|NlRjIZBL%z{m;##h)z9ARp_12vDA2;P}tL$RXpg zVZp&>4q>gB6B`yDZWmDYn&Yu?(a~-Rdwi{%g@huXy%gj+Op!}VvosMv8PHh8W@=7yR~vTWL;hzu{rDR zsjaK8uTMDKCF{Ly&CSgjmsiD}{=Bkb72~~Kt-q(Oy}P^O^Q*h3x39myzk!)s&S%Gl z#F1=;#XNk%w1VbBK(0EYko000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui0MG{t000R80M!W`NU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGiuz(v7^V2AVZ2ANwTELlPFWFT*({Vj%bu;+?Z0rgaihAOo3`)Yz=I1PPQ1ABU*OP@}?y7lYWvuoeZy}S4C;KPgmA5Xr#`Sa-0t6$H)z5Dm@7rtA2$K=XW)SdCaB+*pMVA`=%9oaYUrVeCaUP7j5g}%qmV`_>7ZqiaYU-(|rmE_ythVavtFXocie*3mJC`c7>Hq)$ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/se-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/se-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a678e67fd6edad35c463cb6d96b05fc9d6e89c8 GIT binary patch literal 838 zcmZ?wbhEHb6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui015yK000Ow0M(^ChYD3VYzVQXLuanwzl7M%nHv}G f-@}9j!xh{H(V;_#75{Cs2(hHelPFV`3^a literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/gray/sw-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..937102c6b23e59f512f74b5393378ced56e006c9 GIT binary patch literal 839 zcmZ?wbhEHb literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/gray/sw-handle.gif b/www/extras/yui-ext/resources/images/sizer/gray/sw-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9e2f563a037e362e69290dff5c19f0316f4659b GIT binary patch literal 855 zcmV-d1E~B*Nk%w1VF~~W0EYko000010RaL60s{jB1Ox;H1qB8M1_uWR2nYxX2?+`c z3JVJh3=9kn4Gj(s4i66x5D*X%5fKs+5)%^>6ciK{6%`g178e&67#J8C85tTH8XFrM z92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsyB_$>%CMPE+C@3f?DJd!{Dl021EG#T7 zEiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOiHa9mnI5;>tIXOByIy*Z%JUl!-Jv}}? zK0iM{KtMo2K|w-7LPJACL_|bIMMXwNMn^|SNJvOYNl8jdN=r*iOiWBoO-)WtPESuy zP*6}&QBhJ-Qd3h?R8&+|RaI72R##V7SXfwDSy@_IT3cINTwGjTU0q&YUSD5dU|?Wj zVPRroVq;@tWMpJzWo2e&W@l$-XlQ6@X=!R|YHMq2Y;0_8ZEbFDZf|dIaBy&OadC2T za&vQYbaZreb#-=jc6WDoczAeud3kzzdV70&e0+R;eSLm@et&;|fPjF3fq{a8f`fyD zgoK2Jg@uNOhKGlTh=_=ZiHVAeii?YjjEszpjg5|uj*pLzkdTm(k&%*;l9Q8@l$4Z} zm6ev3mY0{8n3$NEnVFiJnwy)OoSdAUot>VZo}ZteprD|kp`oIpqNAguq@<*!rKP5( zrl+T;sHmu^si~@}s;jH3tgNi9t*x%EuCK4Ju&}VPv9YqUva_?Zw6wIfwY9dkwzs#p zxVX5vxw*Q!y1To(yu7@dCU$jHda z$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD)(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lt)=I7_<=;-L_>FMg~>g((4 z?Ck9A?d|UF?(gsK@bK{Q@$vHV^7Hfa^z`)g_4W4l_V@Sq`1ttw`T6?#`uqF){QUg= z{r&#_{{R2~A^8LV00930EC2ui015yK000Oy0I>+Yh5$94ZWq95Nmo l794Em;N}uwNKib;z{ui|Vj-Z!(9Iz$HK#)0@qq>gYXJ2^5-b1! literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/ne-handle.gif b/www/extras/yui-ext/resources/images/sizer/ne-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..09405c7ac7b321b3eb9170b1584167448819a071 GIT binary patch literal 854 zcmZ?wbhEHbc63}qqP#3eHjE2L+1SS?XB|ZfS0S0RTeD^Ni literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/nw-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/nw-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e49d6967c08db2c02a3aeb9c1f3cacb9c8665f6 GIT binary patch literal 839 zcmZ?wbhEHb+Yh5$94ZWq95Nmo l794Em5abeINJw;KWMp#S2{2G%=w_Cco6{kn+|a;a4FKuB5a0j+ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/nw-handle.gif b/www/extras/yui-ext/resources/images/sizer/nw-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..2fcea8a9285dc74626ba9374055b25ab77e53a08 GIT binary patch literal 853 zcmZ?wbhEHb#gW zSa7hJLs%>3#D;~3+Xa-p=6GyebhKN-IP1=djf;=>D>!$_cy3y9a}Xwye0g*kiI*?5UEB1_q}2ZmnDnS(jHwY|grS zYU}Fj>k|%l$$D>Fb8~aX+fl6@9wVn{Oa!M?d$LFZ(!z@^VzW> zaVFC%HL)EM4v!B{Q1+hZvvbqa(=&{-@15DX`T6+;&fRjpySBW%ydrpY+}T}QUtiyl ze0rYm?rm>x?*pKCAv-hK1$|Ns9CqhK@yMn(uI{$v4q z^gn|R$h)9C!NBpKfty3dW5a@j%^bp7F()=GJlrmz>@~+@*_y+_d!cbc5tmb38XMJ3HH=_|=`0o0p%T&eFss>$PRY#l;?zwPH_g zS$TPRz+$htURzgPT^+GG>+Y$otFNz5INT-cy=~3S%^8FMbi#@YAI?A-kP`~v50 zIp1AdUS3`iygKgeuC1@HZ%95pZ|#k>jf~q0nRm>cz3u(|1I^s>etUL&e0*ZEcKo?L zJ3n7!TI4<7Z||eAWv;!(H3F^$JPCf70^_gXw#@wm_C+l$Bj4s4oFCb)=Y zKAGsDw(`j&AG4QFCI`4_KAjR0micsQMB2)y(_+eAKAoP>rul3}%CyX9Gc%U0d^Rg* z+skLO3yx_%pHp%z^ZDG0XDgr2tNHfw`TPbptrrVg#Ijy2>`+_vVo{ITs~3wWxM{sy zG9@hQ<LuU0IXmi21oie;-_ty;6~)vMJTjxl$oIxtuR03tF% AKmY&$ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/se-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/se-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4c1087868afab5b5bfd329f52d9907eb1c0061a GIT binary patch literal 838 zcmZ?wbhEHb+YZ5$9Lfxg96SOJ k3mltSSY>Q9925^Vv52er?AV~l(9La}b>~E3vIB!P0N;ZWjQ{`u literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/se-handle.gif b/www/extras/yui-ext/resources/images/sizer/se-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..972055e7b297a702ab9aa2d799d133b94ac92315 GIT binary patch literal 853 zcmZ?wbhEHb{~M&wt%~@%zrJ-wdN* zGz5lq2q^w!0s8MhgAT}-pgh6AVaveCA>$E{(A3N!$mMciL!xsdyOP%wjSCG&yTw_> nZk(97*nvsGxlP1k!4l8OOsp$nb_OLhOgBgro5QJ~z+epkjJq?f literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/sw-handle-dark.gif b/www/extras/yui-ext/resources/images/sizer/sw-handle-dark.gif new file mode 100644 index 0000000000000000000000000000000000000000..77224b0c06f1666685286c5322fb02b4cd2204bc GIT binary patch literal 839 zcmZ?wbhEHb+Yh5$94ZWq93m15 l2M#ndammSOI2<_C%q421Gvk7Sb33nm)}0d@l^YrutN|0L6o3E# literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/sizer/sw-handle.gif b/www/extras/yui-ext/resources/images/sizer/sw-handle.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ca0ed96df2059fe283c1d65fa1032a777e1ff97 GIT binary patch literal 855 zcmZ?wbhEHb-?#P7;$1Ytu zaplUX>(|fRym{{S?F)DAT)cPh^23MM9zDAL`0jcWvj^pRv2Xf5GSTx%=ki5wlN! ziI4aQXaE2%t3xUk$z;#w<|Y&hu~IpuQc2b78I5LEtCcS=D_2(+^m_IBy2fD88jVXE z8!KkB&SKG9t!p;hI`De03;dr8y!Th+fB5?V{*}b5PXN*TKtxeO?oh9^F8VEOiE^k< z))4zaepl}Bqq*jUlPI-vn5np%{Mqfqyk)ce9_DkfWPZfH(3XB>p(}4RCI3NYwc9vf zjn@25s6)Ne89*;FbKBlO1@hS|11CE^?am*==CF%LD_(TQ;`D>1?3zOb0{qf&`3gAJ zMCBQTSi?+rfu3m`rv>vTIl{rq^dI+8;kRi+=JB83#8Ds8hOHxak_sG0uaDTl`^PJ( zo!3X5%@g&pD=oFUe*1=53R2NIcnCWrFxqXC~GM2eMkqVg`lIt;+#$ybU zr3ur|vfRcCps$({r;@EL89I{nPPT(({pCy;vfd>iQ*Ethpo^TU!w^ z)&ARsVzT}IrE<2NQ9^au+e?2+)gsCmWJd?7pY7K(pR+aY5x`p$emTxJ8PZjLBSswV^-cX9hJDjO6y7h1 zJVNnHqtRUd%)u;=Ulw!VtYkLsA|)`FaFrX7C;s3GD3TlS+sb3@laX+;;KSRxoBQ!`COJav{IClwzGQSV%5$cm#*@@ z*CF08?dVGz(!y(H?N#A*(f}{~Cq?KD8?GtRc8%ZSw4D^%jf|TwfY7_%-Obvl^gR>( b$k%)3M)cD?OH0<)p0zb6{j@D20{Hk}th4;{ literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/gray/tab-btm-left-bg.gif b/www/extras/yui-ext/resources/images/tabs/gray/tab-btm-left-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae47e170c594f23bf5c30bb6fb4c5e378e157f47 GIT binary patch literal 875 zcmZ?wbhEHbWM(j8XlGzpvts6@OD7&bzVY@40yn1!-&6@}B-aY#8;mPOE&%b_s z`ThIrU%%e{`Saob|4;w_fBFCa+yDPR{{R2||Nr0r|Nk?Lg3%Bd$|0cmlLhGf{|q`H zPk{0S1BVBLW&nf2ga-$jIQX?pP8cK}Zsk*Un)74BqQjibsysag0*4N;Gt2Vi7)&^L kfR$O4$Hze6-~nc4ULGBT2?q`^GPBCC2sA8jXkf4g09rRzr~m)} literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/gray/tab-btm-right-bg.gif b/www/extras/yui-ext/resources/images/tabs/gray/tab-btm-right-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..bd70cbcded73f1356a939b13784df5cbe068fe16 GIT binary patch literal 1601 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 literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/tab-btm-inactive-left-bg.gif b/www/extras/yui-ext/resources/images/tabs/tab-btm-inactive-left-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c1d8f413fab5f02c8d242562c2e1cabc757e20e GIT binary patch literal 875 zcmZ?wbhEHbWM(j8XlGzZoqT@smixP>N`pGZ~Mnho8hJfNv7NFbz zGw6VP0Ll{#93Bjs0SpQg9vo=m;MX!aVUT#Zl~37e&W{a?4s$ZA^7I%896G?xEX$K) nFyY_038 zR_0Od>Pm~1;?&Y2hbStdLsYx~PdtzptDPWnz91loHr>M3kFlh`Pw+fX^2^L3q-T7E zgMA3p0Khj)EmOM5lk50HI??cI*XU}Ga#cF6mrd&BQ+kCO9GwQoX2HpMP^|@LmcY4X zgH~r))*DvAHE?Zh;^}kX)m|0&-xhfHdH8?qAprN%;N>R(WC(!e#SkTJV^zr4F@+jQ z`$P@u{cH}g=h0Ms%;|_ZO%GRnC;qcrv02L|)m`)#!oulZ%M3H+@(d@dFCqIuYPoY` zx;$~=4}4X`+iYLr5|_w)?<1j9u+nk5`O}u{eoUsIps(~98-)eCNrH+aIWpW*Pw|Sd zzm6teAHb}Sx8#7_4LRMPtq=`#Ut;_miU__%mzddZe(tFIkx8riGC$9Bcg!fNT zXzXi!Hg3x&_3#rFQU~Wru87rK(GN9sUru`?y!Wxi07n}u!=uT@8^{E{@#f)FyRiyIK${p*1;lpzu_C^yI+kWP)x=k$w`xza z$Xj)29)If=PG5m zd4wd(z5Id_%l(VR0t>5<=CCx8en~_!p@YYvIUOBs)fgxLF{{)m z;PZq|p)lf}QY2A@Fi@vdUkZr_twN|v5p+V`N;uXfnLLU`g=rE*uHLy+$kn$UL_2bq4B8p;s<0kKKu`H@IPA?f&&c0F$TJEc za9(BjajJI=nb_$aKb+?BP8^NQS58Ji8PmuI6MDb$1%wibKJ0 z1FqfK57apS+!>JSpHH`S`WMdbyZl-_;)oP~D5@;5L`)P1md~ZR11ou%$$Pr|3uSw& z7q5ta)Q7!h+yhB9$w5O=Q(170+#wD=r4G1*>sQsu`y1aQ7THw#_52&pfWSNM{mn{5 f%7Kw_{M!RlZDQBKRzup(fw?g=C1V=~13vy2u}b^O literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/tab-btm-left-bg.gif b/www/extras/yui-ext/resources/images/tabs/tab-btm-left-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..e36ad2015f109538a86e123af2a3379b1e7dd9d6 GIT binary patch literal 877 zcmZ?wbhEHbWM(j8XlGz>`0tQ9`TXQ9_YdFtdF;;5llOj|eemnTqhFVw{J!?=_pKMd z@4ou;;LV@M@Bcje`1jT4zi+?({qX(Y=b!(+|Ni&u@BhF5L4aWtjE2C_3<1TTEX*L6 z>wpMQo?zhcV$crZP?+%GKobYQmdOc&#KWz8%1(2BY*^&X#jMUV#lYZ@0|&D_Pl>^X ngAQ!W;yfV+1_vEjnE8233^p8aU}9$H*&^WJaGsHok--`OmAY2X literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/tab-btm-right-bg.gif b/www/extras/yui-ext/resources/images/tabs/tab-btm-right-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..b538273da697f403c690c49802502f995dbe69f5 GIT binary patch literal 1606 zcmeH`YfoAS0EPjXC0;s{Icqu_-P$Mu+I4Yivo0gsf~ZY3nbCeQt6QD*f}NQgqo&zh zWun!tuC!RKPAnF=NJT+#UTJL+>%Da7L@Rd=91!p*sEBOczgW`e!}Iygle}r^gw)et z;ou*@XfPPwkN<`~PZzIGtnA8Hcc)(N&1&`*bbCsJS7q|90Nyq0zQ(q%ckG*7J}cz2 zZ~L5{18Dca<2~5(`F;LZz+UsZ!2h$rySvDMSIcq#>EBPlP<~iIP9#ytd{l#a3zM%9 zc23a3j%TzH`|dw&h&&ZEqv&Hz-i-O|dQ|#zt^5}H3ts+IzwsG8@#3?#bWv=^-Q-H^ z>QrUi+#mRwpkuABxJ4F`{@#Z?F<04rs^!!6i~&pMh__g=R`{i+x2( z-atKBpq66PkJ~esSgS)6C}V^#?Y%&~>JM_iLlJ6+eti>5zDMcP_uq)lG#$OtZ{*!M zSw?QXA~LhuKWPX&S|zr$J;>rSTB-)X=H81bZxcHucJ*K-_;Pkw>R6Z61V^768Fc9t zbZk~)#Wl#hz{>16H#)QpE{n?6=SGJ;4$VY^Kl5<8X5Uyi?O-jr}*rELPm+HrI^h%wUQ(j)4d9Lyt(arRf)NsVyf@P zhiqBQ9o2ytfJu!g1v=|udBFX~WGldGB4A3o5D5jA2X~8j7IquiYUyUyVyv7lMyZv{ zVe_m!UQm~eFO>T+V2@Z;3JL~IJn-R&+Y0u|0z_#mZK4GN)-HaL zTV@|vF5=rItK?|`9!14&3>p|^8-D_9{>G3^0&WaDup# za84QW2+8>f71!f@9Fk&lP8<#{lsyU0Be|YNUg~klqkgoxCSz#0O~r|3(&iMp1D6fQ zNo||c?@!{OnWQBWG@EMff#%M5Y|uRZP^cJ>3@_hWB*qE0o}W#zZz;3W61HFDk2HkZ5qF76h%S4dL3TU{}k;931HIIQ{&idi5fT~!}Xs$PR5 l6L&P!BbRryb#V`Obd4z+JNl-y#9hPfyvwJJa5(Ive*j2i2hRWi literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/tabs/tab-sprite.gif b/www/extras/yui-ext/resources/images/tabs/tab-sprite.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac89148b64f047b6c3186e7629fe3888c49f11bc GIT binary patch literal 3088 zcmeH|=T{Sk0>#5nA_Apq!BRx377$Y4i3;KM8yC{R)GVbv%UkR=rr zMXM2zOu`Dogb{|>0R%EYMr4GLgpi#O2xQ2}`X zK#(cuQrSQmVXB5Wf+CGzJ2?0*P6L@k=;5~Xaf$D_?NnYDo!8Ce^|5)>0UqN6k2S;} z7~v0b`5fLTZ*;VGY?(5?OrJEc1%|K|l{9VW%wHf|@ZLY*bUy1fv846N!ECLY>VjKrv;*zS{?wbl*(;XS)-XdY-5L4{`mS+~`OGhQ z6894(cK~s;&;>>$EDWQE8vjWhaAo&pkd9ae3}ZR6Kg_>Di2hx$?N&-NI)VAm8*nPpm-;E3ULG2w$X8cF(`O z&b>VU=S?Ac{?%`?-5el%y{8C~gY4Jr}AUM?lbLcKw1`sCk(o zUO*ypJ;kW%r%7TossmoHM1r zQe5&tO4_cKjo0WNNSu=4UME#DeZ$AEvG($=sJi^7aH{@8WslPbf~;<<27Yk7dYy4> zd#!rtD|fbf_@uw|`pB8cZSs+bgxVXSQK^d>-p(7gTK>gCn07S!MX`456qc?12qD?( z#=mF6bQ6Iei*=L#k(k)JDbE#KyZ#rr88_x~0FxVS@lzfyw4h^>D5q+}x2yULPpGXJ3S{bO(1^N6YVTWg*u4 z)4J`lESNwZ*Z&!!4_jtBIObtJ9Ffhhmox9E*c0=U;{Or9Ii{zhX@?sYN9^MY(D z?M->$z8y}Ad@!_fQ#q~AEl}~`WYLZ-wdHWnXhlI3tJ0yB_TD>7Q5a`awUr8{?5R)` zB|@v5h7%93Yf}`b6;(OUgQf32)C(rwb~7qd@Cr;hgR=!q|<@} zm4B2LRqt{Sp+lmTkDjrr-TdivSoA|Pgw0!z;~|XG70Smb=v&W7IwOLpd{STZ7L*Xe zj2;@wvZcNC&ZIMA4a#z|O^t6}2KP4Mv!|TSiVtjh&P|8!MTW4GqE!`qR?Yra zIy)sx^+I5S44{VeU#n2P6cQ#axb*%EqUuk15%SP{$UxSZ>Xn{_JffqU2JRSCuK`A+ z#x-d0zLOdOgrRlJ`_Z&E4Q*ef@>Y`m1L=_Ty4?d^y`=9Mj-$ zvazu`2Cq}e$s%pU#aV^&dz`fO`LHWea|E9fsBI`M#{KdQlTVMJ3 zcj!;nF;Oj>I_q;k`wFlT==!&m8uE`rr#HRO_j!ah6hyM79Z353z9kJs3D6m*kIyLE z!@7$zSu-vxdTNkeV`*Odg`A(@G;mnsqjJ`)o6nc$9n%^gBcXGiF$d_tUhziKbSP6Tp5Ei%X2neg% z3pxLV59Wsv5T9$!emrRSkRH4h=n7kalzn;r>v}?s|G7&!58%THyM0ej`I?`4VHmmN zW`>Dmi?{B?S=N>`<4zU%Ze|&{ZNdBvX>3W4Idlbd`{93u zr?=0nt_9E(-zxtYCe6An=J_+i`%^y4el}-sN?R9a_bbH?F0@SmnWe=lthd1DHzeT9 z;3W!cXSirx0?53yQ(?UezF?MsGe^i2)*!gp7!R_jcTrmJg-e#>aTeq-rS&1WR1*)f z9K55nJ_cV@#N#Xlc%?NIE?bNTt&{i57|O#FcTBh5S@`JFHh0P=jvSh9s@1=bBq>TB z?w{Q`C8dWS8GYLITZ3QSa$I_+s$=btDE%Dq!_gRZP5C}?_>`E_bcch#YeZl4xpiu| wQ%mtaEW3AmWg?lV>x^uXW#3H}Y&LzMeAn5OSGUUb>sqeAdqjO=n?2y*UxNsNUjP6A literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/resources/images/toolbar/btn-over-bg.gif b/www/extras/yui-ext/resources/images/toolbar/btn-over-bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee2dd9860c799be6dc194b387c36a953c55aac59 GIT binary patch literal 837 zcmZ?wbhEHbWMoKTXlGzJeCy}&J3mj~|8@T1uggzJpf;!hT!Z~imrfcyl?6AT{b$et`3#gN7&v4Zqzw`_ELgzA$|)pg(Xe14 SBQvX#kb;4O15gDcgEauAx-gUg literal 0 HcmV?d00001 diff --git a/www/extras/yui-ext/source/Bench.js b/www/extras/yui-ext/source/Bench.js new file mode 100644 index 000000000..ed1619425 --- /dev/null +++ b/www/extras/yui-ext/source/Bench.js @@ -0,0 +1,43 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +YAHOO.ext.util.Bench = function(){ + this.timers = {}; + this.lastKey = null; +}; +YAHOO.ext.util.Bench.prototype = { + start : function(key){ + this.lastKey = key; + this.timers[key] = {}; + this.timers[key].startTime = new Date().getTime(); + }, + + stop : function(key){ + key = key || this.lastKey; + this.timers[key].endTime = new Date().getTime(); + }, + + getElapsed : function(key){ + key = key || this.lastKey; + return this.timers[key].endTime - this.timers[key].startTime; + }, + + toString : function(html){ + var results = ""; + for(var key in this.timers){ + if(typeof this.timers[key] != 'function'){ + results += key + ":\t" + (this.getElapsed(key) / 1000) + " seconds\n"; + } + } + if(html){ + results = results.replace("\n", '
      '); + } + return results; + }, + + show : function(){ + alert(this.toString()); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/CSS.js b/www/extras/yui-ext/source/CSS.js new file mode 100644 index 000000000..97d37debf --- /dev/null +++ b/www/extras/yui-ext/source/CSS.js @@ -0,0 +1,157 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.util.CSS + * Class for manipulating CSS Rules + * @singleton + */ +YAHOO.ext.util.CSS = new function(){ + var rules = null; + + var toCamel = function(property) { + var convert = function(prop) { + var test = /(-[a-z])/i.exec(prop); + return prop.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase()); + }; + while(property.indexOf('-') > -1) { + property = convert(property); + } + return property; + }; + + /** + * Gets all css rules for the document + * @param {Boolean} refreshCache true to refresh the internal cache + * @return {Object} An object (hash) of rules indexed by selector + */ + this.getRules = function(refreshCache){ + if(rules == null || refreshCache){ + rules = {}; + var ds = document.styleSheets; + for(var i =0, len = ds.length; i < len; i++){ + try{ + var ss = ds[i]; + var ssRules = ss.cssRules || ss.rules; + for(var j = ssRules.length-1; j >= 0; --j){ + rules[ssRules[j].selectorText] = ssRules[j]; + } + }catch(e){} // try catch for cross domain access issue + } + } + return rules; + }; + + /** + * Gets an an individual CSS rule by selector(s) + * @param {String/Array} selector The CSS selector or an array of selectors to try. The first selector that is found is returned. + * @param {Boolean} refreshCache true to refresh the internal cache + * @return {CSSRule} The CSS rule or null if one is not found + */ + this.getRule = function(selector, refreshCache){ + var rs = this.getRules(refreshCache); + if(!(selector instanceof Array)){ + return rs[selector]; + } + for(var i = 0; i < selector.length; i++){ + if(rs[selector[i]]){ + return rs[selector[i]]; + } + } + return null; + }; + + + /** + * Updates a rule property + * @param {String/Array} selector If it's an array it tries each selector until it finds one. Stops immediately once one is found. + * @param {String} property The css property + * @param {String} value The new value for the property + * @return {Boolean} true if a rule was found and updated + */ + this.updateRule = function(selector, property, value){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + rule.style[toCamel(property)] = value; + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.updateRule(selector[i], property, value)){ + return true; + } + } + } + return false; + }; + + /** + * Applies a rule to an element without adding the class + * @param {HTMLElement} el The element + * @param {String/Array} selector If it's an array it tries each selector until it finds one. Stops immediately once one is found. + * @return {Boolean} true if a rule was found and applied + */ + this.apply = function(el, selector){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + var s = rule.style; + for(var key in s){ + if(typeof s[key] != 'function'){ + if(s[key] && String(s[key]).indexOf(':') < 0 && s[key] != 'false'){ + try{el.style[key] = s[key];}catch(e){} + } + } + } + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.apply(el, selector[i])){ + return true; + } + } + } + return false; + }; + + this.applyFirst = function(el, id, selector){ + var selectors = [ + '#' + id + ' ' + selector, + selector + ]; + return this.apply(el, selectors); + }; + + this.revert = function(el, selector){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + for(key in rule.style){ + if(rule.style[key] && String(rule.style[key]).indexOf(':') < 0 && rule.style[key] != 'false'){ + try{el.style[key] = '';}catch(e){} + } + } + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.revert(el, selector[i])){ + return true; + } + } + } + return false; + }; + + this.revertFirst = function(el, id, selector){ + var selectors = [ + '#' + id + ' ' + selector, + selector + ]; + return this.revert(el, selectors); + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/CompositeElement.js b/www/extras/yui-ext/source/CompositeElement.js new file mode 100644 index 000000000..876e448d3 --- /dev/null +++ b/www/extras/yui-ext/source/CompositeElement.js @@ -0,0 +1,145 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.CompositeElement + * Standard composite class. Creates a YAHOO.ext.Element for every element in the collection. + *

      + * NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element + * actions will be performed on all the elements in this collection. + *

      + * All methods return this and can be chained. +
      
      + var els = getEls('#some-el div.some-class');
      + // or
      + var els = YAHOO.ext.Element.select('#some-el div.some-class');
      + els.setWidth(100); // all elements become 100 width
      + els.hide(true); // all elements fade out and hide
      + // or
      + els.setWidth(100).hide(true);
      + 
      + */ +YAHOO.ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +YAHOO.ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = getEl(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + YAHOO.ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + /** + * Adds elements to this composite. + * @param {String/Array} els A string CSS selector, an array of elements or an element + * @return {CompositeElement} this + */ + add : function(els){ + if(typeof els == 'string'){ + this.addElements(YAHOO.ext.Element.selectorFunction(string)); + }else if(els instanceof Array){ + this.addElements(els); + }else{ + this.addElements([els]); + } + return this; + }, + /** + * Calls the passed function passing (el, this, index) for each element in this composite. + * @param {Function} fn The function to call + * @param {Object} scope (optional) The this object (defaults to the element) + * @return {CompositeElement} this + */ + each : function(fn, scope){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++){ + fn.call(scope || els[i], els[i], this, i); + } + return this; + } +}; +/** + * @class YAHOO.ext.CompositeElementLite + * @extends YAHOO.ext.CompositeElement + * Flyweight composite class. Reuses the same YAHOO.ext.Element for element operations. + *

      + * NOTE: Although they are not listed, this class supports all of the set/update methods of YAHOO.ext.Element. All YAHOO.ext.Element + * actions will be performed on all the elements in this collection. + */ +YAHOO.ext.CompositeElementLite = function(els){ + YAHOO.ext.CompositeElementLite.superclass.constructor.call(this, els); + this.el = YAHOO.ext.Element.get(this.elements[0], true); +}; +YAHOO.extendX(YAHOO.ext.CompositeElementLite, YAHOO.ext.CompositeElement, { + addElements : function(els){ + if(els){ + this.elements = this.elements.concat(els); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++) { + el.dom = els[i]; + YAHOO.ext.Element.prototype[fn].apply(el, args); + } + return this; + } +}); +YAHOO.ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in YAHOO.ext.Element.prototype){ + if(typeof YAHOO.ext.Element.prototype[fnName] == 'function'){ + YAHOO.ext.CompositeElement.createCall(YAHOO.ext.CompositeElement.prototype, fnName); + } +} +if(typeof cssQuery == 'function'){// Dean Edwards cssQuery + YAHOO.ext.Element.selectorFunction = cssQuery; +}else if(typeof document.getElementsBySelector == 'function'){ // Simon Willison's getElementsBySelector + YAHOO.ext.Element.selectorFunction = document.getElementsBySelector.createDelegate(document); +} +/** + * @member YAHOO.ext.Element +* Selects elements based on the passed CSS selector to enable working on them as 1. +* @param {String/Array} selector The CSS selector or an array of elements +* @param {Boolean} unique (optional) true to create a unique YAHOO.ext.Element for each element (defaults to a shared flyweight object) +* @return {CompositeElementLite/CompositeElement} +* @method @static +*/ +YAHOO.ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == 'string'){ + els = YAHOO.ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw 'Invalid selector'; + } + if(unique === true){ + return new YAHOO.ext.CompositeElement(els); + }else{ + return new YAHOO.ext.CompositeElementLite(els); + } +}; + +var getEls = YAHOO.ext.Element.select; \ No newline at end of file diff --git a/www/extras/yui-ext/source/Date.js b/www/extras/yui-ext/source/Date.js new file mode 100644 index 000000000..da2b81697 --- /dev/null +++ b/www/extras/yui-ext/source/Date.js @@ -0,0 +1,413 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/* + * All the Date functions below are the excellent work of Baron Schwartz + * They generate precompiled functions from date formats instead of parsing and processing + * the format everytime you do something with a date. + */ +/** @ignore */ +Date.parseFunctions = {count:0}; +/** @ignore */ +Date.parseRegexes = []; +/** @ignore */ +Date.formatFunctions = {count:0}; + +/** + * Formats a date given to the supplied format - the format syntax is the same as
      PHP's date() function. + */ +Date.prototype.dateFormat = function(format) { + if (Date.formatFunctions[format] == null) { + Date.createNewFormat(format); + } + var func = Date.formatFunctions[format]; + return this[func](); +}; + +/** + * Same as {@link #dateFormat} + */ +Date.prototype.format = Date.prototype.dateFormat; + +/** @ignore */ +Date.createNewFormat = function(format) { + var funcName = "format" + Date.formatFunctions.count++; + Date.formatFunctions[format] = funcName; + var code = "Date.prototype." + funcName + " = function(){return "; + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + code += "'" + String.escape(ch) + "' + "; + } + else { + code += Date.getFormatCode(ch); + } + } + eval(code.substring(0, code.length - 3) + ";}"); +}; + +/** @ignore */ +Date.getFormatCode = function(character) { + switch (character) { + case "d": + return "String.leftPad(this.getDate(), 2, '0') + "; + case "D": + return "Date.dayNames[this.getDay()].substring(0, 3) + "; + case "j": + return "this.getDate() + "; + case "l": + return "Date.dayNames[this.getDay()] + "; + case "S": + return "this.getSuffix() + "; + case "w": + return "this.getDay() + "; + case "z": + return "this.getDayOfYear() + "; + case "W": + return "this.getWeekOfYear() + "; + case "F": + return "Date.monthNames[this.getMonth()] + "; + case "m": + return "String.leftPad(this.getMonth() + 1, 2, '0') + "; + case "M": + return "Date.monthNames[this.getMonth()].substring(0, 3) + "; + case "n": + return "(this.getMonth() + 1) + "; + case "t": + return "this.getDaysInMonth() + "; + case "L": + return "(this.isLeapYear() ? 1 : 0) + "; + case "Y": + return "this.getFullYear() + "; + case "y": + return "('' + this.getFullYear()).substring(2, 4) + "; + case "a": + return "(this.getHours() < 12 ? 'am' : 'pm') + "; + case "A": + return "(this.getHours() < 12 ? 'AM' : 'PM') + "; + case "g": + return "((this.getHours() %12) ? this.getHours() % 12 : 12) + "; + case "G": + return "this.getHours() + "; + case "h": + return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + "; + case "H": + return "String.leftPad(this.getHours(), 2, '0') + "; + case "i": + return "String.leftPad(this.getMinutes(), 2, '0') + "; + case "s": + return "String.leftPad(this.getSeconds(), 2, '0') + "; + case "O": + return "this.getGMTOffset() + "; + case "T": + return "this.getTimezone() + "; + case "Z": + return "(this.getTimezoneOffset() * -60) + "; + default: + return "'" + String.escape(character) + "' + "; + }; +}; + +/** + * Parses a date given the supplied format - the format syntax is the same as PHP's date() function. + */ +Date.parseDate = function(input, format) { + if (Date.parseFunctions[format] == null) { + Date.createParser(format); + } + var func = Date.parseFunctions[format]; + return Date[func](input); +}; + +/** @ignore */ +Date.createParser = function(format) { + var funcName = "parse" + Date.parseFunctions.count++; + var regexNum = Date.parseRegexes.length; + var currentGroup = 1; + Date.parseFunctions[format] = funcName; + + var code = "Date." + funcName + " = function(input){\n" + + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n" + + "var d = new Date();\n" + + "y = d.getFullYear();\n" + + "m = d.getMonth();\n" + + "d = d.getDate();\n" + + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n" + + "if (results && results.length > 0) {" + var regex = ""; + + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + regex += String.escape(ch); + } + else { + obj = Date.formatCodeToRegex(ch, currentGroup); + currentGroup += obj.g; + regex += obj.s; + if (obj.g && obj.c) { + code += obj.c; + } + } + } + + code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n" + + "{return new Date(y, m, d, h, i, s);}\n" + + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" + + "{return new Date(y, m, d, h, i);}\n" + + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n" + + "{return new Date(y, m, d, h);}\n" + + "else if (y > 0 && m >= 0 && d > 0)\n" + + "{return new Date(y, m, d);}\n" + + "else if (y > 0 && m >= 0)\n" + + "{return new Date(y, m);}\n" + + "else if (y > 0)\n" + + "{return new Date(y);}\n" + + "}return null;}"; + + Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$"); + eval(code); +}; + +/** @ignore */ +Date.formatCodeToRegex = function(character, currentGroup) { + switch (character) { + case "D": + return {g:0, + c:null, + s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"}; + case "j": + case "d": + return {g:1, + c:"d = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "l": + return {g:0, + c:null, + s:"(?:" + Date.dayNames.join("|") + ")"}; + case "S": + return {g:0, + c:null, + s:"(?:st|nd|rd|th)"}; + case "w": + return {g:0, + c:null, + s:"\\d"}; + case "z": + return {g:0, + c:null, + s:"(?:\\d{1,3})"}; + case "W": + return {g:0, + c:null, + s:"(?:\\d{2})"}; + case "F": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n", + s:"(" + Date.monthNames.join("|") + ")"}; + case "M": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n", + s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"}; + case "n": + case "m": + return {g:1, + c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", + s:"(\\d{1,2})"}; + case "t": + return {g:0, + c:null, + s:"\\d{1,2}"}; + case "L": + return {g:0, + c:null, + s:"(?:1|0)"}; + case "Y": + return {g:1, + c:"y = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{4})"}; + case "y": + return {g:1, + c:"var ty = parseInt(results[" + currentGroup + "], 10);\n" + + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", + s:"(\\d{1,2})"}; + case "a": + return {g:1, + c:"if (results[" + currentGroup + "] == 'am') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(am|pm)"}; + case "A": + return {g:1, + c:"if (results[" + currentGroup + "] == 'AM') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(AM|PM)"}; + case "g": + case "G": + case "h": + case "H": + return {g:1, + c:"h = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "i": + return {g:1, + c:"i = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "s": + return {g:1, + c:"s = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "O": + return {g:0, + c:null, + s:"[+-]\\d{4}"}; + case "T": + return {g:0, + c:null, + s:"[A-Z]{3}"}; + case "Z": + return {g:0, + c:null, + s:"[+-]\\d{1,5}"}; + default: + return {g:0, + c:null, + s:String.escape(character)}; + } +}; + +Date.prototype.getTimezone = function() { + return this.toString().replace( + /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace( + /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); +}; + +Date.prototype.getGMTOffset = function() { + return (this.getTimezoneOffset() > 0 ? "-" : "+") + + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0") + + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); +}; + +Date.prototype.getDayOfYear = function() { + var num = 0; + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + for (var i = 0; i < this.getMonth(); ++i) { + num += Date.daysInMonth[i]; + } + return num + this.getDate() - 1; +}; + +Date.prototype.getWeekOfYear = function() { + // Skip to Thursday of this week + var now = this.getDayOfYear() + (4 - this.getDay()); + // Find the first Thursday of the year + var jan1 = new Date(this.getFullYear(), 0, 1); + var then = (7 - jan1.getDay() + 4); + document.write(then); + return String.leftPad(((now - then) / 7) + 1, 2, "0"); +}; + +Date.prototype.isLeapYear = function() { + var year = this.getFullYear(); + return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); +}; + +Date.prototype.getFirstDayOfMonth = function() { + var day = (this.getDay() - (this.getDate() - 1)) % 7; + return (day < 0) ? (day + 7) : day; +}; + +Date.prototype.getLastDayOfMonth = function() { + var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7; + return (day < 0) ? (day + 7) : day; +}; + +Date.prototype.getDaysInMonth = function() { + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + return Date.daysInMonth[this.getMonth()]; +}; + +/** @ignore */ +Date.prototype.getSuffix = function() { + switch (this.getDate()) { + case 1: + case 21: + case 31: + return "st"; + case 2: + case 22: + return "nd"; + case 3: + case 23: + return "rd"; + default: + return "th"; + } +}; + +/** @ignore */ +Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; + +/** + * Override these values for international dates, for example... + * Date.monthNames = ['JanInYourLang', 'FebInYourLang', ...]; + */ +Date.monthNames = + ["January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"]; + +/** + * Override these values for international dates, for example... + * Date.dayNames = ['SundayInYourLang', 'MondayInYourLang', ...]; + */ +Date.dayNames = + ["Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday"]; + +/** @ignore */ +Date.y2kYear = 50; + +/** @ignore */ +Date.monthNumbers = { + Jan:0, + Feb:1, + Mar:2, + Apr:3, + May:4, + Jun:5, + Jul:6, + Aug:7, + Sep:8, + Oct:9, + Nov:10, + Dec:11}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/DomHelper.js b/www/extras/yui-ext/source/DomHelper.js new file mode 100644 index 000000000..29e19cef5 --- /dev/null +++ b/www/extras/yui-ext/source/DomHelper.js @@ -0,0 +1,414 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.DomHelper + * Utility class for working with DOM and/or Templates. It transparently supports using HTML fragments or DOM. + * For more information see this blog post with examples. + * @singleton + */ +YAHOO.ext.DomHelper = new function(){ + /**@private*/ + var d = document; + var tempTableEl = null; + /** True to force the use of DOM instead of html fragments @type Boolean */ + this.useDom = false; + var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i; + /** + * Applies a style specification to an element + * @param {String/HTMLElement} el The element to apply styles to + * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or + * a function which returns such a specification. + */ + this.applyStyles = function(el, styles){ + if(styles){ + var D = YAHOO.util.Dom; + if (typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + D.setStyle(el, matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + D.setStyle(el, style, styles[style]); + } + }else if (typeof styles == "function"){ + YAHOO.ext.DomHelper.applyStyles(el, styles.call()); + } + } + }; + + // build as innerHTML where available + /** @ignore */ + var createHtml = function(o){ + var b = ''; + b += '<' + o.tag; + for(var attr in o){ + if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue; + if(attr == 'style'){ + var s = o['style']; + if(typeof s == 'function'){ + s = s.call(); + } + if(typeof s == 'string'){ + b += ' style="' + s + '"'; + }else if(typeof s == 'object'){ + b += ' style="'; + for(var key in s){ + if(typeof s[key] != 'function'){ + b += key + ':' + s[key] + ';'; + } + } + b += '"'; + } + }else{ + if(attr == 'cls'){ + b += ' class="' + o['cls'] + '"'; + }else if(attr == 'htmlFor'){ + b += ' for="' + o['htmlFor'] + '"'; + }else{ + b += ' ' + attr + '="' + o[attr] + '"'; + } + } + } + if(emptyTags.test(o.tag)){ + b += ' />'; + }else{ + b += '>'; + if(o.children){ + for(var i = 0, len = o.children.length; i < len; i++) { + b += createHtml(o.children[i], b); + } + } + if(o.html){ + b += o.html; + } + b += ''; + } + return b; + } + + // build as dom + /** @ignore */ + var createDom = function(o, parentNode){ + var el = d.createElement(o.tag); + var useSet = el.setAttribute ? true : false; // In IE some elements don't have setAttribute + for(var attr in o){ + if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + if(o.children){ + for(var i = 0, len = o.children.length; i < len; i++) { + createDom(o.children[i], el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + /** + * @ignore + * Nasty code for IE's broken table implementation + */ + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + if(tag == 'table' || tag == 'tbody'){ + tempTableEl.innerHTML = ''+html+'
      '; + node = tempTableEl.firstChild.firstChild.firstChild; + }else{ + tempTableEl.innerHTML = ''+html+'
      '; + node = tempTableEl.firstChild.firstChild.firstChild.firstChild; + } + if(where == 'beforebegin'){ + el.parentNode.insertBefore(node, el); + return node; + }else if(where == 'afterbegin'){ + el.insertBefore(node, el.firstChild); + return node; + }else if(where == 'beforeend'){ + el.appendChild(node); + return node; + }else if(where == 'afterend'){ + el.parentNode.insertBefore(node, el.nextSibling); + return node; + } + } + + /** + * Inserts an HTML fragment into the Dom + * @param {String} where Where to insert the html in relation to el - beforeBegin, afterBegin, beforeEnd, afterEnd. + * @param {HTMLElement} el The context element + * @param {String} html The HTML fragmenet + * @return {HTMLElement} The new node + */ + this.insertHtml = function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == 'table' || tag == 'tbody' || tag == 'tr'){ + return insertIntoTable(tag, where, el, html); + } + switch(where){ + case 'beforebegin': + el.insertAdjacentHTML(where, html); + return el.previousSibling; + case 'afterbegin': + el.insertAdjacentHTML(where, html); + return el.firstChild; + case 'beforeend': + el.insertAdjacentHTML(where, html); + return el.lastChild; + case 'afterend': + el.insertAdjacentHTML(where, html); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + } + var range = el.ownerDocument.createRange(); + var frag; + switch(where){ + case 'beforebegin': + range.setStartBefore(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el); + return el.previousSibling; + case 'afterbegin': + if(el.firstChild){ // faster + range.setStartBefore(el.firstChild); + }else{ + range.selectNodeContents(el); + range.collapse(true); + } + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + case 'beforeend': + if(el.lastChild){ + range.setStartAfter(el.lastChild); // faster + }else{ + range.selectNodeContents(el); + range.collapse(false); + } + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + case 'afterend': + range.setStartAfter(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el.nextSibling); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + }; + + /** + * Creates new Dom element(s) and inserts them before el + * @param {HTMLElement} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + this.insertBefore = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeBegin', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + /** + * Creates new Dom element(s) and inserts them after el + * @param {HTMLElement} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + this.insertAfter = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el.nextSibling); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('afterEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + /** + * Creates new Dom element(s) and appends them to el + * @param {HTMLElement} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + this.append = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.appendChild(newNode); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + /** + * Creates new Dom element(s) and overwrites the contents of el with them + * @param {HTMLElement} el The context element + * @param {Object} o The Dom object spec (and children) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + this.overwrite = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = createHtml(o); + return returnElement ? YAHOO.ext.Element.get(el.firstChild, true) : el.firstChild; + }; + + /** + * Creates a new YAHOO.ext.DomHelper.Template from the Dom object spec + * @param {Object} o The Dom object spec (and children) + * @return {YAHOO.ext.DomHelper.Template} The new template + */ + this.createTemplate = function(o){ + var html = createHtml(o); + return new YAHOO.ext.DomHelper.Template(html); + }; +}(); + +/** +* @class YAHOO.ext.DomHelper.Template +* Represents an HTML fragment template. +* For more information see this blog post with examples. +*
      +* This class is also available as YAHOO.ext.Template. +* @constructor +* @param {String} html The HTML fragment +*/ +YAHOO.ext.DomHelper.Template = function(html){ + /**@private*/ + this.html = html; + /**@private*/ + this.re = /\{(\w+)\}/g; +}; +YAHOO.ext.DomHelper.Template.prototype = { + /** + * Returns an HTML fragment of this template with the specified values applied + * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) + * @return {String} + */ + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var empty = ''; + var fn = function(match, index){ + if(typeof values[index] != 'undefined'){ + return values[index]; + }else{ + return empty; + } + } + return this.html.replace(this.re, fn); + }, + + /** + * Compiles the template into an internal function, eliminating the RegEx overhead + */ + compile : function(){ + var html = this.html; + var re = /\{(\w+)\}/g; + var body = []; + body.push("this.compiled = function(values){ return ["); + var result; + var lastMatchEnd = 0; + while ((result = re.exec(html)) != null){ + body.push("'", html.substring(lastMatchEnd, result.index), "', "); + body.push("values['", html.substring(result.index+1,re.lastIndex-1), "'], "); + lastMatchEnd = re.lastIndex; + } + body.push("'", html.substr(lastMatchEnd), "'].join('');};"); + eval(body.join('')); + }, + + /** + * Applies the supplied values to the template and inserts the new node(s) before el + * @param {HTMLElement} el The context element + * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + insertBefore: function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + /** + * Applies the supplied values to the template and inserts the new node(s) after el + * @param {HTMLElement} el The context element + * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + insertAfter : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + /** + * Applies the supplied values to the template and append the new node(s) to el + * @param {HTMLElement} el The context element + * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + append : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + /** + * Applies the supplied values to the template and overwrites the content of el with the new node(s) + * @param {HTMLElement} el The context element + * @param {Object} values The template values. Can be an array if your params are numeric (i.e. {0}) or an object (i.e. {foo: 'bar'}) + * @param {Boolean} returnElement (optional) true to return a YAHOO.ext.Element + * @return {HTMLElement} The new node + */ + overwrite : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = ''; + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + } +}; + +YAHOO.ext.Template = YAHOO.ext.DomHelper.Template; \ No newline at end of file diff --git a/www/extras/yui-ext/source/Element.js b/www/extras/yui-ext/source/Element.js new file mode 100644 index 000000000..6fad71b9d --- /dev/null +++ b/www/extras/yui-ext/source/Element.js @@ -0,0 +1,1827 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.Element + * Wraps around a DOM element and provides convenient access to Yahoo + * UI library functionality (and more).

      + * Usage:
      + *
      
      + * var el = YAHOO.ext.Element.get('myElementId');
      + * // or the shorter
      + * var el = getEl('myElementId');
      + * 
      + * Using YAHOO.ext.Element.get() instead of calling the constructor directly ensures you get the same object + * each call instead of constructing a new one.

      + * For working with collections of Elements, see YAHOO.ext.CompositeElement + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.Anim (optional) to support animation + * @requires YAHOO.util.Motion (optional) to support animation + * @requires YAHOO.util.Easing (optional) to support animation + * @constructor Create a new Element directly. + * @param {String/HTMLElement} element + * @param {Boolean} forceNew (optional) By default the constructor checks to see if there is already an instance of this element in the cache and if there is it returns the same instance. This will skip that check (useful for extending this class). + */ +YAHOO.ext.Element = function(element, forceNew){ + var dom = YAHOO.util.Dom.get(element); + if(!dom){ // invalid id/element + return null; + } + if(!forceNew && YAHOO.ext.Element.cache[dom.id]){ // element object already exists + return YAHOO.ext.Element.cache[dom.id]; + } + /** + * The DOM element + * @type HTMLElement + */ + this.dom = dom; + + /** + * The DOM element ID + * @type String + */ + this.id = this.dom.id; + /** + * @private the current visibility mode + */ + this.visibilityMode = YAHOO.ext.Element.VISIBILITY; + + + /** + * The element's default display mode @type String + */ + this.originalDisplay = YAHOO.util.Dom.getStyle(this.dom, 'display') || ''; + if(this.autoDisplayMode){ + if(this.originalDisplay == 'none'){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + } + } + if(this.originalDisplay == 'none'){ + this.originalDisplay = ''; + } + + /** + * The default unit to append to CSS values where a unit isn't provided (Defaults to px). + * @type String + */ + this.defaultUnit = 'px'; +} + +YAHOO.ext.Element.prototype = { + /** + * Sets the elements visibility mode. When setVisible() is called it + * will use this to determine whether to set the visibility or the display property. + * @param visMode Element.VISIBILITY or Element.DISPLAY + * @return {YAHOO.ext.Element} this + */ + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + /** + * Convenience method for setVisibilityMode(Element.DISPLAY) + * @param {String} display (optional) What to set display to when visible + * @return {YAHOO.ext.Element} this + */ + enableDisplayMode : function(display){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + if(typeof display != 'undefined') this.originalDisplay = display; + return this; + }, + + /** + * Perform Yahoo UI animation on this element. + * @param {Object} args The YUI animation control args + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @param {Function} animType (optional) YAHOO.util.Anim subclass to use. For example: YAHOO.util.Motion + * @return {YAHOO.ext.Element} this + */ + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, duration, onComplete, easing, animType); + return this; + }, + + /** + * @private Internal animation call + */ + anim : function(args, duration, onComplete, easing, animType){ + animType = animType || YAHOO.util.Anim; + var anim = new animType(this.dom, args, duration || .35, + easing || YAHOO.util.Easing.easeBoth); + if(onComplete){ + if(!(onComplete instanceof Array)){ + anim.onComplete.subscribe(onComplete, this, true); + }else{ + for(var i = 0; i < onComplete.length; i++){ + var fn = onComplete[i]; + if(fn) anim.onComplete.subscribe(fn, this, true); + } + } + } + anim.animate(); + }, + + /** + * Scrolls this element into view within the passed container. + * @param {String/HTMLElement/Element} container (optional) The container element to scroll (defaults to document.body) + * @return {YAHOO.ext.Element} this + */ + scrollIntoView : function(container){ + var c = getEl(container || document.body, true); + var cp = c.getStyle('position'); + var restorePos = false; + if(cp != 'relative' && cp != 'absolute'){ + c.setStyle('position', 'relative'); + restorePos = true; + } + var el = this.dom; + var childTop = parseInt(el.offsetTop, 10); + var childBottom = childTop + el.offsetHeight; + var containerTop = parseInt(c.scrollTop, 10); // parseInt for safari bug + var containerBottom = containerTop + c.clientHeight; + if(childTop < containerTop){ + c.scrollTop = childTop; + }else if(childBottom > containerBottom){ + c.scrollTop = childBottom-c.clientHeight; + } + if(restorePos){ + c.setStyle('position', cp); + } + return this; + }, + + /** + * Measures the elements content height and updates height to match. Note, this function uses setTimeout and + * the new height may not be available immediately. + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {Float} duration (optional) Length of the animation. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing) + * @return {YAHOO.ext.Element} this + */ + autoHeight : function(animate, duration, onComplete, easing){ + var oldHeight = this.getHeight(); + this.clip(); + this.setHeight(1); // force clipping + setTimeout(function(){ + var height = parseInt(this.dom.scrollHeight, 10); // parseInt for Safari + if(!animate){ + this.setHeight(height); + this.unclip(); + if(typeof onComplete == 'function'){ + onComplete(); + } + }else{ + this.setHeight(oldHeight); // restore original height + this.setHeight(height, animate, duration, function(){ + this.unclip(); + if(typeof onComplete == 'function') onComplete(); + }.createDelegate(this), easing); + } + }.createDelegate(this), 0); + return this; + }, + + /** + * Checks whether the element is currently visible using both visibility and display properties. + * @param {Boolean} deep True to walk the dom and see if parent elements are hidden. + * @return {Boolean} true if the element is currently visible + */ + isVisible : function(deep) { + var vis = YAHOO.util.Dom.getStyle(this.dom, 'visibility') != 'hidden' + && YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + if(!deep || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'visibility') == 'hidden' || YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + return false; + } + p = p.parentNode; + } + return true; + }, + + /** + * Selects child nodes based on the passed CSS selector (the selector should not contain an id) + * @param {String} selector The CSS selector + * @param {Boolean} unique true to create a unique YAHOO.ext.Element for each child (defaults to a shared flyweight object) + * @return {CompositeElement/CompositeElementLite} The composite element + */ + select : function(selector, unique){ + return YAHOO.ext.Element.select('#' + this.dom.id + ' ' + selector, unique); + }, + + /** + * Initializes a YAHOO.util.DD object for this element. + * @param {String} group The group the DD object is member of + * @param {Object} config The DD config object + * @param {Object} overrides An object containing methods to override/implement on the DD object + * @return {YAHOO.util.DD} The DD object + */ + initDD : function(group, config, overrides){ + var dd = new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + /** + * Initializes a YAHOO.util.DDProxy object for this element. + * @param {String} group The group the DDProxy object is member of + * @param {Object} config The DDProxy config object + * @param {Object} overrides An object containing methods to override/implement on the DDProxy object + * @return {YAHOO.util.DDProxy} The DDProxy object + */ + initDDProxy : function(group, config, overrides){ + var dd = new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + /** + * Initializes a YAHOO.util.DDTarget object for this element. + * @param {String} group The group the DDTarget object is member of + * @param {Object} config The DDTarget config object + * @param {Object} overrides An object containing methods to override/implement on the DDTarget object + * @return {YAHOO.util.DDTarget} The DDTarget object + */ + initDDTarget : function(group, config, overrides){ + var dd = new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + /** + * Sets the visibility of the element (see details). If the visibilityMode is set to Element.DISPLAY, it will use + * the display property to hide the element, otherwise it uses visibility. The default is to hide and show using the visibility property. + * @param {Boolean} visible Whether the element is visible + * @param {Boolean} animate (optional) Fade the element in or out (Default is false) + * @param {Float} duration (optional) How long the fade effect lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing) + * @return {YAHOO.ext.Element} this + */ + setVisible : function(visible, animate, duration, onComplete, easing){ + //if(this.isVisible() == visible) return; // nothing to do + if(!animate || !YAHOO.util.Anim){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }else{ + // make sure they can see the transition + this.setOpacity(visible?0:1); + YAHOO.util.Dom.setStyle(this.dom, 'visibility', 'visible'); + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(true); + } + var args = {opacity: { from: (visible?0:1), to: (visible?1:0) }}; + var anim = new YAHOO.util.Anim(this.dom, args, duration || .35, + easing || (visible ? YAHOO.util.Easing.easeIn : YAHOO.util.Easing.easeOut)); + anim.onComplete.subscribe((function(){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }).createDelegate(this)); + if(onComplete){ + anim.onComplete.subscribe(onComplete); + } + anim.animate(); + } + return this; + }, + + /** + * Returns true if display is not "none" + * @return {Boolean} + */ + isDisplayed : function() { + return YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + }, + + /** + * Toggles the elements visibility or display, depending on visibility mode. + * @param {Boolean} animate (optional) Fade the element in or out (Default is false) + * @param {float} duration (optional) How long the fade effect lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut for hiding or YAHOO.util.Easing.easeIn for showing) + * @return {YAHOO.ext.Element} this + */ + toggle : function(animate, duration, onComplete, easing){ + this.setVisible(!this.isVisible(), animate, duration, onComplete, easing); + return this; + }, + + /** + * Sets the css display. Uses originalDisplay if value is a boolean true. + * @param {Boolean} value Boolean to display the element using it's default display or a string to set the display directly + * @return {YAHOO.ext.Element} this + */ + setDisplayed : function(value) { + if(typeof value == 'boolean'){ + value = value ? this.originalDisplay : 'none'; + } + YAHOO.util.Dom.setStyle(this.dom, 'display', value); + return this; + }, + + /** + * Tries to focus the element. Any exceptions are caught. + * @return {YAHOO.ext.Element} this + */ + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + /** + * Add a CSS class to the element. + * @param {String} className The CSS class to add + * @return {YAHOO.ext.Element} this + */ + addClass : function(className){ + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + + /** + * Adds the passed className to this element and removes the class from all siblings + * @param {String} className The className to add + * @return {YAHOO.ext.Element} this + */ + radioClass : function(className){ + var siblings = this.dom.parentNode.childNodes; + for(var i = 0; i < siblings.length; i++) { + var s = siblings[i]; + if(s.nodeType == 1){ + YAHOO.util.Dom.removeClass(s, className); + } + } + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + /** + * Removes a CSS class from the element. + * @param {String} className The CSS class to remove + * @return {YAHOO.ext.Element} this + */ + removeClass : function(className){ + YAHOO.util.Dom.removeClass(this.dom, className); + return this; + }, + + /** + * Toggles (adds or removes) the passed class. + * @param {String} className + * @return {YAHOO.ext.Element} this + */ + toggleClass : function(className){ + if(YAHOO.util.Dom.hasClass(this.dom, className)){ + YAHOO.util.Dom.removeClass(this.dom, className); + }else{ + YAHOO.util.Dom.addClass(this.dom, className); + } + return this; + }, + + /** + * Checks if a CSS class is in use by the element. + * @param {String} className The CSS class to check + * @return {Boolean} true or false + */ + hasClass : function(className){ + return YAHOO.util.Dom.hasClass(this.dom, className); + }, + + /** + * Replaces a CSS class on the element with another. + * @param {String} oldClassName The CSS class to replace + * @param {String} newClassName The replacement CSS class + * @return {YAHOO.ext.Element} this + */ + replaceClass : function(oldClassName, newClassName){ + YAHOO.util.Dom.replaceClass(this.dom, oldClassName, newClassName); + return this; + }, + + /** + * Normalizes currentStyle and ComputedStyle. + * @param {String} property The style property whose value is returned. + * @return {String} The current value of the style property for this element. + */ + getStyle : function(name){ + return YAHOO.util.Dom.getStyle(this.dom, name); + }, + + /** + * Wrapper for setting style properties, also takes single object parameter of multiple styles + * @param {String/Object} property The style property to be set or an object of multiple styles. + * @param {String} val (optional) The value to apply to the given property or null if an object was passed. + * @return {YAHOO.ext.Element} this + */ + setStyle : function(name, value){ + if(typeof name == 'string'){ + YAHOO.util.Dom.setStyle(this.dom, name, value); + }else{ + var D = YAHOO.util.Dom; + for(var style in name){ + if(typeof name[style] != 'function'){ + D.setStyle(this.dom, style, name[style]); + } + } + } + return this; + }, + + /** + * More flexible version of {@link #setStyle} for setting style properties. + * @param {String/Object/Function} styles A style specification string eg "width:100px", or object in the form {width:"100px"}, or + * a function which returns such a specification. + * @return {YAHOO.ext.Element} this + */ + applyStyles : function(style){ + YAHOO.ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + /** + * Gets the current X position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The X position of the element + */ + getX : function(){ + return YAHOO.util.Dom.getX(this.dom); + }, + + /** + * Gets the current Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Number} The Y position of the element + */ + getY : function(){ + return YAHOO.util.Dom.getY(this.dom); + }, + + /** + * Gets the current position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @ return {Array} The XY position of the element + */ + getXY : function(){ + return YAHOO.util.Dom.getXY(this.dom); + }, + + /** + * Sets the X position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @param {Number} The X position of the element + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setX : function(x, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], animate, duration, onComplete, easing); + } + return this; + }, + + /** + * Sets the Y position of the element based on page coordinates. Element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + @param {Number} The Y position of the element + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setY : function(y, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], animate, duration, onComplete, easing); + } + return this; + }, + + /** + * Set the element's left position directly using CSS style (instead of setX()) + * @param {String} left The left CSS property value + * @return {YAHOO.ext.Element} this + */ + setLeft : function(left){ + YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(left)); + return this; + }, + + /** + * Set the element's top position directly using CSS style (instead of setY()) + * @param {String} top The top CSS property value + * @return {YAHOO.ext.Element} this + */ + setTop : function(top){ + YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(top)); + return this; + }, + + /** + * Set the element's css right style + * @param {String} right The right CSS property value + * @return {YAHOO.ext.Element} this + */ + setRight : function(right){ + YAHOO.util.Dom.setStyle(this.dom, 'right', this.addUnits(right)); + return this; + }, + + /** + * Set the element's css bottom style + * @param {String} bottom The bottom CSS property value + * @return {YAHOO.ext.Element} this + */ + setBottom : function(bottom){ + YAHOO.util.Dom.setStyle(this.dom, 'bottom', this.addUnits(bottom)); + return this; + }, + + /** + * Set the position of the element in page coordinates, regardless of how the element is positioned. + * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + * @param {Array} pos Contains X & Y [x, y] values for new position (coordinates are page-based) + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setXY : function(pos, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + /** + * Set the position of the element in page coordinates, regardless of how the element is positioned. + * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + * @param {Number} x X value for new position (coordinates are page-based) + * @param {Number} y Y value for new position (coordinates are page-based) + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setLocation : function(x, y, animate, duration, onComplete, easing){ + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + /** + * Set the position of the element in page coordinates, regardless of how the element is positioned. + * The element must be part of the DOM tree to have page coordinates (display:none or elements not appended return false). + * @param {Number} x X value for new position (coordinates are page-based) + * @param {Number} y Y value for new position (coordinates are page-based) + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + moveTo : function(x, y, animate, duration, onComplete, easing){ + //YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(x)); + //YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(y)); + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + /** + * Returns the region of the given element. + * The element must be part of the DOM tree to have a region (display:none or elements not appended return false). + * @return {Region} A YAHOO.util.Region containing "top, left, bottom, right" member data. + */ + getRegion : function(){ + return YAHOO.util.Dom.getRegion(this.dom); + }, + + /** + * Returns the offset height of the element + * @param {Boolean} contentHeight (optional) true to get the height minus borders and padding + * @return {Number} The element's height + */ + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight; + return contentHeight !== true ? h : h-this.getBorderWidth('tb')-this.getPadding('tb'); + }, + + /** + * Returns the offset width of the element + * @param {Boolean} contentWidth (optional) true to get the width minus borders and padding + * @return {Number} The element's width + */ + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth; + return contentWidth !== true ? w : w-this.getBorderWidth('lr')-this.getPadding('lr'); + }, + + /** + * Returns the size of the element + * @param {Boolean} contentSize (optional) true to get the width/size minus borders and padding + * @return {Object} An object containing the element's size {width: (element width), height: (element height)} + */ + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + /** @private */ + adjustWidth : function(width){ + if(typeof width == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + width -= (this.getBorderWidth('lr') + this.getPadding('lr')); + } + if(width < 0){ + width = 0; + } + } + return width; + }, + + /** @private */ + adjustHeight : function(height){ + if(typeof height == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + height -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + if(height < 0){ + height = 0; + } + } + return height; + }, + + /** + * Set the width of the element + * @param {Number} width The new width + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if width is larger or YAHOO.util.Easing.easeIn if it is smaller) + * @return {YAHOO.ext.Element} this + */ + setWidth : function(width, animate, duration, onComplete, easing){ + width = this.adjustWidth(width); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'width', this.addUnits(width)); + }else{ + this.anim({width: {to: width}}, duration, onComplete, + easing || (width > this.getWidth() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + /** + * Set the height of the element + * @param {Number} height The new height + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller) + * @return {YAHOO.ext.Element} this + */ + setHeight : function(height, animate, duration, onComplete, easing){ + height = this.adjustHeight(height); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'height', this.addUnits(height)); + }else{ + this.anim({height: {to: height}}, duration, onComplete, + easing || (height > this.getHeight() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + /** + * Set the size of the element. If animation is true, both width an height will be animated concurrently. + * @param {Number} width The new width + * @param {Number} height The new height + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setSize : function(width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({width: {to: width}, height: {to: height}}, duration, onComplete, easing); + } + return this; + }, + + /** + * Sets the element's position and size in one shot. If animation is true then width, height, x and y will be animated concurrently. + * @param {Number} x X value for new position (coordinates are page-based) + * @param {Number} y Y value for new position (coordinates are page-based) + * @param {Number} width The new width + * @param {Number} height The new height + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setBounds : function(x, y, width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + this.setLocation(x, y); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + /** + * Sets the element's position and size the the specified region. If animation is true then width, height, x and y will be animated concurrently. + * @param {YAHOO.util.Region} region The region to fill + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setRegion : function(region, animate, duration, onComplete, easing){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, animate, duration, onComplete, easing); + return this; + }, + + /** + * Appends an event handler to this element + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override (optional) If true, the obj passed in becomes + * the execution scope of the listener + * @return {YAHOO.ext.Element} this + */ + addListener : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + /** + * Appends an event handler to this element. The difference between this function and addListener is this + * function prevents the default action, and if set stops propagation (bubbling) as well + * @param {String} eventName The type of event to listen for + * @param {Boolean} stopPropagation Whether to also stopPropagation (bubbling) + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override (optional) If true, the obj passed in becomes + * the execution scope of the listener + * @return {YAHOO.ext.Element} this + */ + addHandler : function(eventName, stopPropagation, handler, scope, override){ + var fn = YAHOO.ext.Element.createStopHandler(stopPropagation, handler, scope || this, true); + YAHOO.util.Event.addListener(this.dom, eventName, fn); + return this; + }, + + /** + * Appends an event handler to this element (Same as addListener) + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override (optional) If true, the obj passed in becomes + * the execution scope of the listener + * @return {YAHOO.ext.Element} this + */ + on : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + /** + * Append a managed listener - See {@link YAHOO.ext.EventObject} for more details. Use mon() for a shorter version. + * @param {String} eventName The type of event to listen for + * @param {Function} fn The method the event invokes + * @param {Object} scope (optional) An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override (optional) If true, the obj passed in becomes + * the execution scope of the listener + * @return {Function} The EventManager wrapped function that can be used to remove the listener + */ + addManagedListener : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + + /** + * Append a managed listener (shorthanded for {@link #addManagedListener}) + * @param {String} eventName The type of event to listen for + * @param {Function} fn The method the event invokes + * @param {Object} scope (optional) An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override (optional) If true, the obj passed in becomes + * the execution scope of the listener + * @return {Function} The EventManager wrapped function that can be used to remove the listener + */ + mon : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + /** + * Removes an event handler from this element + * @param {String} sType the type of event to remove + * @param {Function} fn the method the event invokes + * @param {Object} scope + * @return {YAHOO.ext.Element} this + */ + removeListener : function(eventName, handler, scope){ + YAHOO.util.Event.removeListener(this.dom, eventName, handler, scope || this); + return this; + }, + + /** + * Removes all previous added listeners from this element + * @return {YAHOO.ext.Element} this + */ + removeAllListeners : function(){ + YAHOO.util.Event.purgeElement(this.dom); + return this; + }, + + + /** + * Set the opacity of the element + * @param {Float} opacity The new opacity. 0 = transparent, .5 = 50% visibile, 1 = fully visible, etc + * @param {Boolean} animate (optional) Animate (fade) the transition (Default is false) + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut if height is larger or YAHOO.util.Easing.easeIn if it is smaller) + * @return {YAHOO.ext.Element} this + */ + setOpacity : function(opacity, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'opacity', opacity); + }else{ + this.anim({opacity: {to: opacity}}, duration, onComplete, easing); + } + return this; + }, + + /** + * Gets the left X coordinate + * @param {Boolean} local True to get the local css position instead of page coordinate + * @return {Number} + */ + getLeft : function(local){ + if(!local){ + return this.getX(); + }else{ + return parseInt(this.getStyle('left'), 10) || 0; + } + }, + + /** + * Gets the right X coordinate of the element (element X position + element width) + * @param {Boolean} local True to get the local css position instead of page coordinate + * @return {Number} + */ + getRight : function(local){ + if(!local){ + return this.getX() + this.getWidth(); + }else{ + return (this.getLeft(true) + this.getWidth()) || 0; + } + }, + + /** + * Gets the top Y coordinate + * @param {Boolean} local True to get the local css position instead of page coordinate + * @return {Number} + */ + getTop : function(local) { + if(!local){ + return this.getY(); + }else{ + return parseInt(this.getStyle('top'), 10) || 0; + } + }, + + /** + * Gets the bottom Y coordinate of the element (element Y position + element height) + * @param {Boolean} local True to get the local css position instead of page coordinate + * @return {Number} + */ + getBottom : function(local){ + if(!local){ + return this.getY() + this.getHeight(); + }else{ + return (this.getTop(true) + this.getHeight()) || 0; + } + }, + + /** + * Set the element as absolute positioned with the specified z-index + * @param {Number} zIndex (optional) + * @return {YAHOO.ext.Element} this + */ + setAbsolutePositioned : function(zIndex){ + this.setStyle('position', 'absolute'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + /** + * Set the element as relative positioned with the specified z-index + * @param {Number} zIndex (optional) + * @return {YAHOO.ext.Element} this + */ + setRelativePositioned : function(zIndex){ + this.setStyle('position', 'relative'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + /** + * Clear positioning back to the default when the document was loaded + * @return {YAHOO.ext.Element} this + */ + clearPositioning : function(){ + this.setStyle('position', ''); + this.setStyle('left', ''); + this.setStyle('right', ''); + this.setStyle('top', ''); + this.setStyle('bottom', ''); + return this; + }, + + /** + * Gets an object with all CSS positioning properties. Useful along with setPostioning to get + * snapshot before performing an update and then restoring the element. + * @return {Object} + */ + getPositioning : function(){ + return { + 'position' : this.getStyle('position'), + 'left' : this.getStyle('left'), + 'right' : this.getStyle('right'), + 'top' : this.getStyle('top'), + 'bottom' : this.getStyle('bottom') + }; + }, + + /** + * Gets the width of the border(s) for the specified side(s) + * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example, + * passing lr would get the border (l)eft width + the border (r)ight width. + * @return {Number} The width of the sides passed added together + */ + getBorderWidth : function(side){ + return this.addStyles(side, YAHOO.ext.Element.borders); + }, + + /** + * Gets the width of the padding(s) for the specified side(s) + * @param {String} side Can be t, l, r, b or any combination of those to add multiple values. For example, + * passing lr would get the padding (l)eft + the padding (r)ight. + * @return {Number} The padding of the sides passed added together + */ + getPadding : function(side){ + return this.addStyles(side, YAHOO.ext.Element.paddings); + }, + + /** + * Set positioning with an object returned by getPositioning(). + * @param {Object} posCfg + * @return {YAHOO.ext.Element} this + */ + setPositioning : function(positionCfg){ + if(positionCfg.position)this.setStyle('position', positionCfg.position); + if(positionCfg.left)this.setLeft(positionCfg.left); + if(positionCfg.right)this.setRight(positionCfg.right); + if(positionCfg.top)this.setTop(positionCfg.top); + if(positionCfg.bottom)this.setBottom(positionCfg.bottom); + return this; + }, + + + /** + * Quick set left and top adding default units + * @return {YAHOO.ext.Element} this + */ + setLeftTop : function(left, top){ + this.dom.style.left = this.addUnits(left); + this.dom.style.top = this.addUnits(top); + return this; + }, + + /** + * Move this element relative to it's current position. + * @param {String} direction Possible values are: 'l','left' - 'r','right' - 't','top','up' - 'b','bottom','down'. + * @param {Number} distance How far to move the element in pixels + * @param {Boolean} animate (optional) Animate the movement (Default is false) + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. + * @return {YAHOO.ext.Element} this + */ + move : function(direction, distance, animate, duration, onComplete, easing){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case 'l': + case 'left': + this.moveTo(xy[0]-distance, xy[1], animate, duration, onComplete, easing); + break; + case 'r': + case 'right': + this.moveTo(xy[0]+distance, xy[1], animate, duration, onComplete, easing); + break; + case 't': + case 'top': + case 'up': + this.moveTo(xy[0], xy[1]-distance, animate, duration, onComplete, easing); + break; + case 'b': + case 'bottom': + case 'down': + this.moveTo(xy[0], xy[1]+distance, animate, duration, onComplete, easing); + break; + } + return this; + }, + + /** + * Store the current overflow setting and clip overflow on the element - use {@link #unclip} to remove + * @return {YAHOO.ext.Element} this + */ + clip : function(){ + if(!this.isClipped){ + this.isClipped = true; + this.originalClip = { + 'o': this.getStyle('overflow'), + 'x': this.getStyle('overflow-x'), + 'y': this.getStyle('overflow-y') + }; + this.setStyle('overflow', 'hidden'); + this.setStyle('overflow-x', 'hidden'); + this.setStyle('overflow-y', 'hidden'); + } + return this; + }, + + /** + * Return clipping (overflow) to original clipping before clip() was called + * @return {YAHOO.ext.Element} this + */ + unclip : function(){ + if(this.isClipped){ + this.isClipped = false; + var o = this.originalClip; + if(o.o){this.setStyle('overflow', o.o);} + if(o.x){this.setStyle('overflow-x', o.x);} + if(o.y){this.setStyle('overflow-y', o.y);} + } + return this; + }, + + /** + * Align this element with another element. + * @param {String/HTMLElement/YAHOO.ext.Element} element The element to align to. + * @param {String} position The position to align to. Possible values are 'tl' - top left, 'tr' - top right, 'bl' - bottom left, and 'br' - bottom right. + * @param {Array} offsets (optional) Offset the positioning by [x, y] + * @param {Boolean} animate (optional) Animate the movement (Default is false) + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. + * @return {YAHOO.ext.Element} this + */ + alignTo : function(element, position, offsets, animate, duration, onComplete, easing){ + var otherEl = getEl(element); + if(!otherEl){ + return this; // must not exist + } + offsets = offsets || [0, 0]; + var r = otherEl.getRegion(); + position = position.toLowerCase(); + switch(position){ + case 'bl': + this.moveTo(r.left + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'br': + this.moveTo(r.right + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tl': + this.moveTo(r.left + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tr': + this.moveTo(r.right + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + } + return this; + }, + + /** + * Clears any opacity settings from this element. Required in some cases for IE. + * @return {YAHOO.ext.Element} this + */ + clearOpacity : function(){ + if (window.ActiveXObject) { + this.dom.style.filter = ''; + } else { + this.dom.style.opacity = ''; + this.dom.style['-moz-opacity'] = ''; + this.dom.style['-khtml-opacity'] = ''; + } + return this; + }, + + /** + * Hide this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}. + * @param {Boolean} animate (optional) Animate (fade) the transition (Default is false) + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + hide : function(animate, duration, onComplete, easing){ + this.setVisible(false, animate, duration, onComplete, easing); + return this; + }, + + /** + * Show this element - Uses display mode to determine whether to use "display" or "visibility". See {@link #setVisible}. + * @param {Boolean} animate (optional) Animate (fade in) the transition (Default is false) + * @param {Float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + show : function(animate, duration, onComplete, easing){ + this.setVisible(true, animate, duration, onComplete, easing); + return this; + }, + + /** + * @private Test if size has a unit, otherwise appends the default + */ + addUnits : function(size){ + if(size === '' || size == 'auto' || typeof size == 'undefined'){ + return size; + } + if(typeof size == 'number' || !YAHOO.ext.Element.unitPattern.test(size)){ + return size + this.defaultUnit; + } + return size; + }, + + /** + * Temporarily enables offsets (width,height,x,y) for an element with display:none, use endMeasure() when done. + * @return {YAHOO.ext.Element} this + */ + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; // offsets work already + } + var changed = []; + var p = this.dom; // start with this element + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + changed.push({el: p, visibility: YAHOO.util.Dom.getStyle(p, 'visibility')}); + p.style.visibility = 'hidden'; + p.style.display = 'block'; + } + p = p.parentNode; + } + this._measureChanged = changed; + return this; + + }, + + /** + * Restores displays to before beginMeasure was called + * @return {YAHOO.ext.Element} this + */ + endMeasure : function(){ + var changed = this._measureChanged; + if(changed){ + for(var i = 0, len = changed.length; i < len; i++) { + var r = changed[i]; + r.el.style.visibility = r.visibility; + r.el.style.display = 'none'; + } + this._measureChanged = null; + } + return this; + }, + + /** + * Update the innerHTML of this element, optionally searching for and processing scripts + * @param {String} html The new HTML + * @param {Boolean} loadScripts (optional) true to look for and process scripts + * @param {Function} callback For async script loading you can be noticed when the update completes + * @return {YAHOO.ext.Element} this + */ + update : function(html, loadScripts, callback){ + if(typeof html == 'undefined'){ + html = ''; + } + if(loadScripts !== true){ + this.dom.innerHTML = html; + if(typeof callback == 'function'){ + callback(); + } + return this; + } + var id = YAHOO.util.Dom.generateId(); + var dom = this.dom; + + html += ''; + + YAHOO.util.Event.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:)((\n|\r|.)*?)(?:<\/script>)/img; + var srcRe = /\ssrc=[\'\"](.*)[\'\"]/i; + var match; + while(match = re.exec(html)){ + var srcMatch = match[0].match(srcRe); + if(srcMatch && srcMatch[1]){ + var s0 = document.createElement("script"); + s0.src = srcMatch[1]; + hd.appendChild(s0); + }else if(match[1]){ + eval(match[1]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == 'function'){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img, ''); + return this; + }, + + /** + * Direct access to the UpdateManager update() method (takes the same parameters). + * @param {String/Function} url The url for this request or a function to call to get the url + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + * @param {Boolean} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url. + * @return {YAHOO.ext.Element} this + */ + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + /** + * Gets this elements UpdateManager + * @return {YAHOO.ext.UpdateManager} The UpdateManager + */ + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new YAHOO.ext.UpdateManager(this); + } + return this.updateManager; + }, + + /** + * Disables text selection for this element (normalized across browsers) + * @return {YAHOO.ext.Element} this + */ + unselectable : function(){ + this.dom.unselectable = 'on'; + this.swallowEvent('selectstart', true); + this.applyStyles('-moz-user-select:none;-khtml-user-select:none;'); + return this; + }, + + /** + * Calculates the x, y to center this element on the screen + * @param {Boolean} offsetScroll True to offset the documents current scroll position + * @return {Array} The x, y values [x, y] + */ + getCenterXY : function(offsetScroll){ + var centerX = Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2); + var centerY = Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2); + if(!offsetScroll){ + return [centerX, centerY]; + }else{ + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop || 0; + return[centerX + scrollX, centerY + scrollY]; + } + }, + + /** + * Centers the Element in either the viewport, or another Element. + * @param {String/HTMLElement/YAHOO.ext.Element} centerIn (optional) The element in which to center the element. + */ + center : function(centerIn) { + if(!centerIn){ + this.setXY(this.getCenterXY(true)); + }else{ + var box = YAHOO.ext.Element.get(centerIn).getBox(); + this.setXY([box.x + (box.width / 2) - (this.getWidth() / 2), + box.y + (box.height / 2) - (this.getHeight() / 2)]); + } + return this; + }, + + /** + * Gets an array of child YAHOO.ext.Element objects by tag name + * @param {String} tagName + * @return {Array} The children + */ + getChildrenByTagName : function(tagName){ + var children = this.dom.getElementsByTagName(tagName); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + /** + * Gets an array of child YAHOO.ext.Element objects by class name and optional tagName + * @param {String} className + * @param {String} tagName (optional) + * @return {Array} The children + */ + getChildrenByClassName : function(className, tagName){ + var children = YAHOO.util.Dom.getElementsByClassName(className, tagName, this.dom); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + /** + * Tests various css rules/browsers to determine if this element uses a border box + * @return {Boolean} + */ + isBorderBox : function(){ + if(typeof this.bbox == 'undefined'){ + var el = this.dom; + var b = YAHOO.ext.util.Browser; + var strict = YAHOO.ext.Strict; + this.bbox = ((b.isIE && !strict && el.style.boxSizing != 'content-box') || + (b.isGecko && YAHOO.util.Dom.getStyle(el, "-moz-box-sizing") == 'border-box') || + (!b.isSafari && YAHOO.util.Dom.getStyle(el, "box-sizing") == 'border-box')); + } + return this.bbox; + }, + + /** + * Return a box {x, y, width, height} that can be used to set another elements + * size/location to match this element. + * @param {Boolean} contentBox (optional) If true a box for the content of the element is returned. + * @param {Boolean} local (optional) If true the element's left and top are returned instead of page x/y. + * @return {Object} + */ + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(YAHOO.util.Dom.getStyle('left'), 10) || 0; + var top = parseInt(YAHOO.util.Dom.getStyle('top'), 10) || 0; + xy = [left, top]; + } + var el = this.dom; + var w = el.offsetWidth; + var h = el.offsetHeight; + if(!contentBox){ + return {x: xy[0], y: xy[1], width: w, height: h}; + }else{ + var l = this.getBorderWidth('l')+this.getPadding('l'); + var r = this.getBorderWidth('r')+this.getPadding('r'); + var t = this.getBorderWidth('t')+this.getPadding('t'); + var b = this.getBorderWidth('b')+this.getPadding('b'); + return {x: xy[0]+l, y: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + }, + + /** + * Sets the element's box. Use getBox() on another element to get a box obj. If animate is true then width, height, x and y will be animated concurrently. + * @param {Object} box The box to fill {x, y, width, height} + * @param {Boolean} adjust (optional) Whether to adjust for box-model issues automatically + * @param {Boolean} animate (optional) Animate the transition (Default is false) + * @param {float} duration (optional) How long the animation lasts. (Defaults to .35 seconds) + * @param {Function} onComplete (optional) Function to call when animation completes. + * @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeBoth) + * @return {YAHOO.ext.Element} this + */ + setBox : function(box, adjust, animate, duration, onComplete, easing){ + var w = box.width, h = box.height; + if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){ + w -= (this.getBorderWidth('lr') + this.getPadding('lr')); + h -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + this.setBounds(box.x, box.y, w, h, animate, duration, onComplete, easing); + return this; + }, + + /** + * Forces the browser to repaint this element + * @return {YAHOO.ext.Element} this + */ + repaint : function(){ + var dom = this.dom; + YAHOO.util.Dom.addClass(dom, 'yui-ext-repaint'); + setTimeout(function(){ + YAHOO.util.Dom.removeClass(dom, 'yui-ext-repaint'); + }, 1); + return this; + }, + + /** + * Returns an object with properties top, left, right and bottom representing the margins of this element unless sides is passed, + * then it returns the calculated width of the sides (see getPadding) + * @param {String} sides (optional) Any combination of l, r, t, b to get the sum of those sides + * @return {Object/Number} + */ + getMargins : function(side){ + if(!side){ + return { + top: parseInt(this.getStyle('margin-top'), 10) || 0, + left: parseInt(this.getStyle('margin-left'), 10) || 0, + bottom: parseInt(this.getStyle('margin-bottom'), 10) || 0, + right: parseInt(this.getStyle('margin-right'), 10) || 0 + }; + }else{ + return this.addStyles(side, YAHOO.ext.Element.margins); + } + }, + + addStyles : function(sides, styles){ + var val = 0; + for(var i = 0, len = sides.length; i < len; i++){ + var w = parseInt(this.getStyle(styles[sides.charAt(i)]), 10); + if(!isNaN(w)) val += w; + } + return val; + }, + + /** + * Creates a proxy element of this element + * @param {String/Object} config The class name of the proxy element or a DomHelper config object + * @param {String/HTMLElement} renderTo (optional) The element or element id to render the proxy to (defaults to document.body) + * @param {Boolean} matchBox (optional) True to align and size the proxy to this element now (defaults to false) + * @return {YAHOO.ext.Element} The new proxy element + */ + createProxy : function(config, renderTo, matchBox){ + if(renderTo){ + renderTo = YAHOO.util.Dom.get(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == 'object' ? + config : {tag : 'div', cls: config}; + var proxy = YAHOO.ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + /** + * Creates an iframe shim for this element to keep selects and other windowed objects from + * showing through. + * @return {YAHOO.ext.Element} The new shim element + */ + createShim : function(){ + var config = {tag : 'iframe', frameBorder:'no', cls: 'yiframe-shim', src: YAHOO.ext.SSL_SECURE_URL}; + var shim = YAHOO.ext.DomHelper.append(this.dom.parentNode, config, true); + shim.setBox(this.getBox()); + return shim; + }, + + /** + * Removes this element from the DOM and deletes it from the cache + */ + remove : function(){ + this.dom.parentNode.removeChild(this.dom); + delete YAHOO.ext.Element.cache[this.dom.id]; + }, + + /** + * Sets up event handlers to add and remove a css class when the mouse is over this element + * @param {String} className + * @return {YAHOO.ext.Element} this + */ + addClassOnOver : function(className){ + this.on('mouseover', function(){ + this.addClass(className); + }, this, true); + this.on('mouseout', function(){ + this.removeClass(className); + }, this, true); + return this; + }, + + /** + * Stops the specified event from bubbling and optionally prevent's the default action + * @param {String} eventName + * @param {Boolean} preventDefault (optional) true to prevent the default action too + * @return {YAHOO.ext.Element} this + */ + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + this.mon(eventName, fn); + return this; + }, + + /** + * Sizes this element to it's parent element's dimensions performing + * neccessary box adjustments. + * @param {Boolean} monitorResize (optional) If true maintains the fit when the browser window is resized. + * @return {YAHOO.ext.Element} this + */ + fitToParent : function(monitorResize){ + var p = getEl(this.dom.parentNode, true); + p.beginMeasure(); // in case parent is display:none + var box = p.getBox(true, true); + p.endMeasure(); + this.setSize(box.width, box.height); + if(monitorResize === true){ + YAHOO.ext.EventManager.onWindowResize(this.fitToParent, this, true); + } + return this; + }, + + /** + * Gets the next sibling, skipping text nodes + * @return {HTMLElement} The next sibling or null + */ + getNextSibling : function(){ + var n = this.dom.nextSibling; + while(n && n.nodeType != 1){ + n = n.nextSibling; + } + return n; + }, + + /** + * Gets the previous sibling, skipping text nodes + * @return {HTMLElement} The previous sibling or null + */ + getPrevSibling : function(){ + var n = this.dom.previousSibling; + while(n && n.nodeType != 1){ + n = n.previousSibling; + } + return n; + }, + + + /** + * Appends the passed element(s) to this element + * @param {String/HTMLElement/Array/Element/CompositeElement} el + * @return {YAHOO.ext.Element} this + */ + appendChild: function(el){ + el = getEl(el); + el.appendTo(this); + return this; + }, + + /** + * Creates the passed DomHelper config and appends it to this element or optionally inserts it before the passed child element. + * @param {Object} config DomHelper element config object + * @param {HTMLElement} insertBefore (optional) a child element of this element + * @return {YAHOO.ext.Element} The new child element + */ + createChild: function(config, insertBefore){ + var c; + if(insertBefore){ + c = YAHOO.ext.DomHelper.insertBefore(insertBefore, config, true); + }else{ + c = YAHOO.ext.DomHelper.append(this.dom, config, true); + } + return c; + }, + + /** + * Appends this element to the passed element + * @param {String/HTMLElement/Element} el The new parent element + * @return {YAHOO.ext.Element} this + */ + appendTo: function(el){ + var node = getEl(el).dom; + node.appendChild(this.dom); + return this; + }, + + /** + * Inserts this element before the passed element in the DOM + * @param {String/HTMLElement/Element} el The element to insert before + * @return {YAHOO.ext.Element} this + */ + insertBefore: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node); + return this; + }, + + /** + * Inserts this element after the passed element in the DOM + * @param {String/HTMLElement/Element} el The element to insert after + * @return {YAHOO.ext.Element} this + */ + insertAfter: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node.nextSibling); + return this; + }, + + /** + * Creates and wraps this element with another element + * @param {Object} config (optional) DomHelper element config object for the wrapper element or null for an empty div + * @return {Element} The newly created wrapper element + */ + wrap: function(config){ + if(!config){ + config = {tag: 'div'}; + } + var newEl = YAHOO.ext.DomHelper.insertBefore(this.dom, config, true); + newEl.dom.appendChild(this.dom); + return newEl; + }, + + /** + * Replaces the passed element with this element + * @param {String/HTMLElement/Element} el The element to replace + * @return {YAHOO.ext.Element} this + */ + replace: function(el){ + el = getEl(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + /** + * Inserts an html fragment into this element + * @param {String} where Where to insert the html in relation to the this element - beforeBegin, afterBegin, beforeEnd, afterEnd. + * @param {String} html The HTML fragment + * @return {YAHOO.ext.Element} this + */ + insertHtml : function(where, html){ + YAHOO.ext.DomHelper.insertHtml(where, this.dom, html); + return this; + }, + + /** + * Sets the passed attributes as attributes of this element (a style attribute can be a string, object or function) + * @param {Object} o The object with the attributes + * @return {YAHOO.ext.Element} this + */ + set : function(o){ + var el = this.dom; + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + return this; + } +}; + +/** + * true to automatically adjust width and height settings for box-model issues (default to true) + */ +YAHOO.ext.Element.prototype.autoBoxAdjust = true; +/** + * true to automatically detect display mode and use display instead of visibility with show()/hide() (defaults to false). + * To enable this globally:
      YAHOO.ext.Element.prototype.autoDisplayMode = true;
      + */ +YAHOO.ext.Element.prototype.autoDisplayMode = true; + +YAHOO.ext.Element.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; +/** + * Visibility mode constant - Use visibility to hide element + * @static + * @type Number + */ +YAHOO.ext.Element.VISIBILITY = 1; +/** + * Visibility mode constant - Use display to hide element + * @static + * @type Number + */ +YAHOO.ext.Element.DISPLAY = 2; + +YAHOO.ext.Element.blockElements = /^(?:address|blockquote|center|dir|div|dl|fieldset|form|h\d|hr|isindex|menu|ol|ul|p|pre|table|dd|dt|li|tbody|tr|td|thead|tfoot|iframe)$/i; +YAHOO.ext.Element.borders = {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'}; +YAHOO.ext.Element.paddings = {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'}; +YAHOO.ext.Element.margins = {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'}; + +/** + * @private Call out to here so we make minimal closure + */ +YAHOO.ext.Element.createStopHandler = function(stopPropagation, handler, scope, override){ + return function(e){ + if(e){ + if(stopPropagation){ + YAHOO.util.Event.stopEvent(e); + }else { + YAHOO.util.Event.preventDefault(e); + } + } + handler.call(override && scope ? scope : window, e, scope); + }; +}; + +/** + * @private + */ +YAHOO.ext.Element.cache = {}; + +/** + * Static method to retreive Element objects. Uses simple caching to consistently return the same object. + * Automatically fixes if an object was recreated with the same id via AJAX or DOM. + * @param {String/HTMLElement/Element} el The id of the element or the element to wrap (must have an id). If you pass in an element, it is returned + * @param {Boolean} autoGenerateId (optional) Set this flag to true if you are passing an element without an id (like document.body). It will auto generate an id if one isn't present. + * @return {Element} The element object + * @static + */ +YAHOO.ext.Element.get = function(el, autoGenerateId){ + if(!el){ return null; } + autoGenerateId = true; // now generates id by default + if(el instanceof YAHOO.ext.Element){ + el.dom = YAHOO.util.Dom.get(el.id); // refresh dom element in case no longer valid + YAHOO.ext.Element.cache[el.id] = el; // in case it was created directly with Element(), let's cache it + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return YAHOO.ext.Element.select(el); + } + var key = el; + if(typeof el != 'string'){ // must be an element + if(!el.id && !autoGenerateId){ return null; } + YAHOO.util.Dom.generateId(el, 'elgen-'); + key = el.id; + } + var element = YAHOO.ext.Element.cache[key]; + if(!element){ + element = new YAHOO.ext.Element(key); + if(!element.dom) return null; + YAHOO.ext.Element.cache[key] = element; + }else{ + element.dom = YAHOO.util.Dom.get(key); + } + return element; +}; + +/** + * Shorthand function for YAHOO.ext.Element.get() + */ +var getEl = YAHOO.ext.Element.get; + +// clean up refs +YAHOO.util.Event.addListener(window, 'unload', function(){ YAHOO.ext.Element.cache = null; }); \ No newline at end of file diff --git a/www/extras/yui-ext/source/EventManager.js b/www/extras/yui-ext/source/EventManager.js new file mode 100644 index 000000000..e38871ddb --- /dev/null +++ b/www/extras/yui-ext/source/EventManager.js @@ -0,0 +1,433 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +/** + * @class YAHOO.ext.EventManager + * Registers event handlers that want to receive a normalized EventObject instead of the standard browser event and provides + * several useful events directly. + * See {@link YAHOO.ext.EventObject} for more details on normalized event objects. + * @singleton + */ +YAHOO.ext.EventManager = new function(){ + var docReadyEvent; + var docReadyProcId; + var docReadyState = false; + this.ieDeferSrc = null; + var resizeEvent; + var resizeTask; + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(docReadyEvent){ + docReadyEvent.fire(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new YAHOO.util.CustomEvent('documentready'); + if(document.addEventListener) { + YAHOO.util.Event.on(document, "DOMContentLoaded", fireDocReady); + }else if(YAHOO.ext.util.Browser.isIE){ + // inspired by http://www.thefutureoftheweb.com/blog/2006/6/adddomloadevent + document.write(''); + YAHOO.util.Event.on('ie-deferred-loader', 'readystatechange', function(){ + if(this.readyState == 'complete'){ + fireDocReady(); + } + }); + }else if(YAHOO.ext.util.Browser.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == 'loaded' || rs == 'complete') { + fireDocReady(); + } + }, 10); + } + // no matter what, make sure it fires on load + YAHOO.util.Event.on(window, 'load', fireDocReady); + }; + /** + * Places a simple wrapper around an event handler to override the browser event + * object with a YAHOO.ext.EventObject + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} override If true, the obj passed in becomes + * the execution scope of the listener + * @return {Function} The wrapped function + */ + this.wrap = function(fn, scope, override){ + var wrappedFn = function(e){ + YAHOO.ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, YAHOO.ext.EventObject, scope); + }; + return wrappedFn; + }; + + /** + * Appends an event handler + * + * @param {Object} element The html element to assign the + * event to + * @param {String} eventName The type of event to append + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} override If true, the obj passed in becomes + * the execution scope of the listener + * @return {Function} The wrapper function created (to be used to remove the listener if necessary) + */ + this.addListener = function(element, eventName, fn, scope, override){ + var wrappedFn = this.wrap(fn, scope, override); + YAHOO.util.Event.addListener(element, eventName, wrappedFn); + return wrappedFn; + }; + + /** + * Removes an event handler + * + * @param {Object} element The html element to remove the + * event from + * @param {String} eventName The type of event to append + * @param {Function} wrappedFn The wrapper method returned when adding the listener + * @return {Boolean} True if a listener was actually removed + */ + this.removeListener = function(element, eventName, wrappedFn){ + return YAHOO.util.Event.removeListener(element, eventName, wrappedFn); + }; + + /** + * Appends an event handler (shorthand for addListener) + * + * @param {Object} element The html element to assign the + * event to + * @param {String} eventName The type of event to append + * @param {Function} fn The method the event invokes + * @param {Object} scope An arbitrary object that will be + * passed as a parameter to the handler + * @param {boolean} override If true, the obj passed in becomes + * the execution scope of the listener + * @return {Function} The wrapper function created (to be used to remove the listener if necessary) + * @method + */ + this.on = this.addListener; + + /** + * Fires when the document is ready (before onload and before images are loaded) + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} override If true, the obj passed in becomes + * the execution scope of the listener + */ + this.onDocumentReady = function(fn, scope, override){ + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.subscribe(fn, scope, override); + } + + /** + * Fires when the window is resized and provides resize event buffering (50 milliseconds), passes new viewport width and height to handlers. + * @param {Function} fn The method the event invokes + * @param {Object} scope An object that becomes the scope of the handler + * @param {boolean} override If true, the obj passed in becomes + * the execution scope of the listener + */ + this.onWindowResize = function(fn, scope, override){ + if(!resizeEvent){ + resizeEvent = new YAHOO.util.CustomEvent('windowresize'); + resizeTask = new YAHOO.ext.util.DelayedTask(function(){ + resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight()); + }); + YAHOO.util.Event.on(window, 'resize', function(){ + resizeTask.delay(50); + }); + } + resizeEvent.subscribe(fn, scope, override); + }, + + /** + * Removes the passed window resize listener. + * @param {Function} fn The method the event invokes + * @param {Object} scope The scope of handler + */ + this.removeResizeListener = function(fn, scope){ + if(resizeEvent){ + resizeEvent.unsubscribe(fn, scope); + } + } +}; + +/** + * @class YAHOO.ext.EventObject + * EventObject exposes the Yahoo! UI Event functionality directly on the object + * passed to your event handler. It exists mostly for convenience. It also fixes the annoying null checks automatically to cleanup your code + * (All the YAHOO.util.Event methods throw javascript errors if the passed event is null). + * To get an EventObject instead of the standard browser event, + * your must register your listener thru the {@link YAHOO.ext.EventManager} or directly on an Element + * with {@link YAHOO.ext.Element#addManagedListener} or the shorthanded equivalent {@link YAHOO.ext.Element#mon}.
      + * Example: + *
      
      + fu<>nction handleClick(e){ // e is not a standard event object, it is a YAHOO.ext.EventObject
      +    e.preventDefault();
      +    var target = e.getTarget();
      +    ...
      + }
      + var myDiv = getEl('myDiv');
      + myDiv.mon('click', handleClick);
      + //or
      + YAHOO.ext.EventManager.on('myDiv', 'click', handleClick);
      + YAHOO.ext.EventManager.addListener('myDiv', 'click', handleClick);
      + 
      + * @singleton + */ +YAHOO.ext.EventObject = new function(){ + /** The normal browser event */ + this.browserEvent = null; + /** The button pressed in a mouse event */ + this.button = -1; + /** True if the shift key was down during the event */ + this.shiftKey = false; + /** True if the control key was down during the event */ + this.ctrlKey = false; + /** True if the alt key was down during the event */ + this.altKey = false; + + /** Key constant @type Number */ + this.BACKSPACE = 8; + /** Key constant @type Number */ + this.TAB = 9; + /** Key constant @type Number */ + this.RETURN = 13; + /** Key constant @type Number */ + this.ESC = 27; + /** Key constant @type Number */ + this.SPACE = 32; + /** Key constant @type Number */ + this.PAGEUP = 33; + /** Key constant @type Number */ + this.PAGEDOWN = 34; + /** Key constant @type Number */ + this.END = 35; + /** Key constant @type Number */ + this.HOME = 36; + /** Key constant @type Number */ + this.LEFT = 37; + /** Key constant @type Number */ + this.UP = 38; + /** Key constant @type Number */ + this.RIGHT = 39; + /** Key constant @type Number */ + this.DOWN = 40; + /** Key constant @type Number */ + this.DELETE = 46; + /** Key constant @type Number */ + this.F5 = 116; + + /** @private */ + this.setEvent = function(e){ + this.browserEvent = e; + if(e){ + this.button = e.button; + this.shiftKey = e.shiftKey; + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + } + }; + + /** + * Stop the event. Calls YAHOO.util.Event.stopEvent() if the event is not null. + */ + this.stopEvent = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopEvent(this.browserEvent); + } + }; + + /** + * Prevents the browsers default handling of the event. Calls YAHOO.util.Event.preventDefault() if the event is not null. + */ + this.preventDefault = function(){ + if(this.browserEvent){ + YAHOO.util.Event.preventDefault(this.browserEvent); + } + }; + + /** @private */ + this.isNavKeyPress = function(){ + return (this.browserEvent.keyCode && this.browserEvent.keyCode >= 33 && this.browserEvent.keyCode <= 40); + }; + + /** + * Cancels bubbling of the event. Calls YAHOO.util.Event.stopPropagation() if the event is not null. + */ + this.stopPropagation = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopPropagation(this.browserEvent); + } + }; + + /** + * Gets the key code for the event. Returns value from YAHOO.util.Event.getCharCode() if the event is not null. + * @return {Number} + */ + this.getCharCode = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getCharCode(this.browserEvent); + } + return null; + }; + + /** + * Returns a browsers key for a keydown event + * @return {Number} The key code + */ + this.getKey = function(){ + if(this.browserEvent){ + return this.browserEvent.charCode || this.browserEvent.keyCode; + } + return null; + }; + + /** + * Gets the x coordinate of the event. Returns value from YAHOO.util.Event.getPageX() if the event is not null. + * @return {Number} + */ + this.getPageX = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageX(this.browserEvent); + } + return null; + }; + + /** + * Gets the y coordinate of the event. Returns value from YAHOO.util.Event.getPageY() if the event is not null. + * @return {Number} + */ + this.getPageY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageY(this.browserEvent); + } + return null; + }; + + /** + * Gets the time of the event. Returns value from YAHOO.util.Event.getTime() if the event is not null. + * @return {Number} + */ + this.getTime = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTime(this.browserEvent); + } + return null; + }; + + /** + * Gets the page coordinates of the event. Returns value from YAHOO.util.Event.getXY() if the event is not null. + * @return {Array} The xy values like [x, y] + */ + this.getXY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getXY(this.browserEvent); + } + return []; + }; + + /** + * Gets the target for the event. Returns value from YAHOO.util.Event.getTarget() if the event is not null. + * @return {HTMLelement} + */ + this.getTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTarget(this.browserEvent); + } + return null; + }; + + /** + * Walk up the DOM looking for a particular target - if the default target matches, it is returned. + * @param {String} className The class name to look for or null + * @param {String} tagName (optional) The tag name to look for + * @return {HTMLelement} + */ + this.findTarget = function(className, tagName){ + if(tagName) tagName = tagName.toLowerCase(); + if(this.browserEvent){ + function isMatch(el){ + if(!el){ + return false; + } + if(className && !YAHOO.util.Dom.hasClass(el, className)){ + return false; + } + if(tagName && el.tagName.toLowerCase() != tagName){ + return false; + } + return true; + }; + + var t = this.getTarget(); + if(!t || isMatch(t)){ + return t; + } + var p = t.parentNode; + var b = document.body; + while(p && p != b){ + if(isMatch(p)){ + return p; + } + p = p.parentNode; + } + } + return null; + }; + /** + * Gets the related target. Returns value from YAHOO.util.Event.getRelatedTarget() if the event is not null. + * @return {HTMLElement} + */ + this.getRelatedTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getRelatedTarget(this.browserEvent); + } + return null; + }; + + /** + * Normalizes mouse wheel delta across browsers + * @return {Number} The delta + */ + this.getWheelDelta = function(){ + var e = this.browserEvent; + var delta = 0; + if(e.wheelDelta){ /* IE/Opera. */ + delta = e.wheelDelta/120; + /* In Opera 9, delta differs in sign as compared to IE. */ + if(window.opera) delta = -delta; + }else if(e.detail){ /* Mozilla case. */ + delta = -e.detail/3; + } + return delta; + }; + + /** + * Returns true if the control, shift or alt key was pressed during this event. + * @return {Boolean} + */ + this.hasModifier = function(){ + return this.ctrlKey || this.altKey || this.shiftKey; + }; +}(); + + \ No newline at end of file diff --git a/www/extras/yui-ext/source/JSON.js b/www/extras/yui-ext/source/JSON.js new file mode 100644 index 000000000..f6920c668 --- /dev/null +++ b/www/extras/yui-ext/source/JSON.js @@ -0,0 +1,134 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.util.JSON + * Modified version of Douglas Crockford's json.js that doesn't + * mess with the Object prototype + * http://www.json.org/js.html + * @singleton + */ +YAHOO.ext.util.JSON = new function(){ + var useHasOwn = {}.hasOwnProperty ? true : false; + var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/; + + var pad = function(n) { + return n < 10 ? '0' + n : n; + }; + + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + + var encodeString = function(s){ + if (/["\\\x00-\x1f]/.test(s)) { + return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = m[b]; + if(c){ + return c; + } + c = b.charCodeAt(); + return '\\u00' + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + '"'; + } + return '"' + s + '"'; + }; + + var encodeArray = function(o){ + var a = ['['], b, i, l = o.length, v; + for (i = 0; i < l; i += 1) { + v = o[i]; + switch (typeof v) { + case 'undefined': + case 'function': + case 'unknown': + break; + default: + if (b) { + a.push(','); + } + a.push(v === null ? "null" : YAHOO.ext.util.JSON.encode(v)); + b = true; + } + } + a.push(']'); + return a.join(''); + }; + + var encodeDate = function(o){ + return '"' + o.getFullYear() + '-' + + pad(o.getMonth() + 1) + '-' + + pad(o.getDate()) + 'T' + + pad(o.getHours()) + ':' + + pad(o.getMinutes()) + ':' + + pad(o.getSeconds()) + '"'; + }; + + /** + * Encodes an Object, Array or other value + * @param {Mixed} o The variable to encode + * @return {String} The JSON string + */ + this.encode = function(o){ + if(typeof o == 'undefined' || o === null){ + return 'null'; + }else if(o instanceof Array){ + return encodeArray(o); + }else if(o instanceof Date){ + return encodeDate(o); + }else if(typeof o == 'string'){ + return encodeString(o); + }else if(typeof o == 'number'){ + return isFinite(o) ? String(o) : "null"; + }else if(typeof o == 'boolean'){ + return String(o); + }else { + var a = ['{'], b, i, v; + for (var i in o) { + if(!useHasOwn || o.hasOwnProperty(i)) { + v = o[i]; + switch (typeof v) { + case 'undefined': + case 'function': + case 'unknown': + break; + default: + if(b){ + a.push(','); + } + a.push(this.encode(i), ':', + v === null ? "null" : this.encode(v)); + b = true; + } + } + } + a.push('}'); + return a.join(''); + } + }; + + /** + * Decodes (parses) a JSON string to an object. If the JSON is invalid, this function throws a SyntaxError. + * @param {String} json The JSON string + * @return {Object} The resulting object + */ + this.decode = function(json){ + try{ + if(validRE.test(json)) { + return eval('(' + json + ')'); + } + }catch(e){ + } + throw new SyntaxError("parseJSON"); + }; +}(); \ No newline at end of file diff --git a/www/extras/yui-ext/source/MixedCollection.js b/www/extras/yui-ext/source/MixedCollection.js new file mode 100644 index 000000000..80660b3d0 --- /dev/null +++ b/www/extras/yui-ext/source/MixedCollection.js @@ -0,0 +1,349 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.util.MixedCollection + * A Collection class that maintains both numeric indexes and keys and exposes events.
      + * @constructor + * @param {Boolean} allowFunctions True if the addAll function should add function references + * to the collection. + */ +YAHOO.ext.util.MixedCollection = function(allowFunctions){ + this.items = []; + this.keys = []; + this.events = { + /** + * @event clear + * Fires when the collection is cleared. + */ + 'clear' : new YAHOO.util.CustomEvent('clear'), + /** + * @event add + * Fires when an item is added to the collection. + * @param {Number} index The index at which the item was added. + * @param {Object} o The item added. + * @param {String} key The key associated with the added item. + */ + 'add' : new YAHOO.util.CustomEvent('add'), + /** + * @event replace + * Fires when an item is replaced in the collection. + * @param {String} key he key associated with the new added. + * @param {Object} old The item being replaced. + * @param {Object} new The new item. + */ + 'replace' : new YAHOO.util.CustomEvent('replace'), + /** + * @event remove + * Fires when an item is removed from the collection. + * @param {Object} o The item being removed. + * @param {String} key (optional) The key associated with the removed item. + */ + 'remove' : new YAHOO.util.CustomEvent('remove') + } + this.allowFunctions = allowFunctions === true; +}; + +YAHOO.extendX(YAHOO.ext.util.MixedCollection, YAHOO.ext.util.Observable, { + allowFunctions : false, + +/** + * Adds an item to the collection. + * @param {String} key The key to associate with the item + * @param {Object} o The item to add. + * @return {Object} The item added. + */ + add : function(key, o){ + if(arguments.length == 1){ + o = arguments[0]; + key = this.getKey(o); + } + this.items.push(o); + if(typeof key != 'undefined' && key != null){ + this.items[key] = o; + this.keys.push(key); + } + this.fireEvent('add', this.items.length-1, o, key); + return o; + }, + +/** + * MixedCollection has a generic way to fetch keys if you implement getKey. +
      
      +    // normal way
      +    var mc = new YAHOO.ext.util.MixedCollection();
      +    mc.add(someEl.dom.id, someEl);
      +    mc.add(otherEl.dom.id, otherEl);
      +    //and so on
      +    
      +    // using getKey
      +    var mc = new YAHOO.ext.util.MixedCollection();
      +    mc.getKey = function(el){
      +       return el.dom.id;
      +    }
      +    mc.add(someEl);
      +    mc.add(otherEl);
      +    // etc
      +    
      + * @param o {Object} The item for which to find the key.
      + * @return {Object} The key for the passed item.
      + */
      +    getKey : function(o){
      +         return null; 
      +    },
      +   
      +/**
      + * Replaces an item in the collection.
      + * @param {String} key The key associated with the item to replace, or the item to replace.
      + * @param o {Object} o (optional) If the first parameter passed was a key, the item to associate with that key.
      + * @return {Object}  The new item.
      + */
      +    replace : function(key, o){
      +        if(arguments.length == 1){
      +            o = arguments[0];
      +            key = this.getKey(o);
      +        }
      +        if(typeof this.items[key] == 'undefined'){
      +            return this.add(key, o);
      +        }
      +        var old = this.items[key];
      +        if(typeof key == 'number'){ // array index key
      +            this.items[key] = o;
      +        }else{
      +            var index = this.indexOfKey(key);
      +            this.items[index] = o;
      +            this.items[key] = o;
      +        }
      +        this.fireEvent('replace', key, old, o);
      +        return o;
      +    },
      +   
      +/**
      + * Adds all elements of an Array or an Object to the collection.
      + * @param {Object/Array} objs An Object containing properties which will be added to the collection, or
      + * an Array of values, each of which are added to the collection.
      + */
      +    addAll : function(objs){
      +        if(arguments.length > 1 || objs instanceof Array){
      +            var args = arguments.length > 1 ? arguments : objs;
      +            for(var i = 0, len = args.length; i < len; i++){
      +                this.add(args[i]);
      +            }
      +        }else{
      +            for(var key in objs){
      +                if(this.allowFunctions || typeof objs[key] != 'function'){
      +                    this.add(objs[key], key);
      +                }
      +            }
      +        }
      +    },
      +   
      +/**
      + * Executes the specified function once for every item in the collection, passing each
      + * item as the first and only parameter.
      + * @param {Function} fn The function to execute for each item.
      + * @param {Object} scope (optional) The scope in which to execute the function.
      + */
      +    each : function(fn, scope){
      +        for(var i = 0, len = this.items.length; i < len; i++){
      +            fn.call(scope || window, this.items[i]);
      +        }
      +    },
      +   
      +/**
      + * Executes the specified function once for every key in the collection, passing each
      + * key, and its associated item as the first two parameters.
      + * @param {Function} fn The function to execute for each item.
      + * @param {Object} scope (optional) The scope in which to execute the function.
      + */
      +    eachKey : function(fn, scope){
      +        for(var i = 0, len = this.keys.length; i < len; i++){
      +            fn.call(scope || window, this.keys[i], this.items[i]);
      +        }
      +    },
      +   
      +/**
      + * Returns the first item in the collection which elicits a true return value from the
      + * passed selection function.
      + * @param {Function} fn The selection function to execute for each item.
      + * @param {Object} scope (optional) The scope in which to execute the function.
      + * @return {Object} The first item in the collection which returned true from the selection function.
      + */
      +    find : function(fn, scope){
      +        for(var i = 0, len = this.items.length; i < len; i++){
      +            if(fn.call(scope || window, this.items[i])){
      +                return this.items[i];
      +            }
      +        }
      +        return null;
      +    },
      +   
      +/**
      + * Inserts an item at the specified index in the collection.
      + * @param {Number} index The index to insert the item at.
      + * @param {String} key The key to associate with the new item, or the item itself.
      + * @param {Object} o  (optional) If the second parameter was a key, the new item.
      + * @return {Object} The item inserted.
      + */
      +    insert : function(index, key, o){
      +        if(arguments.length == 2){
      +            o = arguments[1];
      +            key = this.getKey(o);
      +        }
      +        if(index >= this.items.length){
      +            return this.add(o, key);
      +        }
      +        this.items.splice(index, 0, o);
      +        if(typeof key != 'undefined' && key != null){
      +            this.items[key] = o;
      +            this.keys.splice(index, 0, key);
      +        }
      +        this.fireEvent('add', index, o, key);
      +        return o;
      +    },
      +   
      +/**
      + * Removed an item from the collection.
      + * @param {Object} o The item to remove.
      + * @return {Object} The item removed.
      + */
      +    remove : function(o){
      +        var index = this.indexOf(o);
      +        this.items.splice(index, 1);
      +        if(typeof this.keys[index] != 'undefined'){
      +            var key = this.keys[index];
      +            this.keys.splice(index, 1);
      +            delete this.items[key];
      +        }
      +        this.fireEvent('remove', o);
      +        return o;
      +    },
      +   
      +/**
      + * Remove an item from a specified index in the collection.
      + * @param {Number} index The index within the collection of the item to remove.
      + */
      +    removeAt : function(index){
      +        this.items.splice(index, 1);
      +        var key = this.keys[index];
      +        if(typeof key != 'undefined'){
      +             this.keys.splice(index, 1);
      +             delete this.items[key];
      +        }
      +        this.fireEvent('remove', o, key);
      +    },
      +   
      +/**
      + * Removed an item associated with the passed key fom the collection.
      + * @param {String} key The key of the item to remove.
      + */
      +    removeKey : function(key){
      +        var o = this.items[key];
      +        var index = this.indexOf(o);
      +        this.items.splice(index, 1);
      +        this.keys.splice(index, 1);
      +        delete this.items[key];
      +        this.fireEvent('remove', o, key);
      +    },
      +   
      +/**
      + * Returns the number of items in the collection.
      + * @return {Number} the number of items in the collection.
      + */
      +    getCount : function(){
      +        return this.items.length; 
      +    },
      +   
      +/**
      + * Returns index within the collection of the passed Object.
      + * @param {Object} o The item to find the index of.
      + * @return {Number} index of the item.
      + */
      +    indexOf : function(o){
      +        if(!this.items.indexOf){
      +            for(var i = 0, len = this.items.length; i < len; i++){
      +                if(this.items[i] == o) return i;
      +            }
      +            return -1;
      +        }else{
      +            return this.items.indexOf(o);
      +        }
      +    },
      +   
      +/**
      + * Returns index within the collection of the passed key.
      + * @param {String} key The key to find the index of.
      + * @return {Number} index of the key.
      + */
      +    indexOfKey : function(key){
      +        if(!this.keys.indexOf){
      +            for(var i = 0, len = this.keys.length; i < len; i++){
      +                if(this.keys[i] == key) return i;
      +            }
      +            return -1;
      +        }else{
      +            return this.keys.indexOf(key);
      +        }
      +    },
      +   
      +/**
      + * Returns the item associated with the passed key.
      + * @param {String/Number} key The key or index of the item.
      + * @return {Object} The item associated with the passed key.
      + */
      +    item : function(key){
      +        return this.items[key];
      +    },
      +   
      +/**
      + * Returns true if the collection contains the passed Object as an item.
      + * @param {Object} o  The Object to look for in the collection.
      + * @return {Boolean} True if the collection contains the Object as an item.
      + */
      +    contains : function(o){
      +        return this.indexOf(o) != -1;
      +    },
      +   
      +/**
      + * Returns true if the collection contains the passed Object as a key.
      + * @param {String} key The key to look for in the collection.
      + * @return {Boolean} True if the collection contains the Object as a key.
      + */
      +    containsKey : function(key){
      +        return typeof this.items[key] != 'undefined';
      +    },
      +   
      +/**
      + * Removes all items from the collection.
      + */
      +    clear : function(o){
      +        this.items = [];
      +        this.keys = [];
      +        this.fireEvent('clear');
      +    },
      +   
      +/**
      + * Returns the first item in the collection.
      + * @return {Boolean} the first item in the collection..
      + */
      +    first : function(){
      +        return this.items[0]; 
      +    },
      +   
      +/**
      + * Returns the last item in the collection.
      + * @return {Boolean} the last item in the collection..
      + */
      +    last : function(){
      +        return this.items[this.items.length];   
      +    }
      +});
      +/**
      + * Returns the item associated with the passed key or index.
      + * @method
      + * @param {String/Number} key The key or index of the item.
      + * @return {Object} The item associated with the passed key.
      + */
      +YAHOO.ext.util.MixedCollection.prototype.get = YAHOO.ext.util.MixedCollection.prototype.item;
      \ No newline at end of file
      diff --git a/www/extras/yui-ext/source/State.js b/www/extras/yui-ext/source/State.js
      new file mode 100644
      index 000000000..04860b59e
      --- /dev/null
      +++ b/www/extras/yui-ext/source/State.js
      @@ -0,0 +1,269 @@
      +/*
      + * YUI Extensions 0.33 RC2
      + * Copyright(c) 2006, Jack Slocum.
      + */
      +
      +YAHOO.namespace('ext.state');
      +/**
      + * @class YAHOO.ext.state.Provider
      + * Abstract base class for provider implementations. This class provides methods
      + * for encoding and decoding typed variables including dates and defines the 
      + * Provider interface.
      + */
      +YAHOO.ext.state.Provider = function(){
      +    YAHOO.ext.state.Provider.superclass.constructor.call(this);
      +    /**
      +     * @event statechange
      +     * Fires when a state change occurs.
      +     * @param {Provider} this
      +     * @param {String} key The state key which was changed
      +     * @param {String} value The encoded value for the state
      +     */
      +    this.events = {
      +        'statechange': new YAHOO.util.CustomEvent('statechange')  
      +    };
      +    this.state = {};
      +};
      +YAHOO.extendX(YAHOO.ext.state.Provider, YAHOO.ext.util.Observable, {
      +    /**
      +     * Get the current value for a key.
      +     * @param {String} name
      +     * @param {Mixed} defaultValue
      +     * @return {Mixed}
      +     */
      +    get : function(name, defaultValue){
      +        return typeof this.state[name] == 'undefined' ?
      +            defaultValue : this.state[name];
      +    },
      +    
      +    /**
      +     * Clear a value from the state.
      +     */
      +    clear : function(name){
      +        delete this.state[name];
      +        this.fireEvent('statechange', this, name, null);
      +    },
      +    
      +    /**
      +     * Set the value for a key.
      +     * @param {String} name
      +     * @param {Mixed} value
      +     */
      +    set : function(name, value){
      +        this.state[name] = value;
      +        this.fireEvent('statechange', this, name, value);
      +    },
      +    
      +    /**
      +     * Decodes a string previously encoded with {@link #encodeValue}.
      +     * @param {String} value
      +     * @return {Mixed} The value
      +     */
      +    decodeValue : function(cookie){
      +        var re = /^(a|n|d|b|s|o)\:(.*)$/;
      +        var matches = re.exec(unescape(cookie));
      +        if(!matches || !matches[1]) return; // non state cookie
      +        var type = matches[1];
      +        var v = matches[2];
      +        switch(type){
      +            case 'n':
      +                return parseFloat(v);
      +            case 'd':
      +                return new Date(Date.parse(v));
      +            case 'b':
      +                return (v == '1');
      +            case 'a':
      +                var all = [];
      +                var values = v.split('^');
      +                for(var i = 0, len = values.length; i < len; i++){
      +                    all.push(this.decodeValue(values[i]))
      +                }
      +                return all;
      +           case 'o':
      +                var all = {};
      +                var values = v.split('^');
      +                for(var i = 0, len = values.length; i < len; i++){
      +                    var kv = values[i].split('=');
      +                    all[kv[0]] = this.decodeValue(kv[1]);
      +                }
      +                return all;
      +           default:
      +                return v;
      +        }
      +    },
      +    
      +    /**
      +     * Encode a value including type information.
      +     * @param {Mixed} value
      +     * @return {String}
      +     */
      +    encodeValue : function(v){
      +        var enc;
      +        if(typeof v == 'number'){
      +            enc = 'n:' + v;
      +        }else if(typeof v == 'boolean'){
      +            enc = 'b:' + (v ? '1' : '0');
      +        }else if(v instanceof Date){
      +            enc = 'd:' + v.toGMTString();
      +        }else if(v instanceof Array){
      +            var flat = '';
      +            for(var i = 0, len = v.length; i < len; i++){
      +                flat += this.encodeValue(v[i]);
      +                if(i != len-1) flat += '^';
      +            }
      +            enc = 'a:' + flat;
      +        }else if(typeof v == 'object'){
      +            var flat = '';
      +            for(var key in v){
      +                if(typeof v[key] != 'function'){
      +                    flat += key + '=' + this.encodeValue(v[key]) + '^';
      +                }
      +            }
      +            enc = 'o:' + flat.substring(0, flat.length-1);
      +        }else{
      +            enc = 's:' + v;
      +        }
      +        return escape(enc);        
      +    }
      +});
      +
      +/**
      + * @class YAHOO.ext.state.Manager
      + * This is the global state manager. By default all components that are "state aware" check this class
      + * for state information if you don't pass them a custom state provider. In order for this class
      + * to be useful, it must be initialized with a provider when your application initializes.
      + 
      
      +// in your initialization function
      +init : function(){
      +   YAHOO.ext.state.Manager.setProvider(new YAHOO.ext.state.CookieProvider());
      +   ...
      +   // supposed you have a {@link YAHOO.ext.BorderLayout}
      +   var layout = new YAHOO.ext.BorderLayout(...);
      +   layout.restoreState();
      +   // or a {YAHOO.ext.BasicDialog}
      +   var dialog = new YAHOO.ext.BasicDialog(...);
      +   dialog.restoreState();
      + 
      + * @singleton + */ +YAHOO.ext.state.Manager = new function(){ + var provider = new YAHOO.ext.state.Provider(); + + return { + /** + * Configures the default provider for your application. + * @param {Provider} stateProvider + */ + setProvider : function(stateProvider){ + provider = stateProvider; + }, + + /** + * Get the current value for a key. + * @param {String} name + * @param {Mixed} defaultValue + * @return {Mixed} + */ + get : function(key, defaultValue){ + return provider.get(key, defaultValue); + }, + + /** + * Set the value for a key. + * @param {String} name + * @param {Mixed} value + */ + set : function(key, value){ + provider.set(key, value); + }, + + /** + * Clear a value from the state. + */ + clear : function(key){ + provider.clear(key); + }, + + /** + * Gets the currently configured provider. + * @return {Provider} + */ + getProvider : function(){ + return provider; + } + }; +}(); + +/** + * @class YAHOO.ext.state.CookieProvider + * @extends YAHOO.ext.state.Provider + * The default Provider implementation. The example below includes all valid configuration options and their + * default values. +
      
      +   var cp = new YAHOO.ext.state.CookieProvider({
      +       path: '/',
      +       expires: new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days
      +       domain: null,
      +       secure: false       
      +   })
      +   YAHOO.ext.state.Manager.setProvider(cp);
      + 
      + * @constructor + * Create a new CookieProvider + * @param {Object} config The configuration object + */ +YAHOO.ext.state.CookieProvider = function(config){ + YAHOO.ext.state.CookieProvider.superclass.constructor.call(this); + this.path = '/'; + this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days + this.domain = null; + this.secure = false; + YAHOO.ext.util.Config.apply(this, config); + this.state = this.readCookies(); +}; + +YAHOO.extendX(YAHOO.ext.state.CookieProvider, YAHOO.ext.state.Provider, { + set : function(name, value){ + if(typeof value == 'undefined' || value === null){ + this.clear(name); + return; + } + this.setCookie(name, value); + YAHOO.ext.state.CookieProvider.superclass.set.call(this, name, value); + }, + + clear : function(name){ + this.clearCookie(name); + YAHOO.ext.state.CookieProvider.superclass.clear.call(this, name); + }, + + readCookies : function(){ + var cookies = {}; + var c = document.cookie + ';'; + var re = /\s?(.*?)=(.*?);/g; + var matches; + while((matches = re.exec(c)) != null){ + var name = matches[1]; + var value = matches[2]; + if(name && name.substring(0,3) == 'ys-'){ + cookies[name.substr(3)] = this.decodeValue(value); + } + } + return cookies; + }, + + setCookie : function(name, value){ + document.cookie = "ys-"+ name + "=" + this.encodeValue(value) + + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + }, + + clearCookie : function(name){ + document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + } +}); diff --git a/www/extras/yui-ext/source/UpdateManager.js b/www/extras/yui-ext/source/UpdateManager.js new file mode 100644 index 000000000..60cfb1ddf --- /dev/null +++ b/www/extras/yui-ext/source/UpdateManager.js @@ -0,0 +1,481 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.UpdateManager + * @extends YAHOO.ext.util.Observable + * Provides AJAX-style update for Element object using Yahoo + * UI library YAHOO.util.Connect functionality.

      + * Usage:
      + *
      
      + * // Get it from a YAHOO.ext.Element object
      + * var el = getEl('foo');
      + * var mgr = el.getUpdateManager();
      + * mgr.update('http://myserver.com/index.php', 'param1=1&param2=2');
      + * ...
      + * mgr.formUpdate('myFormId', 'http://myserver.com/index.php');
      + * 
      + * // or directly (returns the same UpdateManager instance) + * var mgr = new YAHOO.ext.UpdateManager('myElementId'); + * mgr.startAutoRefresh(60, 'http://myserver.com/index.php'); + * mgr.onUpdate.subscribe(myFcnNeedsToKnow); + *
      + *
      + * @requires YAHOO.ext.Element + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.Connect + * @constructor + * Create new UpdateManager directly. + * @param {String/HTMLElement/YAHOO.ext.Element} el The element to update + * @param {Boolean} forceNew (optional) By default the constructor checks to see if the passed element already has an UpdateManager and if it does it returns the same instance. This will skip that check (useful for extending this class). + */ +YAHOO.ext.UpdateManager = function(el, forceNew){ + el = YAHOO.ext.Element.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + /** + * The Element object + * @type YAHOO.ext.Element + */ + this.el = el; + /** + * Cached url to use for refreshes. Overwritten every time update() is called unless 'discardUrl' param is set to true. + * @type String + */ + this.defaultUrl = null; + this.beforeUpdate = new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate'); + this.onUpdate = new YAHOO.util.CustomEvent('UpdateManager.onUpdate'); + this.onFailure = new YAHOO.util.CustomEvent('UpdateManager.onFailure'); + + this.events = { + /** + * @event beforeupdate + * Fired before an update is made, return false from your handler and the update is cancelled. + * @param {YAHOO.ext.Element} el + * @param {String/Object/Function} url + * @param {String/Object} params + */ + 'beforeupdate': this.beforeUpdate, + /** + * @event update + * Fired after successful update is made. + * @param {YAHOO.ext.Element} el + * @param {Object} oResponseObject The YAHOO.util.Connect response Object + */ + 'update': this.onUpdate, + /** + * @event failure + * Fired on update failure. Uses fireDirect with signature: (oElement, oResponseObject) + * @param {YAHOO.ext.Element} el + * @param {Object} oResponseObject The YAHOO.util.Connect response Object + */ + 'failure': this.onFailure + }; + + /** + * Blank page URL to use with SSL file uploads (Defaults to YAHOO.ext.UpdateManager.defaults.sslBlankUrl or 'about:blank'). + * @type String + */ + this.sslBlankUrl = YAHOO.ext.UpdateManager.defaults.sslBlankUrl; + /** + * Whether to append unique parameter on get request to disable caching (Defaults to YAHOO.ext.UpdateManager.defaults.disableCaching or false). + * @type Boolean + */ + this.disableCaching = YAHOO.ext.UpdateManager.defaults.disableCaching; + /** + * Text for loading indicator (Defaults to YAHOO.ext.UpdateManager.defaults.indicatorText or '<div class="loading-indicator">Loading...</div>'). + * @type String + */ + this.indicatorText = YAHOO.ext.UpdateManager.defaults.indicatorText; + /** + * Whether to show indicatorText when loading (Defaults to YAHOO.ext.UpdateManager.defaults.showLoadIndicator or true). + * @type String + */ + this.showLoadIndicator = YAHOO.ext.UpdateManager.defaults.showLoadIndicator; + /** + * Timeout for requests or form posts in seconds (Defaults to YAHOO.ext.UpdateManager.defaults.timeout or 30 seconds). + * @type Number + */ + this.timeout = YAHOO.ext.UpdateManager.defaults.timeout; + + /** + * True to process scripts in the output (Defaults to YAHOO.ext.UpdateManager.defaults.loadScripts (false)). + * @type Boolean + */ + this.loadScripts = YAHOO.ext.UpdateManager.defaults.loadScripts; + + /** + * YAHOO.util.Connect transaction object of current executing transaction + */ + this.transaction = null; + + /** + * @private + */ + this.autoRefreshProcId = null; + /** + * Delegate for refresh() prebound to 'this', use myUpdater.refreshDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + this.refreshDelegate = this.refresh.createDelegate(this); + /** + * Delegate for update() prebound to 'this', use myUpdater.updateDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + this.updateDelegate = this.update.createDelegate(this); + /** + * Delegate for formUpdate() prebound to 'this', use myUpdater.formUpdateDelegate.createCallback(arg1, arg2) to bind arguments + * @type Function + */ + this.formUpdateDelegate = this.formUpdate.createDelegate(this); + /** + * @private + */ + this.successDelegate = this.processSuccess.createDelegate(this); + /** + * @private + */ + this.failureDelegate = this.processFailure.createDelegate(this); + + /** + * The renderer for this UpdateManager. Defaults to {@link YAHOO.ext.UpdateManager.BasicRenderer}. + */ + this.renderer = new YAHOO.ext.UpdateManager.BasicRenderer(); +}; + +YAHOO.ext.UpdateManager.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + /** + * Get the Element this UpdateManager is bound to + * @return {YAHOO.ext.Element} The element + */ + getEl : function(){ + return this.el; + }, + + /** + * Performs an async request, updating this element with the response. If params are specified it uses POST, otherwise it uses GET. + * @param {Object/String/Function} url The url for this request or a function to call to get the url or a config object containing any of the following options: +
      
      +um.update({
      +    url: 'your-url.php',
      +    params: {param1: 'foo', param2: 'bar'}, // or a URL encoded string
      +    callback: yourFunction,
      +    scope: yourObject, //(optional scope)  
      +    discardUrl: false, 
      +    disableCaching: false,
      +    indicatorText: 'Loading...',
      +    timeout: 30,
      +    loadScripts: false
      +});   
      +
      + * The only required property is url. The optional properties nocache, text and scripts + * are shorthand for disableCaching, indicatorText and loadScripts and are used to set their associated property on this UpdateManager instance. + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + * @param {Boolean} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url. + */ + update : function(url, params, callback, discardUrl){ + if(this.beforeUpdate.fireDirect(this.el, url, params) !== false){ + if(typeof url == 'object'){ // must be config object + var cfg = url; + url = cfg.url; + params = params || cfg.params; + callback = callback || cfg.callback; + discardUrl = discardUrl || cfg.discardUrl; + if(callback && cfg.scope){ + callback = callback.createDelegate(cfg.scope); + } + if(typeof cfg.nocache != 'undefined'){this.disableCaching = cfg.nocache}; + if(typeof cfg.text != 'undefined'){this.indicatorText = cfg.text}; + if(typeof cfg.scripts != 'undefined'){this.loadScripts = cfg.scripts}; + if(typeof cfg.timeout != 'undefined'){this.timeout = cfg.timeout}; + } + this.showLoading(); + if(!discardUrl){ + this.defaultUrl = url; + } + if(typeof url == 'function'){ + url = url(); + } + if(params && typeof params != 'string'){ // must be object + var buf = []; + for(var key in params){ + if(typeof params[key] != 'function'){ + buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&'); + } + } + delete buf[buf.length-1]; + params = buf.join(''); + } + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': null, 'callback': callback, 'params': params} + }; + var method = params ? 'POST' : 'GET'; + if(method == 'GET'){ + url = this.prepareUrl(url); + } + this.transaction = YAHOO.util.Connect.asyncRequest(method, url, callback, params); + } + }, + + /** + * Performs an async form post, updating this element with the response. If the form has the attribute enctype="multipart/form-data", it assumes it's a file upload. + * Uses this.sslBlankUrl for SSL file uploads to prevent IE security warning. See YUI docs for more info. + * @param {String/HTMLElement} form The form Id or form element + * @param {String} url (optional) The url to pass the form to. If omitted the action attribute on the form will be used. + * @param {Boolean} reset (optional) Whether to try to reset the form after the update + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + */ + formUpdate : function(form, url, reset, callback){ + if(this.beforeUpdate.fireDirect(this.el, form, url) !== false){ + this.showLoading(); + formEl = YAHOO.util.Dom.get(form); + if(typeof url == 'function'){ + url = url(); + } + url = url || formEl.action; + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': form, 'callback': callback, 'reset': reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute('enctype'); + if(enctype && enctype.toLowerCase() == 'multipart/form-data'){ + isUpload = true; + } + YAHOO.util.Connect.setForm(form, isUpload, this.sslBlankUrl); + this.transaction = YAHOO.util.Connect.asyncRequest('POST', url, callback); + } + }, + + /** + * Refresh the element with the last used url or defaultUrl. If there is no url, it returns immediately + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + */ + refresh : function(callback){ + if(this.defaultUrl == null){ + return; + } + this.update(this.defaultUrl, null, callback, true); + }, + + /** + * Set this element to auto refresh. + * @param {Number} interval How often to update (in seconds). + * @param {String/Function} url (optional) The url for this request or a function to call to get the url (Defaults to the last used url) + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string "¶m1=1¶m2=2" or as an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + * @param {Boolean} refreshNow (optional) Whether to execute the refresh now, or wait the interval + */ + startAutoRefresh : function(interval, url, params, callback, refreshNow){ + if(refreshNow){ + this.update(url || this.defaultUrl, params, callback, true); + } + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000); + }, + + /** + * Stop auto refresh on this element. + */ + stopAutoRefresh : function(){ + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + }, + + /** + * Called to update the element to "Loading" state. Override to perform custom action. + */ + showLoading : function(){ + if(this.showLoadIndicator){ + this.el.update(this.indicatorText); + } + }, + + /** + * Adds unique parameter to query string if disableCaching = true + * @private + */ + prepareUrl : function(url){ + if(this.disableCaching){ + var append = '_dc=' + (new Date().getTime()); + if(url.indexOf('?') !== -1){ + url += '&' + append; + }else{ + url += '?' + append; + } + } + return url; + }, + + /** + * @private + */ + processSuccess : function(response){ + this.transaction = null; + if(response.argument.form && response.argument.reset){ + try{ // put in try/catch since some older FF releases had problems with this + response.argument.form.reset(); + }catch(e){} + } + if(this.loadScripts){ + this.renderer.render(this.el, response, this, + this.updateComplete.createDelegate(this, [response])); + }else{ + this.renderer.render(this.el, response, this); + this.updateComplete(response); + } + }, + + updateComplete : function(response){ + this.fireEvent('update', this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, true); + } + }, + + /** + * @private + */ + processFailure : function(response){ + this.transaction = null; + this.onFailure.fireDirect(this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, false); + } + }, + + /** + * Set the content renderer for this UpdateManager. See {@link YAHOO.ext.UpdateManager.BasicRenderer#render} for more details. + * @param {Object} renderer The object implementing the render() method + */ + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + /** + * Set the defaultUrl used for updates + * @param {String/Function} defaultUrl The url or a function to call to get the url + */ + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + /** + * Aborts the executing transaction + */ + abort : function(){ + if(this.transaction){ + YAHOO.util.Connect.abort(this.transaction); + } + }, + + /** + * Returns true if an update is in progress + * @return {Boolean} + */ + isUpdating : function(){ + if(this.transaction){ + return YAHOO.util.Connect.isCallInProgress(this.transaction); + } + return false; + } +}; + +/** + * The defaults collection enables customizing the default properties of UpdateManager + */ + YAHOO.ext.UpdateManager.defaults = { + /** + * Timeout for requests or form posts in seconds (Defaults 30 seconds). + * @type Number + */ + timeout : 30, + + /** + * True to process scripts by default (Defaults to false). + * @type Number + */ + loadScripts : false, + + /** + * Blank page URL to use with SSL file uploads (Defaults to 'about:blank'). + * @type String + */ + sslBlankUrl : (YAHOO.ext.SSL_SECURE_URL || 'javascript:false'), + /** + * Whether to append unique parameter on get request to disable caching (Defaults to false). + * @type Boolean + */ + disableCaching : false, + /** + * Whether to show indicatorText when loading (Defaults to true). + * @type String + */ + showLoadIndicator : true, + /** + * Text for loading indicator (Defaults to '<div class="loading-indicator">Loading...</div>'). + * @type String + */ + indicatorText : '
      Loading...
      ' + }; + +/** + * Static convenience method, Usage: + *
      YAHOO.ext.UpdateManager.update('my-div', 'stuff.php');
      + * @param {String/HTMLElement/YAHOO.ext.Element} el The element to update + * @param {String} url The url + * @param {String/Object} params (optional) Url encoded param string or an object of name/value pairs + * @param {Object} options (optional) A config object with any of the UpdateManager properties you want to set - for example: {disableCaching:true, indicatorText: 'Loading data...'} + * @static + */ +YAHOO.ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = getEl(el, true).getUpdateManager(); + YAHOO.ext.util.Config.apply(um, options); + um.update(url, params, options.callback); +} +// alias for backwards compat +YAHOO.ext.UpdateManager.update = YAHOO.ext.UpdateManager.updateElement; +/** + * @class YAHOO.ext.UpdateManager.BasicRenderer + * Default Content renderer. Updates the elements innerHTML with the responseText. + */ +YAHOO.ext.UpdateManager.BasicRenderer = function(){}; + +YAHOO.ext.UpdateManager.BasicRenderer.prototype = { + /** + * This is called when the transaction is completed and it's time to update the element - The BasicRenderer + * updates the elements innerHTML with the responseText - To perform a custom render (i.e. XML or JSON processing), + * create an object with a "render(el, response)" method and pass it to setRenderer on the UpdateManager. + * @param {YAHOO.ext.Element} el The element being rendered + * @param {Object} response The YUI Connect response object + * @param {UpdateManager} updateManager The calling update manager + * @param {Function} callback A callback that will need to be called if loadScripts is true on the UpdateManager + */ + render : function(el, response, updateManager, callback){ + el.update(response.responseText, updateManager.loadScripts, callback); + } +}; diff --git a/www/extras/yui-ext/source/anim/Actor.js b/www/extras/yui-ext/source/anim/Actor.js new file mode 100644 index 000000000..be4f83f4c --- /dev/null +++ b/www/extras/yui-ext/source/anim/Actor.js @@ -0,0 +1,763 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +/** + * @class YAHOO.ext.Actor + * Provides support for syncing and chaining of Element Yahoo! UI based animation and some common effects. Actors support "self-play" without an Animator.

      + * Note: Along with the animation methods defined below, this class inherits and captures all of the "set" or animation methods of {@link YAHOO.ext.Element}. "get" methods are not captured and execute immediately. + *

      Usage:
      + *
      
      + * var actor = new YAHOO.ext.Actor('myElementId');
      + * actor.startCapture(true);
      + * actor.moveTo(100, 100, true);
      + * actor.squish();
      + * actor.play();
      + * 
      + * // or to start capturing immediately, with no Animator (the null second param) + *
      + * var actor = new YAHOO.ext.Actor('myElementId', null, true); + * actor.moveTo(100, 100, true); + * actor.squish(); + * actor.play(); + *
      + * @extends YAHOO.ext.Element + * @requires YAHOO.ext.Element + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.Anim + * @requires YAHOO.util.ColorAnim + * @requires YAHOO.util.Motion + * @className YAHOO.ext.Actor + * @constructor + * Create new Actor. + * @param {String/HTMLElement} el The dom element or element id + * @param {YAHOO.ext.Animator} animator (optional) The Animator that will capture this Actor's actions + * @param {Boolean} selfCapture (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false) + */ +YAHOO.ext.Actor = function(element, animator, selfCapture){ + this.el = YAHOO.ext.Element.get(element, true); // cache el object for playback + YAHOO.ext.Actor.superclass.constructor.call(this, element, true); + this.onCapture = new YAHOO.util.CustomEvent('Actor.onCapture'); + if(animator){ + /** + * The animator used to sync this actor with other actors + * @member YAHOO.ext.Actor + */ + animator.addActor(this); + } + /** + * Whether this actor is currently capturing + * @member YAHOO.ext.Actor + */ + this.capturing = selfCapture; + this.playlist = selfCapture ? new YAHOO.ext.Animator.AnimSequence() : null; +}; + +YAHOO.extendX(YAHOO.ext.Actor, YAHOO.ext.Element); + +/** + * Captures an action for this actor. Generally called internally but can be called directly. + * @param {YAHOO.ext.Actor.Action} action + */ +YAHOO.ext.Actor.prototype.capture = function(action){ + if(this.playlist != null){ + this.playlist.add(action); + } + this.onCapture.fireDirect(this, action); + return action; +}; + +/** @ignore */ +YAHOO.ext.Actor.overrideAnimation = function(method, animParam, onParam){ + return function(){ + if(!this.capturing){ + return method.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + if(args[animParam] === true){ + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, method, args, onParam)); + }else{ + return this.capture(new YAHOO.ext.Actor.Action(this, method, args)); + } + }; +} + +/** @ignore */ +YAHOO.ext.Actor.overrideBasic = function(method){ + return function(){ + if(!this.capturing){ + return method.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new YAHOO.ext.Actor.Action(this, method, args)); + }; +} + +// All of these methods below are marked "ignore" because JSDoc treats them as fields, not function. How brilliant. The Element methods are documented anyway though. +/** Capturing override - See {@link YAHOO.ext.Element#setVisibilityMode} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setVisibilityMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode); +/** Capturing override - See {@link YAHOO.ext.Element#enableDisplayMode} for method details. + * @method */ +YAHOO.ext.Actor.prototype.enableDisplayMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode); +/** Capturing override - See {@link YAHOO.ext.Element#focus} for method details. + * @method */ +YAHOO.ext.Actor.prototype.focus = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus); +/** Capturing override - See {@link YAHOO.ext.Element#addClass} for method details. + * @method */ +YAHOO.ext.Actor.prototype.addClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass); +/** Capturing override - See {@link YAHOO.ext.Element#removeClass} for method details. + * @method */ +YAHOO.ext.Actor.prototype.removeClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass); +/** Capturing override - See {@link YAHOO.ext.Element#replaceClass} for method details. + * @method */ +YAHOO.ext.Actor.prototype.replaceClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass); +/** Capturing override - See {@link YAHOO.ext.Element#setStyle} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setStyle = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle); +/** Capturing override - See {@link YAHOO.ext.Element#setLeft} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setLeft = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft); +/** Capturing override - See {@link YAHOO.ext.Element#setTop} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setTop = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop); +/** Capturing override - See {@link YAHOO.ext.Element#setAbsolutePositioned} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setAbsolutePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned); +/** Capturing override - See {@link YAHOO.ext.Element#setRelativePositioned} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setRelativePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned); +/** Capturing override - See {@link YAHOO.ext.Element#clearPositioning} for method details. + * @method */ +YAHOO.ext.Actor.prototype.clearPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning); +/** Capturing override - See {@link YAHOO.ext.Element#setPositioning} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning); +/** Capturing override - See {@link YAHOO.ext.Element#clip} for method details. + * @method */ +YAHOO.ext.Actor.prototype.clip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip); +/** Capturing override - See {@link YAHOO.ext.Element#unclip} for method details. + * @method */ +YAHOO.ext.Actor.prototype.unclip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip); +/** Capturing override - See {@link YAHOO.ext.Element#clearOpacity} for method details. + * @method */ +YAHOO.ext.Actor.prototype.clearOpacity = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity); +/** Capturing override - See {@link YAHOO.ext.Element#update} for method details. + * @method */ +YAHOO.ext.Actor.prototype.update = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update); +/** Capturing override - See {@link YAHOO.ext.Element#remove} for method details. + * @method */ +YAHOO.ext.Actor.prototype.remove = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove); +YAHOO.ext.Actor.prototype.fitToParent = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent); +YAHOO.ext.Actor.prototype.appendChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild); +YAHOO.ext.Actor.prototype.createChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild); +YAHOO.ext.Actor.prototype.appendTo = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo); +YAHOO.ext.Actor.prototype.insertBefore = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore); +YAHOO.ext.Actor.prototype.insertAfter = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter); +YAHOO.ext.Actor.prototype.wrap = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap); +YAHOO.ext.Actor.prototype.replace = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace); +YAHOO.ext.Actor.prototype.insertHtml = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml); +YAHOO.ext.Actor.prototype.set = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set); + +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#load} for method details. + * @method */ +YAHOO.ext.Actor.prototype.load = function(){ + if(!this.capturing){ + return YAHOO.ext.Actor.superclass.load.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.load, + args, 2)); +}; + +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#animate} for method details. + * @method */ +YAHOO.ext.Actor.prototype.animate = function(args, duration, onComplete, easing, animType){ + if(!this.capturing){ + return YAHOO.ext.Actor.superclass.animate.apply(this, arguments); + } + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.animate, + [args, duration, onComplete, easing, animType], 2)); +}; + +/** Capturing and animation syncing override - See {@link YAHOO.ext.Element#setVisible} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setVisible = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible, 1, 3); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#toggle} for method details. + * @method */ +YAHOO.ext.Actor.prototype.toggle = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle, 0, 2); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setXY} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setXY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY, 1, 3); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setLocation} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setLocation = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation, 2, 4); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setWidth} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setWidth = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth, 1, 3); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setHeight} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight, 1, 3); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setSize} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setSize = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize, 2, 4); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setBounds} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setBounds = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds, 4, 6); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setOpacity} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setOpacity = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity, 1, 3); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#moveTo} for method details. + * @method */ +YAHOO.ext.Actor.prototype.moveTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo, 2, 4); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#move} for method details. + * @method */ +YAHOO.ext.Actor.prototype.move = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move, 2, 4); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#alignTo} for method details. + * @method */ +YAHOO.ext.Actor.prototype.alignTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo, 3, 5); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#hide} for method details. + * @method */ +YAHOO.ext.Actor.prototype.hide = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide, 0, 2); +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#show} for method details. + * @method */ +YAHOO.ext.Actor.prototype.show = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show, 0, 2); + +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#setBox} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setBox = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox, 2, 4); + +/**Capturing and animation syncing override - See {@link YAHOO.ext.Element#autoHeight} for method details. + * @method */ +YAHOO.ext.Actor.prototype.autoHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight, 0, 2); +/** Capturing override - See {@link YAHOO.ext.Element#setX} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setX = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX, 1, 3); +/** Capturing override - See {@link YAHOO.ext.Element#setY} for method details. + * @method */ +YAHOO.ext.Actor.prototype.setY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY, 1, 3); + +/** + * Start self capturing calls on this Actor. All subsequent calls are captured and executed when play() is called. + */ +YAHOO.ext.Actor.prototype.startCapture = function(){ + this.capturing = true; + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + }; + + /** + * Stop self capturing calls on this Actor. + */ + YAHOO.ext.Actor.prototype.stopCapture = function(){ + this.capturing = false; + }; + +/** + * Clears any calls that have been self captured. + */ +YAHOO.ext.Actor.prototype.clear = function(){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); +}; + +/** + * Starts playback of self captured calls. + * @param {Function} oncomplete (optional) Callback to execute when playback has completed + */ +YAHOO.ext.Actor.prototype.play = function(oncomplete){ + this.capturing = false; + if(this.playlist){ + this.playlist.play(oncomplete); + } + }; + +/** + * Capture a function call. + * @param {Function} fcn The function to call + * @param {Array} args (optional) The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + */ +YAHOO.ext.Actor.prototype.addCall = function(fcn, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + } +}; + +/** + * Capture an async function call. + * @param {Function} fcn The function to call + * @param {Number} callbackIndex The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED. + * @param {Array} args The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + */ +YAHOO.ext.Actor.prototype.addAsyncCall = function(fcn, callbackIndex, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + } + }, + +/** + * Capture a pause (in seconds). + * @param {Number} seconds The seconds to pause + */ +YAHOO.ext.Actor.prototype.pause = function(seconds){ + this.capture(new YAHOO.ext.Actor.PauseAction(seconds)); + }; + +/** +* Shake this element from side to side +*/ +YAHOO.ext.Actor.prototype.shake = function(){ + this.move('left', 20, true, .05); + this.move('right', 40, true, .05); + this.move('left', 40, true, .05); + this.move('right', 20, true, .05); +}; + +/** +* Bounce this element from up and down +*/ +YAHOO.ext.Actor.prototype.bounce = function(){ + this.move('up', 20, true, .05); + this.move('down', 40, true, .05); + this.move('up', 40, true, .05); + this.move('down', 20, true, .05); +}; + +/** +* Show the element using a "blinds" effect +* @param {String} anchor The part of the element that it should appear to exapand from. + The short/long options currently are t/top, l/left +* @param {Number} newSize (optional) The size to animate to. (Default to current size) +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut) +*/ +YAHOO.ext.Actor.prototype.blindShow = function(anchor, newSize, duration, easing){ + var size = newSize || this.getSize(); + this.clip(); + this.setVisible(true); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'l': + case 'left': + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + } + this.unclip(); + return size; +}; + +/** +* Hide the element using a "blinds" effect +* @param {String} anchor The part of the element that it should appear to collapse to. + The short/long options are t/top, l/left, b/bottom, r/right. +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn) +*/ +YAHOO.ext.Actor.prototype.blindHide = function(anchor, duration, easing){ + var size = this.getSize(); + this.clip(); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'l': + case 'left': + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'r': + case 'right': + this.animate({width: {to: 1}, points: {by: [this.getWidth(), 0]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); + break; + case 'b': + case 'bottom': + this.animate({height: {to: 1}, points: {by: [0, this.getHeight()]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); + break; + } + return size; +}; + +/** +* Show the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindShow effect is rendered. +* @param {String} anchor The part of the element that it should appear to slide from. + The short/long options currently are t/top, l/left +* @param {Number} newSize (optional) The size to animate to. (Default to current size) +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOuth) +*/ +YAHOO.ext.Actor.prototype.slideShow = function(anchor, newSize, duration, easing, clearPositioning){ + var size = newSize || this.getSize(); + this.clip(); + var firstChild = this.dom.firstChild; + if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { // can't do a slide with only a textnode + this.blindShow(anchor, newSize, duration, easing); + return; + } + var child = YAHOO.ext.Element.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.setAbsolutePositioned, null, child); + this.setVisible(true); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', '0px'], child); + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'l': + case 'left': + this.addCall(child.setStyle, ['left', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['right', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'r': + case 'right': + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'b': + case 'bottom': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + } + if(clearPositioning !== false){ + this.addCall(child.setPositioning, [pos], child); + } + this.unclip(); + return size; +}; + +/** +* Hide the element using a "slide in" effect - In order for this effect to work the element MUST have a child element container that can be "slid" otherwise a blindHide effect is rendered. +* @param {String} anchor The part of the element that it should appear to slide to. + The short/long options are t/top, l/left, b/bottom, r/right. +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn) +*/ +YAHOO.ext.Actor.prototype.slideHide = function(anchor, duration, easing){ + var size = this.getSize(); + this.clip(); + var firstChild = this.dom.firstChild; + if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { // can't do a slide with only a textnode + this.blindHide(anchor, duration, easing); + return; + } + var child = YAHOO.ext.Element.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.setAbsolutePositioned, null, child); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', '0px'], child); + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'l': + case 'left': + this.addCall(child.setStyle, ['left', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['right', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'r': + case 'right': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'b': + case 'bottom': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + } + this.addCall(child.setPositioning, [pos], child); + return size; +}; + +/** +* Hide the element by "squishing" it into the corner +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.squish = function(duration){ + var size = this.getSize(); + this.clip(); + this.setSize(1, 1, true, duration || .5); + this.setVisible(false); + return size; +}; + +/** +* Fade an element in +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.appear = function(duration){ + this.setVisible(true, true, duration); +}; + +/** +* Fade an element out +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.fade = function(duration){ + this.setVisible(false, true, duration); +}; + +/** +* Blink the element as if it was clicked and then collapse on it's center +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.switchOff = function(duration){ + this.clip(); + this.setVisible(false, true, .1); + this.clearOpacity(); + this.setVisible(true); + this.animate({height: {to: 1}, points: {by: [0, this.getHeight()/2]}}, + duration || .5, null, YAHOO.util.Easing.easeOut, YAHOO.util.Motion); + this.setVisible(false); +}; + +/** +* Highlight the element using a background color (or passed attribute) animation +* @param {String} color (optional) The color to use for the highlight +* @param {String} fromColor (optional) If the element does not currently have a background color, you will need to pass in a color to animate from +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {String} attribute (optional) Specify a CSS attribute to use other than background color - camelCase +*/ +YAHOO.ext.Actor.prototype.highlight = function(color, fromColor, duration, attribute){ + attribute = attribute || 'background-color'; + var original = this.getStyle(attribute); + fromColor = fromColor || ((original && original != '' && original != 'transparent') ? original : '#FFFFFF'); + var cfg = {}; + cfg[attribute] = {to: color, from: fromColor}; + this.setVisible(true); + this.animate(cfg, duration || .5, null, YAHOO.util.Easing.bounceOut, YAHOO.util.ColorAnim); + this.setStyle(attribute, original); +}; + +/** +* Fade the element in and out the specified amount of times +* @param {Number} count (optional) How many times to pulse (Defaults to 3) +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.pulsate = function(count, duration){ + count = count || 3; + for(var i = 0; i < count; i++){ + this.toggle(true, duration || .25); + this.toggle(true, duration || .25); + } +}; + +/** +* Fade the element as it is falling from it's current position +* @param {Float} duration (optional) How long the effect lasts (in seconds) +*/ +YAHOO.ext.Actor.prototype.dropOut = function(duration){ + this.animate({opacity: {to: 0}, points: {by: [0, this.getHeight()]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); +}; + +/** +* Hide the element in a way that it appears as if it is flying off the screen +* @param {String} anchor The part of the page that the element should appear to move to. + The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, + tr/top-right, bl/bottom-left or br/bottom-right. +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeIn) +*/ +YAHOO.ext.Actor.prototype.moveOut = function(anchor, duration, easing){ + var Y = YAHOO.util; + var vw = Y.Dom.getViewportWidth(); + var vh = Y.Dom.getViewportHeight(); + var cpoints = this.getCenterXY() + var centerX = cpoints[0]; + var centerY = cpoints[1]; + var anchor = anchor.toLowerCase(); + var p; + switch(anchor){ + case 't': + case 'top': + p = [centerX, -this.getHeight()]; + break; + case 'l': + case 'left': + p = [-this.getWidth(), centerY]; + break; + case 'r': + case 'right': + p = [vw+this.getWidth(), centerY]; + break; + case 'b': + case 'bottom': + p = [centerX, vh+this.getHeight()]; + break; + case 'tl': + case 'top-left': + p = [-this.getWidth(), -this.getHeight()]; + break; + case 'bl': + case 'bottom': + p = [-this.getWidth(), vh+this.getHeight()]; + break; + case 'br': + case 'bottom-right': + p = [vw+this.getWidth(), vh+this.getHeight()]; + break; + case 'tr': + case 'top-right': + p = [vw+this.getWidth(), -this.getHeight()]; + break; + } + this.moveTo(p[0], p[1], true, duration || .35, null, easing || Y.Easing.easeIn); + this.setVisible(false); +}; + +/** +* Show the element in a way that it appears as if it is flying onto the screen +* @param {String} anchor The part of the page that the element should appear to move from. + The short/long options are t/top, l/left, b/bottom, r/right, tl/top-left, + tr/top-right, bl/bottom-left or br/bottom-right. +* @param {Array} to (optional) Array of x and y position to move to like [x, y] (Defaults to center screen) +* @param {Float} duration (optional) How long the effect lasts (in seconds) +* @param {Function} easing (optional) YAHOO.util.Easing method to use. (Defaults to YAHOO.util.Easing.easeOut) +*/ +YAHOO.ext.Actor.prototype.moveIn = function(anchor, to, duration, easing){ + to = to || this.getCenterXY(); + this.moveOut(anchor, .01); + this.setVisible(true); + this.setXY(to, true, duration || .35, null, easing || YAHOO.util.Easing.easeOut); +}; +/** +* Show a ripple of exploding, attenuating borders to draw attention to an Element. +* @param {Number} color (optional) The color of the border. +* @param {Number} count (optional) How many ripples. +* @param {Float} duration (optional) How long each ripple takes to expire +*/ +YAHOO.ext.Actor.prototype.frame = function(color, count, duration){ + color = color || "red"; + count = count || 3; + duration = duration || .5; + var frameFn = function(callback){ + var box = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + tag:"div", + style:{ + visbility:"hidden", + position:"absolute", + zIndex:this.getStyle("zIndex"), + border:"0px solid " + color + } + }); + var scale = proxy.isBorderBox() ? 2 : 1; + proxy.animate({ + top:{from:box.y, to:box.y - 20}, + left:{from:box.x, to:box.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:box.height, to:(box.height + (20*scale))}, + width:{from:box.width, to:(box.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + if(typeof callback == 'function'){ + callback(); + } + } + } + animFn.call(this); + } + this.addAsyncCall(frameFn, 0, null, this); +}; + +YAHOO.ext.Actor.Action = function(actor, method, args){ + this.actor = actor; + this.method = method; + this.args = args; + } + +YAHOO.ext.Actor.Action.prototype = { + play : function(onComplete){ + this.method.apply(this.actor || window, this.args); + onComplete(); + } +}; + + +YAHOO.ext.Actor.AsyncAction = function(actor, method, args, onIndex){ + YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this, actor, method, args); + this.onIndex = onIndex; + this.originalCallback = this.args[onIndex]; +} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction, YAHOO.ext.Actor.Action); + +YAHOO.ext.Actor.AsyncAction.prototype.play = function(onComplete){ + var callbackArg = this.originalCallback ? + this.originalCallback.createSequence(onComplete) : onComplete; + this.args[this.onIndex] = callbackArg; + this.method.apply(this.actor, this.args); +}; + + +YAHOO.ext.Actor.PauseAction = function(seconds){ + this.seconds = seconds; +}; +YAHOO.ext.Actor.PauseAction.prototype = { + play : function(onComplete){ + setTimeout(onComplete, this.seconds * 1000); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/anim/Animator.js b/www/extras/yui-ext/source/anim/Animator.js new file mode 100644 index 000000000..f2de6247e --- /dev/null +++ b/www/extras/yui-ext/source/anim/Animator.js @@ -0,0 +1,487 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.Animator + * Provides support for syncing animations for multiple {@link YAHOO.ext.Actor}s.

      +*

      This example can be seen in action here +* by clicking on "Click here and I will point it out" at the end of the first paragraph.
      + *
      
      +var animator = new YAHOO.ext.Animator();
      +var cursor = new YAHOO.ext.Actor('cursor-img', animator);
      +var click = new YAHOO.ext.Actor('click-img', animator);
      +var resize = new YAHOO.ext.Actor('resize-img', animator);
      +
      +// start capturing
      +animator.startCapture();
      +
      +// these animations will be run in sequence
      +cursor.show();
      +cursor.moveTo(500,400);
      +cursor.moveTo(20, getEl('navbar').getY()+10, true, .75);
      +click.show();
      +click.alignTo(cursor, 'tl', [-4, -4]);
      +
      +// Add an async function call, pass callback to argument 1
      +animator.addAsyncCall(Blog.navbar.undockDelegate, 1);
      +
      +// pause .5 seconds
      +animator.pause(.5);
      +
      +// again, these animations will be run in sequence
      +click.hide(true, .7);
      +cursor.alignTo('splitter', 'tr', [0, +100], true, 1);
      +resize.alignTo('splitter', 'tr', [-12, +100]);
      +
      +// start sync block: these animations will run at the same time
      +animator.beginSync();
      +cursor.hide();
      +resize.show();
      +animator.endSync();
      +
      +// play the captured animation sequences, call myCallback when done
      +animator.play(myCallback);
      + * 
      + * @requires YAHOO.ext.Element + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.Anim + * @requires YAHOO.util.ColorAnim + * @requires YAHOO.util.Motion + * @constructor + * @param {String/HTMLElement} el The dom element or element id + * @param {YAHOO.ext.Animator} animator (optional) The Animator that will capture this Actor's actions + * @param {Boolean} selfCapture (optional) Whether this actor should capture it's own actions to support self playback without an animator (defaults to false) + */ + YAHOO.ext.Animator = function(/*Actors...*/){ + this.actors = []; + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + this.captureDelegate = this.capture.createDelegate(this); + this.playDelegate = this.play.createDelegate(this); + this.syncing = false; + this.stopping = false; + this.playing = false; + for(var i = 0; i < arguments.length; i++){ + this.addActor(arguments[i]); + } + }; + + YAHOO.ext.Animator.prototype = { + + capture : function(actor, action){ + if(this.syncing){ + if(!this.syncMap[actor.id]){ + this.syncMap[actor.id] = new YAHOO.ext.Animator.AnimSequence(); + } + this.syncMap[actor.id].add(action); + }else{ + this.playlist.add(action); + } + }, + + /** + * Add an actor. The actor is also set to capturing = true. + * @param {YAHOO.ext.Actor} actor + */ + addActor : function(actor){ + actor.onCapture.subscribe(this.captureDelegate); + this.actors.push(actor); + }, + + + /** + * Start capturing actions on the added actors. + * @param {Boolean} clearPlaylist Whether to also create a new playlist + */ + startCapture : function(clearPlaylist){ + for(var i = 0; i < this.actors.length; i++){ + var a = this.actors[i]; + if(!this.isCapturing(a)){ + a.onCapture.subscribe(this.captureDelegate); + } + a.capturing = true; + } + if(clearPlaylist){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + } + }, + + /** + * Checks whether this animator is listening to a specific actor. + * @param {YAHOO.ext.Actor} actor + */ + isCapturing : function(actor){ + var subscribers = actor.onCapture.subscribers; + if(subscribers){ + for(var i = 0; i < subscribers.length; i++){ + if(subscribers[i] && subscribers[i].contains(this.captureDelegate)){ + return true; + } + } + } + return false; + }, + + /** + * Stop capturing on all added actors. + */ + stopCapture : function(){ + for(var i = 0; i < this.actors.length; i++){ + var a = this.actors[i]; + a.onCapture.unsubscribe(this.captureDelegate); + a.capturing = false; + } + }, + + /** + * Start a multi-actor sync block. By default all animations are run in sequence. While in the sync block + * each actor's own animations will still be sequenced, but all actors will animate at the same time. + */ + beginSync : function(){ + this.syncing = true; + this.syncMap = {}; + }, + + /** + * End the multi-actor sync block + */ + endSync : function(){ + this.syncing = false; + var composite = new YAHOO.ext.Animator.CompositeSequence(); + for(key in this.syncMap){ + if(typeof this.syncMap[key] != 'function'){ + composite.add(this.syncMap[key]); + } + } + this.playlist.add(composite); + this.syncMap = null; + }, + + /** + * Starts playback of the playlist, also stops any capturing. To start capturing again call {@link #startCapture}. + * @param {Function} oncomplete (optional) Callback to execute when playback has completed + */ + play : function(oncomplete){ + if(this.playing) return; // can't play the same animation twice at once + this.stopCapture(); + this.playlist.play(oncomplete); + }, + + /** + * Stop at the next available stopping point + */ + stop : function(){ + this.playlist.stop(); + }, + + /** + * Check if this animator is currently playing + */ + isPlaying : function(){ + return this.playlist.isPlaying(); + }, + /** + * Clear the playlist + */ + clear : function(){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + }, + + /** + * Add a function call to the playlist. + * @param {Function} fcn The function to call + * @param {Array} args The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + */ + addCall : function(fcn, args, scope){ + this.playlist.add(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + }, + + /** + * Add an async function call to the playlist. + * @param {Function} fcn The function to call + * @param {Number} callbackIndex The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED. + * @param {Array} args The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + */ + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.playlist.add(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + }, + + /** + * Add a pause to the playlist (in seconds) + * @param {Number} seconds The number of seconds to pause. + */ + pause : function(seconds){ + this.playlist.add(new YAHOO.ext.Actor.PauseAction(seconds)); + } + + }; +/** + * Static function to build a AnimatorComposite from a css selector (requires YAHOO.ext.Element.selectorFunction be defined) + * @param {String/Array} selector The css selector or an array of nodes to animate + * @method @static + */ +YAHOO.ext.Animator.select = function(selector){ + var els; + if(typeof selector == 'string'){ + els = YAHOO.ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw 'Invalid selector'; + } + return new YAHOO.ext.AnimatorComposite(els); +}; +var getActors = YAHOO.ext.Animator.select; + +/** + * @class YAHOO.ext.AnimatorComposite + * Composite class with synchronized animations. This is the class returned by getActors(selector) or YAHOO.ext.Animator.select(). + */ +YAHOO.ext.AnimatorComposite = function(els){ + this.animator = new YAHOO.ext.Animator(); + this.addElements(els); + this.syncAnims = true; +}; +YAHOO.ext.AnimatorComposite.prototype = { + isComposite: true, + /** + * Adds elements to this composite. + * @param {Array} els An array of elements to add + * @return {AnimatorComposite} this + */ + addElements : function(els){ + if(!els) return this; + var anim = this.animator; + for(var i = 0, len = els.length; i < len; i++) { + anim.addActor(new YAHOO.ext.Actor(els[i])); + } + anim.startCapture(); + return this; + }, + /** + * Operations called after sequence() will be performed one by one on each element in this composite. + * @return {AnimatorComposite} this + */ + sequence : function(){ + this.syncAnims = false; + return this; + }, + /** + * Operations called after sync() will be performed at the same time on each element in this composite. + * @return {AnimatorComposite} this + */ + sync : function(){ + this.syncAnims = true; + return this; + }, + invoke : function(fn, args){ + var els = this.animator.actors; + if(this.syncAnims) this.animator.beginSync(); + for(var i = 0, len = els.length; i < len; i++) { + YAHOO.ext.Actor.prototype[fn].apply(els[i], args); + } + if(this.syncAnims) this.animator.endSync(); + return this; + }, + /** + * Play the actions queued in this composite. + * @param {Function} callback (optional) callback is called when all animations have compelted + * @return {AnimatorComposite} this + */ + play : function(callback){ + this.animator.play(callback); + return this; + }, + /** + * Clear all actions in the queue. + * @param {Function} callback (optional) callback is called when all animations have compelted + * @return {AnimatorComposite} this + */ + reset : function(callback){ + this.animator.startCapture(true); + return this; + }, + /** + * Add a pause + * @param {Number} seconds + * @return {AnimatorComposite} this + */ + pause : function(seconds){ + this.animator.pause(seconds); + return this; + }, + /** + * Get the YAHOO.ext.Animator that controls the animations for this composite. + * @return {YAHOO.ext.Animator} + */ + getAnimator : function(){ + return this.animator; + }, + /** + * Calls the passed function passing (el, this, index) for each element in this composite. + * @param {Function} fn The function to call + * @param {Object} scope (optional) The this object (defaults to the element) + * @return {AnimatorComposite} this + */ + each : function(fn, scope){ + var els = this.animator.actors; + if(this.syncAnims) this.animator.beginSync(); + for(var i = 0, len = els.length; i < len; i++){ + fn.call(scope || els[i], els[i], this, i); + } + if(this.syncAnims) this.animator.endSync(); + return this; + }, + /** + * Add a function call to the playlist. + * @param {Function} fcn The function to call + * @param {Array} args (optional) The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + * @return {AnimatorComposite} this + */ + addCall : function(fcn, args, scope){ + this.animator.addCall(fcn, args, scope); + return this; + }, + /** + * Add an async function call to the playlist. + * @param {Function} fcn The function to call + * @param {Number} callbackIndex The index of the callback parameter on the passed function. A CALLBACK IS REQUIRED. + * @param {Array} args (optional) The arguments to call the function with + * @param {Object} scope (optional) The scope of the function + * @return {AnimatorComposite} this + */ + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.animator.addAsyncCall(fcn, callbackIndex, args, scope); + return this; + } +}; +for(var fnName in YAHOO.ext.Actor.prototype){ + if(typeof YAHOO.ext.Actor.prototype[fnName] == 'function'){ + YAHOO.ext.CompositeElement.createCall(YAHOO.ext.AnimatorComposite.prototype, fnName); + } +} + + +YAHOO.ext.Animator.AnimSequence = function(){ + this.actions = []; + this.nextDelegate = this.next.createDelegate(this); + this.playDelegate = this.play.createDelegate(this); + this.oncomplete = null; + this.playing = false; + this.stopping = false; + this.actionIndex = -1; + }; + + YAHOO.ext.Animator.AnimSequence.prototype = { + + add : function(action){ + this.actions.push(action); + }, + + next : function(){ + if(this.stopping){ + this.playing = false; + if(this.oncomplete){ + this.oncomplete(this, false); + } + return; + } + var nextAction = this.actions[++this.actionIndex]; + if(nextAction){ + nextAction.play(this.nextDelegate); + }else{ + this.playing = false; + if(this.oncomplete){ + this.oncomplete(this, true); + } + } + }, + + play : function(oncomplete){ + if(this.playing) return; // can't play the same sequence twice at once + this.oncomplete = oncomplete; + this.stopping = false; + this.playing = true; + this.actionIndex = -1; + this.next(); + }, + + stop : function(){ + this.stopping = true; + }, + + isPlaying : function(){ + return this.playing; + }, + + clear : function(){ + this.actions = []; + }, + + addCall : function(fcn, args, scope){ + this.actions.push(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + }, + + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.actions.push(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + }, + + pause : function(seconds){ + this.actions.push(new YAHOO.ext.Actor.PauseAction(seconds)); + } + + }; + +YAHOO.ext.Animator.CompositeSequence = function(){ + this.sequences = []; + this.completed = 0; + this.trackDelegate = this.trackCompletion.createDelegate(this); +} + +YAHOO.ext.Animator.CompositeSequence.prototype = { + add : function(sequence){ + this.sequences.push(sequence); + }, + + play : function(onComplete){ + this.completed = 0; + if(this.sequences.length < 1){ + if(onComplete)onComplete(); + return; + } + this.onComplete = onComplete; + for(var i = 0; i < this.sequences.length; i++){ + this.sequences[i].play(this.trackDelegate); + } + }, + + trackCompletion : function(){ + ++this.completed; + if(this.completed >= this.sequences.length && this.onComplete){ + this.onComplete(); + } + }, + + stop : function(){ + for(var i = 0; i < this.sequences.length; i++){ + this.sequences[i].stop(); + } + }, + + isPlaying : function(){ + for(var i = 0; i < this.sequences.length; i++){ + if(this.sequences[i].isPlaying()){ + return true; + } + } + return false; + } +}; + + diff --git a/www/extras/yui-ext/source/data/AbstractDataModel.js b/www/extras/yui-ext/source/data/AbstractDataModel.js new file mode 100644 index 000000000..4fbb6c5da --- /dev/null +++ b/www/extras/yui-ext/source/data/AbstractDataModel.js @@ -0,0 +1,231 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.AbstractDataModel + * @extends YAHOO.ext.util.Observable + * This abstract class provides default implementations of the events required by the Grid. + It takes care of the creating the CustomEvents and provides some convenient methods for firing the events.

      + * @constructor +*/ +YAHOO.ext.grid.AbstractDataModel = function(){ + /** Fires when a cell is updated - fireDirect sig: (this, rowIndex, columnIndex) + * @private + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onCellUpdated = new YAHOO.util.CustomEvent('onCellUpdated'); + /** Fires when all data needs to be revalidated - fireDirect sig: (thisd) + * @private + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onTableDataChanged = new YAHOO.util.CustomEvent('onTableDataChanged'); + /** Fires when rows are deleted - fireDirect sig: (this, firstRowIndex, lastRowIndex) + * @private + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onRowsDeleted = new YAHOO.util.CustomEvent('onRowsDeleted'); + /** Fires when a rows are inserted - fireDirect sig: (this, firstRowIndex, lastRowIndex) + * @private + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onRowsInserted = new YAHOO.util.CustomEvent('onRowsInserted'); + /** Fires when a rows are updated - fireDirect sig: (this, firstRowIndex, lastRowIndex) + * @private + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onRowsUpdated = new YAHOO.util.CustomEvent('onRowsUpdated'); + /** Fires when a sort has reordered the rows - fireDirect sig: (this, sortColumnIndex, + * @private + * sortDirection = 'ASC' or 'DESC') + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + */ + this.onRowsSorted = new YAHOO.util.CustomEvent('onRowsSorted'); + + this.events = { + /** + * @event cellupdated + * Fires when a cell is updated + * @param {DataModel} this + * @param {Number} rowIndex + * @param {Number} columnIndex + */ + 'cellupdated' : this.onCellUpdated, + /** + * @event datachanged + * Fires when the entire data structure has changed + * @param {DataModel} this + */ + 'datachanged' : this.onTableDataChanged, + /** + * @event rowsdeleted + * Fires when a range of rows have been deleted + * @param {DataModel} this + * @param {Number} firstRowIndex + * @param {Number} lastRowIndex + */ + 'rowsdeleted' : this.onRowsDeleted, + /** + * @event rowsinserted + * Fires when a range of rows have been inserted + * @param {DataModel} this + * @param {Number} firstRowIndex + * @param {Number} lastRowIndex + */ + 'rowsinserted' : this.onRowsInserted, + /** + * @event rowsupdated + * Fires when a range of rows have been updated + * @param {DataModel} this + * @param {Number} firstRowIndex + * @param {Number} lastRowIndex + */ + 'rowsupdated' : this.onRowsUpdated, + /** + * @event rowssorted + * Fires when the data has been sorted + * @param {DataModel} this + */ + 'rowssorted' : this.onRowsSorted + }; +}; + +YAHOO.ext.grid.AbstractDataModel.prototype = { + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + /** + * Notifies listeners that the value of the cell at [row, col] has been updated + * @deprecated + * @private + */ + fireCellUpdated : function(row, col){ + this.onCellUpdated.fireDirect(this, row, col); + }, + + /** + * Notifies listeners that all data for the grid may have changed - use as a last resort. This + * also wipes out all selections a user might have made. + * @deprecated + * @private + */ + fireTableDataChanged : function(){ + this.onTableDataChanged.fireDirect(this); + }, + + /** + * Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been deleted + * @deprecated + * @private + */ + fireRowsDeleted : function(firstRow, lastRow){ + this.onRowsDeleted.fireDirect(this, firstRow, lastRow); + }, + + /** + * Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been inserted + * @deprecated + * @private + */ + fireRowsInserted : function(firstRow, lastRow){ + this.onRowsInserted.fireDirect(this, firstRow, lastRow); + }, + + /** + * Notifies listeners that rows in the range [firstRow, lastRow], inclusive, have been updated + * @deprecated + * @private + */ + fireRowsUpdated : function(firstRow, lastRow){ + this.onRowsUpdated.fireDirect(this, firstRow, lastRow); + }, + + /** + * Notifies listeners that rows have been sorted and any indexes may be invalid + * @deprecated + * @private + */ + fireRowsSorted : function(sortColumnIndex, sortDir, noRefresh){ + this.onRowsSorted.fireDirect(this, sortColumnIndex, sortDir, noRefresh); + }, + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method. + * See {@link YAHOO.ext.DefaultDataModel#sort} for an example implementation. + * @private + */ + sort : function(sortInfo, columnIndex, direction, suppressEvent){ + + }, + + /** + * Interface method to supply info regarding the Grid's current sort state - if overridden, + * this should return an object like this {column: this.sortColumn, direction: this.sortDir}. + * @return {Object} + * @private + */ + getSortState : function(){ + return {column: this.sortColumn, direction: this.sortDir}; + }, + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method. + * See {@link YAHOO.ext.DefaultDataModel} for an example implementation. + * @private + */ + getRowCount : function(){ + + }, + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method to support virtual row counts. + * @private + */ + getTotalRowCount : function(){ + return this.getRowCount(); + }, + + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method. + * See {@link YAHOO.ext.DefaultDataModel} for an example implementation. + * @private + */ + getRowId : function(rowIndex){ + + }, + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method. + * See {@link YAHOO.ext.DefaultDataModel} for an example implementation. + * @private + */ + getValueAt : function(rowIndex, colIndex){ + + }, + + /** + * Empty interface method - Classes which extend AbstractDataModel should implement this method. + * See {@link YAHOO.ext.DefaultDataModel} for an example implementation. + * @private + */ + setValueAt : function(value, rowIndex, colIndex){ + + }, + + isPaged : function(){ + return false; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/DefaultDataModel.js b/www/extras/yui-ext/source/data/DefaultDataModel.js new file mode 100644 index 000000000..f70591000 --- /dev/null +++ b/www/extras/yui-ext/source/data/DefaultDataModel.js @@ -0,0 +1,342 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +/** + * @class YAHOO.ext.grid.DefaultDataModel + * This is the default implementation of a DataModel used by the Grid. It works + * with multi-dimensional array based data. Using the event system in the base class + * {@link YAHOO.ext.grid.AbstractDataModel}, all updates to this DataModel are automatically + * reflected in the user interface. + *
      Usage:
      + *
      
      + * var myData = [
      +	["MSFT","Microsoft Corporation", "314,571.156", "32,187.000", "55000"],
      +	["ORCL", "Oracle Corporation", "62,615.266", "9,519.000", "40650"]
      + * ];
      + * var dataModel = new YAHOO.ext.grid.DefaultDataModel(myData);
      + * 
      + * @extends YAHOO.ext.grid.AbstractDataModel + * @constructor + * @param {Array} data +*/ +YAHOO.ext.grid.DefaultDataModel = function(data){ + YAHOO.ext.grid.DefaultDataModel.superclass.constructor.call(this); + /**@private*/ + this.data = data; +}; +YAHOO.extendX(YAHOO.ext.grid.DefaultDataModel, YAHOO.ext.grid.AbstractDataModel, { + /** + * Returns the number of rows in the dataset + * @return {Number} + */ + getRowCount : function(){ + return this.data.length; + }, + + /** + * Returns the ID of the specified row. By default it return the value of the first column. + * Override to provide more advanced ID handling. + * @return {Number} + */ + getRowId : function(rowIndex){ + return this.data[rowIndex][0]; + }, + + /** + * Returns the column data for the specified row. + * @return {Array} + */ + getRow : function(rowIndex){ + return this.data[rowIndex]; + }, + + /** + * Returns the column data for the specified rows as a + * multi-dimensional array: rows[3][0] would give you the value of row 4, column 0. + * @param {Array} indexes The row indexes to fetch + * @return {Array} + */ + getRows : function(indexes){ + var data = this.data; + var r = []; + for(var i = 0; i < indexes.length; i++){ + r.push(data[indexes[i]]); + } + return r; + }, + + /** + * Returns the value at the specified data position + * @param {Number} rowIndex + * @param {Number} colIndex + * @return {Object} + */ + getValueAt : function(rowIndex, colIndex){ + return this.data[rowIndex][colIndex]; + }, + + /** + * Sets the specified value at the specified data position + * @param {Object} value The new value + * @param {Number} rowIndex + * @param {Number} colIndex + */ + setValueAt: function(value, rowIndex, colIndex){ + this.data[rowIndex][colIndex] = value; + this.fireCellUpdated(rowIndex, colIndex); + }, + + /** + * @private + * Removes the specified range of rows. + * @param {Number} startIndex + * @param {Number} endIndex (optional) Defaults to startIndex + */ + removeRows: function(startIndex, endIndex){ + endIndex = endIndex || startIndex; + this.data.splice(startIndex, endIndex-startIndex+1); + this.fireRowsDeleted(startIndex, endIndex); + }, + + /** + * Remove a row. + * @param {Number} index + */ + removeRow: function(index){ + this.data.splice(index, 1); + this.fireRowsDeleted(index, index); + }, + + /** + * @private + * Removes all rows. + */ + removeAll: function(){ + var count = this.getRowCount(); + if(count > 0){ + this.removeRows(0, count-1); + } + }, + + /** + * Query the DataModel rows by the filters defined in spec, for example... + *
      
      +     * // column 1 starts with Jack, column 2 filtered by myFcn, column 3 equals 'Fred'
      +     * dataModel.filter({1: /^Jack.+/i}, 2: myFcn, 3: 'Fred'});
      +     * 
      + * @param {Object} spec The spec is generally an object literal consisting of + * column index and filter type. The filter type can be a string/number (exact match), + * a regular expression to test using String.search() or a function to call. If it's a function, + * it will be called with the value for the specified column and an array of the all column + * values for that row: yourFcn(value, columnData). If it returns anything other than true, + * the row is not a match. If you have modified Object.prototype this method may fail. + * @param {Boolean} returnUnmatched True to return rows which don't match the query instead + * of rows that do match + * @return {Array} An array of row indexes that match + */ + query: function(spec, returnUnmatched){ + var d = this.data; + var r = []; + for(var i = 0; i < d.length; i++){ + var row = d[i]; + var isMatch = true; + for(var col in spec){ + //if(typeof spec[col] != 'function'){ + if(!isMatch) continue; + var filter = spec[col]; + switch(typeof filter){ + case 'string': + case 'number': + case 'boolean': + if(row[col] != filter){ + isMatch = false; + } + break; + case 'function': + if(!filter(row[col], row)){ + isMatch = false; + } + break; + case 'object': + if(filter instanceof RegExp){ + if(String(row[col]).search(filter) === -1){ + isMatch = false; + } + } + break; + } + //} + } + if(isMatch && !returnUnmatched){ + r.push(i); + }else if(!isMatch && returnUnmatched){ + r.push(i); + } + } + return r; + }, + + /** + * Filter the DataModel rows by the query defined in spec, see {@link #query} for more details + * on the query spec. + * @param {Object} query The query spec {@link #query} + * @return {Number} The number of rows removed + */ + filter: function(query){ + var matches = this.query(query, true); + var data = this.data; + // go thru the data setting matches to deleted + // while not disturbing row indexes + for(var i = 0; i < matches.length; i++){ + data[matches[i]]._deleted = true; + } + for(var i = 0; i < data.length; i++){ + while(data[i] && data[i]._deleted === true){ + this.removeRow(i); + } + } + return matches.length; + }, + + /** + * Adds a row to the dataset. + * @param {Array} cellValues The array of values for the new row + * @return {Number} The index of the added row + */ + addRow: function(cellValues){ + this.data.push(cellValues); + var newIndex = this.data.length-1; + this.fireRowsInserted(newIndex, newIndex); + this.applySort(); + return newIndex; + }, + + /** + * @private + * Adds a set of rows. + * @param {Array} rowData This should be an array of arrays like the constructor takes + */ + addRows: function(rowData){ + this.data = this.data.concat(rowData); + var firstIndex = this.data.length-rowData.length; + this.fireRowsInserted(firstIndex, firstIndex+rowData.length-1); + this.applySort(); + }, + + /** + * Inserts a row a the specified location in the dataset. + * @param {Number} index The index where the row should be inserted + * @param {Array} cellValues The array of values for the new row + * @return {Number} The index the row was inserted in + */ + insertRow: function(index, cellValues){ + this.data.splice(index, 0, cellValues); + this.fireRowsInserted(index, index); + this.applySort(); + return index; + }, + + /** + * @private + * Inserts a set of rows. + * @param {Number} index The index where the rows should be inserted + * @param {Array} rowData This should be an array of arrays like the constructor takes + */ + insertRows: function(index, rowData){ + /* + if(index == this.data.length){ // try these two first since they are faster + this.data = this.data.concat(rowData); + }else if(index == 0){ + this.data = rowData.concat(this.data); + }else{ + var newData = this.data.slice(0, index); + newData.concat(rowData); + newData.concat(this.data.slice(index)); + this.data = newData; + }*/ + var args = rowData.concat(); + args.splice(0, 0, index, 0); + this.data.splice.apply(this.data, args); + this.fireRowsInserted(index, index+rowData.length-1); + this.applySort(); + }, + + /** + * Applies the last used sort to the current data. + */ + applySort: function(suppressEvent){ + if(typeof this.sortColumn != 'undefined'){ + this.sort(this.sortInfo, this.sortColumn, this.sortDir, suppressEvent); + } + }, + + /** + * Sets the default sort info. Note: this function does not actually apply the sort. + * @param {Function/Object} sortInfo A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like + * a grid column model. + * @param {Number} columnIndex The column index to sort by + * @param {String} direction The direction of the sort ('DESC' or 'ASC') + */ + setDefaultSort: function(sortInfo, columnIndex, direction){ + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + }, + /** + * Sorts the data by the specified column - Uses the sortType specified for the column in the passed columnModel. + * @param {Function/Object} sortInfo A sort comparison function or null to use the default or A object that has a method getSortType(index) that returns a function like + * a grid column model. + * @param {Number} columnIndex The column index to sort by + * @param {String} direction The direction of the sort ('DESC' or 'ASC') + */ + sort: function(sortInfo, columnIndex, direction, suppressEvent){ + // store these so we can maintain sorting when we load new data + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + + var dsc = (direction && direction.toUpperCase() == 'DESC'); + var sortType = null; + if(sortInfo != null){ + if(typeof sortInfo == 'function'){ + sortType = sortInfo; + }else if(typeof sortInfo == 'object'){ + sortType = sortInfo.getSortType(columnIndex);; + } + } + var fn = function(cells, cells2){ + var v1 = sortType ? sortType(cells[columnIndex], cells) : cells[columnIndex]; + var v2 = sortType ? sortType(cells2[columnIndex], cells2) : cells2[columnIndex]; + if(v1 < v2) + return dsc ? +1 : -1; + if(v1 > v2) + return dsc ? -1 : +1; + return 0; + }; + this.data.sort(fn); + if(!suppressEvent){ + this.fireRowsSorted(columnIndex, direction); + } + }, + + /** + * Calls passed function with each rows data - if the function returns false it stops. + * @param {Function} fn + * @param {Object} scope (optional) + */ + each: function(fn, scope){ + var d = this.data; + for(var i = 0, len = d.length; i < len; i++){ + if(fn.call(scope || window, d[i], i) === false) break; + } + } +}); + +/** + * Alias to YAHOO.ext.grid.DefaultColumnModel.sortTypes + * @static + */ +YAHOO.ext.grid.DefaultDataModel.sortTypes = YAHOO.ext.grid.DefaultColumnModel.sortTypes; \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/JSONDataModel.js b/www/extras/yui-ext/source/data/JSONDataModel.js new file mode 100644 index 000000000..bf37cbd1f --- /dev/null +++ b/www/extras/yui-ext/source/data/JSONDataModel.js @@ -0,0 +1,86 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +/** + * @class YAHOO.ext.grid.JSONDataModel + * This is an implementation of a DataModel used by the Grid. It works + * with JSON data. + *
      Example schema: + *
      
      + * var schema = {
      + *     root: 'Results.Result',
      + *     id: 'ASIN',
      + *     fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
      + * };
      + * 
      + * @extends YAHOO.ext.grid.LoadableDataModel + * @constructor +*/ +YAHOO.ext.grid.JSONDataModel = function(schema){ + YAHOO.ext.grid.JSONDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.JSON); + /**@private*/ + this.schema = schema; +}; +YAHOO.extendX(YAHOO.ext.grid.JSONDataModel, YAHOO.ext.grid.LoadableDataModel, { + /** + * Overrides loadData in LoadableDataModel to process JSON data + * @param {Object} data The JSON object to load + * @param {Function} callback + */ + loadData : function(data, callback, keepExisting){ + var idField = this.schema.id; + var fields = this.schema.fields; + if(this.schema.totalProperty){ + var v = parseInt(eval('data.' + this.schema.totalProperty), 10); + if(!isNaN(v)){ + this.totalCount = v; + } + } + var rowData = []; + try{ + var root = eval('data.' + this.schema.root); + for(var i = 0; i < root.length; i++){ + var node = root[i]; + var colData = []; + colData.node = node; + colData.id = (typeof node[idField] != 'undefined' && node[idField] !== '' ? node[idField] : String(i)); + for(var j = 0; j < fields.length; j++) { + var val = node[fields[j]]; + if(typeof val == 'undefined'){ + val = ''; + } + if(this.preprocessors[j]){ + val = this.preprocessors[j](val); + } + colData.push(val); + } + rowData.push(colData); + } + if(keepExisting !== true){ + this.removeAll(); + } + this.addRows(rowData); + if(typeof callback == 'function'){ + callback(this, true); + } + this.fireLoadEvent(); + }catch(e){ + this.fireLoadException(e, null); + if(typeof callback == 'function'){ + callback(this, false); + } + } + }, + + /** + * Overrides getRowId in DefaultDataModel to return the ID value of the specified node. + * @param {Number} rowIndex + * @return {Number} + */ + getRowId : function(rowIndex){ + return this.data[rowIndex].id; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/data/LoadableDataModel.js b/www/extras/yui-ext/source/data/LoadableDataModel.js new file mode 100644 index 000000000..ee119588a --- /dev/null +++ b/www/extras/yui-ext/source/data/LoadableDataModel.js @@ -0,0 +1,335 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.LoadableDataModel + * This class extends DefaultDataModel and adds the core functionality to load data remotely. Generally you will want to use one of it's subclasses.

      + * @extends YAHOO.ext.grid.DefaultDataModel + * @constructor + * @param {String} dataType YAHOO.ext.grid.LoadableDataModel.XML, YAHOO.ext.grid.LoadableDataModel.TEXT or YAHOO.ext.grid.JSON +*/ +YAHOO.ext.grid.LoadableDataModel = function(dataType){ + YAHOO.ext.grid.LoadableDataModel.superclass.constructor.call(this, []); + + /** Fires when a successful load is completed - fireDirect sig: (this) + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + * @private + */ + this.onLoad = new YAHOO.util.CustomEvent('load'); + /** Fires when a load fails - fireDirect sig: (this, errorMsg, responseObj) + * @type YAHOO.util.CustomEvent + * @deprecated Use addListener instead of accessing directly + * @private + */ + this.onLoadException = new YAHOO.util.CustomEvent('loadException'); + /** + * @event load + * Fires when new data has successfully been loaded + * @param {DataModel} this + */ + this.events['load'] = this.onLoad; + /** + * @event beforeload + * Fires before a load takes place + * @param {DataModel} this + */ + this.events['beforeload'] = new YAHOO.util.CustomEvent('beforeload'); + /** + * @event loadexception + * Fires when there's an error loading data + * @param {DataModel} this + * @param {Exception} e The exception object or null + * @param {Object} response The Connect response object + */ + this.events['loadexception'] = this.onLoadException; + + /**@private*/ + this.dataType = dataType; + /**@private*/ + this.preprocessors = []; + /**@private*/ + this.postprocessors = []; + + // paging info + /** The active page @type Number*/ + this.loadedPage = 1; + /** True to use remote sorting, initPaging automatically sets this to true @type Boolean */ + this.remoteSort = false; + /** The number of records per page @type Number*/ + this.pageSize = 0; + /** The script/page to call to provide paged/sorted data @type String*/ + this.pageUrl = null; + /** An object of key/value pairs to be passed as parameters + * when loading pages/sorting @type Object*/ + this.baseParams = {}; + /** Maps named params to url parameters - Override to specify your own param names */ + this.paramMap = {'page':'page', 'pageSize':'pageSize', 'sortColumn':'sortColumn', 'sortDir':'sortDir'}; + +}; +YAHOO.extendX(YAHOO.ext.grid.LoadableDataModel, YAHOO.ext.grid.DefaultDataModel, { + + /** @ignore */ + setLoadedPage: function(pageNum, userCallback){ + this.loadedPage = pageNum; + if(typeof userCallback == 'function'){ + userCallback(); + } + }, + + /** Returns true if this model uses paging @return Boolean */ + isPaged: function(){ + return this.pageSize > 0; + }, + + /** Returns the total number of records available, override if needed @return {Number} */ + getTotalRowCount: function(){ + return this.totalCount || this.getRowCount(); + }, + + /** Returns the number of records per page @return Number */ + getPageSize: function(){ + return this.pageSize; + }, + + /** Returns the total number of pages available @return Number */ + getTotalPages: function(){ + if(this.getPageSize() == 0 || this.getTotalRowCount() == 0){ + return 1; + } + return Math.ceil(this.getTotalRowCount()/this.getPageSize()); + }, + + /** Initializes paging for this model. + * @param {String} url + * @param {Number} pageSize + * @param {Object} baseParams (optional) Object containing key/value pairs to add to all requests + */ + initPaging: function(url, pageSize, baseParams){ + this.pageUrl = url; + this.pageSize = pageSize; + this.remoteSort = true; + if(baseParams) this.baseParams = baseParams; + }, + + /** @ignore */ + createParams: function(pageNum, sortColumn, sortDir){ + var params = {}, map = this.paramMap; + for(var key in this.baseParams){ + if(typeof this.baseParams[key] != 'function'){ + params[key] = this.baseParams[key]; + } + } + params[map['page']] = pageNum; + params[map['pageSize']] = this.getPageSize(); + params[map['sortColumn']] = (typeof sortColumn == 'undefined' ? '' : sortColumn); + params[map['sortDir']] = sortDir || ''; + return params; + }, + + /** + * Loads a page of data. + * @param {Number} pageNum Which page to load. The first page is 1. + * @param {Function} callback (optional) Optional callback when loading is complete + * @param {Boolean} keepExisting (optional) true to keep existing data and append the new data + */ + loadPage: function(pageNum, callback, keepExisting){ + var sort = this.getSortState(); + var params = this.createParams(pageNum, sort.column, sort.direction); + this.load(this.pageUrl, params, this.setLoadedPage.createDelegate(this, [pageNum, callback]), + keepExisting ? (pageNum-1) * this.pageSize : null); + }, + + /** @ignore */ + applySort: function(suppressEvent){ + if(!this.remoteSort){ + YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this, arguments); + }else if(!suppressEvent){ + var sort = this.getSortState(); + if(sort.column){ + this.fireRowsSorted(sort.column, sort.direction, true); + } + } + }, + + /** @ignore */ + resetPaging: function(){ + this.loadedPage = 1; + }, + + /* Overridden sort method to use remote sorting if turned on */ + sort: function(sortInfo, columnIndex, direction, suppressEvent){ + if(!this.remoteSort){ + YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this, arguments); + }else{ + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + var params = this.createParams(this.loadedPage, columnIndex, direction); + this.load(this.pageUrl, params, this.fireRowsSorted.createDelegate(this, [columnIndex, direction, true])); + } + }, + + /** + * Initiates the loading of the data from the specified URL - Failed load attempts will + * fire the {@link #loadexception} event. + * @param {Object/String} url The url from which the data can be loaded + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or as an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when load is complete - called with signature (this, rowCountLoaded) + * @param {Number} insertIndex (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data + */ + load: function(url, params, callback, insertIndex){ + this.fireEvent('beforeload', this); + if(params && typeof params != 'string'){ // must be object + var buf = []; + for(var key in params){ + if(typeof params[key] != 'function'){ + buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&'); + } + } + delete buf[buf.length-1]; + params = buf.join(''); + } + var cb = { + success: this.processResponse, + failure: this.processException, + scope: this, + argument: {callback: callback, insertIndex: insertIndex} + }; + var method = params ? 'POST' : 'GET'; + YAHOO.util.Connect.asyncRequest(method, url, cb, params); + }, + + /**@private*/ + processResponse: function(response){ + var cb = response.argument.callback; + var keepExisting = (typeof response.argument.insertIndex == 'number'); + var insertIndex = response.argument.insertIndex; + switch(this.dataType){ + case YAHOO.ext.grid.LoadableDataModel.XML: + this.loadData(response.responseXML, cb, keepExisting, insertIndex); + break; + case YAHOO.ext.grid.LoadableDataModel.JSON: + var rtext = response.responseText; + try { // this code is a modified version of Yahoo! UI DataSource JSON parsing + // Trim leading spaces + while(rtext.substring(0,1) == " ") { + rtext = rtext.substring(1, rtext.length); + } + // Invalid JSON response + if(rtext.indexOf("{") < 0) { + throw "Invalid JSON response"; + } + + // Empty (but not invalid) JSON response + if(rtext.indexOf("{}") === 0) { + this.loadData({}, response.argument.callback); + return; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + rtext + ")"); + if(!jsonObjRaw) { + throw "Error evaling JSON response"; + } + this.loadData(jsonObjRaw, cb, keepExisting, insertIndex); + } catch(e) { + this.fireLoadException(e, response); + if(typeof callback == 'function'){ + callback(this, false); + } + } + break; + case YAHOO.ext.grid.LoadableDataModel.TEXT: + this.loadData(response.responseText, cb, keepExisting, insertIndex); + break; + }; + }, + + /**@private*/ + processException: function(response){ + this.fireLoadException(null, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this, false); + } + }, + + fireLoadException: function(e, responseObj){ + this.onLoadException.fireDirect(this, e, responseObj); + }, + + fireLoadEvent: function(){ + this.fireEvent('load', this.loadedPage, this.getTotalPages()); + }, + + /** + * Adds a preprocessor function to parse data before it is added to the Model - ie. Date.parse to parse dates. + * @param {Number} columnIndex + * @param {Function} fn + */ + addPreprocessor: function(columnIndex, fn){ + this.preprocessors[columnIndex] = fn; + }, + + /** + * Gets the preprocessor function for the specified column. + * @param {Number} columnIndex + * @return {Function} + */ + getPreprocessor: function(columnIndex){ + return this.preprocessors[columnIndex]; + }, + + /** + * Removes a preprocessor function. + * @param {Number} columnIndex + */ + removePreprocessor: function(columnIndex){ + this.preprocessors[columnIndex] = null; + }, + + /** + * Adds a postprocessor function to format data before updating the underlying data source (ie. convert date to string before updating XML document). + * @param {Number} columnIndex + * @param {Function} fn + */ + addPostprocessor: function(columnIndex, fn){ + this.postprocessors[columnIndex] = fn; + }, + + /** + * Gets the postprocessor function for the specified column. + * @param {Number} columnIndex + * @return {Function} + */ + getPostprocessor: function(columnIndex){ + return this.postprocessors[columnIndex]; + }, + + /** + * Removes a postprocessor function. + * @param {Number} columnIndex + */ + removePostprocessor: function(columnIndex){ + this.postprocessors[columnIndex] = null; + }, + /** + * Empty interface method - Called to process the data returned by the XHR - Classes which extend LoadableDataModel should implement this method. + * See {@link YAHOO.ext.XMLDataModel} for an example implementation. + */ + loadData: function(data, callback, keepExisting, insertIndex){ + + } +}); + +YAHOO.ext.grid.LoadableDataModel.XML = 'xml'; +YAHOO.ext.grid.LoadableDataModel.JSON = 'json'; +YAHOO.ext.grid.LoadableDataModel.TEXT = 'text'; + + + + + diff --git a/www/extras/yui-ext/source/data/XMLDataModel.js b/www/extras/yui-ext/source/data/XMLDataModel.js new file mode 100644 index 000000000..82ef1bc1f --- /dev/null +++ b/www/extras/yui-ext/source/data/XMLDataModel.js @@ -0,0 +1,262 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.XMLDataModel + * This is an implementation of a DataModel used by the Grid. It works + * with XML data. + *
      Example schema from Amazon search: + *
      
      + * var schema = {
      + *     tagName: 'Item',
      + *     id: 'ASIN',
      + *     fields: ['Author', 'Title', 'Manufacturer', 'ProductGroup']
      + * };
      + * 
      + * @extends YAHOO.ext.grid.LoadableDataModel + * @constructor + * @param {Object} schema The schema to use + * @param {XMLDocument} xml An XML document to load immediately +*/ +YAHOO.ext.grid.XMLDataModel = function(schema, xml){ + YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.XML); + /**@private*/ + this.schema = schema; + this.xml = xml; + if(xml){ + this.loadData(xml); + } + this.idSeed = 0; +}; +YAHOO.extendX(YAHOO.ext.grid.XMLDataModel, YAHOO.ext.grid.LoadableDataModel, { + + getDocument: function(){ + return this.xml; + }, + + /** + * Overrides loadData in LoadableDataModel to process XML + * @param {XMLDocument} doc The document to load + * @param {Function} callback (optional) callback to call when loading is complete + * @param {Boolean} keepExisting (optional) true to keep existing data + * @param {Number} insertIndex (optional) if present, loaded data is inserted at the specified index instead of overwriting existing data + */ + loadData: function(doc, callback, keepExisting, insertIndex){ + this.xml = doc; + var idField = this.schema.id; + var fields = this.schema.fields; + if(this.schema.totalTag){ + this.totalCount = null; + var totalNode = doc.getElementsByTagName(this.schema.totalTag); + if(totalNode && totalNode.item(0) && totalNode.item(0).firstChild) { + var v = parseInt(totalNode.item(0).firstChild.nodeValue, 10); + if(!isNaN(v)){ + this.totalCount = v; + } + } + } + var rowData = []; + var nodes = doc.getElementsByTagName(this.schema.tagName); + if(nodes && nodes.length > 0) { + for(var i = 0; i < nodes.length; i++) { + var node = nodes.item(i); + var colData = []; + colData.node = node; + colData.id = this.getNamedValue(node, idField, String(++this.idSeed)); + for(var j = 0; j < fields.length; j++) { + var val = this.getNamedValue(node, fields[j], ""); + if(this.preprocessors[j]){ + val = this.preprocessors[j](val); + } + colData.push(val); + } + rowData.push(colData); + } + } + if(keepExisting !== true){ + YAHOO.ext.grid.XMLDataModel.superclass.removeAll.call(this); + } + if(typeof insertIndex != 'number'){ + insertIndex = this.getRowCount(); + } + YAHOO.ext.grid.XMLDataModel.superclass.insertRows.call(this, insertIndex, rowData); + if(typeof callback == 'function'){ + callback(this, true); + } + this.fireLoadEvent(); + }, + + /** + * Adds a row to this DataModel and syncs the XML document + * @param {String} id The id of the row, if null the next row index is used + * @param {Array} cellValues The cell values for this row + * @return {Number} The index of the new row (if the model is sorted this index may not be accurate) + */ + addRow: function(id, cellValues){ + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = id || ++this.idSeed; + cellValues.node = node; + return YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this, cellValues); + }, + + /** + * Inserts a row into this DataModel and syncs the XML document + * @param {Number} index The index to insert the row + * @param {String} id The id of the row, if null the next row index is used + * @param {Array} cellValues The cell values for this row + * @return {Number} The index of the new row (if the model is sorted this index may not be accurate) + */ + insertRow: function(index, id, cellValues){ + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = id || ++this.idSeed; + cellValues.node = node; + return YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues); + }, + + /** + * Removes the row from DataModel and syncs the XML document + * @param {Number} index The index of the row to remove + */ + removeRow: function(index){ + var node = this.data[index].node; + node.parentNode.removeChild(node); + YAHOO.ext.grid.XMLDataModel.superclass.removeRow.call(this, index, index); + }, + + getNode: function(rowIndex){ + return this.data[rowIndex].node; + }, + + /** + * Override this method to define your own node creation routine for when new rows are added. + * By default this method clones the first node and sets the column values in the newly cloned node. + * In many instances this will not work and you will have to create the node manually. + * @param {XMLDocument} xmlDoc The xml document being used by this model + * @param {String/Number} id The row id + * @param {Array} colData The column data for the new node + * @return {XMLNode} The created node + */ + createNode: function(xmlDoc, id, colData){ + var template = this.data[0].node; + var newNode = template.cloneNode(true); + var fields = this.schema.fields; + for(var i = 0, len = fields.length; i < len; i++){ + var nodeValue = colData[i]; + if(this.postprocessors[i]){ + nodeValue = this.postprocessors[i](nodeValue); + } + this.setNamedValue(newNode, fields[i], nodeValue); + } + if(id){ + this.setNamedValue(newNode, this.schema.idField, id); + } + template.parentNode.appendChild(newNode); + return newNode; + }, + + /** + * @private + * Convenience function looks for value in attributes, then in children tags - also + * normalizes namespace matches (ie matches ns:tag, FireFox matches tag and not ns:tag). + */ + getNamedValue: function(node, name, defaultValue){ + if(!node || !name){ + return defaultValue; + } + var nodeValue = defaultValue; + var attrNode = node.attributes.getNamedItem(name); + if(attrNode) { + nodeValue = attrNode.value; + } else { + var childNode = node.getElementsByTagName(name); + if(childNode && childNode.item(0) && childNode.item(0).firstChild) { + nodeValue = childNode.item(0).firstChild.nodeValue; + }else{ + // try to strip namespace for FireFox + var index = name.indexOf(':'); + if(index > 0){ + return this.getNamedValue(node, name.substr(index+1), defaultValue); + } + } + } + return nodeValue; + }, + + /** + * @private + * Convenience function set a value in the underlying xml node. + */ + setNamedValue: function(node, name, value){ + if(!node || !name){ + return; + } + var attrNode = node.attributes.getNamedItem(name); + if(attrNode) { + attrNode.value = value; + return; + } + var childNode = node.getElementsByTagName(name); + if(childNode && childNode.item(0) && childNode.item(0).firstChild) { + childNode.item(0).firstChild.nodeValue = value; + }else{ + // try to strip namespace for FireFox + var index = name.indexOf(':'); + if(index > 0){ + this.setNamedValue(node, name.substr(index+1), value); + } + } + }, + + /** + * Overrides DefaultDataModel.setValueAt to update the underlying XML Document + * @param {Object} value The new value + * @param {Number} rowIndex + * @param {Number} colIndex + */ + setValueAt: function(value, rowIndex, colIndex){ + var node = this.data[rowIndex].node; + if(node){ + var nodeValue = value; + if(this.postprocessors[colIndex]){ + nodeValue = this.postprocessors[colIndex](value); + } + this.setNamedValue(node, this.schema.fields[colIndex], nodeValue); + } + YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this, value, rowIndex, colIndex); + }, + + /** + * Overrides getRowId in DefaultDataModel to return the ID value of the specified node. + * @param {Number} rowIndex + * @return {Number} + */ + getRowId: function(rowIndex){ + return this.data[rowIndex].id; + }, + + addRows : function(rowData){ + for(var j = 0, len = rowData.length; j < len; j++){ + var cellValues = rowData[j]; + var id = ++this.idSeed; + var node = this.createNode(this.xml, id, cellValues); + cellValues.node=node; + cellValues.id = cellValues.id || id; + YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this,cellValues); + } + }, + + insertRows : function(index, rowData){ + // copy original array so it is not reversed + rowData = rowData.slice(0).reverse(); + for(var j = 0, len = rowData.length; j < len; j++){ + var cellValues = rowData[j]; + var id = ++this.idSeed; + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = cellValues.id || id; + cellValues.node = node; + YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/AbstractColumnModel.js b/www/extras/yui-ext/source/grid/AbstractColumnModel.js new file mode 100644 index 000000000..310d12c9b --- /dev/null +++ b/www/extras/yui-ext/source/grid/AbstractColumnModel.js @@ -0,0 +1,135 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.AbstractColumnModel + * @extends YAHOO.ext.util.Observable + * This abstract class defines the ColumnModel interface and provides default implementations of the events required by the Grid. + * @constructor +*/ +YAHOO.ext.grid.AbstractColumnModel = function(){ + // legacy events + this.onWidthChange = new YAHOO.util.CustomEvent('widthChanged'); + this.onHeaderChange = new YAHOO.util.CustomEvent('headerChanged'); + this.onHiddenChange = new YAHOO.util.CustomEvent('hiddenChanged'); + + this.events = { + /** + * @event widthchange + * Fires when the width of a column changes + * @param {ColumnModel} this + * @param {Number} columnIndex The column index + * @param {Number} newWidth The new width + */ + 'widthchange': this.onWidthChange, + /** + * @event headerchange + * Fires when the text of a header changes + * @param {ColumnModel} this + * @param {Number} columnIndex The column index + * @param {Number} newText The new header text + */ + 'headerchange': this.onHeaderChange, + /** + * @event hiddenchange + * Fires when a column is hidden or "unhidden" + * @param {ColumnModel} this + * @param {Number} columnIndex The column index + * @param {Number} hidden true if hidden, false otherwise + */ + 'hiddenchange': this.onHiddenChange + }; +}; + +YAHOO.ext.grid.AbstractColumnModel.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + fireWidthChange : function(colIndex, newWidth){ + this.onWidthChange.fireDirect(this, colIndex, newWidth); + }, + + fireHeaderChange : function(colIndex, newHeader){ + this.onHeaderChange.fireDirect(this, colIndex, newHeader); + }, + + fireHiddenChange : function(colIndex, hidden){ + this.onHiddenChange.fireDirect(this, colIndex, hidden); + }, + + /** + * Interface method - Returns the number of columns. + * @return {Number} + */ + getColumnCount : function(){ + return 0; + }, + + /** + * Interface method - Returns true if the specified column is sortable. + * @param {Number} col The column index + * @return {Boolean} + */ + isSortable : function(col){ + return false; + }, + + /** + * Interface method - Returns true if the specified column is hidden. + * @param {Number} col The column index + * @return {Boolean} + */ + isHidden : function(col){ + return false; + }, + + /** + * Interface method - Returns the sorting comparison function defined for the column (defaults to sortTypes.none). + * @param {Number} col The column index + * @return {Function} + */ + getSortType : function(col){ + return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none; + }, + + /** + * Interface method - Returns the rendering (formatting) function defined for the column. + * @param {Number} col The column index + * @return {Function} + */ + getRenderer : function(col){ + return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer; + }, + + /** + * Interface method - Returns the width for the specified column. + * @param {Number} col The column index + * @return {Number} + */ + getColumnWidth : function(col){ + return 0; + }, + + /** + * Interface method - Returns the total width of all columns. + * @return {Number} + */ + getTotalWidth : function(){ + return 0; + }, + + /** + * Interface method - Returns the header for the specified column. + * @param {Number} col The column index + * @return {String} + */ + getColumnHeader : function(col){ + return ''; + } +}; diff --git a/www/extras/yui-ext/source/grid/DefaultColumnModel.js b/www/extras/yui-ext/source/grid/DefaultColumnModel.js new file mode 100644 index 000000000..e46bca869 --- /dev/null +++ b/www/extras/yui-ext/source/grid/DefaultColumnModel.js @@ -0,0 +1,311 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.DefaultColumnModel + * @extends YAHOO.ext.grid.AbstractColumnModel + * This is the default implementation of a ColumnModel used by the Grid. It defines + * the columns in the grid. + *
      Usage:
      +
      
      + var sort = YAHOO.ext.grid.DefaultColumnModel.sortTypes;
      + var myColumns = [
      +	{header: "Ticker", width: 60, sortable: true, sortType: sort.asUCString}, 
      +	{header: "Company Name", width: 150, sortable: true, sortType: sort.asUCString}, 
      +	{header: "Market Cap.", width: 100, sortable: true, sortType: sort.asFloat}, 
      +	{header: "$ Sales", width: 100, sortable: true, sortType: sort.asFloat, renderer: money}, 
      +	{header: "Employees", width: 100, sortable: true, sortType: sort.asFloat}
      + ];
      + var colModel = new YAHOO.ext.grid.DefaultColumnModel(myColumns);
      + 
      + * @constructor + * @param {Object} config The config object +*/ +YAHOO.ext.grid.DefaultColumnModel = function(config){ + YAHOO.ext.grid.DefaultColumnModel.superclass.constructor.call(this); + /** + * The config passed into the constructor + */ + this.config = config; + + /** + * The width of columns which have no width specified (defaults to 100) + * @type Number + */ + this.defaultWidth = 100; + /** + * Default sortable of columns which have no sortable specified (defaults to false) + * @type Boolean + */ + this.defaultSortable = false; +}; +YAHOO.extendX(YAHOO.ext.grid.DefaultColumnModel, YAHOO.ext.grid.AbstractColumnModel, { + + /** + * Returns the number of columns. + * @return {Number} + */ + getColumnCount : function(){ + return this.config.length; + }, + + /** + * Returns true if the specified column is sortable. + * @param {Number} col The column index + * @return {Boolean} + */ + isSortable : function(col){ + if(typeof this.config[col].sortable == 'undefined'){ + return this.defaultSortable; + } + return this.config[col].sortable; + }, + + /** + * Returns the sorting comparison function defined for the column (defaults to sortTypes.none). + * @param {Number} col The column index + * @return {Function} + */ + getSortType : function(col){ + if(!this.dataMap){ + // build a lookup so we don't search every time + var map = []; + for(var i = 0, len = this.config.length; i < len; i++){ + map[this.getDataIndex(i)] = i; + } + this.dataMap = map; + } + col = this.dataMap[col]; + if(!this.config[col].sortType){ + return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none; + } + return this.config[col].sortType; + }, + + /** + * Sets the sorting comparison function for a column. + * @param {Number} col The column index + * @param {Function} fn + */ + setSortType : function(col, fn){ + this.config[col].sortType = fn; + }, + + + /** + * Returns the rendering (formatting) function defined for the column. + * @param {Number} col The column index + * @return {Function} + */ + getRenderer : function(col){ + if(!this.config[col].renderer){ + return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer; + } + return this.config[col].renderer; + }, + + /** + * Sets the rendering (formatting) function for a column. + * @param {Number} col The column index + * @param {Function} fn + */ + setRenderer : function(col, fn){ + this.config[col].renderer = fn; + }, + + /** + * Returns the width for the specified column. + * @param {Number} col The column index + * @return {Number} + */ + getColumnWidth : function(col){ + return this.config[col].width || this.defaultWidth; + }, + + /** + * Sets the width for a column. + * @param {Number} col The column index + * @param {Number} width The new width + */ + setColumnWidth : function(col, width, suppressEvent){ + this.config[col].width = width; + this.totalWidth = null; + if(!suppressEvent){ + this.onWidthChange.fireDirect(this, col, width); + } + }, + + /** + * Returns the total width of all columns. + * @param {Boolean} includeHidden True to include hidden column widths + * @return {Number} + */ + getTotalWidth : function(includeHidden){ + if(!this.totalWidth){ + this.totalWidth = 0; + for(var i = 0; i < this.config.length; i++){ + if(includeHidden || !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + } + return this.totalWidth; + }, + + /** + * Returns the header for the specified column. + * @param {Number} col The column index + * @return {String} + */ + getColumnHeader : function(col){ + return this.config[col].header; + }, + + /** + * Sets the header for a column. + * @param {Number} col The column index + * @param {String} header The new header + */ + setColumnHeader : function(col, header){ + this.config[col].header = header; + this.onHeaderChange.fireDirect(this, col, header); + }, + /** + * Returns the dataIndex for the specified column. + * @param {Number} col The column index + * @return {Number} + */ + getDataIndex : function(col){ + if(typeof this.config[col].dataIndex != 'number'){ + return col; + } + return this.config[col].dataIndex; + }, + + /** + * Sets the dataIndex for a column. + * @param {Number} col The column index + * @param {Number} dataIndex The new dataIndex + */ + setDataIndex : function(col, dataIndex){ + this.config[col].dataIndex = dataIndex; + }, + /** + * Returns true if the cell is editable. + * @param {Number} colIndex The column index + * @param {Number} rowIndex The row index + * @return {Boolean} + */ + isCellEditable : function(colIndex, rowIndex){ + return this.config[colIndex].editable || (typeof this.config[colIndex].editable == 'undefined' && this.config[colIndex].editor); + }, + + /** + * Returns the editor defined for the cell/column. + * @param {Number} colIndex The column index + * @param {Number} rowIndex The row index + * @return {Object} + */ + getCellEditor : function(colIndex, rowIndex){ + return this.config[colIndex].editor; + }, + + /** + * Sets if a column is editable. + * @param {Number} col The column index + * @param {Boolean} editable True if the column is editable + */ + setEditable : function(col, editable){ + this.config[col].editable = editable; + }, + + + /** + * Returns true if the column is hidden. + * @param {Number} colIndex The column index + * @return {Boolean} + */ + isHidden : function(colIndex){ + return this.config[colIndex].hidden; + }, + + + /** + * Returns true if the column width cannot be changed + */ + isFixed : function(colIndex){ + return this.config[colIndex].fixed; + }, + + /** + * Returns true if the column cannot be resized + */ + isResizable : function(colIndex){ + return this.config[colIndex].resizable !== false; + }, + /** + * Sets if a column is hidden. + * @param {Number} colIndex The column index + */ + setHidden : function(colIndex, hidden){ + this.config[colIndex].hidden = hidden; + this.totalWidth = null; + this.fireHiddenChange(colIndex, hidden); + }, + + /** + * Sets the editor for a column. + * @param {Number} col The column index + * @param {Object} editor The editor object + */ + setEditor : function(col, editor){ + this.config[col].editor = editor; + } +}); + +/** + * Defines the default sorting (casting?) comparison functions used when sorting data: + *
        sortTypes.none - sorts data as it is without casting or parsing (the default) + *
        sortTypes.asUCString - case insensitive string + *
        sortTypes.asDate - attempts to parse data as a date + *
        sortTypes.asFloat + *
        sortTypes.asInt + * @static + */ +YAHOO.ext.grid.DefaultColumnModel.sortTypes = { + none : function(s) { + return s; + }, + + asUCString : function(s) { + return String(s).toUpperCase(); + }, + + asDate : function(s) { + if(s instanceof Date){ + return s.getTime(); + } + return Date.parse(String(s)); + }, + + asFloat : function(s) { + var val = parseFloat(String(s).replace(/,/g, '')); + if(isNaN(val)) val = 0; + return val; + }, + + asInt : function(s) { + var val = parseInt(String(s).replace(/,/g, '')); + if(isNaN(val)) val = 0; + return val; + } +}; + +YAHOO.ext.grid.DefaultColumnModel.defaultRenderer = function(value){ + if(typeof value == 'string' && value.length < 1){ + return ' '; + } + return value; +} \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/EditorGrid.js b/www/extras/yui-ext/source/grid/EditorGrid.js new file mode 100644 index 000000000..39859ce18 --- /dev/null +++ b/www/extras/yui-ext/source/grid/EditorGrid.js @@ -0,0 +1,21 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.EditorGrid + * @extends YAHOO.ext.grid.Grid + * Shortcut class for creating and editable grid. + * @param {String/HTMLElement/YAHOO.ext.Element} container The element into which this grid will be rendered - + * The container MUST have some type of size defined for the grid to fill. The container will be + * automatically set to position relative if it isn't already. + * @param {Object} dataModel The data model to bind to + * @param {Object} colModel The column model with info about this grid's columns + */ +YAHOO.ext.grid.EditorGrid = function(container, dataModel, colModel){ + YAHOO.ext.grid.EditorGrid.superclass.constructor.call(this, container, dataModel, + colModel, new YAHOO.ext.grid.EditorSelectionModel()); + this.container.addClass('yeditgrid'); +}; +YAHOO.extendX(YAHOO.ext.grid.EditorGrid, YAHOO.ext.grid.Grid); \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/EditorSelectionModel.js b/www/extras/yui-ext/source/grid/EditorSelectionModel.js new file mode 100644 index 000000000..85e826f5f --- /dev/null +++ b/www/extras/yui-ext/source/grid/EditorSelectionModel.js @@ -0,0 +1,187 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +/** + @class YAHOO.ext.grid.EditorSelectionModel + * Extends {@link YAHOO.ext.grid.DefaultSelectionModel} to enable cell navigation.

      + @extends YAHOO.ext.grid.DefaultSelectionModel + @constructor + */ +YAHOO.ext.grid.EditorSelectionModel = function(){ + YAHOO.ext.grid.EditorSelectionModel.superclass.constructor.call(this); + /** Number of clicks to activate a cell (for editing) - valid values are 1 or 2 + * @type Number */ + this.clicksToActivateCell = 1; + this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate'); +}; + +YAHOO.extendX(YAHOO.ext.grid.EditorSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.EditorSelectionModel.prototype.disableArrowNavigation = false; +YAHOO.ext.grid.EditorSelectionModel.prototype.controlForArrowNavigation = false; + +/** @ignore */ +YAHOO.ext.grid.EditorSelectionModel.prototype.initEvents = function(){ + this.grid.addListener("cellclick", this.onCellClick, this, true); + this.grid.addListener("celldblclick", this.onCellDblClick, this, true); + this.grid.addListener("keydown", this.keyDown, this, true); +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.onCellClick = function(grid, rowIndex, colIndex){ + if(this.clicksToActivateCell == 1){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.activate(row, cell); + } + } +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.activate = function(row, cell){ + this.fireEvent('cellactivate', this, row, cell); + this.grid.doEdit(row, cell); +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){ + if(this.clicksToActivateCell == 2){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.activate(row, cell); + } + } +}; + +/** @ignore */ +YAHOO.ext.grid.EditorSelectionModel.prototype.setRowState = function(row, selected){ + YAHOO.ext.grid.EditorSelectionModel.superclass.setRowState.call(this, row, false, false); +}; +/** @ignore */ +YAHOO.ext.grid.EditorSelectionModel.prototype.focusRow = function(row, selected){ +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellAfter = function(cell, spanRows){ + var g = this.grid; + var next = g.getCellAfter(cell); + while(next && !g.colModel.isCellEditable(next.columnIndex)){ + next = g.getCellAfter(next); + } + if(!next && spanRows){ + var row = g.getRowAfter(g.getRowFromChild(cell)); + if(row){ + next = g.getFirstCell(row); + if(!g.colModel.isCellEditable(next.columnIndex)){ + next = this.getEditorCellAfter(next); + } + } + } + return next; +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellBefore = function(cell, spanRows){ + var g = this.grid; + var prev = g.getCellBefore(cell); + while(prev && !g.colModel.isCellEditable(prev.columnIndex)){ + prev = g.getCellBefore(prev); + } + if(!prev && spanRows){ + var row = g.getRowBefore(g.getRowFromChild(cell)); + if(row){ + prev = g.getLastCell(row); + if(!g.colModel.isCellEditable(prev.columnIndex)){ + prev = this.getEditorCellBefore(prev); + } + } + } + return prev; +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.allowArrowNav = function(e){ + return (!this.disableArrowNavigation && (!this.controlForArrowNavigation || e.ctrlKey)); +} +/** @ignore */ +YAHOO.ext.grid.EditorSelectionModel.prototype.keyDown = function(e){ + var g = this.grid, cm = g.colModel, cell = g.getEditingCell(); + if(!cell) return; + var newCell; + switch(e.browserEvent.keyCode){ + case e.TAB: + if(e.shiftKey){ + newCell = this.getEditorCellBefore(cell, true); + }else{ + newCell = this.getEditorCellAfter(cell, true); + } + e.preventDefault(); + break; + case e.DOWN: + if(this.allowArrowNav(e)){ + var next = g.getRowAfter(g.getRowFromChild(cell)); + if(next){ + newCell = next.childNodes[cell.columnIndex]; + } + } + break; + case e.UP: + if(this.allowArrowNav(e)){ + var prev = g.getRowBefore(g.getRowFromChild(cell)); + if(prev){ + newCell = prev.childNodes[cell.columnIndex]; + } + } + break; + case e.RETURN: + if(e.shiftKey){ + var prev = g.getRowBefore(g.getRowFromChild(cell)); + if(prev){ + newCell = prev.childNodes[cell.columnIndex]; + } + }else{ + var next = g.getRowAfter(g.getRowFromChild(cell)); + if(next){ + newCell = next.childNodes[cell.columnIndex]; + } + } + break; + case e.RIGHT: + if(this.allowArrowNav(e)){ + newCell = this.getEditorCellAfter(cell); + } + break; + case e.LEFT: + if(this.allowArrowNav(e)){ + newCell = this.getEditorCellBefore(cell); + } + break; + }; + if(newCell){ + this.activate(g.getRowFromChild(newCell), newCell); + e.stopEvent(); + } +}; + +/** + * @class YAHOO.ext.grid.EditorAndSelectionModel + */ +YAHOO.ext.grid.EditorAndSelectionModel = function(){ + YAHOO.ext.grid.EditorAndSelectionModel.superclass.constructor.call(this); + this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate'); +}; + +YAHOO.extendX(YAHOO.ext.grid.EditorAndSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.EditorAndSelectionModel.prototype.initEvents = function(){ + YAHOO.ext.grid.EditorAndSelectionModel.superclass.initEvents.call(this); + this.grid.addListener("celldblclick", this.onCellDblClick, this, true); +}; + +YAHOO.ext.grid.EditorAndSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.fireEvent('cellactivate', this, row, cell); + this.grid.doEdit(row, cell); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/Grid.js b/www/extras/yui-ext/source/grid/Grid.js new file mode 100644 index 000000000..d918b77f9 --- /dev/null +++ b/www/extras/yui-ext/source/grid/Grid.js @@ -0,0 +1,900 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.Grid + * @extends YAHOO.ext.util.Observable + * This class represents the primary interface of a component based grid control. + *

      Usage:
      
      + * var grid = new YAHOO.ext.grid.Grid('my-container-id', dataModel, columnModel);
      + * // set any options
      + * grid.render();
      + * 
      + * Common Problems: + * - Grid does not resize properly when going smaller: Setting overflow hidden on the container + * element will correct this + * - If you get el.style[camel]= NaNpx or -2px or something related, be certain you have given your container element + * dimensions. The grid adapts to your container's size, if your container has no size defined then the results + * are unpredictable. + * - Do not put render the grid into an element with display:none. Use visibility:hidden + * and position:absolute - at least until the grid is rendered. Otherwise there is no way for the + * grid to calculate dimension/offsets. + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.ext.Element + * @requires YAHOO.ext.util.Browser + * @requires YAHOO.ext.util.CSS + * @requires YAHOO.ext.SplitBar + * @requires YAHOO.ext.EventObject + * @constructor + * @param {String/HTMLElement/YAHOO.ext.Element} container The element into which this grid will be rendered - + * The container MUST have some type of size defined for the grid to fill. The container will be + * automatically set to position relative if it isn't already. + * @param {Object} dataModel The data model to bind to + * @param {Object} colModel The column model with info about this grid's columns + * @param {Object} selectionModel (optional) The selection model for this grid (defaults to DefaultSelectionModel) + */ +YAHOO.ext.grid.Grid = function(container, dataModel, colModel, selectionModel){ + /** @private */ + this.container = YAHOO.ext.Element.get(container); + this.container.update(''); + this.container.setStyle('overflow', 'hidden'); + this.id = this.container.id; + this.rows = []; + this.rowCount = 0; + this.fieldId = null; + this.dataModel = dataModel; + this.colModel = colModel; + this.selModel = selectionModel; + this.activeEditor = null; + this.editingCell = null; + + /** The minimum width a column can be resized to. (Defaults to 25) + * @type Number */ + this.minColumnWidth = 25; + + /** True to automatically resize the columns to fit their content on initial render + * @type Boolean */ + this.autoSizeColumns = false; + + /** True to measure headers with column data when auto sizing columns + * @type Boolean */ + this.autoSizeHeaders = false; + + /** + * True to autoSize the grid when the window resizes - defaults to true + */ + this.monitorWindowResize = true; + + /** If autoSizeColumns is on, maxRowsToMeasure can be used to limit the number of + * rows measured to get a columns size - defaults to 0 (all rows). + * @type Number */ + this.maxRowsToMeasure = 0; + + /** True to highlight rows when the mouse is over (default is false) + * @type Boolean */ + this.trackMouseOver = false; + + /** True to enable drag and drop of rows + * @type Boolean */ + this.enableDragDrop = false; + + /** True to stripe the rows (default is true) + * @type Boolean */ + this.stripeRows = true; + /** True to fit the height of the grid container to the height of the data (defaults to false) + * @type Boolean */ + this.autoHeight = false; + + /** True to fit the width of the grid container to the width of the columns (defaults to false) + * @type Boolean */ + this.autoWidth = false; + + /** A regular expression defining tagNames + * allowed to have text selection (Defaults to /INPUT|TEXTAREA|SELECT/i) */ + this.allowTextSelectionPattern = /INPUT|TEXTAREA|SELECT/i; + + /** @private */ + this.setValueDelegate = this.setCellValue.createDelegate(this); + + var CE = YAHOO.util.CustomEvent; + /** @private */ + this.events = { + // raw events + /** + * @event click + * The raw click event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'click' : new CE('click'), + /** + * @event dblclick + * The raw dblclick event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'dblclick' : new CE('dblclick'), + /** + * @event mousedown + * The raw mousedown event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'mousedown' : new CE('mousedown'), + /** + * @event mouseup + * The raw mouseup event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'mouseup' : new CE('mouseup'), + /** + * @event mouseover + * The raw mouseover event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'mouseover' : new CE('mouseover'), + /** + * @event mouseout + * The raw mouseout event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'mouseout' : new CE('mouseout'), + /** + * @event keypress + * The raw keypress event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'keypress' : new CE('keypress'), + /** + * @event keydown + * The raw keydown event for the entire grid. + * @param {YAHOO.ext.EventObject} e + */ + 'keydown' : new CE('keydown'), + + // custom events + + /** + * @event cellclick + * Fires when a cell is clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + * @param {YAHOO.ext.EventObject} e + */ + 'cellclick' : new CE('cellclick'), + /** + * @event celldblclick + * Fires when a cell is double clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + * @param {YAHOO.ext.EventObject} e + */ + 'celldblclick' : new CE('celldblclick'), + /** + * @event rowclick + * Fires when a row is clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {YAHOO.ext.EventObject} e + */ + 'rowclick' : new CE('rowclick'), + /** + * @event rowdblclick + * Fires when a cell is double clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {YAHOO.ext.EventObject} e + */ + 'rowdblclick' : new CE('rowdblclick'), + /** + * @event headerclick + * Fires when a header is clicked + * @param {Grid} this + * @param {Number} columnIndex + * @param {YAHOO.ext.EventObject} e + */ + 'headerclick' : new CE('headerclick'), + /** + * @event rowcontextmenu + * Fires when a row is right clicked + * @param {Grid} this + * @param {Number} rowIndex + * @param {YAHOO.ext.EventObject} e + */ + 'rowcontextmenu' : new CE('rowcontextmenu'), + /** + * @event headercontextmenu + * Fires when a header is right clicked + * @param {Grid} this + * @param {Number} columnIndex + * @param {YAHOO.ext.EventObject} e + */ + 'headercontextmenu' : new CE('headercontextmenu'), + /** + * @event beforeedit + * Fires before a cell is edited + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + */ + 'beforeedit' : new CE('beforeedit'), + /** + * @event afteredit + * Fires after a cell is edited + * @param {Grid} this + * @param {Number} rowIndex + * @param {Number} columnIndex + */ + 'afteredit' : new CE('afteredit'), + /** + * @event bodyscroll + * Fires when the body element is scrolled + * @param {Number} scrollLeft + * @param {Number} scrollTop + */ + 'bodyscroll' : new CE('bodyscroll'), + /** + * @event columnresize + * Fires when the user resizes a column + * @param {Number} columnIndex + * @param {Number} newSize + */ + 'columnresize' : new CE('columnresize'), + /** + * @event startdrag + * Fires when row(s) start being dragged + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {event} e The raw browser event + */ + 'startdrag' : new CE('startdrag'), + /** + * @event enddrag + * Fires when a drag operation is complete + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {event} e The raw browser event + */ + 'enddrag' : new CE('enddrag'), + /** + * @event dragdrop + * Fires when dragged row(s) are dropped on a valid DD target + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + 'dragdrop' : new CE('dragdrop'), + /** + * @event dragover + * Fires while row(s) are being dragged. "targetId" is the id of the Yahoo.util.DD object the selected rows are being dragged over. + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + 'dragover' : new CE('dragover'), + /** + * @event dragenter + * Fires when the dragged row(s) first cross another DD target while being dragged + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + 'dragenter' : new CE('dragenter'), + /** + * @event dragout + * Fires when the dragged row(s) leave another DD target while being dragged + * @param {Grid} this + * @param {YAHOO.ext.GridDD} dd The drag drop object + * @param {String} targetId The target drag drop object + * @param {event} e The raw browser event + */ + 'dragout' : new CE('dragout') + }; +}; + +YAHOO.ext.grid.Grid.prototype = { + /** + * Called once after all setup has been completed and the grid is ready to be rendered. + */ + render : function(){ + if((!this.container.dom.offsetHeight || this.container.dom.offsetHeight < 20) + || this.container.getStyle('height') == 'auto'){ + this.autoHeight = true; + } + if((!this.container.dom.offsetWidth || this.container.dom.offsetWidth < 20)){ + this.autoWidth = true; + } + if(!this.view){ + if(this.dataModel.isPaged()){ + this.view = new YAHOO.ext.grid.PagedGridView(); + }else{ + this.view = new YAHOO.ext.grid.GridView(); + } + } + this.view.init(this); + this.el = getEl(this.view.render(), true); + var c = this.container; + c.mon("click", this.onClick, this, true); + c.mon("dblclick", this.onDblClick, this, true); + c.mon("contextmenu", this.onContextMenu, this, true); + c.mon("selectstart", this.cancelTextSelection, this, true); + c.mon("mousedown", this.cancelTextSelection, this, true); + c.mon("mousedown", this.onMouseDown, this, true); + c.mon("mouseup", this.onMouseUp, this, true); + if(this.trackMouseOver){ + this.el.mon("mouseover", this.onMouseOver, this, true); + this.el.mon("mouseout", this.onMouseOut, this, true); + } + c.mon("keypress", this.onKeyPress, this, true); + c.mon("keydown", this.onKeyDown, this, true); + this.init(); + }, + + /** + * Replace the current data model with a new one (experimental) + * @param {DataModel} dm The new data model + * @pram {Boolean} rerender true to render the grid rows from scratch + */ + setDataModel : function(dm, rerender){ + this.view.unplugDataModel(this.dataModel); + this.dataModel = dm; + this.view.plugDataModel(dm); + if(rerender){ + dm.fireEvent('datachanged'); + } + }, + + init : function(){ + this.rows = this.el.dom.rows; + if(!this.disableSelection){ + if(!this.selModel){ + this.selModel = new YAHOO.ext.grid.DefaultSelectionModel(this); + } + this.selModel.init(this); + this.selModel.onSelectionChange.subscribe(this.updateField, this, true); + }else{ + this.selModel = new YAHOO.ext.grid.DisableSelectionModel(this); + this.selModel.init(this); + } + + if(this.enableDragDrop){ + this.dd = new YAHOO.ext.grid.GridDD(this, this.container.dom); + } + }, + + onMouseDown : function(e){ + this.fireEvent('mousedown', e); + }, + + onMouseUp : function(e){ + this.fireEvent('mouseup', e); + }, + + onMouseOver : function(e){ + this.fireEvent('mouseover', e); + }, + + onMouseOut : function(e){ + this.fireEvent('mouseout', e); + }, + + onKeyPress : function(e){ + this.fireEvent('keypress', e); + }, + + onKeyDown : function(e){ + this.fireEvent('keydown', e); + }, + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + onClick : function(e){ + this.fireEvent('click', e); + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var cell = this.getCellFromChild(target); + var header = this.getHeaderFromChild(target); + if(row){ + this.fireEvent('rowclick', this, row.rowIndex, e); + } + if(cell){ + this.fireEvent('cellclick', this, row.rowIndex, cell.columnIndex, e); + } + if(header){ + this.fireEvent('headerclick', this, header.columnIndex, e); + } + }, + + onContextMenu : function(e){ + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var header = this.getHeaderFromChild(target); + if(row){ + this.fireEvent('rowcontextmenu', this, row.rowIndex, e); + } + if(header){ + this.fireEvent('headercontextmenu', this, header.columnIndex, e); + } + e.preventDefault(); + }, + + onDblClick : function(e){ + this.fireEvent('dblclick', e); + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var cell = this.getCellFromChild(target); + if(row){ + this.fireEvent('rowdblclick', this, row.rowIndex, e); + } + if(cell){ + this.fireEvent('celldblclick', this, row.rowIndex, cell.columnIndex, e); + } + }, + + /** + * Starts editing the specified for the specified row/column + * @param {Number} rowIndex + * @param {Number} colIndex + */ + startEditing : function(rowIndex, colIndex){ + var row = this.rows[rowIndex]; + var cell = row.childNodes[colIndex]; + this.stopEditing(); + setTimeout(this.doEdit.createDelegate(this, [row, cell]), 10); + }, + + /** + * Stops any active editing + */ + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.stopEditing(); + } + }, + + /** @ignore */ + doEdit : function(row, cell){ + if(!row || !cell) return; + var cm = this.colModel; + var dm = this.dataModel; + var colIndex = cell.columnIndex; + var rowIndex = row.rowIndex; + if(cm.isCellEditable(colIndex, rowIndex)){ + var ed = cm.getCellEditor(colIndex, rowIndex); + if(ed){ + if(this.activeEditor){ + this.activeEditor.stopEditing(); + } + this.fireEvent('beforeedit', this, rowIndex, colIndex); + this.activeEditor = ed; + this.editingCell = cell; + this.view.ensureVisible(row, true); + try{ + cell.focus(); + }catch(e){} + ed.init(this, this.el.dom.parentNode, this.setValueDelegate); + var value = dm.getValueAt(rowIndex, cm.getDataIndex(colIndex)); + // set timeout so firefox stops editing before starting a new edit + setTimeout(ed.startEditing.createDelegate(ed, [value, row, cell]), 1); + } + } + }, + + setCellValue : function(value, rowIndex, colIndex){ + this.dataModel.setValueAt(value, rowIndex, this.colModel.getDataIndex(colIndex)); + this.fireEvent('afteredit', this, rowIndex, colIndex); + }, + + /** @ignore Called when text selection starts or mousedown to prevent default */ + cancelTextSelection : function(e){ + var target = e.getTarget(); + if(target && target != this.el.dom.parentNode && !this.allowTextSelectionPattern.test(target.tagName)){ + e.preventDefault(); + } + }, + + /** + * Causes the grid to manually recalculate it's dimensions. Generally this is done automatically, + * but if manual update is required this method will initiate it. + */ + autoSize : function(){ + this.view.updateWrapHeight(); + this.view.adjustForScroll(); + }, + + /** + * Scrolls the grid to the specified row + * @param {Number/HTMLElement} row The row object or index of the row + */ + scrollTo : function(row){ + if(typeof row == 'number'){ + row = this.rows[row]; + } + this.view.ensureVisible(row, true); + }, + + /** @private */ + getEditingCell : function(){ + return this.editingCell; + }, + + /** + * Binds this grid to the field with the specified id. Initially reads and parses the comma + * delimited ids in the field and selects those items. All selections made in the grid + * will be persisted to the field by their ids comma delimited. + * @param {String} The id of the field to bind to + */ + bindToField : function(fieldId){ + this.fieldId = fieldId; + this.readField(); + }, + + /** @private */ + updateField : function(){ + if(this.fieldId){ + var field = YAHOO.util.Dom.get(this.fieldId); + field.value = this.getSelectedRowIds().join(','); + } + }, + + /** + * Causes the grid to read and select the ids from the bound field - See {@link #bindToField}. + */ + readField : function(){ + if(this.fieldId){ + var field = YAHOO.util.Dom.get(this.fieldId); + var values = field.value.split(','); + var rows = this.getRowsById(values); + this.selModel.selectRows(rows, false); + } + }, + + /** + * Returns the table row at the specified index + * @param {Number} index + * @return {HTMLElement} + */ + getRow : function(index){ + return this.rows[index]; + }, + + /** + * Returns the rows that have the specified id(s). The id value for a row is provided + * by the DataModel. See {@link YAHOO.ext.grid.DefaultDataModel#getRowId}. + * @param {String/Array} An id to find or an array of ids + * @return {HtmlElement/Array} If one id was passed in, it returns one result. + * If an array of ids was specified, it returns an Array of HTMLElements + */ + getRowsById : function(id){ + var dm = this.dataModel; + if(!(id instanceof Array)){ + for(var i = 0; i < this.rows.length; i++){ + if(dm.getRowId(i) == id){ + return this.rows[i]; + } + } + return null; + } + var found = []; + var re = "^(?:"; + for(var i = 0; i < id.length; i++){ + re += id[i]; + if(i != id.length-1) re += "|"; + } + var regex = new RegExp(re + ")$"); + for(var i = 0; i < this.rows.length; i++){ + if(regex.test(dm.getRowId(i))){ + found.push(this.rows[i]); + } + } + return found; + }, + + /** + * Returns the row that comes after the specified row - text nodes are skipped. + * @param {HTMLElement} row + * @return {HTMLElement} + */ + getRowAfter : function(row){ + return this.getSibling('next', row); + }, + + /** + * Returns the row that comes before the specified row - text nodes are skipped. + * @param {HTMLElement} row + * @return {HTMLElement} + */ + getRowBefore : function(row){ + return this.getSibling('previous', row); + }, + + /** + * Returns the cell that comes after the specified cell - text nodes are skipped. + * @param {HTMLElement} cell + * @param {Boolean} includeHidden + * @return {HTMLElement} + */ + getCellAfter : function(cell, includeHidden){ + var next = this.getSibling('next', cell); + if(next && !includeHidden && this.colModel.isHidden(next.columnIndex)){ + return this.getCellAfter(next); + } + return next; + }, + + /** + * Returns the cell that comes before the specified cell - text nodes are skipped. + * @param {HTMLElement} cell + * @param {Boolean} includeHidden + * @return {HTMLElement} + */ + getCellBefore : function(cell, includeHidden){ + var prev = this.getSibling('previous', cell); + if(prev && !includeHidden && this.colModel.isHidden(prev.columnIndex)){ + return this.getCellBefore(prev); + } + return prev; + }, + + /** + * Returns the last cell for the row - text nodes and hidden columns are skipped. + * @param {HTMLElement} row + * @param {Boolean} includeHidden + * @return {HTMLElement} + */ + getLastCell : function(row, includeHidden){ + var cell = this.getElement('previous', row.lastChild); + if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){ + return this.getCellBefore(cell); + } + return cell; + }, + + /** + * Returns the first cell for the row - text nodes and hidden columns are skipped. + * @param {HTMLElement} row + * @param {Boolean} includeHidden + * @return {HTMLElement} + */ + getFirstCell : function(row, includeHidden){ + var cell = this.getElement('next', row.firstChild); + if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){ + return this.getCellAfter(cell); + } + return cell; + }, + + /** + * @private + * Gets siblings, skipping text nodes + * @param {String} type The direction to walk: 'next' or 'previous' + * @param {HTMLElement} node + */ + getSibling : function(type, node){ + if(!node) return null; + type += 'Sibling'; + var n = node[type]; + while(n && n.nodeType != 1){ + n = n[type]; + } + return n; + }, + + /** + * Returns node if node is an HTMLElement else walks the siblings in direction looking for + * a node that is an element + * @param {String} direction The direction to walk: 'next' or 'previous' + * @private + */ + getElement : function(direction, node){ + if(!node || node.nodeType == 1) return node; + else return this.getSibling(direction, node); + }, + + /** + * @private + */ + getElementFromChild : function(childEl, parentClass){ + if(!childEl || (YAHOO.util.Dom.hasClass(childEl, parentClass))){ + return childEl; + } + var p = childEl.parentNode; + var b = document.body; + while(p && p != b){ + if(YAHOO.util.Dom.hasClass(p, parentClass)){ + return p; + } + p = p.parentNode; + } + return null; + }, + + /** + * Returns the row that contains the specified child element. + * @param {HTMLElement} childEl + * @return {HTMLElement} + */ + getRowFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-row'); + }, + + /** + * Returns the cell that contains the specified child element. + * @param {HTMLElement} childEl + * @return {HTMLElement} + */ + getCellFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-col'); + }, + + + /** + * Returns the header element that contains the specified child element. + * @param {HTMLElement} childEl + * @return {HTMLElement} + */ + getHeaderFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-hd'); + }, + + /** + * Convenience method for getSelectionModel().getSelectedRows() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRows} for more details. + * @return {Array} + */ + getSelectedRows : function(){ + return this.selModel.getSelectedRows(); + }, + + /** + * Convenience method for getSelectionModel().getSelectedRows()[0] - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRows} for more details. + * @return {HTMLElement} + */ + getSelectedRow : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRows()[0]; + } + return null; + }, + + /** + * Get the selected row indexes + * @return {Array} Array of indexes + */ + getSelectedRowIndexes : function(){ + var a = []; + var rows = this.selModel.getSelectedRows(); + for(var i = 0; i < rows.length; i++) { + a[i] = rows[i].rowIndex; + } + return a; + }, + + /** + * Gets the first selected row or -1 if none are selected + * @return {Number} + */ + getSelectedRowIndex : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRows()[0].rowIndex; + } + return -1; + }, + + /** + * Convenience method for getSelectionModel().getSelectedRowIds()[0] - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRowIds} for more details. + * @return {String} + */ + getSelectedRowId : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRowIds()[0]; + } + return null; + }, + + /** + * Convenience method for getSelectionModel().getSelectedRowIds() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#getSelectedRowIds} for more details. + * @return {Array} + */ + getSelectedRowIds : function(){ + return this.selModel.getSelectedRowIds(); + }, + + /** + * Convenience method for getSelectionModel().clearSelections() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#clearSelections} for more details. + */ + clearSelections : function(){ + this.selModel.clearSelections(); + }, + + + /** + * Convenience method for getSelectionModel().selectAll() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#selectAll} for more details. + */ + selectAll : function(){ + this.selModel.selectAll(); + }, + + + /** + * Convenience method for getSelectionModel().getCount() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#getCount} for more details. + * @return {Number} + */ + getSelectionCount : function(){ + return this.selModel.getCount(); + }, + + /** + * Convenience method for getSelectionModel().hasSelection() - + * See {@link YAHOO.ext.grid.DefaultSelectionModel#hasSelection} for more details. + * @return {Boolean} + */ + hasSelection : function(){ + return this.selModel.hasSelection(); + }, + + /** + * Returns the grid's SelectionModel. + * @return {SelectionModel} + */ + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new DefaultSelectionModel(); + } + return this.selModel; + }, + + /** + * Returns the grid's DataModel. + * @return {DataModel} + */ + getDataModel : function(){ + return this.dataModel; + }, + + /** + * Returns the grid's ColumnModel. + * @return {ColumnModel} + */ + getColumnModel : function(){ + return this.colModel; + }, + + /** + * Returns the grid's GridView object. + * @return {GridView} + */ + getView : function(){ + return this.view; + }, + /** + * Called to get grid's drag proxy text, by default returns this.ddText. + * @return {String} + */ + getDragDropText : function(){ + return this.ddText.replace('%0', this.selModel.getCount()); + } +}; +/** + * Configures the text is the drag proxy (defaults to "%0 selected row(s)"). + * %0 is replaced with the number of selected rows. + * @type String + */ +YAHOO.ext.grid.Grid.prototype.ddText = "%0 selected row(s)"; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/GridDD.js b/www/extras/yui-ext/source/grid/GridDD.js new file mode 100644 index 000000000..73d7c04e9 --- /dev/null +++ b/www/extras/yui-ext/source/grid/GridDD.js @@ -0,0 +1,106 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +// kill dependency issue +if(YAHOO.util.DDProxy){ +/** + * @class YAHOO.ext.grid.GridDD + * Custom implementation of YAHOO.util.DDProxy used internally by the grid + * @extends YAHOO.util.DDProxy + */ +YAHOO.ext.grid.GridDD = function(grid, bwrap){ + this.grid = grid; + var ddproxy = document.createElement('div'); + ddproxy.id = grid.container.id + '-ddproxy'; + ddproxy.className = 'ygrid-drag-proxy'; + document.body.insertBefore(ddproxy, document.body.firstChild); + YAHOO.util.Dom.setStyle(ddproxy, 'opacity', .80); + var ddicon = document.createElement('span'); + ddicon.className = 'ygrid-drop-icon ygrid-drop-nodrop'; + ddproxy.appendChild(ddicon); + var ddtext = document.createElement('span'); + ddtext.className = 'ygrid-drag-text'; + ddtext.innerHTML = " "; + ddproxy.appendChild(ddtext); + + this.ddproxy = ddproxy; + this.ddtext = ddtext; + this.ddicon = ddicon; + YAHOO.util.Event.on(bwrap, 'click', this.handleClick, this, true); + YAHOO.ext.grid.GridDD.superclass.constructor.call(this, bwrap.id, 'GridDD', + {dragElId : ddproxy.id, resizeFrame: false}); + + this.unlockDelegate = grid.selModel.unlock.createDelegate(grid.selModel); +}; +YAHOO.extendX(YAHOO.ext.grid.GridDD, YAHOO.util.DDProxy); + +YAHOO.ext.grid.GridDD.prototype.handleMouseDown = function(e){ + var row = this.grid.getRowFromChild(YAHOO.util.Event.getTarget(e)); + if(!row) return; + if(this.grid.selModel.isSelected(row)){ + YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e); + }else { + this.grid.selModel.unlock(); + YAHOO.ext.EventObject.setEvent(e); + this.grid.selModel.rowClick(this.grid, row.rowIndex, YAHOO.ext.EventObject); + YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e); + this.grid.selModel.lock(); + } +}; + +YAHOO.ext.grid.GridDD.prototype.handleClick = function(e){ + if(this.grid.selModel.isLocked()){ + setTimeout(this.unlockDelegate, 1); + YAHOO.util.Event.stopEvent(e); + } +}; + +/** + * Updates the DD visual element to allow/not allow a drop + * @param {Boolean} dropStatus True if drop is allowed on the target + */ +YAHOO.ext.grid.GridDD.prototype.setDropStatus = function(dropStatus){ + if(dropStatus === true){ + YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-nodrop', 'ygrid-drop-ok'); + }else{ + YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-ok', 'ygrid-drop-nodrop'); + } +}; + +YAHOO.ext.grid.GridDD.prototype.startDrag = function(e){ + this.ddtext.innerHTML = this.grid.getDragDropText(); + this.setDropStatus(false); + this.grid.selModel.lock(); + this.grid.fireEvent('startdrag', this.grid, this, e); +}; + +YAHOO.ext.grid.GridDD.prototype.endDrag = function(e){ + YAHOO.util.Dom.setStyle(this.ddproxy, 'visibility', 'hidden'); + this.grid.fireEvent('enddrag', this.grid, this, e); +}; + +YAHOO.ext.grid.GridDD.prototype.autoOffset = function(iPageX, iPageY) { + this.setDelta(-12, -20); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragEnter = function(e, id) { + this.setDropStatus(true); + this.grid.fireEvent('dragenter', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragDrop = function(e, id) { + this.grid.fireEvent('dragdrop', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragOver = function(e, id) { + this.grid.fireEvent('dragover', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragOut = function(e, id) { + this.setDropStatus(false); + this.grid.fireEvent('dragout', this.grid, this, id, e); +}; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/GridView.js b/www/extras/yui-ext/source/grid/GridView.js new file mode 100644 index 000000000..6de7689f5 --- /dev/null +++ b/www/extras/yui-ext/source/grid/GridView.js @@ -0,0 +1,769 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.GridView + * Default UI code used internally by the Grid. This is the object returned by {@link YAHOO.ext.grid.Grid#getView}. + * @constructor + */ +YAHOO.ext.grid.GridView = function(){ + this.grid = null; + this.lastFocusedRow = null; + this.onScroll = new YAHOO.util.CustomEvent('onscroll'); + this.adjustScrollTask = new YAHOO.ext.util.DelayedTask(this._adjustForScroll, this); + this.ensureVisibleTask = new YAHOO.ext.util.DelayedTask(); +}; + +YAHOO.ext.grid.GridView.prototype = { + init: function(grid){ + this.grid = grid; + }, + + fireScroll: function(scrollLeft, scrollTop){ + this.onScroll.fireDirect(this.grid, scrollLeft, scrollTop); + }, + + /** + * @private + * Utility method that gets an array of the cell renderers + */ + getColumnRenderers : function(){ + var renderers = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + renderers.push(cm.getRenderer(i)); + } + return renderers; + }, + + buildIndexMap : function(){ + var colToData = {}; + var dataToCol = {}; + var cm = this.grid.colModel; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var di = cm.getDataIndex(i); + colToData[i] = di; + dataToCol[di] = i; + } + return {'colToData': colToData, 'dataToCol': dataToCol}; + }, + + getDataIndexes : function(){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.colToData; + }, + + getColumnIndexByDataIndex : function(dataIndex){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.dataToCol[dataIndex]; + }, + + updateHeaders : function(){ + var colModel = this.grid.colModel; + var hcells = this.headers; + var colCount = colModel.getColumnCount(); + for(var i = 0; i < colCount; i++){ + hcells[i].textNode.innerHTML = colModel.getColumnHeader(i); + } + }, + + adjustForScroll : function(disableDelay){ + if(!disableDelay){ + this.adjustScrollTask.delay(50); + }else{ + this._adjustForScroll(); + } + }, + + /** + * Returns the rowIndex/columnIndex of the cell found at the passed page coordinates + * @param {Number} x + * @param {Number} y + * @return {Array} [rowIndex, columnIndex] + */ + getCellAtPoint : function(x, y){ + var colIndex = null; + var rowIndex = null; + + // translate page coordinates to local coordinates + var xy = YAHOO.util.Dom.getXY(this.wrap); + x = (x - xy[0]) + this.wrap.scrollLeft; + y = (y - xy[1]) + this.wrap.scrollTop; + + var colModel = this.grid.colModel; + var pos = 0; + var colCount = colModel.getColumnCount(); + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)) continue; + var width = colModel.getColumnWidth(i); + if(x >= pos && x < pos+width){ + colIndex = i; + break; + } + pos += width; + } + if(colIndex != null){ + rowIndex = (y == 0 ? 0 : Math.floor(y / this.getRowHeight())); + if(rowIndex >= this.grid.dataModel.getRowCount()){ + return null; + } + return [colIndex, rowIndex]; + } + return null; + }, + + /** @private */ + _adjustForScroll : function(){ + this.forceScrollUpdate(); + if(this.scrollbarMode == YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){ + var adjustment = 0; + if(this.wrap.clientWidth && this.wrap.clientWidth !== 0){ + adjustment = this.wrap.offsetWidth - this.wrap.clientWidth; + } + this.hwrap.setWidth(this.wrap.offsetWidth-adjustment); + }else{ + this.hwrap.setWidth(this.wrap.offsetWidth); + } + this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(), this.wrap.clientWidth)); + }, + + /** + * Focuses the specified row. The preferred way to scroll to a row is {@link #ensureVisible}. + * @param {Number/HTMLElement} row The index of a row or the row itself + */ + focusRow : function(row){ + if(typeof row == 'number'){ + row = this.getBodyTable().childNodes[row]; + } + if(!row) return; + var left = this.wrap.scrollLeft; + try{ // try catch for IE occasional focus bug + row.childNodes.item(0).hideFocus = true; + row.childNodes.item(0).focus(); + }catch(e){} + this.ensureVisible(row); + this.wrap.scrollLeft = left; + this.handleScroll(); + this.lastFocusedRow = row; + }, + + /** + * Scrolls the specified row into view. This call is automatically buffered (delayed), to disable + * the delay, pass true for disableDelay. + * @param {Number/HTMLElement} row The index of a row or the row itself + * @param {Boolean} disableDelay + */ + ensureVisible : function(row, disableDelay){ + if(!disableDelay){ + this.ensureVisibleTask.delay(50, this._ensureVisible, this, [row]); + }else{ + this._ensureVisible(row); + } + }, + + /** @ignore */ + _ensureVisible : function(row){ + if(typeof row == 'number'){ + row = this.getBodyTable().childNodes[row]; + } + if(!row) return; + var left = this.wrap.scrollLeft; + var rowTop = parseInt(row.offsetTop, 10); // parseInt for safari bug + var rowBottom = rowTop + row.offsetHeight; + var clientTop = parseInt(this.wrap.scrollTop, 10); // parseInt for safari bug + var clientBottom = clientTop + this.wrap.clientHeight; + if(rowTop < clientTop){ + this.wrap.scrollTop = rowTop; + }else if(rowBottom > clientBottom){ + this.wrap.scrollTop = rowBottom-this.wrap.clientHeight; + } + this.wrap.scrollLeft = left; + this.handleScroll(); + }, + + updateColumns : function(){ + this.grid.stopEditing(); + var colModel = this.grid.colModel; + var hcols = this.headers; + var colCount = colModel.getColumnCount(); + var pos = 0; + var totalWidth = colModel.getTotalWidth(); + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)) continue; + var width = colModel.getColumnWidth(i); + hcols[i].style.width = width + 'px'; + hcols[i].style.left = pos + 'px'; + hcols[i].split.style.left = (pos+width-3) + 'px'; + this.setCSSWidth(i, width, pos); + pos += width; + } + this.lastWidth = totalWidth; + if(this.grid.autoWidth){ + this.grid.container.setWidth(totalWidth+this.grid.container.getBorderWidth('lr')); + this.grid.autoSize(); + } + this.bwrap.setWidth(Math.max(totalWidth, this.wrap.clientWidth)); + if(!YAHOO.ext.util.Browser.isIE){ // fix scrolling prob in gecko and opera + this.wrap.scrollLeft = this.hwrap.dom.scrollLeft; + } + this.syncScroll(); + this.forceScrollUpdate(); + if(this.grid.autoHeight){ + this.autoHeight(); + this.updateWrapHeight(); + } + }, + + setCSSWidth : function(colIndex, width, pos){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'width', width + 'px'); + if(typeof pos == 'number'){ + YAHOO.ext.util.CSS.updateRule(selector, 'left', pos + 'px'); + } + }, + + /** + * Set a css style for a column dynamically. + * @param {Number} colIndex The index of the column + * @param {String} name The css property name + * @param {String} value The css value + */ + setCSSStyle : function(colIndex, name, value){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, name, value); + }, + + handleHiddenChange : function(colModel, colIndex, hidden){ + if(hidden){ + this.hideColumn(colIndex); + }else{ + this.unhideColumn(colIndex); + } + this.updateColumns(); + }, + + hideColumn : function(colIndex){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'position', 'absolute'); + YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'hidden'); + + this.headers[colIndex].style.display = 'none'; + this.headers[colIndex].split.style.display = 'none'; + }, + + unhideColumn : function(colIndex){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'position', ''); + YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'visible'); + + this.headers[colIndex].style.display = ''; + this.headers[colIndex].split.style.display = ''; + }, + + getBodyTable : function(){ + return this.bwrap.dom; + }, + + updateRowIndexes : function(firstRow, lastRow){ + var stripeRows = this.grid.stripeRows; + var bt = this.getBodyTable(); + var nodes = bt.childNodes; + firstRow = firstRow || 0; + lastRow = lastRow || nodes.length-1; + var re = /^(?:ygrid-row ygrid-row-alt|ygrid-row)/; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var node = nodes[rowIndex]; + if(stripeRows && (rowIndex+1) % 2 == 0){ + node.className = node.className.replace(re, 'ygrid-row ygrid-row-alt'); + }else{ + node.className = node.className.replace(re, 'ygrid-row'); + } + node.rowIndex = rowIndex; + nodes[rowIndex].style.top = (rowIndex * this.rowHeight) + 'px'; + } + }, + + insertRows : function(dataModel, firstRow, lastRow){ + this.updateBodyHeight(); + this.adjustForScroll(true); + var renderers = this.getColumnRenderers(); + var dindexes = this.getDataIndexes(); + var colCount = this.grid.colModel.getColumnCount(); + var beforeRow = null; + var bt = this.getBodyTable(); + if(firstRow < bt.childNodes.length){ + beforeRow = bt.childNodes[firstRow]; + } + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var row = document.createElement('span'); + row.className = 'ygrid-row'; + row.style.top = (rowIndex * this.rowHeight) + 'px'; + this.renderRow(dataModel, row, rowIndex, colCount, renderers, dindexes); + if(beforeRow){ + bt.insertBefore(row, beforeRow); + }else{ + bt.appendChild(row); + } + } + this.updateRowIndexes(firstRow); + this.adjustForScroll(true); + }, + + renderRow : function(dataModel, row, rowIndex, colCount, renderers, dindexes){ + for(var colIndex = 0; colIndex < colCount; colIndex++){ + var td = document.createElement('span'); + td.className = 'ygrid-col ygrid-col-' + colIndex + (colIndex == colCount-1 ? ' ygrid-col-last' : ''); + td.columnIndex = colIndex; + td.tabIndex = 0; + var span = document.createElement('span'); + span.className = 'ygrid-cell-text'; + td.appendChild(span); + var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + span.innerHTML = val; + row.appendChild(td); + } + }, + + deleteRows : function(dataModel, firstRow, lastRow){ + this.updateBodyHeight(); + // first make sure they are deselected + this.grid.selModel.deselectRange(firstRow, lastRow); + var bt = this.getBodyTable(); + var rows = []; // get references because the rowIndex will change + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + rows.push(bt.childNodes[rowIndex]); + } + for(var i = 0; i < rows.length; i++){ + bt.removeChild(rows[i]); + rows[i] = null; + } + rows = null; + this.updateRowIndexes(firstRow); + this.adjustForScroll(); + }, + + updateRows : function(dataModel, firstRow, lastRow){ + var bt = this.getBodyTable(); + var dindexes = this.getDataIndexes(); + var renderers = this.getColumnRenderers(); + var colCount = this.grid.colModel.getColumnCount(); + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var row = bt.rows[rowIndex]; + var cells = row.childNodes; + for(var colIndex = 0; colIndex < colCount; colIndex++){ + var td = cells[colIndex]; + var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + td.firstChild.innerHTML = val; + } + } + }, + + handleSort : function(dataModel, sortColumnIndex, sortDir, noRefresh){ + this.grid.selModel.syncSelectionsToIds(); + if(!noRefresh){ + this.updateRows(dataModel, 0, dataModel.getRowCount()-1); + } + this.updateHeaderSortState(); + if(this.lastFocusedRow){ + this.focusRow(this.lastFocusedRow); + } + }, + + syncScroll : function(){ + this.hwrap.dom.scrollLeft = this.wrap.scrollLeft; + }, + + handleScroll : function(){ + this.syncScroll(); + this.fireScroll(this.wrap.scrollLeft, this.wrap.scrollTop); + this.grid.fireEvent('bodyscroll', this.wrap.scrollLeft, this.wrap.scrollTop); + }, + + getRowHeight : function(){ + if(!this.rowHeight){ + var rule = YAHOO.ext.util.CSS.getRule(["#" + this.grid.id + " .ygrid-row", ".ygrid-row"]); + if(rule && rule.style.height){ + this.rowHeight = parseInt(rule.style.height, 10); + }else{ + this.rowHeight = 21; + } + } + return this.rowHeight; + }, + + renderRows : function(dataModel){ + this.grid.stopEditing(); + if(this.grid.selModel){ + this.grid.selModel.clearSelections(); + } + var bt = this.getBodyTable(); + bt.innerHTML = ''; + this.rowHeight = this.getRowHeight(); + this.insertRows(dataModel, 0, dataModel.getRowCount()-1); + }, + + updateCell : function(dataModel, rowIndex, dataIndex){ + var colIndex = this.getColumnIndexByDataIndex(dataIndex); + if(typeof colIndex == 'undefined'){ // not present in grid + return; + } + var bt = this.getBodyTable(); + var row = bt.childNodes[rowIndex]; + var cell = row.childNodes[colIndex]; + var renderer = this.grid.colModel.getRenderer(colIndex); + var val = renderer(dataModel.getValueAt(rowIndex, dataIndex), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + cell.firstChild.innerHTML = val; + }, + + calcColumnWidth : function(colIndex, maxRowsToMeasure){ + var maxWidth = 0; + var bt = this.getBodyTable(); + var rows = bt.childNodes; + var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length); + if(this.grid.autoSizeHeaders){ + var h = this.headers[colIndex]; + var curWidth = h.style.width; + h.style.width = this.grid.minColumnWidth+'px'; + maxWidth = Math.max(maxWidth, h.scrollWidth); + h.style.width = curWidth; + } + for(var i = 0; i < stopIndex; i++){ + var cell = rows[i].childNodes[colIndex].firstChild; + maxWidth = Math.max(maxWidth, cell.scrollWidth); + } + return maxWidth + /*margin for error in IE*/ 5; + }, + + /** + * Autofit a column to it's content. + * @param {Number} colIndex + * @param {Boolean} forceMinSize true to force the column to go smaller if possible + */ + autoSizeColumn : function(colIndex, forceMinSize){ + if(forceMinSize){ + this.setCSSWidth(colIndex, this.grid.minColumnWidth); + } + var newWidth = this.calcColumnWidth(colIndex); + this.grid.colModel.setColumnWidth(colIndex, + Math.max(this.grid.minColumnWidth, newWidth)); + this.grid.fireEvent('columnresize', colIndex, newWidth); + }, + + /** + * Autofits all columns to their content and then expands to fit any extra space in the grid + */ + autoSizeColumns : function(){ + var colModel = this.grid.colModel; + var colCount = colModel.getColumnCount(); + var wrap = this.wrap; + for(var i = 0; i < colCount; i++){ + this.setCSSWidth(i, this.grid.minColumnWidth); + colModel.setColumnWidth(i, this.calcColumnWidth(i, this.grid.maxRowsToMeasure), true); + } + if(colModel.getTotalWidth() < wrap.clientWidth){ + var diff = Math.floor((wrap.clientWidth - colModel.getTotalWidth()) / colCount); + for(var i = 0; i < colCount; i++){ + colModel.setColumnWidth(i, colModel.getColumnWidth(i) + diff, true); + } + } + this.updateColumns(); + }, + + /** + * Autofits all columns to the grid's width proportionate with their current size + */ + fitColumns : function(){ + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + var cols = []; + var width = 0; + var i, w; + for (i = 0; i < colCount; i++){ + if(!cm.isHidden(i) && !cm.isFixed(i)){ + w = cm.getColumnWidth(i); + cols.push(i); + cols.push(w); + width += w; + } + } + var frac = (this.wrap.clientWidth - cm.getTotalWidth())/width; + while (cols.length){ + w = cols.pop(); + i = cols.pop(); + cm.setColumnWidth(i, Math.floor(w + w*frac), true); + } + this.updateColumns(); + }, + + onWindowResize : function(){ + if(this.grid.monitorWindowResize){ + this.adjustForScroll(); + this.updateWrapHeight(); + this.adjustForScroll(); + } + }, + + updateWrapHeight : function(){ + this.grid.container.beginMeasure(); + this.autoHeight(); + var box = this.grid.container.getSize(true); + this.wrapEl.setHeight(box.height-this.footerHeight-parseInt(this.wrap.offsetTop, 10)); + this.pwrap.setSize(box.width, box.height); + this.grid.container.endMeasure(); + }, + + forceScrollUpdate : function(){ + var wrap = this.wrapEl; + wrap.setWidth(wrap.getWidth(true)); + setTimeout(function(){ // set timeout so FireFox works + wrap.setWidth(''); + }, 1); + }, + + updateHeaderSortState : function(){ + var state = this.grid.dataModel.getSortState(); + if(!state || typeof state.column == 'undefined') return; + var sortColumn = this.getColumnIndexByDataIndex(state.column); + var sortDir = state.direction; + for(var i = 0, len = this.headers.length; i < len; i++){ + var h = this.headers[i]; + if(i != sortColumn){ + h.sortDesc.style.display = 'none'; + h.sortAsc.style.display = 'none'; + }else{ + h.sortDesc.style.display = sortDir == 'DESC' ? 'block' : 'none'; + h.sortAsc.style.display = sortDir == 'ASC' ? 'block' : 'none'; + } + } + }, + + unplugDataModel : function(dm){ + dm.removeListener('cellupdated', this.updateCell, this); + dm.removeListener('datachanged', this.renderRows, this); + dm.removeListener('rowsdeleted', this.deleteRows, this); + dm.removeListener('rowsinserted', this.insertRows, this); + dm.removeListener('rowsupdated', this.updateRows, this); + dm.removeListener('rowssorted', this.handleSort, this); + }, + + plugDataModel : function(dm){ + dm.on('cellupdated', this.updateCell, this, true); + dm.on('datachanged', this.renderRows, this, true); + dm.on('rowsdeleted', this.deleteRows, this, true); + dm.on('rowsinserted', this.insertRows, this, true); + dm.on('rowsupdated', this.updateRows, this, true); + dm.on('rowssorted', this.handleSort, this, true); + }, + + render : function(){ + var grid = this.grid; + var container = grid.container.dom; + var dataModel = grid.dataModel; + this.plugDataModel(dataModel); + + var colModel = grid.colModel; + colModel.onWidthChange.subscribe(this.updateColumns, this, true); + colModel.onHeaderChange.subscribe(this.updateHeaders, this, true); + colModel.onHiddenChange.subscribe(this.handleHiddenChange, this, true); + + YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true); + + var autoSizeDelegate = this.autoSizeColumn.createDelegate(this); + + var colCount = colModel.getColumnCount(); + + var dh = YAHOO.ext.DomHelper; + this.pwrap = dh.append(container, + {tag: 'div', cls: 'ygrid-positioner', + style: 'position:relative;width:100%;height:100%;left:0;top:0;overflow:hidden;'}, true); + var pos = this.pwrap.dom; + + //create wrapper elements that handle offsets and scrolling + var wrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap'}); + this.wrap = wrap; + this.wrapEl = getEl(wrap, true); + YAHOO.ext.EventManager.on(wrap, 'scroll', this.handleScroll, this, true); + + var hwrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap-headers'}); + this.hwrap = getEl(hwrap, true); + + var bwrap = dh.append(wrap, {tag: 'div', cls: 'ygrid-wrap-body', id: container.id + '-body'}); + this.bwrap = getEl(bwrap, true); + this.bwrap.setWidth(colModel.getTotalWidth()); + bwrap.rows = bwrap.childNodes; + + this.footerHeight = 0; + var foot = this.appendFooter(this.pwrap.dom); + if(foot){ + this.footer = getEl(foot, true); + this.footerHeight = this.footer.getHeight(); + } + this.updateWrapHeight(); + + var hrow = dh.append(hwrap, {tag: 'span', cls: 'ygrid-hrow'}); + this.hrow = hrow; + + if(!YAHOO.ext.util.Browser.isGecko){ + // IE doesn't like iframes, we will leave this alone + var iframe = document.createElement('iframe'); + iframe.className = 'ygrid-hrow-frame'; + iframe.frameBorder = 0; + iframe.src = YAHOO.ext.SSL_SECURE_URL; + hwrap.appendChild(iframe); + } + this.headerCtrl = new YAHOO.ext.grid.HeaderController(this.grid); + this.headers = []; + this.cols = []; + + var htemplate = dh.createTemplate({ + tag: 'span', cls: 'ygrid-hd ygrid-header-{0}', children: [{ + tag: 'span', + cls: 'ygrid-hd-body', + html: '' + + '' + + '' + + '
      {1}
      ' + }] + }); + htemplate.compile(); + for(var i = 0; i < colCount; i++){ + var hd = htemplate.append(hrow, [i, colModel.getColumnHeader(i)]); + var spans = hd.getElementsByTagName('span'); + hd.textNode = spans[1]; + hd.sortDesc = spans[2]; + hd.sortAsc = spans[3]; + hd.columnIndex = i; + this.headers.push(hd); + if(colModel.isSortable(i)){ + this.headerCtrl.register(hd); + } + var split = dh.append(hrow, {tag: 'span', cls: 'ygrid-hd-split'}); + hd.split = split; + + if(colModel.isResizable(i) && !colModel.isFixed(i)){ + YAHOO.util.Event.on(split, 'dblclick', autoSizeDelegate.createCallback(i+0, true)); + var sb = new YAHOO.ext.SplitBar(split, hd, null, YAHOO.ext.SplitBar.LEFT); + sb.columnIndex = i; + sb.minSize = grid.minColumnWidth; + sb.onMoved.subscribe(this.onColumnSplitterMoved, this, true); + YAHOO.util.Dom.addClass(sb.proxy, 'ygrid-column-sizer'); + YAHOO.util.Dom.setStyle(sb.proxy, 'background-color', ''); + sb.dd._resizeProxy = function(){ + var el = this.getDragEl(); + YAHOO.util.Dom.setStyle(el, 'height', (hwrap.clientHeight+wrap.clientHeight-2) +'px'); + }; + }else{ + split.style.cursor = 'default'; + } + } + if(grid.autoSizeColumns){ + this.renderRows(dataModel); + this.autoSizeColumns(); + }else{ + this.updateColumns(); + this.renderRows(dataModel); + } + + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)){ + this.hideColumn(i); + } + } + this.updateHeaderSortState(); + return this.bwrap; + }, + + onColumnSplitterMoved : function(splitter, newSize){ + this.grid.colModel.setColumnWidth(splitter.columnIndex, newSize); + this.grid.fireEvent('columnresize', splitter.columnIndex, newSize); + }, + + appendFooter : function(parentEl){ + return null; + }, + + autoHeight : function(){ + if(this.grid.autoHeight){ + var h = this.getBodyHeight(); + var c = this.grid.container; + var total = h + (parseInt(this.wrap.offsetTop, 10)||0) + + this.footerHeight + c.getBorderWidth('tb') + c.getPadding('tb') + + (this.wrap.offsetHeight - this.wrap.clientHeight); + c.setHeight(total); + + } + }, + + getBodyHeight : function(){ + return this.grid.dataModel.getRowCount() * this.getRowHeight();; + }, + + updateBodyHeight : function(){ + this.getBodyTable().style.height = this.getBodyHeight() + 'px'; + if(this.grid.autoHeight){ + this.autoHeight(); + this.updateWrapHeight(); + } + } +}; +YAHOO.ext.grid.GridView.SCROLLBARS_UNDER = 0; +YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP = 1; +YAHOO.ext.grid.GridView.prototype.scrollbarMode = YAHOO.ext.grid.GridView.SCROLLBARS_UNDER; + +YAHOO.ext.grid.GridView.prototype.fitColumnsToContainer = YAHOO.ext.grid.GridView.prototype.fitColumns; + +YAHOO.ext.grid.HeaderController = function(grid){ + this.grid = grid; + this.headers = []; +}; + +YAHOO.ext.grid.HeaderController.prototype = { + register : function(header){ + this.headers.push(header); + YAHOO.ext.EventManager.on(header, 'selectstart', this.cancelTextSelection, this, true); + YAHOO.ext.EventManager.on(header, 'mousedown', this.cancelTextSelection, this, true); + YAHOO.ext.EventManager.on(header, 'mouseover', this.headerOver, this, true); + YAHOO.ext.EventManager.on(header, 'mouseout', this.headerOut, this, true); + YAHOO.ext.EventManager.on(header, 'click', this.headerClick, this, true); + }, + + headerClick : function(e){ + var grid = this.grid, cm = grid.colModel, dm = grid.dataModel; + grid.stopEditing(); + var header = grid.getHeaderFromChild(e.getTarget()); + var state = dm.getSortState(); + var direction = header.sortDir || 'ASC'; + if(typeof state.column != 'undefined' && + grid.getView().getColumnIndexByDataIndex(state.column) == header.columnIndex){ + direction = (state.direction == 'ASC' ? 'DESC' : 'ASC'); + } + header.sortDir = direction; + dm.sort(cm, cm.getDataIndex(header.columnIndex), direction); + }, + + headerOver : function(e){ + var header = this.grid.getHeaderFromChild(e.getTarget()); + YAHOO.util.Dom.addClass(header, 'ygrid-hd-over'); + //YAHOO.ext.util.CSS.applyFirst(header, this.grid.id, '.ygrid-hd-over'); + }, + + headerOut : function(e){ + var header = this.grid.getHeaderFromChild(e.getTarget()); + YAHOO.util.Dom.removeClass(header, 'ygrid-hd-over'); + //YAHOO.ext.util.CSS.revertFirst(header, this.grid.id, '.ygrid-hd-over'); + }, + + cancelTextSelection : function(e){ + e.preventDefault(); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/PagedGridView.js b/www/extras/yui-ext/source/grid/PagedGridView.js new file mode 100644 index 000000000..09a4be0ae --- /dev/null +++ b/www/extras/yui-ext/source/grid/PagedGridView.js @@ -0,0 +1,199 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.PagedGridView + * @extends YAHOO.ext.grid.GridView + * Extends the default GridView to add a paging interface. + * @constructor + * This class is created for you automatically if your data model is set to use paging. + */ +YAHOO.ext.grid.PagedGridView = function(){ + YAHOO.ext.grid.PagedGridView.superclass.constructor.call(this); + this.cursor = 1; +}; + +YAHOO.extendX(YAHOO.ext.grid.PagedGridView, YAHOO.ext.grid.GridView, { + appendFooter : function(parentEl){ + var fwrap = document.createElement('div'); + fwrap.className = 'ygrid-wrap-footer'; + var fbody = document.createElement('span'); + fbody.className = 'ygrid-footer'; + fwrap.appendChild(fbody); + parentEl.appendChild(fwrap); + this.createPagingToolbar(fbody); + return fwrap; + }, + + createPagingToolbar : function(container){ + var tb = new YAHOO.ext.Toolbar(container); + this.pageToolbar = tb; + this.first = tb.addButton({ + tooltip: this.firstText, + className: 'ygrid-page-first', + disabled: true, + click: this.onClick.createDelegate(this, ['first']) + }); + this.prev = tb.addButton({ + tooltip: this.prevText, + className: 'ygrid-page-prev', + disabled: true, + click: this.onClick.createDelegate(this, ['prev']) + }); + tb.addSeparator(); + tb.add(this.beforePageText); + var pageBox = document.createElement('input'); + pageBox.type = 'text'; + pageBox.size = 3; + pageBox.value = '1'; + pageBox.className = 'ygrid-page-number'; + tb.add(pageBox); + this.field = getEl(pageBox, true); + this.field.mon('keydown', this.onEnter, this, true); + this.field.on('focus', function(){pageBox.select();}); + this.afterTextEl = tb.addText(this.afterPageText.replace('%0', '1')); + this.field.setHeight(18); + tb.addSeparator(); + this.next = tb.addButton({ + tooltip: this.nextText, + className: 'ygrid-page-next', + disabled: true, + click: this.onClick.createDelegate(this, ['next']) + }); + this.last = tb.addButton({ + tooltip: this.lastText, + className: 'ygrid-page-last', + disabled: true, + click: this.onClick.createDelegate(this, ['last']) + }); + tb.addSeparator(); + this.loading = tb.addButton({ + tooltip: this.refreshText, + className: 'ygrid-loading', + disabled: true, + click: this.onClick.createDelegate(this, ['refresh']) + }); + this.onPageLoaded(1, this.grid.dataModel.getTotalPages()); + }, + + /** + * Returns the toolbar used for paging so you can add new buttons. + * @return {YAHOO.ext.Toolbar} + */ + getPageToolbar : function(){ + return this.pageToolbar; + }, + + onPageLoaded : function(pageNum, totalPages){ + this.cursor = pageNum; + this.lastPage = totalPages; + this.afterTextEl.innerHTML = this.afterPageText.replace('%0', totalPages); + this.field.dom.value = pageNum; + this.first.setDisabled(pageNum == 1); + this.prev.setDisabled(pageNum == 1); + this.next.setDisabled(pageNum == totalPages); + this.last.setDisabled(pageNum == totalPages); + this.loading.enable(); + }, + + onLoadError : function(){ + this.loading.enable(); + }, + + onEnter : function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + var v = this.field.dom.value; + if(!v){ + this.field.dom.value = this.cursor; + return; + } + var pageNum = parseInt(v, 10); + if(isNaN(pageNum)){ + this.field.dom.value = this.cursor; + return; + } + pageNum = Math.min(Math.max(1, pageNum), this.lastPage); + this.grid.dataModel.loadPage(pageNum); + e.stopEvent(); + } + }, + + beforeLoad : function(){ + this.grid.stopEditing(); + if(this.loading){ + this.loading.disable(); + } + }, + + onClick : function(which){ + switch(which){ + case 'first': + this.grid.dataModel.loadPage(1); + break; + case 'prev': + this.grid.dataModel.loadPage(this.cursor -1); + break; + case 'next': + this.grid.dataModel.loadPage(this.cursor + 1); + break; + case 'last': + this.grid.dataModel.loadPage(this.lastPage); + break; + case 'refresh': + this.grid.dataModel.loadPage(this.cursor); + break; + } + }, + + unplugDataModel : function(dm){ + dm.removeListener('beforeload', this.beforeLoad, this); + dm.removeListener('load', this.onPageLoaded, this); + dm.removeListener('loadexception', this.onLoadError, this); + YAHOO.ext.grid.PagedGridView.superclass.unplugDataModel.call(this, dm); + }, + + plugDataModel : function(dm){ + dm.on('beforeload', this.beforeLoad, this, true); + dm.on('load', this.onPageLoaded, this, true); + dm.on('loadexception', this.onLoadError, this); + YAHOO.ext.grid.PagedGridView.superclass.plugDataModel.call(this, dm); + }, + + /** + * Customizable piece of the default paging text (defaults to "Page") + * @type String + */ + beforePageText : "Page", + /** + * Customizable piece of the default paging text (defaults to "of %0") + * @type String + */ + afterPageText : "of %0", + /** + * Customizable piece of the default paging text (defaults to "First Page") + * @type String + */ + firstText : "First Page", + /** + * Customizable piece of the default paging text (defaults to "Previous Page") + * @type String + */ + prevText : "Previous Page", + /** + * Customizable piece of the default paging text (defaults to "Next Page") + * @type String + */ + nextText : "Next Page", + /** + * Customizable piece of the default paging text (defaults to "Last Page") + * @type String + */ + lastText : "Last Page", + /** + * Customizable piece of the default paging text (defaults to "Refresh") + * @type String + */ + refreshText : "Refresh" +}); diff --git a/www/extras/yui-ext/source/grid/SelectionModel.js b/www/extras/yui-ext/source/grid/SelectionModel.js new file mode 100644 index 000000000..bd08005ee --- /dev/null +++ b/www/extras/yui-ext/source/grid/SelectionModel.js @@ -0,0 +1,449 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + @class YAHOO.ext.grid.DefaultSelectionModel + * @extends YAHOO.ext.util.Observable + * The default SelectionModel used by {@link YAHOO.ext.grid.Grid}. + It supports multiple selections and keyboard selection/navigation.

      + @constructor + */ +YAHOO.ext.grid.DefaultSelectionModel = function(){ + this.selectedRows = []; + this.selectedRowIds = []; + this.lastSelectedRow = null; + + this.onRowSelect = new YAHOO.util.CustomEvent('SelectionTable.rowSelected'); + this.onSelectionChange = new YAHOO.util.CustomEvent('SelectionTable.selectionChanged'); + + this.events = { + /** + * @event selectionchange + * Fires when the selection changes + * @param {SelectionModel} this + * @param {Array} rows Array of row elements that are selected + * @param {String} ids Array of ids that are selected + */ + 'selectionchange' : this.onSelectionChange, + /** + * @event dragenter + * Fires when a row is selected or deselected + * @param {SelectionModel} this + * @param {HTMLElement} row The row element + * @param {Boolean} selected true if the row was selected, false if deselected + */ + 'rowselect' : this.onRowSelect + }; + + this.locked = false; +}; + +YAHOO.ext.grid.DefaultSelectionModel.prototype = { + /** @ignore Called by the grid automatically. Do not call directly. */ + init : function(grid){ + this.grid = grid; + this.initEvents(); + }, + + /** + * Lock the selections + */ + lock : function(){ + this.locked = true; + }, + + /** + * Unlock the selections + */ + unlock : function(){ + this.locked = false; + }, + + /** + * Returns true if the selections are locked + * @return {Boolean} + */ + isLocked : function(){ + return this.locked; + }, + + /** @ignore */ + initEvents : function(){ + if(this.grid.trackMouseOver){ + this.grid.addListener("mouseover", this.handleOver, this, true); + this.grid.addListener("mouseout", this.handleOut, this, true); + } + this.grid.addListener("rowclick", this.rowClick, this, true); + this.grid.addListener("keydown", this.keyDown, this, true); + }, + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + /** @ignore Syncs selectedRows with the correct row by looking it up by id. + Used after a sort moves data around. */ + syncSelectionsToIds : function(){ + if(this.getCount() > 0){ + var ids = this.selectedRowIds.concat(); + this.clearSelections(); + this.selectRowsById(ids, true); + } + }, + + /** + * Set the selected rows by their ID(s). IDs must match what is returned by the DataModel getRowId(index). + * @param {String/Array} id The id(s) to select + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectRowsById : function(id, keepExisting){ + var rows = this.grid.getRowsById(id); + if (!(rows instanceof Array)){ + this.selectRow(rows, keepExisting); + return; + } + this.selectRows(rows, keepExisting); + }, + + /** + * Gets the number of selected rows. + * @return {Number} + */ + getCount : function(){ + return this.selectedRows.length; + }, + + /** + * Selects the first row in the grid. + */ + selectFirstRow : function(){ + for(var j = 0; j < this.grid.rows.length; j++){ + if(this.isSelectable(this.grid.rows[j])){ + this.focusRow(this.grid.rows[j]); + this.setRowState(this.grid.rows[j], true); + return; + } + } + }, + + /** + * Selects the row immediately following the last selected row. + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectNext : function(keepExisting){ + if(this.lastSelectedRow){ + for(var j = (this.lastSelectedRow.rowIndex+1); j < this.grid.rows.length; j++){ + var row = this.grid.rows[j]; + if(this.isSelectable(row)){ + this.focusRow(row); + this.setRowState(row, true, keepExisting); + return; + } + } + } + }, + + /** + * Selects the row that precedes the last selected row. + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectPrevious : function(keepExisting){ + if(this.lastSelectedRow){ + for(var j = (this.lastSelectedRow.rowIndex-1); j >= 0; j--){ + var row = this.grid.rows[j]; + if(this.isSelectable(row)){ + this.focusRow(row); + this.setRowState(row, true, keepExisting); + return; + } + } + } + }, + + /** + * Returns the selected rows. + * @return {Array} Array of DOM row elements + */ + getSelectedRows : function(){ + return this.selectedRows; + }, + + /** + * Returns the selected row ids. + * @return {Array} Array of String ids + */ + getSelectedRowIds : function(){ + return this.selectedRowIds; + }, + + /** + * Clears all selections. + */ + clearSelections : function(){ + if(this.isLocked()) return; + var oldSelections = this.selectedRows.concat(); + for(var j = 0; j < oldSelections.length; j++){ + this.setRowState(oldSelections[j], false); + } + this.selectedRows = []; + this.selectedRowIds = []; + }, + + + /** + * Selects all rows. + */ + selectAll : function(){ + if(this.isLocked()) return; + this.selectedRows = []; + this.selectedRowIds = []; + for(var j = 0, len = this.grid.rows.length; j < len; j++){ + this.setRowState(this.grid.rows[j], true, true); + } + }, + + /** + * Returns True if there is a selection. + * @return {Boolean} + */ + hasSelection : function(){ + return this.selectedRows.length > 0; + }, + + /** + * Returns True if the specified row is selected. + * @param {HTMLElement} row The row to check + * @return {Boolean} + */ + isSelected : function(row){ + return row && (row.selected === true || row.getAttribute('selected') == 'true'); + }, + + /** + * Returns True if the specified row is selectable. + * @param {HTMLElement} row The row to check + * @return {Boolean} + */ + isSelectable : function(row){ + return row && row.getAttribute('selectable') != 'false'; + }, + + /** @ignore */ + rowClick : function(grid, rowIndex, e){ + if(this.isLocked()) return; + var row = grid.getRow(rowIndex); + if(this.isSelectable(row)){ + if(e.shiftKey && this.lastSelectedRow){ + var lastIndex = this.lastSelectedRow.rowIndex; + this.selectRange(this.lastSelectedRow, row, e.ctrlKey); + this.lastSelectedRow = this.grid.el.dom.rows[lastIndex]; + }else{ + this.focusRow(row); + var rowState = e.ctrlKey ? !this.isSelected(row) : true; + this.setRowState(row, rowState, e.hasModifier()); + } + } + }, + + /** + * Deprecated. Tries to focus the row and scroll it into view - Use grid.scrollTo or grid.getView().focusRow() instead. + * @deprecated + * @param {HTMLElement} row The row to focus + */ + focusRow : function(row){ + this.grid.view.focusRow(row); + }, + + /** + * Selects a row. + * @param {Number/HTMLElement} row The row or index of the row to select + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectRow : function(row, keepExisting){ + this.setRowState(this.getRow(row), true, keepExisting); + }, + + /** + * Selects multiple rows. + * @param {Array} rows Array of the rows or indexes of the row to select + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectRows : function(rows, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + for(var i = 0; i < rows.length; i++){ + this.selectRow(rows[i], true); + } + }, + + /** + * Deselects a row. + * @param {Number/HTMLElement} row The row or index of the row to deselect + */ + deselectRow : function(row){ + this.setRowState(this.getRow(row), false); + }, + + /** @ignore */ + getRow : function(row){ + if(typeof row == 'number'){ + row = this.grid.rows[row]; + } + return row; + }, + + /** + * Selects a range of rows. All rows in between startRow and endRow are also selected. + * @param {Number/HTMLElement} startRow The row or index of the first row in the range + * @param {Number/HTMLElement} endRow The row or index of the last row in the range + * @param {Boolean} keepExisting (optional) True to retain existing selections + */ + selectRange : function(startRow, endRow, keepExisting){ + startRow = this.getRow(startRow); + endRow = this.getRow(endRow); + this.setRangeState(startRow, endRow, true, keepExisting); + }, + + /** + * Deselects a range of rows. All rows in between startRow and endRow are also deselected. + * @param {Number/HTMLElement} startRow The row or index of the first row in the range + * @param {Number/HTMLElement} endRow The row or index of the last row in the range + */ + deselectRange : function(startRow, endRow){ + startRow = this.getRow(startRow); + endRow = this.getRow(endRow); + this.setRangeState(startRow, endRow, false, true); + }, + + /** @ignore */ + setRowStateFromChild : function(childEl, selected, keepExisting){ + var row = this.grid.getRowFromChild(childEl); + this.setRowState(row, selected, keepExisting); + }, + + /** @ignore */ + setRangeState : function(startRow, endRow, selected, keepExisting){ + if(this.isLocked()) return; + if(!keepExisting){ + this.clearSelections(); + } + var curRow = startRow; + while(curRow.rowIndex != endRow.rowIndex){ + this.setRowState(curRow, selected, true); + curRow = (startRow.rowIndex < endRow.rowIndex ? + this.grid.getRowAfter(curRow) : this.grid.getRowBefore(curRow)) + } + this.setRowState(endRow, selected, true); + }, + + /** @ignore */ + setRowState : function(row, selected, keepExisting){ + if(this.isLocked()) return; + if(this.isSelectable(row)){ + if(selected){ + if(!keepExisting){ + this.clearSelections(); + } + this.setRowClass(row, 'selected'); + row.selected = true; + this.selectedRows.push(row); + this.selectedRowIds.push(this.grid.dataModel.getRowId(row.rowIndex)); + this.lastSelectedRow = row; + }else{ + this.setRowClass(row, ''); + row.selected = false; + this._removeSelected(row); + } + this.fireEvent('rowselect', this, row, selected); + this.fireEvent('selectionchange', this, this.selectedRows, this.selectedRowIds); + } + }, + + /** @ignore */ + handleOver : function(e){ + var row = this.grid.getRowFromChild(e.getTarget()); + if(this.isSelectable(row) && !this.isSelected(row)){ + this.setRowClass(row, 'over'); + } + }, + + /** @ignore */ + handleOut : function(e){ + var row = this.grid.getRowFromChild(e.getTarget()); + if(this.isSelectable(row) && !this.isSelected(row)){ + this.setRowClass(row, ''); + } + }, + + /** @ignore */ + keyDown : function(e){ + if(e.browserEvent.keyCode == e.DOWN){ + this.selectNext(e.shiftKey); + e.preventDefault(); + }else if(e.browserEvent.keyCode == e.UP){ + this.selectPrevious(e.shiftKey); + e.preventDefault(); + } + }, + + /** @ignore */ + setRowClass : function(row, cssClass){ + if(this.isSelectable(row)){ + if(cssClass == 'selected'){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-over'); + YAHOO.util.Dom.addClass(row, 'ygrid-row-selected'); + }else if(cssClass == 'over'){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected'); + YAHOO.util.Dom.addClass(row, 'ygrid-row-over'); + }else if(cssClass == ''){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected'); + YAHOO.util.Dom.removeClass(row, 'ygrid-row-over'); + } + } + }, + + /** @ignore */ + _removeSelected : function(row){ + var sr = this.selectedRows; + for (var i = 0; i < sr.length; i++) { + if (sr[i] === row){ + this.selectedRows.splice(i, 1); + this.selectedRowIds.splice(i, 1); + return; + } + } + } +}; + +/** + @class YAHOO.ext.grid.SingleSelectionModel + @extends YAHOO.ext.grid.DefaultSelectionModel + Allows only one row to be selected at a time. + @constructor + * Create new SingleSelectionModel + */ +YAHOO.ext.grid.SingleSelectionModel = function(){ + YAHOO.ext.grid.SingleSelectionModel.superclass.constructor.call(this); +}; + +YAHOO.extendX(YAHOO.ext.grid.SingleSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +/** @ignore */ +YAHOO.ext.grid.SingleSelectionModel.prototype.setRowState = function(row, selected){ + YAHOO.ext.grid.SingleSelectionModel.superclass.setRowState.call(this, row, selected, false); +}; + +YAHOO.ext.grid.DisableSelectionModel = function(){ + YAHOO.ext.grid.DisableSelectionModel.superclass.constructor.call(this); +}; + +YAHOO.extendX(YAHOO.ext.grid.DisableSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.DisableSelectionModel.prototype.initEvents = function(){ +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/CellEditor.js b/www/extras/yui-ext/source/grid/editor/CellEditor.js new file mode 100644 index 000000000..de4bd82a2 --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/CellEditor.js @@ -0,0 +1,96 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.CellEditor + * Base class for all EditorGrid editors + */ +YAHOO.ext.grid.CellEditor = function(element){ + this.colIndex = null; + this.rowIndex = null; + this.grid = null; + this.editing = false; + this.originalValue = null; + this.element = getEl(element, true); + this.element.addClass('ygrid-editor'); + this.element.dom.tabIndex = 1; + this.initialized = false; + this.callback = null; +}; + +YAHOO.ext.grid.CellEditor.prototype = { + init : function(grid, bodyElement, callback){ + // there's no way for the grid to know if multiple columns + // share the same editor so it will try to initialize the + // same one over and over + if(this.initialized) return; + this.initialized = true; + this.callback = callback; + this.grid = grid; + bodyElement.appendChild(this.element.dom); + this.initEvents(); + }, + + initEvents : function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.element.mon('keydown', stopOnEnter, this, true); + this.element.on('blur', this.stopEditing, this, true); + }, + + startEditing : function(value, row, cell){ + this.originalValue = value; + this.rowIndex = row.rowIndex; + this.colIndex = cell.columnIndex; + this.cell = cell; + this.setValue(value); + var cellbox = getEl(cell, true).getBox(); + this.fitToCell(cellbox); + this.editing = true; + this.show(); + }, + + stopEditing : function(focusCell){ + if(this.editing){ + this.editing = false; + var newValue = this.getValue(); + this.hide(); + //if(focusCell){try{this.cell.focus();}catch(e){}}; // try to give the cell focus so keyboard nav still works + if(this.originalValue != newValue){ + this.callback(newValue, this.rowIndex, this.colIndex); + } + } + }, + + setValue : function(value){ + this.element.dom.value = value; + }, + + getValue : function(){ + return this.element.dom.value; + }, + + fitToCell : function(box){ + this.element.setBox(box, true); + }, + + show : function(){ + this.element.show(); + this.element.focus(); + }, + + hide : function(){ + try{ + this.element.dom.blur(); + }catch(e){} + this.element.hide(); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/CheckboxEditor.js b/www/extras/yui-ext/source/grid/editor/CheckboxEditor.js new file mode 100644 index 000000000..42a5cc6c1 --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/CheckboxEditor.js @@ -0,0 +1,65 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.CheckboxEditor + * @extends YAHOO.ext.grid.CellEditor +Provides a checkbox for editing boolean values. It currently has no configuration options.

      +For more information on using this editor, see this blog post. +* @constructor +* Create a new CheckboxEditor + */ +YAHOO.ext.grid.CheckboxEditor = function(){ + var div = document.createElement('span'); + div.className = 'ygrid-editor ygrid-checkbox-editor'; + var cb = document.createElement('input'); + cb.type = 'checkbox'; + cb.setAttribute('autocomplete', 'off'); + div.appendChild(cb); + document.body.appendChild(div); + YAHOO.ext.grid.CheckboxEditor.superclass.constructor.call(this, div); + div.tabIndex = ''; + cb.tabIndex = 1; + this.cb = getEl(cb, true); +}; + +YAHOO.extendX(YAHOO.ext.grid.CheckboxEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.CheckboxEditor.prototype.fitToCell = function(box){ + this.element.setBox(box, true); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.setValue = function(value){ + this.cb.dom.checked = (value === true || value === 'true' || value === 1 || value === '1'); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.getValue = function(){ + return this.cb.dom.checked; +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.show = function(){ + this.element.show(); + this.cb.focus(); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.initEvents = function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.cb.mon('keydown', stopOnEnter, this, true); + this.cb.on('blur', this.stopEditing, this, true); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.hide = function(){ + try{ + this.cb.dom.blur(); + }catch(e){} + this.element.hide(); +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/DateEditor.js b/www/extras/yui-ext/source/grid/editor/DateEditor.js new file mode 100644 index 000000000..e30d7bc31 --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/DateEditor.js @@ -0,0 +1,273 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.DateEditor + * @extends YAHOO.ext.grid.CellEditor +Provides a date editor field, and optionally a DatePicker. The DateEditor provides a method to override (showCalendar) if you don't want to use the built in DatePicker control. The reason I chose to use my own DatePicker control rather than the nice YUI Calendar component is my control was very easy to override events to make it work well with the grid. It's also only 5k compressed, while the YUI Calendar is 40k compressed. The DatePicker supports left/right keys to move months, up/down keys to move years and the mouse wheel to quickly go through the months. The DateEditor supports the following configuration options: +
        +
      • format - The date format for the editor. The format is identical to PHP date() and text is allowed. Credit for that goes to this fantastic date library. This format is for the editor only and doesn't affect the rendering of the cell when not in edit mode. Your rendering function can use any date format it wants.
      • +
      • minValue - The minimum allowed date. Can be either a Javascript date object or a string date in the specified format.
      • +
      • maxValue - The maximum allowed date. Can be either a Javascript date object or a string date in the specified format.
      • +
      • minText - The tooltip to display when the date in the cell is before minValue.
      • +
      • maxText - The tooltip to display when the date in the cell is after maxValue.
      • +
      • invalidText - The text to display when the date in the field is invalid (for example: 02/31/06)
      • +
      • disabledDays - An array of days to disable, 0 based. For example, [0, 6] disables Sunday and Saturday.
      • +
      • disabledDaysText - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled day.
      • +
      • disabledDates - An array of "dates" to disable, as strings. These strings will be used to build a dynamic regular expression so they are very powerful. For example, ["03/08/2003", "09/16/2003"] would disable those dates, but ["03/08", "09/16"] would disable them for every year. If you are using short years, you will want to use ^ to tell the regular expression to only match the beginning like ["^03/08"]. To disable March of 2006: ["03/../2006"] or every March ["^03"]. In order to support regular expressions, if you are using a date format that has "." in it, you will have to escape the dot when restricting dates. For example: ["03\\.08\\.03"].
      • +
      • disabledDatesText - The tooltip to display when the date in the cell (or DatePicker) falls on a disabled date.
      • +
      • allowBlank - True if the cell is allowed to be empty.
      • +
      • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
      • +
      • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
      • +
      • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
      • +
      +For more information on using this editor, see this blog post. +* @constructor +* Create a new DateEditor +* @param {Object} config + */ +YAHOO.ext.grid.DateEditor = function(config){ + var div = document.createElement('span'); + div.className = 'ygrid-editor ygrid-editor-container'; + + var element = document.createElement('input'); + element.type = 'text'; + element.tabIndex = 1; + element.setAttribute('autocomplete', 'off'); + div.appendChild(element); + + var pick = document.createElement('span'); + pick.className = 'pick-button'; + div.appendChild(pick); + + document.body.appendChild(div); + + this.div = getEl(div, true); + this.element = getEl(element, true); + this.pick = getEl(pick, true); + + this.colIndex = null; + this.rowIndex = null; + this.grid = null; + this.editing = false; + this.originalValue = null; + this.initialized = false; + this.callback = null; + + this.cal = null; + this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true); + + YAHOO.ext.util.Config.apply(this, config); + if(typeof this.minValue == 'string') this.minValue = this.parseDate(this.minValue); + if(typeof this.maxValue == 'string') this.maxValue = this.parseDate(this.maxValue); + this.ddMatch = /ddnone/; + if(this.disabledDates){ + var dd = this.disabledDates; + var re = "(?:"; + for(var i = 0; i < dd.length; i++){ + re += dd[i]; + if(i != dd.length-1) re += "|"; + } + this.ddMatch = new RegExp(re + ")"); + } +}; + +YAHOO.ext.grid.DateEditor.prototype = { + init : function(grid, bodyElement, callback){ + if(this.initialized) return; + + this.initialized = true; + this.callback = callback; + this.grid = grid; + bodyElement.appendChild(this.div.dom); + this.initEvents(); + }, + + initEvents : function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.element.mon('keydown', stopOnEnter, this, true); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); + this.pick.on('click', this.showCalendar, this, true); + }, + + startEditing : function(value, row, cell){ + this.originalValue = value; + this.rowIndex = row.rowIndex; + this.colIndex = cell.columnIndex; + this.cell = cell; + this.setValue(value); + this.validate(); + var cellbox = getEl(cell, true).getBox(); + this.div.setBox(cellbox, true); + this.element.setWidth(cellbox.width-this.pick.getWidth()); + this.editing = true; + YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler); + this.show(); + }, + + stopEditing : function(focusCell){ + if(this.editing){ + YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler); + this.editing = false; + var newValue = this.getValue(); + this.hide(); + //if(focusCell){try{this.cell.focus();}catch(e){}}// try to give the cell focus so keyboard nav still works + if(this.originalValue != newValue){ + this.callback(newValue, this.rowIndex, this.colIndex); + } + } + }, + + setValue : function(value){ + this.element.dom.value = this.formatDate(value); + this.validate(); + }, + + getValue : function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + var value = this.element.dom.value; + if(value.length < 1){ + return value; + } else{ + return this.parseDate(value); + } + } + }, + + show : function() { + this.div.show(); + this.element.focus(); + this.validate(); + }, + + hide : function(){ + try{ + this.element.dom.blur(); + }catch(e){} + this.div.hide(); + }, + + validate : function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ // if it's blank + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + value = this.parseDate(value); + if(!value){ + dom.title = this.invalidText.replace('%0', dom.value).replace('%1', this.format); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + dom.title = this.minText.replace('%0', this.formatDate(this.minValue)); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + dom.title = this.maxText.replace('%0', this.formatDate(this.maxValue)); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + dom.title = this.disabledDaysText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch.test(fvalue)){ + dom.title = this.disabledDatesText.replace('%0', fvalue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }, + + handleMouseDown : function(e){ + var t = e.getTarget(); + var dom = this.div.dom; + if(t != dom && !YAHOO.util.Dom.isAncestor(dom, t)){ + this.stopEditing(); + } + }, + + showCalendar : function(value){ + if(this.cal == null){ + this.cal = new YAHOO.ext.DatePicker(this.div.dom.parentNode.parentNode); + } + this.cal.minDate = this.minValue; + this.cal.maxDate = this.maxValue; + this.cal.disabledDatesRE = this.ddMatch; + this.cal.disabledDatesText = this.disabledDatesText; + this.cal.disabledDays = this.disabledDays; + this.cal.disabledDaysText = this.disabledDaysText; + this.cal.format = this.format; + if(this.minValue){ + this.cal.minText = this.minText.replace('%0', this.formatDate(this.minValue)); + } + if(this.maxValue){ + this.cal.maxText = this.maxText.replace('%0', this.formatDate(this.maxValue)); + } + var r = this.div.getRegion(); + this.cal.show(r.left, r.bottom, this.getValue(), this.setValue.createDelegate(this)); + }, + + parseDate : function(value){ + if(!value || value instanceof Date) return value; + return Date.parseDate(value, this.format); + }, + + formatDate : function(date){ + if(!date || !(date instanceof Date)) return date; + return date.format(this.format); + } +}; + +YAHOO.ext.grid.DateEditor.prototype.format = 'm/d/y'; +YAHOO.ext.grid.DateEditor.prototype.disabledDays = null; +YAHOO.ext.grid.DateEditor.prototype.disabledDaysText = ''; +YAHOO.ext.grid.DateEditor.prototype.disabledDates = null; +YAHOO.ext.grid.DateEditor.prototype.disabledDatesText = ''; +YAHOO.ext.grid.DateEditor.prototype.allowBlank = true; +YAHOO.ext.grid.DateEditor.prototype.minValue = null; +YAHOO.ext.grid.DateEditor.prototype.maxValue = null; +YAHOO.ext.grid.DateEditor.prototype.minText = 'The date in this field must be after %0'; +YAHOO.ext.grid.DateEditor.prototype.maxText = 'The date in this field must be before %0'; +YAHOO.ext.grid.DateEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.DateEditor.prototype.invalidText = '%0 is not a valid date - it must be in the format %1'; +YAHOO.ext.grid.DateEditor.prototype.validationDelay = 200; +YAHOO.ext.grid.DateEditor.prototype.validator = function(){return true;}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/NumberEditor.js b/www/extras/yui-ext/source/grid/editor/NumberEditor.js new file mode 100644 index 000000000..53753f121 --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/NumberEditor.js @@ -0,0 +1,171 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.NumberEditor + * @extends YAHOO.ext.grid.CellEditor +Provides a masked editor for numeric values. Invalid keys are ignored. It supports the following configuration options: +
        +
      • allowDecimals - True if the cell can have decimal values.
      • +
      • decimalSeparator - Character(s) to allow as the decimal separator.
      • +
      • decimalPrecision - Set the maximum decimal precision.
      • +
      • decimalPrecisionFcn - Define the function to call to remove extra precision (ie. Math.floor, Math.round, Math.ceil or your own function).
      • +
      • allowNegative - True if the cell allows negative values.
      • +
      • selectOnFocus - True to select the text when the editor is activated.
      • +
      • minValue - The minimum value the cell will allow.
      • +
      • maxValue - The maximum value the cell will allow.
      • +
      • minText - The tooltip to display when the value in the cell is below the minimum.
      • +
      • maxText - The tooltip to display when the value in the cell is above the maximum.
      • +
      • nanText - The tooltip to display when the value in the cell is not a valid number (for example, negatives are allowed and the value in the cell is just "-" with no numbers).
      • +
      • allowBlank - True if the cell is allowed to be empty.
      • +
      • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
      • +
      • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
      • +
      • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
      • +
      +For more information on using this editor, see this blog post. +* @constructor +* Create a new NumberEditor +* @param {Object} config + */ +YAHOO.ext.grid.NumberEditor = function(config){ + var element = document.createElement('input'); + element.type = 'text'; + element.className = 'ygrid-editor ygrid-num-editor'; + element.setAttribute('autocomplete', 'off'); + document.body.appendChild(element); + YAHOO.ext.grid.NumberEditor.superclass.constructor.call(this, element); + YAHOO.ext.util.Config.apply(this, config); +}; +YAHOO.extendX(YAHOO.ext.grid.NumberEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.NumberEditor.prototype.initEvents = function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + }; + + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += '-'; + } + var keyPress = function(e){ + var c = e.getCharCode(); + if(c != e.BACKSPACE && allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.element.mon('keydown', stopOnEnter, this, true); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); + this.element.mon('keypress', keyPress, this, true); + this.element.on('blur', this.stopEditing, this, true); +}; + +YAHOO.ext.grid.NumberEditor.prototype.validate = function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ // if it's blank + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + if(value.search(/\d+/) === -1){ + dom.title = this.nanText.replace('%0', value); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + dom.title = this.minText.replace('%0', this.minValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(num > this.maxValue){ + dom.title = this.maxText.replace('%0', this.maxValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; +}; + +YAHOO.ext.grid.NumberEditor.prototype.show = function(){ + this.element.dom.title = ''; + YAHOO.ext.grid.NumberEditor.superclass.show.call(this); + if(this.selectOnFocus){ + try{ + this.element.dom.select(); + }catch(e){} + } + this.validate(this.element.dom.value); +}; + +YAHOO.ext.grid.NumberEditor.prototype.getValue = function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + var value = this.element.dom.value; + if(value.length < 1){ + return value; + } else{ + return this.fixPrecision(this.parseValue(value)); + } + } +}; +YAHOO.ext.grid.NumberEditor.prototype.parseValue = function(value){ + return parseFloat(new String(value).replace(this.decimalSeparator, '.')); +}; + +YAHOO.ext.grid.NumberEditor.prototype.fixPrecision = function(value){ + if(!this.allowDecimals || this.decimalPrecision == -1 || isNaN(value) || value == 0 || !value){ + return value; + } + // this should work but doesn't due to precision error in JS + // var scale = Math.pow(10, this.decimalPrecision); + // var fixed = this.decimalPrecisionFcn(value * scale); + // return fixed / scale; + // + // so here's our workaround: + var scale = Math.pow(10, this.decimalPrecision+1); + var fixed = this.decimalPrecisionFcn(value * scale); + fixed = this.decimalPrecisionFcn(fixed/10); + return fixed / (scale/10); +}; + +YAHOO.ext.grid.NumberEditor.prototype.allowBlank = true; +YAHOO.ext.grid.NumberEditor.prototype.allowDecimals = true; +YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator = '.'; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision = 2; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn = Math.floor; +YAHOO.ext.grid.NumberEditor.prototype.allowNegative = true; +YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus = true; +YAHOO.ext.grid.NumberEditor.prototype.minValue = Number.NEGATIVE_INFINITY; +YAHOO.ext.grid.NumberEditor.prototype.maxValue = Number.MAX_VALUE; +YAHOO.ext.grid.NumberEditor.prototype.minText = 'The minimum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.maxText = 'The maximum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.NumberEditor.prototype.nanText = '%0 is not a valid number'; +YAHOO.ext.grid.NumberEditor.prototype.validationDelay = 100; +YAHOO.ext.grid.NumberEditor.prototype.validator = function(){return true;}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/SelectEditor.js b/www/extras/yui-ext/source/grid/editor/SelectEditor.js new file mode 100644 index 000000000..d24235d39 --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/SelectEditor.js @@ -0,0 +1,42 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.SelectEditor + * @extends YAHOO.ext.grid.CellEditor +Creates an editor out of an existing select field. You can create the select element through DOM in Javascript and pass it to the SelectEditor's constructor or an easier way is like this: +

      +Define the select field in your document, giving it the ygrid-editor class. +
      
      +<select id="light" class="ygrid-editor">
      +	<option value="Shade">Shade</option>
      +	<option value="Mostly Shady">Mostly Shady</option>
      +	<option value="Sun or Shade">Sun or Shade</option>
      +	<option value="Mostly Sunny">Mostly Sunny</option>
      +	<option value="Sunny">Sunny</option>
      +</select>
      +
      +Create the SelectEditor object, passing in the id of your select field. +
      
      +var editor = new YAHOO.ext.grid.SelectEditor('light'); 
      +
      +For more information on using this editor, see this blog post. +* @constructor +* Create a new SelectEditor +* @param {HTMLElement/String} element + */ +YAHOO.ext.grid.SelectEditor = function(element){ + element.hideFocus = true; + YAHOO.ext.grid.SelectEditor.superclass.constructor.call(this, element); + this.element.swallowEvent('click'); +}; +YAHOO.extendX(YAHOO.ext.grid.SelectEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.SelectEditor.prototype.fitToCell = function(box){ + if(YAHOO.ext.util.Browser.isGecko){ + box.height -= 3; + } + this.element.setBox(box, true); +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/grid/editor/TextEditor.js b/www/extras/yui-ext/source/grid/editor/TextEditor.js new file mode 100644 index 000000000..65a0e695b --- /dev/null +++ b/www/extras/yui-ext/source/grid/editor/TextEditor.js @@ -0,0 +1,115 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.grid.TextEditor + * @extends YAHOO.ext.grid.CellEditor +Provides basic text editing for a cells and supports the following configuration options: +
        +
      • allowBlank - True if the cell is allowed to be empty.
      • +
      • minLength - The minimum length the cell will accept.
      • +
      • maxLength - The maximum length the cell will allow.
      • +
      • minText - The tooltip to display when the length of the value in the cell is below the minimum.
      • +
      • maxText - The tooltip to display when the length of the value in the cell is above the maximum.
      • +
      • selectOnFocus - True to select the text when the editor is activated.
      • +
      • blankText - The tooltip (error message) to display when the cell is empty and is not allowed to be.
      • +
      • regex - A regular expression to match if the value is valid. If the regex.test(value) returns false, the value is considered invalid.
      • +
      • regexText - The tooltip (error message) to display when regex does not match.
      • +
      • validator - Any custom validation function you want called. The function must return true if the data is valid or an error message otherwise.
      • +
      • validationDelay - The delay in milliseconds for validation. Each time the user types something the field is validated after a specified delay, setting this value allows you to customize that delay (for example, if your custom validation routine is slow).
      • +
      +For more information on using this editor, see this blog post. +* @constructor +* Create a new TextEditor +* @param {Object} config + */ +YAHOO.ext.grid.TextEditor = function(config){ + var element = document.createElement('input'); + element.type = 'text'; + element.className = 'ygrid-editor ygrid-text-editor'; + element.setAttribute('autocomplete', 'off'); + document.body.appendChild(element); + YAHOO.ext.grid.TextEditor.superclass.constructor.call(this, element); + YAHOO.ext.util.Config.apply(this, config); +}; +YAHOO.extendX(YAHOO.ext.grid.TextEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.TextEditor.prototype.validate = function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ // if it's blank + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + if(value.length < this.minLength){ + dom.title = this.minText.replace('%0', this.minLength); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(value.length > this.maxLength){ + dom.title = this.maxText.replace('%0', this.maxLength); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.regex && !this.regex.test(value)){ + dom.title = this.regexText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; +}; + +YAHOO.ext.grid.TextEditor.prototype.initEvents = function(){ + YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); +}; + +YAHOO.ext.grid.TextEditor.prototype.show = function(){ + this.element.dom.title = ''; + YAHOO.ext.grid.TextEditor.superclass.show.call(this); + this.element.focus(); + if(this.selectOnFocus){ + try{ + this.element.dom.select(); + }catch(e){} + } + this.validate(this.element.dom.value); +}; + +YAHOO.ext.grid.TextEditor.prototype.getValue = function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + return this.element.dom.value; + } +}; + +YAHOO.ext.grid.TextEditor.prototype.allowBlank = true; +YAHOO.ext.grid.TextEditor.prototype.minLength = 0; +YAHOO.ext.grid.TextEditor.prototype.maxLength = Number.MAX_VALUE; +YAHOO.ext.grid.TextEditor.prototype.minText = 'The minimum length for this field is %0'; +YAHOO.ext.grid.TextEditor.prototype.maxText = 'The maximum length for this field is %0'; +YAHOO.ext.grid.TextEditor.prototype.selectOnFocus = true; +YAHOO.ext.grid.TextEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.TextEditor.prototype.validator = function(){return true;}; +YAHOO.ext.grid.TextEditor.prototype.validationDelay = 200; +YAHOO.ext.grid.TextEditor.prototype.regex = null; +YAHOO.ext.grid.TextEditor.prototype.regexText = ''; \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/BorderLayout.js b/www/extras/yui-ext/source/layout/BorderLayout.js new file mode 100644 index 000000000..70a4c6194 --- /dev/null +++ b/www/extras/yui-ext/source/layout/BorderLayout.js @@ -0,0 +1,282 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.BorderLayout + * @extends YAHOO.ext.LayoutManager + * This class represents a common layout manager used in desktop applications. For screenshots and more details, + * please see:

      + * Cross Browser Layouts - Part 1
      + * Cross Browser Layouts - Part 2

      + * Example: +
      
      + var layout = new YAHOO.ext.BorderLayout(document.body, {
      +    north: {
      +        initialSize: 25,
      +        titlebar: false
      +    },
      +    west: {
      +        split:true,
      +        initialSize: 200,
      +        minSize: 175,
      +        maxSize: 400,
      +        titlebar: true,
      +        collapsible: true
      +    },
      +    east: {
      +        split:true,
      +        initialSize: 202,
      +        minSize: 175,
      +        maxSize: 400,
      +        titlebar: true,
      +        collapsible: true
      +    },
      +    south: {
      +        split:true,
      +        initialSize: 100,
      +        minSize: 100,
      +        maxSize: 200,
      +        titlebar: true,
      +        collapsible: true
      +    },
      +    center: {
      +        titlebar: true,
      +        autoScroll:true,
      +        resizeTabs: true,
      +        minTabWidth: 50,
      +        preferredTabWidth: 150
      +    }
      +});
      +
      +// shorthand
      +var CP = YAHOO.ext.ContentPanel;
      +
      +layout.beginUpdate();
      +layout.add('north', new CP('north', 'North'));
      +layout.add('south', new CP('south', {title: 'South', closable: true}));
      +layout.add('west', new CP('west', {title: 'West'}));
      +layout.add('east', new CP('autoTabs', {title: 'Auto Tabs', closable: true}));
      +layout.add('center', new CP('center1', {title: 'Close Me', closable: true}));
      +layout.add('center', new CP('center2', {title: 'Center Panel', closable: false}));
      +layout.getRegion('center').showPanel('center1');
      +layout.endUpdate();
      +
      +* @constructor +* Create a new BorderLayout +* @param {String/HTMLElement/Element} container The container this layout is bound to +* @param {Object} config Configuration options + */ +YAHOO.ext.BorderLayout = function(container, config){ + YAHOO.ext.BorderLayout.superclass.constructor.call(this, container); + this.factory = config.factory || YAHOO.ext.BorderLayout.RegionFactory; + /** + * True to hide the center panel while performing layouts. This helps when the center region contains + * heavy components such as a yui-ext grid. + * @type Boolean + */ + this.hideOnLayout = config.hideOnLayout || false; + for(var i = 0, len = this.factory.validRegions.length; i < len; i++) { + var target = this.factory.validRegions[i]; + if(config[target]){ + this.addRegion(target, config[target]); + } + } + //this.dragOverDelegate = YAHOO.ext.EventManager.wrap(this.onDragOver, this, true); +}; + +YAHOO.extendX(YAHOO.ext.BorderLayout, YAHOO.ext.LayoutManager, { + /** + * Creates and adds a new region if it doesn't already exist. + * @param {String} target The target region key (north, south, east, west or center). + * @param {Object} config The regions config object + * @return {BorderLayoutRegion} The new region + */ + addRegion : function(target, config){ + if(!this.regions[target]){ + var r = this.factory.create(target, this, config); + this.regions[target] = r; + r.on('visibilitychange', this.layout, this, true); + r.on('paneladded', this.layout, this, true); + r.on('panelremoved', this.layout, this, true); + r.on('invalidated', this.layout, this, true); + r.on('resized', this.onRegionResized, this, true); + r.on('collapsed', this.onRegionCollapsed, this, true); + r.on('expanded', this.onRegionExpanded, this, true); + } + return this.regions[target]; + }, + + /** + * Performs a layout update. + */ + layout : function(){ + if(this.updating) return; + //var bench = new YAHOO.ext.util.Bench(); + //bench.start('Layout...'); + var size = this.getViewSize(); + var w = size.width, h = size.height; + var centerW = w, centerH = h, centerY = 0, centerX = 0; + var x = 0, y = 0; + + var rs = this.regions; + var n = rs['north'], s = rs['south'], west = rs['west'], e = rs['east'], c = rs['center']; + if(this.hideOnLayout){ + c.el.setStyle('display', 'none'); + } + if(n && n.isVisible()){ + var b = n.getBox(); + var m = n.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + b.y = m.top; + centerY = b.height + b.y + m.bottom; + centerH -= centerY; + n.updateBox(this.safeBox(b)); + } + if(s && s.isVisible()){ + var b = s.getBox(); + var m = s.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + var totalHeight = (b.height + m.top + m.bottom); + b.y = h - totalHeight + m.top; + centerH -= totalHeight; + s.updateBox(this.safeBox(b)); + } + if(west && west.isVisible()){ + var b = west.getBox(); + var m = west.getMargins(); + b.height = centerH - (m.top+m.bottom); + b.x = m.left; + b.y = centerY + m.top; + var totalWidth = (b.width + m.left + m.right); + centerX += totalWidth; + centerW -= totalWidth; + west.updateBox(this.safeBox(b)); + } + if(e && e.isVisible()){ + var b = e.getBox(); + var m = e.getMargins(); + b.height = centerH - (m.top+m.bottom); + var totalWidth = (b.width + m.left + m.right); + b.x = w - totalWidth + m.left; + b.y = centerY + m.top; + centerW -= totalWidth; + e.updateBox(this.safeBox(b)); + } + if(c){ + var m = c.getMargins(); + var centerBox = { + x: centerX + m.left, + y: centerY + m.top, + width: centerW - (m.left+m.right), + height: centerH - (m.top+m.bottom) + }; + if(this.hideOnLayout){ + c.el.setStyle('display', 'block'); + } + c.updateBox(this.safeBox(centerBox)); + } + this.el.repaint(); + this.fireEvent('layout', this); + //bench.stop(); + //alert(bench.toString()); + }, + + safeBox : function(box){ + box.width = Math.max(0, box.width); + box.height = Math.max(0, box.height); + return box; + }, + + /** + * Adds a ContentPanel (or subclass) to this layout. + * @param {String} target The target region key (north, south, east, west or center). + * @param {YAHOO.ext.ContentPanel} panel The panel to add + * @return {YAHOO.ext.ContentPanel} The added panel + */ + add : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].add(panel); + }, + + /** + * Adds a ContentPanel (or subclass) to this layout. + * @param {String} target The target region key (north, south, east, west or center). + * @param {Number/String/YAHOO.ext.ContentPanel} panel The index, id or panel to remove + * @return {YAHOO.ext.ContentPanel} The removed panel + */ + remove : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].remove(panel); + }, + + /** + * Searches all regions for a panel with the specified id + * @param {String} panelId + * @return {YAHOO.ext.ContentPanel} The panel or null if it wasn't found + */ + findPanel : function(panelId){ + var rs = this.regions; + for(var target in rs){ + if(typeof rs[target] != 'function'){ + var p = rs[target].getPanel(panelId); + if(p){ + return p; + } + } + } + return null; + }, + + /** + * Searches all regions for a panel with the specified id and activates (shows) it. + * @param {String/ContentPanel} panelId The panels id or the panel itself + * @return {YAHOO.ext.ContentPanel} The shown panel or null + */ + showPanel : function(panelId) { + var rs = this.regions; + for(var target in rs){ + var r = rs[target]; + if(typeof r != 'function'){ + if(r.hasPanel(panelId)){ + return r.showPanel(panelId); + } + } + } + return null; + }, + + /** + * Restores this layouts state using YAHOO.ext.state.Manager or the state provided by the passed provider. + * @param {YAHOO.ext.state.Provider} provider (optional) An alternate state provider + */ + restoreState : function(provider){ + if(!provider){ + provider = YAHOO.ext.state.Manager; + } + var sm = new YAHOO.ext.LayoutStateManager(); + sm.init(this, provider); + } +}); + +YAHOO.ext.BorderLayout.RegionFactory = {}; +YAHOO.ext.BorderLayout.RegionFactory.validRegions = ['north','south','east','west','center']; +YAHOO.ext.BorderLayout.RegionFactory.create = function(target, mgr, config){ + target = target.toLowerCase(); + switch(target){ + case 'north': + return new YAHOO.ext.NorthLayoutRegion(mgr, config); + case 'south': + return new YAHOO.ext.SouthLayoutRegion(mgr, config); + case 'east': + return new YAHOO.ext.EastLayoutRegion(mgr, config); + case 'west': + return new YAHOO.ext.WestLayoutRegion(mgr, config); + case 'center': + return new YAHOO.ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/BorderLayoutRegions.js b/www/extras/yui-ext/source/layout/BorderLayoutRegions.js new file mode 100644 index 000000000..efd68eced --- /dev/null +++ b/www/extras/yui-ext/source/layout/BorderLayoutRegions.js @@ -0,0 +1,212 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/* + * These classes are private internal classes + */ +YAHOO.ext.CenterLayoutRegion = function(mgr, config){ + YAHOO.ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, 'center'); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +YAHOO.extendX(YAHOO.ext.CenterLayoutRegion, YAHOO.ext.LayoutRegion, { + hide : function(){ + // center panel can't be hidden + }, + + show : function(){ + // center panel can't be hidden + }, + + getMinWidth: function(){ + return this.minWidth; + }, + + getMinHeight: function(){ + return this.minHeight; + } +}); + + +YAHOO.ext.NorthLayoutRegion = function(mgr, config){ + YAHOO.ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, 'north', 'n-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.TOP; + this.split.orientation = YAHOO.ext.SplitBar.VERTICAL; + this.split.el.addClass('ylayout-split-v'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setHeight(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.NorthLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.height += this.split.el.getHeight(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + box.height -= this.split.el.getHeight(); + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y+box.height); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.el.setWidth(box.width); + var bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setWidth(bodyWidth); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(bodyWidth, this.panelSize.height); + } + } + YAHOO.ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.SouthLayoutRegion = function(mgr, config){ + YAHOO.ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, 'south', 's-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.BOTTOM; + this.split.orientation = YAHOO.ext.SplitBar.VERTICAL; + this.split.el.addClass('ylayout-split-v'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setHeight(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.SouthLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sh = this.split.el.getHeight(); + box.height += sh; + box.y -= sh; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sh = this.split.el.getHeight(); + box.height -= sh; + box.y += sh; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y-sh); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.el.setWidth(box.width); + var bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setWidth(bodyWidth); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(bodyWidth, this.panelSize.height); + } + } + YAHOO.ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.EastLayoutRegion = function(mgr, config){ + YAHOO.ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, 'east', 'e-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.RIGHT; + this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL; + this.split.el.addClass('ylayout-split-h'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setWidth(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.EastLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sw = this.split.el.getWidth(); + box.width += sw; + box.x -= sw; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + box.x += sw; + } + if(this.collapsed){ + this.el.setHeight(box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + this.bodyEl.setHeight(bodyHeight); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(this.panelSize.width, bodyHeight); + } + } + YAHOO.ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.WestLayoutRegion = function(mgr, config){ + YAHOO.ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, 'west', 'w-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.LEFT; + this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL; + this.split.el.addClass('ylayout-split-h'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setWidth(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.WestLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.width += this.split.el.getWidth(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x+box.width); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + } + if(this.collapsed){ + this.el.setHeight(box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + this.bodyEl.setHeight(bodyHeight); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(this.panelSize.width, bodyHeight); + } + } + YAHOO.ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); diff --git a/www/extras/yui-ext/source/layout/ContentPanels.js b/www/extras/yui-ext/source/layout/ContentPanels.js new file mode 100644 index 000000000..f7a7a5dd0 --- /dev/null +++ b/www/extras/yui-ext/source/layout/ContentPanels.js @@ -0,0 +1,301 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.ContentPanel + * @extends YAHOO.ext.util.Observable + * A basic ContentPanel element. + * @constructor + * Create a new ContentPanel. + * @param {String/HTMLElement/Element} el The container element for this panel + * @param {String/Object} config A string to set only the title or a config object + * @param {String} content (optional) Set the HTML content for this panel + */ +YAHOO.ext.ContentPanel = function(el, config, content){ + YAHOO.ext.ContentPanel.superclass.constructor.call(this); + this.el = getEl(el, true); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == 'object'){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = YAHOO.ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = YAHOO.ext.DomHelper.append(document.body, + {tag: 'div', cls: 'ylayout-inactive-content', id: el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == 'string'){ + this.title = config; + }else{ + YAHOO.ext.util.Config.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = getEl(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.events = { + /** + * @event activate + * Fires when this panel is activated. + * @param {YAHOO.ext.ContentPanel} this + */ + 'activate' : new YAHOO.util.CustomEvent('activate'), + /** + * @event deactivate + * Fires when this panel is activated. + * @param {YAHOO.ext.ContentPanel} this + */ + 'deactivate' : new YAHOO.util.CustomEvent('deactivate') + }; + if(content){ + this.setContent(content); + } +}; + +YAHOO.extendX(YAHOO.ext.ContentPanel, YAHOO.ext.util.Observable, { + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass('ylayout-inactive-content', 'ylayout-active-content'); + }else{ + this.el.replaceClass('ylayout-active-content', 'ylayout-inactive-content'); + } + }, + + /** + * Returns the toolbar for this Panel if one was configured + * @return {YAHOO.ext.Toolbar} + */ + getToolbar : function(){ + return this.toolbar; + }, + + setActiveState : function(active){ + this.active = active; + if(!active){ + this.fireEvent('deactivate', this); + }else{ + this.fireEvent('activate', this); + } + }, + + /** + * Updates this panel's element + * @param {String} content The new content + * @param {Boolean} loadScripts (optional) true to look for and process scripts + */ + setContent : function(content, loadScripts){ + this.el.update(content, loadScripts); + }, + + /** + * Get the {@link YAHOO.ext.UpdateManager} for this panel. Enables you to perform Ajax updates. + * @return {YAHOO.ext.UpdateManager} The UpdateManager + */ + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + + /** + * Set a URL to be used to load the content for this panel. + * @param {String/Function} url The url to load the content from or a function to call to get the url + * @param {String/Object} params (optional) The string params for the update call or an object of the params. See {@link YAHOO.ext.UpdateManager#update} for more details. (Defaults to null) + * @param {Boolean} loadOnce (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this panel is activated. (Defaults to false) + * @return {YAHOO.ext.UpdateManager} The UpdateManager + */ + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.removeListener('activate', this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on('activate', this._handleRefresh.createDelegate(this, [url, params, loadOnce])); + return this.el.getUpdateManager(); + }, + + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.el.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + _setLoaded : function(){ + this.loaded = true; + }, + + /** + * Returns this panel's id + * @return {String} + */ + getId : function(){ + return this.el.id; + }, + + /** + * Returns this panel's element + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + adjustForComponents : function(width, height){ + if(this.toolbar){ + height -= this.toolbar.getEl().getHeight(); + } + return {'width': width, 'height': height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame){ + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(size.width, size.height); + } + }, + + /** + * Returns this panel's title + * @return {String} + */ + getTitle : function(){ + return this.title; + }, + + /** + * Set this panel's title + * @param {String} title + */ + setTitle : function(title){ + this.title = title; + if(this.region){ + this.region.updatePanelTitle(this, title); + } + }, + + /** + * Returns true is this panel was configured to be closable + * @return {Boolean} + */ + isClosable : function(){ + return this.closable; + }, + + beforeSlide : function(){ + this.el.clip(); + this.resizeEl.clip(); + }, + + afterSlide : function(){ + this.el.unclip(); + this.resizeEl.unclip(); + }, + + /** + * Destroys this panel + */ + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement('span'); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ''; + this.el = null; + } +}); + +/** + * @class YAHOO.ext.GridPanel + * @extends YAHOO.ext.ContentPanel + * @constructor + * Create a new GridPanel. + * @param {YAHOO.ext.grid.Grid} grid The grid for this panel + * @param {String/Object} config A string to set only the title or a config object + */ +YAHOO.ext.GridPanel = function(grid, config){ + this.wrapper = YAHOO.ext.DomHelper.append(document.body, // wrapper for IE7 strict & safari scroll issue + {tag: 'div', cls: 'ylayout-grid-wrapper ylayout-inactive-content'}, true); + this.wrapper.dom.appendChild(grid.container.dom); + YAHOO.ext.GridPanel.superclass.constructor.call(this, this.wrapper, config); + if(this.toolbar){ + this.toolbar.el.insertBefore(this.wrapper.dom.firstChild); + } + grid.monitorWindowResize = false; // turn off autosizing + grid.autoHeight = false; + grid.autoWidth = false; + this.grid = grid; + this.grid.container.replaceClass('ylayout-inactive-content', 'ylayout-component-panel'); +}; + +YAHOO.extendX(YAHOO.ext.GridPanel, YAHOO.ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + /** + * Returns the grid for this panel + * @return {YAHOO.ext.grid.Grid} + */ + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + var grid = this.grid; + var size = this.adjustForComponents(width, height); + grid.container.setSize(size.width, size.height); + grid.autoSize(); + }, + + beforeSlide : function(){ + this.grid.getView().wrapEl.clip(); + }, + + afterSlide : function(){ + this.grid.getView().wrapEl.unclip(); + }, + + destroy : function(){ + this.grid.getView().unplugDataModel(this.grid.getDataModel()); + this.grid.container.removeAllListeners(); + YAHOO.ext.GridPanel.superclass.destroy.call(this); + } +}); + + +/** + * @class YAHOO.ext.NestedLayoutPanel + * @extends YAHOO.ext.ContentPanel + * @constructor + * Create a new NestedLayoutPanel. + * @param {YAHOO.ext.BorderLayout} layout The layout for this panel + * @param {String/Object} config A string to set only the title or a config object + */ +YAHOO.ext.NestedLayoutPanel = function(layout, config){ + YAHOO.ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; // turn off autosizing + this.layout = layout; + this.layout.getEl().addClass('ylayout-nested-layout'); +}; + +YAHOO.extendX(YAHOO.ext.NestedLayoutPanel, YAHOO.ext.ContentPanel, { + setSize : function(width, height){ + var size = this.adjustForComponents(width, height); + this.layout.getEl().setSize(size.width, size.height); + this.layout.layout(); + }, + + /** + * Returns the nested BorderLayout for this panel + * @return {YAHOO.ext.BorderLayout} + */ + getLayout : function(){ + return this.layout; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/LayoutManager.js b/www/extras/yui-ext/source/layout/LayoutManager.js new file mode 100644 index 000000000..0c0c7def3 --- /dev/null +++ b/www/extras/yui-ext/source/layout/LayoutManager.js @@ -0,0 +1,136 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.LayoutManager + * @extends YAHOO.ext.util.Observable + * Base class for layout managers. + */ +YAHOO.ext.LayoutManager = function(container){ + YAHOO.ext.LayoutManager.superclass.constructor.call(this); + this.el = getEl(container, true); + this.id = this.el.id; + this.el.addClass('ylayout-container'); + /** false to disable window resize monitoring @type Boolean */ + this.monitorWindowResize = true; + this.regions = {}; + this.events = { + /** + * @event layout + * Fires when a layout is performed. + * @param {YAHOO.ext.LayoutManager} this + */ + 'layout' : new YAHOO.util.CustomEvent(), + /** + * @event regionresized + * Fires when the user resizes a region. + * @param {YAHOO.ext.LayoutRegion} region + * @param {Number} newSize The new size (width for east/west, height for north/south) + */ + 'regionresized' : new YAHOO.util.CustomEvent(), + /** + * @event regioncollapsed + * Fires when a region is collapsed. + * @param {YAHOO.ext.LayoutRegion} region + */ + 'regioncollapsed' : new YAHOO.util.CustomEvent(), + /** + * @event regionexpanded + * Fires when a region is expanded. + * @param {YAHOO.ext.LayoutRegion} region + */ + 'regionexpanded' : new YAHOO.util.CustomEvent() + }; + this.updating = false; + YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +YAHOO.extendX(YAHOO.ext.LayoutManager, YAHOO.ext.util.Observable, { + /** + * Returns true if this layout is currently being updated + * @return {Boolean} + */ + isUpdating : function(){ + return this.updating; + }, + + /** + * Suspend the LayoutManager from doing auto-layouts while + * making multiple add or remove calls + */ + beginUpdate : function(){ + this.updating = true; + }, + + /** + * Restore auto-layouts and optionally disable the manager from performing a layout + * @param {Boolean} noLayout true to disable a layout update + */ + endUpdate : function(noLayout){ + this.updating = false; + if(!noLayout){ + this.layout(); + } + }, + + layout: function(){ + + }, + + onRegionResized : function(region, newSize){ + this.fireEvent('regionresized', region, newSize); + this.layout(); + }, + + onRegionCollapsed : function(region){ + this.fireEvent('regioncollapsed', region); + }, + + onRegionExpanded : function(region){ + this.fireEvent('regionexpanded', region); + }, + + /** + * Returns the size of the current view, This method normalizes document.body and element embedded layouts and + * performs box-model adjustments. + * @return {Object} The size as an object {width: (the width), height: (the height)} + */ + getViewSize : function(){ + var size; + if(this.el.dom != document.body){ + this.el.beginMeasure(); + size = this.el.getSize(); + this.el.endMeasure(); + }else{ + size = {width: YAHOO.util.Dom.getViewportWidth(), height: YAHOO.util.Dom.getViewportHeight()}; + } + size.width -= this.el.getBorderWidth('lr')-this.el.getPadding('lr'); + size.height -= this.el.getBorderWidth('tb')-this.el.getPadding('tb'); + return size; + }, + + /** + * Returns the element this layout is bound to. + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the specified region. + * @param {String} target The region key + * @return {YAHOO.ext.LayoutRegion} + */ + getRegion : function(target){ + return this.regions[target]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/LayoutRegion.js b/www/extras/yui-ext/source/layout/LayoutRegion.js new file mode 100644 index 000000000..372597b07 --- /dev/null +++ b/www/extras/yui-ext/source/layout/LayoutRegion.js @@ -0,0 +1,592 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.LayoutRegion + * @extends YAHOO.ext.util.Observable + * This class represents a region in a layout manager. + */ +YAHOO.ext.LayoutRegion = function(mgr, config, pos){ + this.mgr = mgr; + this.position = pos; + var dh = YAHOO.ext.DomHelper; + /** This regions container element @type YAHOO.ext.Element */ + this.el = dh.append(mgr.el.dom, {tag: 'div', cls: 'ylayout-panel ylayout-panel-' + this.position}, true); + /** This regions title element @type YAHOO.ext.Element */ + this.titleEl = dh.append(this.el.dom, {tag: 'div', unselectable: 'on', cls: 'yunselectable ylayout-panel-hd ylayout-title-'+this.position, children:[ + {tag: 'span', cls: 'yunselectable ylayout-panel-hd-text', unselectable: 'on', html: ' '}, + {tag: 'div', cls: 'yunselectable ylayout-panel-hd-tools', unselectable: 'on'} + ]}, true); + this.titleEl.enableDisplayMode(); + /** This regions title text element @type HTMLElement */ + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = getEl(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, 'ylayout-close'); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on('click', this.closeClicked, this, true); + this.closeBtn.hide(); + /** This regions body element @type YAHOO.ext.Element */ + this.bodyEl = dh.append(this.el.dom, {tag: 'div', cls: 'ylayout-panel-body'}, true); + this.events = { + /** + * @event invalidated + * Fires when the layout for this region is changed. + * @param {YAHOO.ext.LayoutRegion} this + */ + 'invalidated' : new YAHOO.util.CustomEvent('invalidated'), + /** + * @event visibilitychange + * Fires when this region is shown or hidden + * @param {YAHOO.ext.LayoutRegion} this + * @param {Boolean} visibility true or false + */ + 'visibilitychange' : new YAHOO.util.CustomEvent('visibilitychange'), + /** + * @event paneladded + * Fires when a panel is added. + * @param {YAHOO.ext.LayoutRegion} this + * @param {YAHOO.ext.ContentPanel} panel The panel + */ + 'paneladded' : new YAHOO.util.CustomEvent('paneladded'), + /** + * @event panelremoved + * Fires when a panel is removed. + * @param {YAHOO.ext.LayoutRegion} this + * @param {YAHOO.ext.ContentPanel} panel The panel + */ + 'panelremoved' : new YAHOO.util.CustomEvent('panelremoved'), + /** + * @event collapsed + * Fires when this region is collapsed. + * @param {YAHOO.ext.LayoutRegion} this + */ + 'collapsed' : new YAHOO.util.CustomEvent('collapsed'), + /** + * @event expanded + * Fires when this region is expanded. + * @param {YAHOO.ext.LayoutRegion} this + */ + 'expanded' : new YAHOO.util.CustomEvent('expanded'), + /** + * @event panelactivated + * Fires when a panel is activated. + * @param {YAHOO.ext.LayoutRegion} this + * @param {YAHOO.ext.ContentPanel} panel The activated panel + */ + 'panelactivated' : new YAHOO.util.CustomEvent('panelactivated'), + /** + * @event resized + * Fires when the user resizes this region. + * @param {YAHOO.ext.LayoutRegion} this + * @param {Number} newSize The new size (width for east/west, height for north/south) + */ + 'resized' : new YAHOO.util.CustomEvent('resized') + }; + /** A collection of panels in this region. @type YAHOO.ext.util.MixedCollection */ + this.panels = new YAHOO.ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.visible = false; + this.collapsed = false; + this.hide(); + this.on('paneladded', this.validateVisibility, this, true); + this.on('panelremoved', this.validateVisibility, this, true); + this.activePanel = null; + + this.applyConfig(config); + + /* One day this will get finished + this.draggable = config.draggable || false; + if(YAHOO.ext.LayoutRegionDD && mgr.enablePanelDD){ + this.dd = new YAHOO.ext.LayoutRegionDD(this); + }*/ +}; + +YAHOO.extendX(YAHOO.ext.LayoutRegion, YAHOO.ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + if(config.collapsible && this.position != 'center' && !this.collapsedEl){ + var dh = YAHOO.ext.DomHelper; + this.collapseBtn = this.createTool(this.tools.dom, 'ylayout-collapse-'+this.position); + this.collapseBtn.mon('click', this.collapse, this, true); + /** This regions collapsed element @type YAHOO.ext.Element */ + this.collapsedEl = dh.append(this.mgr.el.dom, {tag: 'div', cls: 'ylayout-collapsed ylayout-collapsed-'+this.position, children:[ + {tag: 'div', cls: 'ylayout-collapsed-tools'} + ]}, true); + if(config.floatable !== false){ + this.collapsedEl.addClassOnOver('ylayout-collapsed-over'); + this.collapsedEl.mon('click', this.collapseClick, this, true); + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild, 'ylayout-expand-'+this.position); + this.expandBtn.mon('click', this.expand, this, true); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(config.collapsible == true); + } + this.cmargins = config.cmargins || this.cmargins || + (this.position == 'west' || this.position == 'east' ? + {top: 0, left: 2, right:2, bottom: 0} : + {top: 2, left: 0, right:0, bottom: 2}); + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = config.tabPosition != 'top'; + this.autoScroll = config.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle('overflow', 'auto'); + }else{ + this.bodyEl.setStyle('overflow', 'hidden'); + } + if((!config.titlebar && !config.title) || config.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(config.title){ + this.titleTextEl.innerHTML = config.title; + } + } + this.duration = config.duration || .30; + this.slideDuration = config.slideDuration || .45; + this.config = config; + if(config.collapsed){ + this.collapse(true); + } + }, + + /** + * Resizes the region to the specified size. For vertical regions (west, east) this adjusts + * the width, for horizontal (north, south) the height. + * @param {Number} newSize The new width or height + */ + resizeTo : function(newSize){ + switch(this.position){ + case 'east': + case 'west': + this.el.setWidth(newSize); + this.fireEvent('resized', this, newSize); + break; + case 'north': + case 'south': + this.el.setHeight(newSize); + this.fireEvent('resized', this, newSize); + break; + } + }, + + getBox : function(){ + var b; + if(!this.collapsed){ + b = this.el.getBox(false, true); + }else{ + b = this.collapsedEl.getBox(false, true); + } + return b; + }, + + getMargins : function(){ + return this.collapsed ? this.cmargins : this.margins; + }, + + highlight : function(){ + this.el.addClass('ylayout-panel-dragover'); + }, + + unhighlight : function(){ + this.el.removeClass('ylayout-panel-dragover'); + }, + + updateBox : function(box){ + this.box = box; + if(!this.collapsed){ + this.el.dom.style.left = box.x + 'px'; + this.el.dom.style.top = box.y + 'px'; + this.el.setSize(box.width, box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setHeight(bodyHeight); + this.bodyEl.setWidth(bodyWidth); + var tabHeight = bodyHeight; + if(this.tabs){ + tabHeight = this.tabs.syncHeight(bodyHeight); + if(YAHOO.ext.util.Browser.isIE) this.tabs.el.repaint(); + } + this.panelSize = {width: bodyWidth, height: tabHeight}; + if(this.activePanel){ + this.activePanel.setSize(bodyWidth, tabHeight); + } + }else{ + this.collapsedEl.dom.style.left = box.x + 'px'; + this.collapsedEl.dom.style.top = box.y + 'px'; + this.collapsedEl.setSize(box.width, box.height); + } + if(this.tabs){ + this.tabs.autoSizeTabs(); + } + }, + + /** + * Returns the container element for this region. + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Hides this region. + */ + hide : function(){ + if(!this.collapsed){ + this.el.dom.style.left = '-2000px'; + this.el.hide(); + }else{ + this.collapsedEl.dom.style.left = '-2000px'; + this.collapsedEl.hide(); + } + this.visible = false; + this.fireEvent('visibilitychange', this, false); + }, + + /** + * Shows this region if it was previously hidden. + */ + show : function(){ + if(!this.collapsed){ + this.el.show(); + }else{ + this.collapsedEl.show(); + } + this.visible = true; + this.fireEvent('visibilitychange', this, true); + }, + + /** + * Returns true if this region is currently visible. + * @return {Boolean} + */ + isVisible : function(){ + return this.visible; + }, + + closeClicked : function(){ + if(this.activePanel){ + this.remove(this.activePanel); + } + }, + + collapseClick : function(e){ + if(this.isSlid){ + e.stopPropagation(); + this.slideIn(); + }else{ + e.stopPropagation(); + this.slideOut(); + } + }, + + /** + * Collapses this region. + * @param {Boolean} skipAnim (optional) true to collapse the element without animation (if animate is true) + */ + collapse : function(skipAnim){ + if(this.collapsed) return; + this.collapsed = true; + if(this.split){ + this.split.el.hide(); + } + if(this.config.animate && skipAnim !== true){ + this.animateCollapse(); + }else{ + this.el.setLocation(-20000,-20000); + this.el.hide(); + this.collapsedEl.show(); + this.fireEvent('collapsed', this); + } + this.fireEvent('invalidated', this); + }, + + animateCollapse : function(){ + // overridden + }, + + /** + * Expand this region if it was previously collapsed. + * @param {YAHOO.ext.EventObject} e The event that triggered the expand (or null if calling manually) + * @param {Boolean} skipAnim (optional) true to expand the element without animation (if animate is true) + */ + expand : function(e, skipAnim){ + if(e) e.stopPropagation(); + if(!this.collapsed) return; + if(this.isSlid){ + this.slideIn(this.expand.createDelegate(this)); + return; + } + this.collapsed = false; + this.el.show(); + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + if(this.split){ + this.split.el.show(); + } + this.collapsedEl.setLocation(-2000,-2000); + this.collapsedEl.hide(); + this.fireEvent('invalidated', this); + this.fireEvent('expanded', this); + } + }, + + animateExpand : function(){ + // overridden + }, + + initTabs : function(){ + this.bodyEl.setStyle('overflow', 'hidden'); + var ts = new YAHOO.ext.TabPanel(this.bodyEl.dom, this.bottomTabs); + this.tabs = ts; + ts.resizeTabs = this.config.resizeTabs === true; + ts.minTabWidth = this.config.minTabWidth || 40; + ts.maxTabWidth = this.config.maxTabWidth || 250; + ts.preferredTabWidth = this.config.preferredTabWidth || 150; + ts.monitorResize = false; + ts.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden'); + this.panels.each(this.initPanelAsTab, this); + }, + + initPanelAsTab : function(panel){ + var ti = this.tabs.addTab(panel.getEl().id, panel.getTitle(), null, + this.config.closeOnTab && panel.isClosable()); + ti.on('activate', function(){ + this.setActivePanel(panel); + }, this, true); + if(this.config.closeOnTab){ + ti.on('beforeclose', function(t, e){ + e.cancel = true; + this.remove(panel); + }, this, true); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + this.tabs.getTab(panel.getEl().id).setText(title); + } + }, + + updateTitle : function(title){ + if(this.titleTextEl && !this.config.title){ + this.titleTextEl.innerHTML = (typeof title != 'undefined' && title.length > 0 ? title : " "); + } + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.panelSize){ + panel.setSize(this.panelSize.width, this.panelSize.height); + } + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + this.updateTitle(panel.getTitle()); + this.fireEvent('panelactivated', this, panel); + /* + if(this.dd && !panel.enableDD){ + this.dd.lock(); + }*/ + }, + + /** + * Show the specified panel. + * @param {Number/String/ContentPanel} panelId The panels index, id or the panel itself + * @return {YAHOO.ext.ContentPanel} The shown panel or null + */ + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + this.tabs.activate(panel.getEl().id); + }else{ + this.setActivePanel(panel); + } + } + return panel; + }, + + /** + * Get the active panel for this region. + * @return {YAHOO.ext.ContentPanel} The active panel or null + */ + getActivePanel : function(){ + return this.activePanel; + }, + + validateVisibility : function(){ + if(this.panels.getCount() < 1){ + this.updateTitle(' '); + this.closeBtn.hide(); + this.hide(); + }else{ + if(!this.isVisible()){ + this.show(); + } + } + }, + + /** + * Add the passed ContentPanel(s) + * @param {ContentPanel...} panel The ContentPanel(s) to add (you can pass more than one) + * @return {YAHOO.ext.ContentPanel} The panel added (if only one was added) + */ + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + this.setActivePanel(panel); + this.fireEvent('paneladded', this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + this.tabs.activate(panel.getEl().id); + this.fireEvent('paneladded', this, panel); + return panel; + }, + + /** + * Returns true if the panel is in this region. + * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself + * @return {Boolean} + */ + hasPanel : function(panel){ + if(typeof panel == 'object'){ // must be panel obj + panel = panel.getId(); + } + return this.getPanel(panel) ? true : false; + }, + + /** + * Hides the tab for the specified panel. + * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself + */ + hidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.hideTab(panel.getEl().id); + } + }, + + /** + * Unhides the tab for a previously hidden panel. + * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself + */ + unhidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.unhideTab(panel.getEl().id); + } + }, + + // broken + //clearPanels : function(){ + // this.panels.each(this.remove, this); + //}, + + /** + * Removes the specified panel. If preservePanel is not true (either here or in the config), the panel is destroyed. + * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself + * @param {Boolean} preservePanel Overrides the config preservePanel option + * @return {YAHOO.ext.ContentPanel} The panel that was removed + */ + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + preservePanel = (typeof preservePanel != 'undefined' ? preservePanel : this.config.preservePanels === true); + var panelId = panel.getId(); + this.panels.removeKey(panelId); + if(preservePanel){ + document.body.appendChild(panel.getEl().dom); + } + if(this.tabs){ + this.tabs.removeTab(panel.getEl().id); + }else if (!preservePanel){ + this.bodyEl.dom.removeChild(panel.getEl().dom); + } + if(this.panels.getCount() == 1 && this.tabs && !this.config.alwaysShowTabs){ + var p = this.panels.first(); + var tempEl = document.createElement('span'); // temp holder to keep IE from deleting the node + tempEl.appendChild(p.getEl().dom); + this.bodyEl.update(''); + this.bodyEl.dom.appendChild(p.getEl().dom); + tempEl = null; + this.updateTitle(p.getTitle()); + this.tabs = null; + this.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden'); + this.setActivePanel(p); + } + panel.setRegion(null); + if(this.activePanel == panel){ + this.activePanel = null; + } + if(this.config.autoDestroy !== false && preservePanel !== true){ + try{panel.destroy();}catch(e){} + } + this.fireEvent('panelremoved', this, panel); + return panel; + }, + + /** + * Returns the TabPanel component used by this region + * @return {YAHOO.ext.TabPanel} + */ + getTabs : function(){ + return this.tabs; + }, + + /** + * Returns the panel specified or null if it's not in this region. + * @param {Number/String/ContentPanel} panel The panels index, id or the panel itself + * @return {YAHOO.ext.ContentPanel} + */ + getPanel : function(id){ + if(typeof id == 'object'){ // must be panel obj + return id; + } + return this.panels.get(id); + }, + + /** + * Returns this regions position (north/south/east/west/center). + * @return {String} + */ + getPosition: function(){ + return this.position; + }, + + createTool : function(parentEl, className){ + var btn = YAHOO.ext.DomHelper.append(parentEl, {tag: 'div', cls: 'ylayout-tools-button', + children: [{tag: 'div', cls: 'ylayout-tools-button-inner ' + className, html: ' '}]}, true); + btn.on('mouseover', btn.addClass.createDelegate(btn, ['ylayout-tools-button-over'])); + btn.on('mouseout', btn.removeClass.createDelegate(btn, ['ylayout-tools-button-over'])); + return btn; + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/LayoutStateManager.js b/www/extras/yui-ext/source/layout/LayoutStateManager.js new file mode 100644 index 000000000..bc88a8de8 --- /dev/null +++ b/www/extras/yui-ext/source/layout/LayoutStateManager.js @@ -0,0 +1,73 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/* + * Private internal class for reading and applying state + */ +YAHOO.ext.LayoutStateManager = function(layout){ + // default empty state + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +YAHOO.ext.LayoutStateManager.prototype = { + init : function(layout, provider){ + this.provider = provider; + var state = provider.get(layout.id+'-layout-state'); + if(state){ + var wasUpdating = layout.isUpdating(); + if(!wasUpdating){ + layout.beginUpdate(); + } + for(var key in state){ + if(typeof state[key] != 'function'){ + var rstate = state[key]; + var r = layout.getRegion(key); + if(r && rstate){ + if(rstate.size){ + r.resizeTo(rstate.size); + } + if(rstate.collapsed == true){ + r.collapse(true); + }else{ + r.expand(null, true); + } + } + } + } + if(!wasUpdating){ + layout.endUpdate(); + } + this.state = state; + } + this.layout = layout; + layout.on('regionresized', this.onRegionResized, this, true); + layout.on('regioncollapsed', this.onRegionCollapsed, this, true); + layout.on('regionexpanded', this.onRegionExpanded, this, true); + }, + + storeState : function(){ + this.provider.set(this.layout.id+'-layout-state', this.state); + }, + + onRegionResized : function(region, newSize){ + this.state[region.getPosition()].size = newSize; + this.storeState(); + }, + + onRegionCollapsed : function(region){ + this.state[region.getPosition()].collapsed = true; + this.storeState(); + }, + + onRegionExpanded : function(region){ + this.state[region.getPosition()].collapsed = false; + this.storeState(); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/layout/SplitLayoutRegion.js b/www/extras/yui-ext/source/layout/SplitLayoutRegion.js new file mode 100644 index 000000000..9ec795822 --- /dev/null +++ b/www/extras/yui-ext/source/layout/SplitLayoutRegion.js @@ -0,0 +1,287 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.SplitLayoutRegion + * @extends YAHOO.ext.LayoutRegion + * Adds a splitbar and other (private) useful functionality to a LayoutRegion + */ +YAHOO.ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + YAHOO.ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); + if(config.split){ + this.hide(); + } +}; + +YAHOO.extendX(YAHOO.ext.SplitLayoutRegion, YAHOO.ext.LayoutRegion, { + applyConfig : function(config){ + YAHOO.ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = YAHOO.ext.DomHelper.append(this.mgr.el.dom, + {tag: 'div', id: this.el.id + '-split', cls: 'ylayout-split ylayout-split-'+this.position, html: ' '}); + /** The SplitBar for this region @type YAHOO.ext.SplitBar */ + this.split = new YAHOO.ext.SplitBar(splitEl, this.el); + this.split.onMoved.subscribe(this.onSplitMove, this, true); + this.split.useShim = config.useShim === true; + YAHOO.util.Dom.setStyle([this.split.el.dom, this.split.proxy], 'cursor', this.cursor); + this.split.getMaximumSize = this.getMaxSize.createDelegate(this); + } + if(typeof config.minSize != 'undefined'){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != 'undefined'){ + this.split.maxSize = config.maxSize; + } + } + }, + + getMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion('center'); + return Math.min(cmax, (this.el.getWidth()+center.getEl().getWidth())-center.getMinWidth()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent('resized', this, newSize); + }, + + /** + * Returns the SplitBar for this region. + * @return {YAHOO.ext.SplitBar} + */ + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + YAHOO.ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + YAHOO.ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(YAHOO.ext.util.Browser.isGecko){// firefox overflow auto bug workaround + this.bodyEl.clip(); + if(this.tabs) this.tabs.bodyEl.clip(); + if(this.activePanel){ + this.activePanel.getEl().clip(); + + if(this.activePanel.beforeSlide){ + this.activePanel.beforeSlide(); + } + } + } + }, + + afterSlide : function(){ + if(YAHOO.ext.util.Browser.isGecko){// firefox overflow auto bug workaround + this.bodyEl.unclip(); + if(this.tabs) this.tabs.bodyEl.unclip(); + if(this.activePanel){ + this.activePanel.getEl().unclip(); + if(this.activePanel.afterSlide){ + this.activePanel.afterSlide(); + } + } + } + }, + + slideOut : function(){ + if(!this.slideEl){ + this.slideEl = new YAHOO.ext.Actor( + YAHOO.ext.DomHelper.append(this.mgr.el.dom, {tag: 'div', cls:'ylayout-slider'})); + if(this.config.autoHide !== false){ + var slideInTask = new YAHOO.ext.util.DelayedTask(this.slideIn, this); + this.slideEl.mon('mouseout', function(e){ + var to = e.getRelatedTarget(); + if(to && to != this.slideEl.dom && !YAHOO.util.Dom.isAncestor(this.slideEl.dom, to)){ + slideInTask.delay(500); + } + }, this, true); + this.slideEl.mon('mouseover', function(e){ + slideInTask.cancel(); + }, this, true); + } + } + var sl = this.slideEl, c = this.collapsedEl, cm = this.cmargins; + this.isSlid = true; + this.snapshot = { + 'left': this.el.getLeft(true), + 'top': this.el.getTop(true), + 'colbtn': this.collapseBtn.isVisible(), + 'closebtn': this.closeBtn.isVisible() + }; + this.collapseBtn.hide(); + this.closeBtn.hide(); + this.el.show(); + this.el.setLeftTop(0,0); + sl.startCapture(true); + var size; + switch(this.position){ + case 'west': + sl.setLeft(c.getRight(true)); + sl.setTop(c.getTop(true)); + size = this.el.getWidth(); + break; + case 'east': + sl.setRight(this.mgr.getViewSize().width-c.getLeft(true)); + sl.setTop(c.getTop(true)); + size = this.el.getWidth(); + break; + case 'north': + sl.setLeft(c.getLeft(true)); + sl.setTop(c.getBottom(true)); + size = this.el.getHeight(); + break; + case 'south': + sl.setLeft(c.getLeft(true)); + sl.setBottom(this.mgr.getViewSize().height-c.getTop(true)); + size = this.el.getHeight(); + break; + } + sl.dom.appendChild(this.el.dom); + YAHOO.util.Event.on(document.body, 'click', this.slideInIf, this, true); + sl.setSize(this.el.getWidth(), this.el.getHeight()); + this.beforeSlide(); + if(this.activePanel){ + this.activePanel.setSize(this.bodyEl.getWidth(), this.bodyEl.getHeight()); + } + sl.slideShow(this.getAnchor(), size, this.slideDuration, null, false); + sl.play(function(){ + this.afterSlide(); + }.createDelegate(this)); + }, + + slideInIf : function(e){ + var t = YAHOO.util.Event.getTarget(e); + if(!YAHOO.util.Dom.isAncestor(this.el.dom, t)){ + this.slideIn(); + } + }, + + slideIn : function(callback){ + if(this.isSlid && !this.slideEl.playlist.isPlaying()){ + YAHOO.util.Event.removeListener(document.body, 'click', this.slideInIf, this, true); + this.slideEl.startCapture(true); + this.slideEl.slideHide(this.getAnchor(), this.slideDuration, null); + this.beforeSlide(); + this.slideEl.play(function(){ + this.isSlid = false; + this.el.setPositioning(this.snapshot); + this.collapseBtn.setVisible(this.snapshot.colbtn); + this.closeBtn.setVisible(this.snapshot.closebtn); + this.afterSlide(); + this.mgr.el.dom.appendChild(this.el.dom); + if(typeof callback == 'function'){ + callback(); + } + }.createDelegate(this)); + } + }, + + animateExpand : function(){ + var em = this.margins, cm = this.cmargins; + var c = this.collapsedEl, el = this.el; + var direction, distance; + switch(this.position){ + case 'west': + direction = 'right'; + el.setLeft(-(el.getWidth() + (em.right+em.left))); + el.setTop(c.getTop(true)-cm.top+em.top); + distance = el.getWidth() + (em.right+em.left); + break; + case 'east': + direction = 'left'; + el.setLeft(this.mgr.getViewSize().width + em.left); + el.setTop(c.getTop(true)-cm.top+em.top); + distance = el.getWidth() + (em.right+em.left); + break; + case 'north': + direction = 'down'; + el.setLeft(em.left); + el.setTop(-(el.getHeight() + (em.top+em.bottom))); + distance = el.getHeight() + (em.top+em.bottom); + break; + case 'south': + direction = 'up'; + el.setLeft(em.left); + el.setTop(this.mgr.getViewSize().height + em.top); + distance = el.getHeight() + (em.top+em.bottom); + break; + } + this.beforeSlide(); + el.setStyle('z-index', '100'); + el.show(); + c.setLocation(-2000,-2000); + c.hide(); + el.move(direction, distance, true, this.duration, function(){ + this.afterSlide(); + el.setStyle('z-index', ''); + if(this.split){ + this.split.el.show(); + } + this.fireEvent('invalidated', this); + this.fireEvent('expanded', this); + }.createDelegate(this), this.config.easing || YAHOO.util.Easing.easeOut); + }, + + animateCollapse : function(){ + var em = this.margins, cm = this.cmargins; + var c = this.collapsedEl, el = this.el; + var direction, distance; + switch(this.position){ + case 'west': + direction = 'left'; + distance = el.getWidth() + (em.right+em.left); + break; + case 'east': + direction = 'right'; + distance = el.getWidth() + (em.right+em.left); + break; + case 'north': + direction = 'up'; + distance = el.getHeight() + (em.top+em.bottom); + break; + case 'south': + direction = 'down'; + distance = el.getHeight() + (em.top+em.bottom); + break; + } + this.el.setStyle('z-index', '100'); + this.beforeSlide(); + this.el.move(direction, distance, true, this.duration, function(){ + this.afterSlide(); + this.el.setStyle('z-index', ''); + this.el.setLocation(-20000,-20000); + this.el.hide(); + this.collapsedEl.show(); + this.fireEvent('collapsed', this); + }.createDelegate(this), YAHOO.util.Easing.easeIn); + }, + + getAnchor : function(){ + switch(this.position){ + case 'west': + return 'left'; + case 'east': + return 'right'; + case 'north': + return 'top'; + case 'south': + return 'bottom'; + } + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/BasicDialog.js b/www/extras/yui-ext/source/widgets/BasicDialog.js new file mode 100644 index 000000000..ff1dac36a --- /dev/null +++ b/www/extras/yui-ext/source/widgets/BasicDialog.js @@ -0,0 +1,1015 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.BasicDialog + * @extends YAHOO.ext.util.Observable + * Lightweight Dialog Class. + * + * The code below lists all configuration options along with the default value. + * If the default value is what you want you can leave it out: + *
      
      +  var dlg = new YAHOO.ext.BasicDialog('element-id', {
      +       width: auto,
      +       height: auto,
      +       x: 200, //(defaults to center screen if blank)
      +       y: 500, //(defaults to center screen if blank)
      +       animateTarget: null,// (no animation) This is the id or element to animate from
      +       resizable: true,
      +       minHeight: 80,
      +       minWidth: 200,
      +       modal: false,
      +       autoScroll: true,
      +       closable: true,
      +       constraintoviewport: true,
      +       draggable: true,
      +       autoTabs: false, (if true searches child nodes for elements with class ydlg-tab and converts them to tabs)
      +       proxyDrag: false, (drag a proxy element rather than the dialog itself)
      +       fixedcenter: false,
      +       shadow: false,
      +       minButtonWidth: 75,
      +       shim: false // true to create an iframe shim to 
      +                   // keep selects from showing through
      +  });
      +  
      + * @constructor + * Create a new BasicDialog. + * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element + * @param {Object} config configuration options + */ +YAHOO.ext.BasicDialog = function(el, config){ + el = getEl(el, true); + this.el = el; + this.el.setDisplayed(true); + this.el.hide = this.hideAction; + this.id = this.el.id; + this.el.addClass('ydlg'); + this.shadowOffset = 3; + this.minHeight = 80; + this.minWidth = 200; + this.minButtonWidth = 75; + this.defaultButton = null; + + YAHOO.ext.util.Config.apply(this, config); + + this.proxy = el.createProxy('ydlg-proxy'); + this.proxy.hide = this.hideAction; + this.proxy.setOpacity(.5); + this.proxy.hide(); + + if(config.width){ + el.setWidth(config.width); + } + if(config.height){ + el.setHeight(config.height); + } + this.size = el.getSize(); + if(typeof config.x != 'undefined' && typeof config.y != 'undefined'){ + this.xy = [config.x,config.y]; + }else{ + this.xy = el.getCenterXY(true); + } + // find the header, body and footer + var cn = el.dom.childNodes; + for(var i = 0, len = cn.length; i < len; i++) { + var node = cn[i]; + if(node && node.nodeType == 1){ + if(YAHOO.util.Dom.hasClass(node, 'ydlg-hd')){ + this.header = getEl(node, true); + }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-bd')){ + this.body = getEl(node, true); + }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-ft')){ + /** + * The footer element + * @type YAHOO.ext.Element + */ + this.footer = getEl(node, true); + } + } + } + + var dh = YAHOO.ext.DomHelper; + if(!this.header){ + /** + * The header element + * @type YAHOO.ext.Element + */ + this.header = dh.append(el.dom, {tag: 'div', cls:'ydlg-hd'}, true); + } + if(!this.body){ + /** + * The body element + * @type YAHOO.ext.Element + */ + this.body = dh.append(el.dom, {tag: 'div', cls:'ydlg-bd'}, true); + } + // wrap the header for special rendering + var hl = dh.insertBefore(this.header.dom, {tag: 'div', cls:'ydlg-hd-left'}); + var hr = dh.append(hl, {tag: 'div', cls:'ydlg-hd-right'}); + hr.appendChild(this.header.dom); + + // wrap the body and footer for special rendering + this.bwrap = dh.insertBefore(this.body.dom, {tag: 'div', cls:'ydlg-dlg-body'}, true); + this.bwrap.dom.appendChild(this.body.dom); + if(this.footer) this.bwrap.dom.appendChild(this.footer.dom); + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle('overflow', 'auto'); + } + if(this.closable !== false){ + this.el.addClass('ydlg-closable'); + this.close = dh.append(el.dom, {tag: 'div', cls:'ydlg-close'}, true); + this.close.mon('click', function(){ + this.hide(); + }, this, true); + } + if(this.resizable !== false){ + this.el.addClass('ydlg-resizable'); + this.resizer = new YAHOO.ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: 'all', + pinned: true + }); + this.resizer.on('beforeresize', this.beforeResize, this, true); + this.resizer.delayedListener('resize', this.onResize, this, true); + } + if(this.draggable !== false){ + el.addClass('ydlg-draggable'); + if (!this.proxyDrag) { + var dd = new YAHOO.util.DD(el.dom.id, 'WindowDrag'); + } + else { + var dd = new YAHOO.util.DDProxy(el.dom.id, 'WindowDrag', {dragElId: this.proxy.id}); + } + dd.setHandleElId(this.header.id); + dd.endDrag = this.endMove.createDelegate(this); + dd.startDrag = this.startMove.createDelegate(this); + dd.onDrag = this.onDrag.createDelegate(this); + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: 'div', cls:'ydlg-mask'}, true); + this.mask.enableDisplayMode('block'); + this.mask.hide(); + } + if(this.shadow){ + this.shadow = el.createProxy({tag: 'div', cls:'ydlg-shadow'}); + this.shadow.setOpacity(.3); + this.shadow.setVisibilityMode(YAHOO.ext.Element.VISIBILITY); + this.shadow.setDisplayed('block'); + this.shadow.hide = this.hideAction; + this.shadow.hide(); + }else{ + this.shadowOffset = 0; + } + if(this.shim){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + } + if(this.autoTabs){ + var tabEls = YAHOO.util.Dom.getElementsByClassName('ydlg-tab', 'div', el.dom); + if(tabEls.length > 0){ + this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top'); + this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom'); + for(var i = 0, len = tabEls.length; i < len; i++) { + var tabEl = tabEls[i]; + this.tabs.addTab(YAHOO.util.Dom.generateId(tabEl), tabEl.title); + tabEl.title = ''; + } + this.tabs.activate(tabEls[0].id); + } + } + this.syncBodyHeight(); + this.events = { + /** + * @event keydown + * Fires when a key is pressed + * @param {YAHOO.ext.BasicDialog} this + * @param {YAHOO.ext.EventObject} e + */ + 'keydown' : new YAHOO.util.CustomEvent('keydown'), + /** + * @event move + * Fires when this dialog is moved by the user. + * @param {YAHOO.ext.BasicDialog} this + * @param {Number} x The new page X + * @param {Number} y The new page Y + */ + 'move' : new YAHOO.util.CustomEvent('move'), + /** + * @event resize + * Fires when this dialog is resized by the user. + * @param {YAHOO.ext.BasicDialog} this + * @param {Number} width The new width + * @param {Number} height The new height + */ + 'resize' : new YAHOO.util.CustomEvent('resize'), + /** + * @event beforehide + * Fires before this dialog is hidden. + * @param {YAHOO.ext.BasicDialog} this + */ + 'beforehide' : new YAHOO.util.CustomEvent('beforehide'), + /** + * @event hide + * Fires when this dialog is hidden. + * @param {YAHOO.ext.BasicDialog} this + */ + 'hide' : new YAHOO.util.CustomEvent('hide'), + /** + * @event beforeshow + * Fires before this dialog is shown. + * @param {YAHOO.ext.BasicDialog} this + */ + 'beforeshow' : new YAHOO.util.CustomEvent('beforeshow'), + /** + * @event show + * Fires when this dialog is shown. + * @param {YAHOO.ext.BasicDialog} this + */ + 'show' : new YAHOO.util.CustomEvent('show') + }; + el.mon('keydown', this.onKeyDown, this, true); + el.mon("mousedown", this.toFront, this, true); + + YAHOO.ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + YAHOO.ext.DialogManager.register(this); +}; + +YAHOO.extendX(YAHOO.ext.BasicDialog, YAHOO.ext.util.Observable, { + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.fireEvent('resize', this, this.size.width, this.size.height); + }, + + onKeyDown : function(e){ + this.fireEvent('keydown', this, e); + }, + + /** + * Resizes the dialog. + * @param {Number} width + * @param {Number} height + * @return {YAHOO.ext.BasicDialog} this + */ + resizeTo : function(width, height){ + this.el.setSize(width, height); + this.size = {width: width, height: height}; + this.syncBodyHeight(); + if(this.fixedcenter){ + this.center(); + } + if(this.isVisible()){ + this.constrainXY(); + this.adjustAssets(); + } + return this; + }, + + /** + * Adds a key listener for when this dialog is displayed + * @param {Number/Array/Object} key Either the numeric key code, array of key codes or an object with the following options: + * {key: (number or array), shift: (true/false), ctrl: (true/false), alt: (true/false)} + * @param {Function} fn The function to call + * @param {Object} scope (optional) The scope of the function + * @return {YAHOO.ext.BasicDialog} this + */ + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == 'object'){ + keyCode = key['key']; + shift = key['shift']; + ctrl = key['ctrl']; + alt = key['alt']; + }else{ + keyCode = key; + } + var handler = function(dlg, e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyCode instanceof Array){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + fn.call(scope || window, dlg, k, e); + return; + } + } + }else{ + if(k == keyCode){ + fn.call(scope || window, dlg, k, e); + } + } + } + }; + this.on('keydown', handler); + return this; + }, + + /** + * Returns the TabPanel component (if autoTabs) + * @return {YAHOO.ext.TabPanel} + */ + getTabs : function(){ + if(!this.tabs){ + this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top'); + this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom'); + } + return this.tabs; + }, + + /** + * Adds a button. + * @param {String/Object} config A string becomes the button text, an object is expected to be a valid YAHOO.ext.DomHelper element config + * @param {Function} handler The function called when the button is clicked + * @param {Object} scope (optional) The scope of the handler function + * @return {YAHOO.ext.BasicDialog.Button} + */ + addButton : function(config, handler, scope){ + var dh = YAHOO.ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap.dom, {tag: 'div', cls:'ydlg-ft'}, true); + } + var btn; + if(typeof config == 'string'){ + if(!this.buttonTemplate){ + // hideous table template + this.buttonTemplate = new YAHOO.ext.DomHelper.Template('
       {0} 
      '); + } + var btn = this.buttonTemplate.append(this.footer.dom, [config], true); + var tbl = getEl(btn.dom.firstChild, true); + if(this.minButtonWidth){ + //tbl.beginMeasure(); + if(tbl.getWidth() < this.minButtonWidth){ + tbl.setWidth(this.minButtonWidth); + } + //tbl.endMeasure(); + } + }else{ + btn = dh.append(this.footer.dom, config, true); + } + var bo = new YAHOO.ext.BasicDialog.Button(btn, handler, scope); + this.syncBodyHeight(); + if(!this.buttons){ + this.buttons = []; + } + this.buttons.push(bo); + return bo; + }, + + /** + * Sets the default button to be focused when the dialog is displayed + * @param {YAHOO.ext.BasicDialog.Button} btn The button object returned by addButton + * @return {YAHOO.ext.BasicDialog} this + */ + setDefaultButton : function(btn){ + this.defaultButton = btn; + return this; + }, + + getHeaderFooterHeight : function(safe){ + var height = 0; + if(this.header){ + height += this.header.getHeight(); + } + if(this.footer){ + var fm = this.footer.getMargins(); + height += (this.footer.getHeight()+fm.top+fm.bottom); + } + height += this.bwrap.getPadding('tb')+this.bwrap.getBorderWidth('tb'); + return height; + }, + + syncBodyHeight : function(){ + var height = this.size.height - this.getHeaderFooterHeight(false); + var bm = this.body.getMargins(); + this.body.setHeight(height-(bm.top+bm.bottom)); + if(this.tabs){ + this.tabs.syncHeight(); + } + this.bwrap.setHeight(this.size.height-this.header.getHeight()); + // 11/07/06 jvs update to set fixed width for IE7 + this.body.setWidth(this.el.getWidth(true)-this.bwrap.getBorderWidth('lr')-this.bwrap.getPadding('lr')); + }, + + /** + * Restores the previous state of the dialog if YAHOO.ext.state is configured + * @return {YAHOO.ext.BasicDialog} this + */ + restoreState : function(){ + var box = YAHOO.ext.state.Manager.get(this.el.id + '-state'); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.size = box; + this.el.setLocation(box.x, box.y); + this.resizer.resizeTo(box.width, box.height); + this.adjustViewport(); + }else{ + this.resizer.resizeTo(this.size.width, this.size.height); + this.adjustViewport(); + } + return this; + }, + + beforeShow : function(){ + if(this.fixedcenter) { + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + YAHOO.util.Dom.addClass(document.body, 'masked'); + this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + this.mask.show(); + } + this.constrainXY(); + }, + + /** + * Shows the dialog. + * @param {String/HTMLElement/YAHOO.ext.Element} animateTarget (optional) Reset the animation target + * @return {YAHOO.ext.BasicDialog} this + */ + show : function(animateTarget){ + if (this.fireEvent('beforeshow', this) === false) + return; + + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + var b = getEl(this.animateTarget, true).getBox(); + this.proxy.show(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }else{ + this.showEl(); + } + } + return this; + }, + + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + if(this.defaultButton){ + this.defaultButton.focus(); + } + this.fireEvent('show', this); + }, + + constrainXY : function(){ + if(this.contraintoviewport !== false){ + if(!this.viewSize){ + this.viewSize = [YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight()]; + } + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + var vw = this.viewSize[0], vh = this.viewSize[1]; + // only move it if it needs it + var moved = false; + // first validate right/bottom + if(x + w > vw){ + x = vw - w; + moved = true; + } + if(y + h > vh){ + y = vh - h; + moved = true; + } + // then make sure top/left isn't negative + if(x < 0){ + x = 0; + moved = true; + } + if(y < 0){ + y = 0; + moved = true; + } + if(moved){ + // cache xy + this.xy = [x, y]; + if(this.isVisible()){ + this.el.setLocation(x, y); + this.adjustAssets(); + } + } + } + }, + + onDrag : function(){ + if(!this.proxyDrag){ + this.xy = this.el.getXY(); + this.adjustAssets(); + } + }, + + adjustAssets : function(doShow){ + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + if(doShow === true){ + if(this.shadow){ + this.shadow.show(); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.setBounds(x + this.shadowOffset, y + this.shadowOffset, w, h); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + + adjustViewport : function(w, h){ + if(!w || !h){ + w = YAHOO.util.Dom.getViewportWidth(); + h = YAHOO.util.Dom.getViewportHeight(); + } + // cache the size + this.viewSize = [w, h]; + if(this.modal && this.mask.isVisible()){ + this.mask.setSize(w, h); // first make sure the mask isn't causing overflow + this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + /** + * Destroys this dialog + * @param {Boolean} removeEl (optional) true to remove the element from the DOM + */ + destroy : function(removeEl){ + YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + if(removeEl === true){ + this.el.update(''); + this.el.remove(); + } + YAHOO.ext.DialogManager.unregister(this); + }, + + startMove : function(){ + if(this.proxyDrag){ + this.proxy.show(); + } + if(this.constraintoviewport !== false){ + this.dd.constrainTo(document.body, {right: this.shadowOffset, bottom: this.shadowOffset}); + } + }, + + endMove : function(){ + if(!this.proxyDrag){ + YAHOO.util.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.fireEvent('move', this, this.xy[0], this.xy[1]) + }, + + /** + * Brings this dialog to the front of any other visible dialogs + * @return {YAHOO.ext.BasicDialog} this + */ + toFront : function(){ + YAHOO.ext.DialogManager.bringToFront(this); + return this; + }, + + /** + * Sends this dialog to the back (under) of any other visible dialogs + * @return {YAHOO.ext.BasicDialog} this + */ + toBack : function(){ + YAHOO.ext.DialogManager.sendToBack(this); + return this; + }, + + /** + * Centers this dialog + * @return {YAHOO.ext.BasicDialog} this + */ + center : function(){ + this.moveTo(this.el.getCenterXY(true)); + return this; + }, + + /** + * Moves the dialog to the specified point + * @param {Number} x + * @param {Number} y + * @return {YAHOO.ext.BasicDialog} this + */ + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + /** + * Returns true if the dialog is visible + * @return {Boolean} + */ + isVisible : function(){ + return this.el.isVisible(); + }, + + /** + * Hides the dialog. + * @param {Function} callback (optional) Function to call when the dialog is hidden + * @return {YAHOO.ext.BasicDialog} this + */ + hide : function(callback){ + if (this.fireEvent('beforehide', this) === false) + return; + + if(this.shadow){ + this.shadow.hide(); + } + if(this.animateTarget){ + var b = getEl(this.animateTarget, true).getBox(); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height); + this.el.hide(); + this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, + this.hideEl.createDelegate(this, [callback])); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + YAHOO.util.Dom.removeClass(document.body, 'masked'); + } + this.fireEvent('hide', this); + if(typeof callback == 'function'){ + callback(); + } + }, + + hideAction : function(){ + this.setLeft('-10000px'); + this.setTop('-10000px'); + this.setStyle('visibility', 'hidden'); + }, + + refreshSize : function(){ + this.size = this.el.getSize(); + this.xy = this.el.getXY(); + YAHOO.ext.state.Manager.set(this.el.id + '-state', this.el.getBox()); + }, + + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle('z-index', index); + } + if(this.shadow){ + this.shadow.setStyle('z-index', ++index); + } + if(this.shim){ + this.shim.setStyle('z-index', ++index); + } + this.el.setStyle('z-index', ++index); + if(this.proxy){ + this.proxy.setStyle('z-index', ++index); + } + if(this.resizer){ + this.resizer.proxy.setStyle('z-index', ++index); + } + + this.lastZIndex = index; + }, + + /** + * Returns the element for this dialog + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + } +}); + + +YAHOO.ext.DialogManager = function(){ + var list = {}; + var accessList = []; + var front = null; + + var sortDialogs = function(d1, d2){ + return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; + }; + + var orderDialogs = function(){ + accessList.sort(sortDialogs); + var seed = YAHOO.ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + if(accessList[i]){ + accessList[i].setZIndex(seed + (i*10)); + } + } + }; + + return { + /** + * The starting z-index for BasicDialogs - defaults to 10000 + * @type Number + */ + zseed : 10000, + + + register : function(dlg){ + list[dlg.id] = dlg; + accessList.push(dlg); + }, + + unregister : function(dlg){ + delete list[dlg.id]; + if(!accessList.indexOf){ + for(var i = 0, len = accessList.length; i < len; i++){ + accessList.splice(i, 1); + return; + } + }else{ + var i = accessList.indexOf(dlg); + if(i != -1){ + accessList.splice(i, 1); + } + } + }, + + /** + * Gets a registered dialog by id + * @param {String/Object} id The id of the dialog or a dialog + * @return {YAHOO.ext.BasicDialog} + */ + get : function(id){ + return typeof id == 'object' ? id : list[id]; + }, + + /** + * Brings the specified dialog to the front + * @param {String/Object} dlg The id of the dialog or a dialog + * @return {YAHOO.ext.BasicDialog} + */ + bringToFront : function(dlg){ + dlg = this.get(dlg); + if(dlg != front){ + front = dlg; + dlg._lastAccess = new Date().getTime(); + orderDialogs(); + } + return dlg; + }, + + /** + * Sends the specified dialog to the back + * @param {String/Object} dlg The id of the dialog or a dialog + * @return {YAHOO.ext.BasicDialog} + */ + sendToBack : function(dlg){ + dlg = this.get(dlg); + dlg._lastAccess = -(new Date().getTime()); + orderDialogs(); + return dlg; + } + }; +}(); + +/** + * @class YAHOO.ext.LayoutDialog + * @extends YAHOO.ext.BasicDialog + * Dialog which provides adjustments for working with a layout in a Dialog. + * Add your neccessary layout config options to the dialogs config.
      + * Example Usage (including a nested layout): + *
          if(!dialog){
      +    dialog = new YAHOO.ext.LayoutDialog("download-dlg", { 
      +            modal: true,
      +            width:600,
      +            height:450,
      +            shadow:true,
      +            minWidth:500,
      +            minHeight:350,
      +            autoTabs:true,
      +            proxyDrag:true,
      +            // layout config merges with the dialog config
      +            center:{
      +                tabPosition: 'top',
      +                alwaysShowTabs: true
      +            }
      +    });
      +    dialog.addKeyListener(27, dialog.hide, dialog);
      +    dialog.setDefaultButton(dialog.addButton('Close', dialog.hide, dialog));
      +    dialog.addButton('Build It!', this.getDownload, this);
      +    
      +    // we can even add nested layouts
      +    var innerLayout = new YAHOO.ext.BorderLayout('dl-inner', {
      +        east: {
      +            initialSize: 200,
      +            autoScroll:true,
      +            split:true
      +        },
      +        center: {
      +            autoScroll:true
      +        }
      +    });
      +    innerLayout.beginUpdate();
      +    innerLayout.add('east', new YAHOO.ext.ContentPanel('dl-details'));
      +    innerLayout.add('center', new YAHOO.ext.ContentPanel('selection-panel'));
      +    innerLayout.endUpdate(true);
      +    
      +    // when doing updates to the top level layout in a dialog, you need to 
      +    // use dialog.beginUpdate()/endUpdate() instead of layout.beginUpdate()/endUpdate()
      +    var layout = dialog.getLayout();
      +    dialog.beginUpdate();
      +    layout.add('center', new YAHOO.ext.ContentPanel('standard-panel', 
      +                        {title: 'Download the Source', fitToFrame:true}));
      +    layout.add('center', new YAHOO.ext.NestedLayoutPanel(innerLayout, 
      +               {title: 'Build your own yui-ext.js'}));
      +    layout.getRegion('center').showPanel(sp);
      +    dialog.endUpdate();
      + * @constructor + * @param {String/HTMLElement/YAHOO.ext.Element} el The id of or container element + * @param {Object} config configuration options + */ +YAHOO.ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + YAHOO.ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:'hidden', position:'relative'}); + this.layout = new YAHOO.ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; +}; +YAHOO.extendX(YAHOO.ext.LayoutDialog, YAHOO.ext.BasicDialog, { + /** + * Ends update of the layout and resets display to none. Use standard beginUpdate/endUpdate on the layout. + * @deprecated + */ + endUpdate : function(){ + this.layout.endUpdate(); + }, + /** + * Begins an update of the layout and sets display to block and visibility to hidden. Use standard beginUpdate/endUpdate on the layout. + * @deprecated + */ + beginUpdate : function(){ + this.layout.beginUpdate(); + }, + /** + * Get the BorderLayout for this dialog + * @return {YAHOO.ext.BorderLayout} + */ + getLayout : function(){ + return this.layout; + }, + syncBodyHeight : function(){ + YAHOO.ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout)this.layout.layout(); + } +}); + +/** + * @class YAHOO.ext.BasicDialog.Button + * Button class returned by BasicDialog.addButton() + */ +YAHOO.ext.BasicDialog.Button = function(el, handler, scope){ + this.el = el; + this.el.addClass('ydlg-button'); + this.el.mon('click', this.onClick, this, true); + this.el.on('mouseover', this.onMouseOver, this, true); + this.el.on('mouseout', this.onMouseOut, this, true); + this.el.on('mousedown', this.onMouseDown, this, true); + this.el.on('mouseup', this.onMouseUp, this, true); + this.handler = handler; + this.scope = scope; + this.disabled = false; +}; + +YAHOO.ext.BasicDialog.Button.prototype = { + /** + * Returns the buttons element + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Sets this buttons click handler + * @param {Function} handler The function to call when the button is clicked + * @param {Object} scope (optional) Scope for the function passed above + */ + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + /** + * Set this buttons text + * @param {String} text + */ + setText : function(text){ + this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text; + }, + + /** + * Show this button + */ + show: function(){ + this.el.setStyle('display', ''); + }, + + /** + * Hide this button + */ + hide: function(){ + this.el.setStyle('display', 'none'); + }, + + /** + * Convenience function for boolean show/hide + * @param {Boolean} visible true to show/false to hide + */ + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + /** + * Focus the button + */ + focus : function(){ + this.el.focus(); + }, + + /** + * Disable this button + */ + disable : function(){ + this.el.addClass('ydlg-button-disabled'); + this.disabled = true; + }, + + /** + * Enable this button + */ + enable : function(){ + this.el.removeClass('ydlg-button-disabled'); + this.disabled = false; + }, + + onClick : function(e){ + e.preventDefault(); + if(!this.disabled){ + this.handler.call(this.scope || window); + } + }, + onMouseOver : function(){ + if(!this.disabled){ + this.el.addClass('ydlg-button-over'); + } + }, + onMouseOut : function(){ + this.el.removeClass('ydlg-button-over'); + }, + onMouseDown : function(){ + if(!this.disabled){ + this.el.addClass('ydlg-button-click'); + } + }, + onMouseUp : function(){ + this.el.removeClass('ydlg-button-click'); + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/DatePicker.js b/www/extras/yui-ext/source/widgets/DatePicker.js new file mode 100644 index 000000000..871b5270f --- /dev/null +++ b/www/extras/yui-ext/source/widgets/DatePicker.js @@ -0,0 +1,348 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +YAHOO.ext.DatePicker = function(id, parentElement){ + this.id = id; + this.selectedDate = new Date(); + this.visibleDate = new Date(); + this.element = null; + this.shadow = null; + this.callback = null; + this.buildControl(parentElement || document.body); + this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true); + this.keyDownHandler = YAHOO.ext.EventManager.wrap(this.handleKeyDown, this, true); + this.wheelHandler = YAHOO.ext.EventManager.wrap(this.handleMouseWheel, this, true); +}; + +YAHOO.ext.DatePicker.prototype = { + show : function(x, y, value, callback){ + this.hide(); + this.selectedDate = value; + this.visibleDate = value; + this.callback = callback; + this.refresh(); + this.element.show(); + this.element.setXY(this.constrainToViewport ? this.constrainXY(x, y) : [x, y]); + this.shadow.show(); + this.shadow.setRegion(this.element.getRegion()); + this.element.dom.tabIndex = 1; + this.element.focus(); + YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler); + YAHOO.util.Event.on(document, "keydown", this.keyDownHandler); + YAHOO.util.Event.on(document, "mousewheel", this.wheelHandler); + YAHOO.util.Event.on(document, "DOMMouseScroll", this.wheelHandler); + }, + + constrainXY : function(x, y){ + var w = YAHOO.util.Dom.getViewportWidth(); + var h = YAHOO.util.Dom.getViewportHeight(); + var size = this.element.getSize(); + return [ + Math.min(w-size.width, x), + Math.min(h-size.height, y) + ]; + }, + + hide : function(){ + this.shadow.hide(); + this.element.hide(); + YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler); + YAHOO.util.Event.removeListener(document, "keydown", this.keyDownHandler); + YAHOO.util.Event.removeListener(document, "mousewheel", this.wheelHandler); + YAHOO.util.Event.removeListener(document, "DOMMouseScroll", this.wheelHandler); + }, + + setSelectedDate : function(date){ + this.selectedDate = date; + }, + + getSelectedDate : function(){ + return this.selectedDate; + }, + + showPrevMonth : function(){ + this.visibleDate = this.getPrevMonth(this.visibleDate); + this.refresh(); + }, + + showNextMonth : function(){ + this.visibleDate = this.getNextMonth(this.visibleDate); + this.refresh(); + }, + + showPrevYear : function(){ + var d = this.visibleDate; + this.visibleDate = new Date(d.getFullYear()-1, d.getMonth(), d.getDate()); + this.refresh(); + }, + + showNextYear : function(){ + var d = this.visibleDate; + this.visibleDate = new Date(d.getFullYear()+1, d.getMonth(), d.getDate()); + this.refresh(); + }, + + handleMouseDown : function(e){ + var target = e.getTarget(); + if(target != this.element.dom && !YAHOO.util.Dom.isAncestor(this.element.dom, target)){ + this.hide(); + } + }, + + handleKeyDown : function(e){ + switch(e.browserEvent.keyCode){ + case e.LEFT: + this.showPrevMonth(); + e.stopEvent(); + break; + case e.RIGHT: + this.showNextMonth(); + e.stopEvent(); + break; + case e.DOWN: + this.showPrevYear(); + e.stopEvent(); + break; + case e.UP: + this.showNextYear(); + e.stopEvent(); + break; + } + }, + + handleMouseWheel : function(e){ + var delta = e.getWheelDelta(); + if(delta > 0){ + this.showPrevMonth(); + e.stopEvent(); + } else if(delta < 0){ + this.showNextMonth(); + e.stopEvent(); + } + }, + + handleClick : function(e){ + var d = this.visibleDate; + var t = e.getTarget(); + if(t && t.className){ + switch(t.className){ + case 'active': + this.handleSelection(new Date(d.getFullYear(), d.getMonth(), parseInt(t.innerHTML))); + break; + case 'prevday': + var p = this.getPrevMonth(d); + this.handleSelection(new Date(p.getFullYear(), p.getMonth(), parseInt(t.innerHTML))); + break; + case 'nextday': + var n = this.getNextMonth(d); + this.handleSelection(new Date(n.getFullYear(), n.getMonth(), parseInt(t.innerHTML))); + break; + case 'ypopcal-today': + this.handleSelection(new Date()); + break; + case 'next-month': + this.showNextMonth(); + break; + case 'prev-month': + this.showPrevMonth(); + break; + } + } + e.stopEvent(); + }, + + selectToday : function(){ + this.handleSelection(new Date()); + }, + + handleSelection: function(date){ + this.selectedDate = date; + this.callback(date); + this.hide(); + }, + + getPrevMonth : function(d){ + var m = d.getMonth();var y = d.getFullYear(); + return (m == 0 ? new Date(--y, 11, 1) : new Date(y, --m, 1)); + }, + + getNextMonth : function(d){ + var m = d.getMonth();var y = d.getFullYear(); + return (m == 11 ? new Date(++y, 0, 1) : new Date(y, ++m, 1)); + }, + + getDaysInMonth : function(m, y){ + return (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) ? 31 : (m == 4 || m == 6 || m == 9 || m == 11) ? 30 : this.isLeapYear(y) ? 29 : 28; + }, + + isLeapYear : function(y){ + return (((y % 4) == 0) && ((y % 100) != 0) || ((y % 400) == 0)); + }, + + clearTime : function(date){ + if(date){ + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return date; + }, + + refresh : function(){ + var d = this.visibleDate; + this.buildInnerCal(d); + this.calHead.update(this.monthNames[d.getMonth()] + ' ' + d.getFullYear()); + if(this.element.isVisible()){ + this.shadow.setRegion(this.element.getRegion()); + } + } +}; + +/** + * This code is not pretty, but it is fast! + * @ignore + */ +YAHOO.ext.DatePicker.prototype.buildControl = function(parentElement){ + var c = document.createElement('div'); + c.style.position = 'absolute'; + c.style.visibility = 'hidden'; + document.body.appendChild(c); + var html = '' + + ''; + c.innerHTML = html; + this.shadow = getEl(c.childNodes[0], true); + this.shadow.enableDisplayMode(); + this.element = getEl(c.childNodes[1], true); + this.element.enableDisplayMode(); + document.body.appendChild(this.shadow.dom); + document.body.appendChild(this.element.dom); + document.body.removeChild(c); + this.element.on("selectstart", function(){return false;}); + var tbody = this.element.dom.getElementsByTagName('tbody')[1]; + this.cells = tbody.getElementsByTagName('td'); + this.calHead = this.element.getChildrenByClassName('ypopcal-month', 'td')[0]; + this.element.mon('mousedown', this.handleClick, this, true); +}; + +YAHOO.ext.DatePicker.prototype.buildInnerCal = function(dateVal){ + var days = this.getDaysInMonth(dateVal.getMonth() + 1, dateVal.getFullYear()); + var firstOfMonth = new Date(dateVal.getFullYear(), dateVal.getMonth(), 1); + var startingPos = firstOfMonth.getDay(); + if(startingPos == 0) startingPos = 7; + var pm = this.getPrevMonth(dateVal); + var prevStart = this.getDaysInMonth(pm.getMonth()+1, pm.getFullYear())-startingPos; + var cells = this.cells; + days += startingPos; + + // convert everything to numbers so it's fast + var day = 86400000; + var date = this.clearTime(new Date(pm.getFullYear(), pm.getMonth(), prevStart)); + var today = this.clearTime(new Date()).getTime(); + var sel = this.selectedDate ? this.clearTime(this.selectedDate).getTime() : today + 1; //today +1 will never match anything + var min = this.minDate ? this.clearTime(this.minDate).getTime() : Number.NEGATIVE_INFINITY; + var max = this.maxDate ? this.clearTime(this.maxDate).getTime() : Number.POSITIVE_INFINITY; + var ddMatch = this.disabledDatesRE; + var ddText = this.disabledDatesText; + var ddays = this.disabledDays; + var ddaysText = this.disabledDaysText; + var format = this.format; + + var setCellClass = function(cal, cell, d){ + cell.title = ''; + var t = d.getTime(); + if(t == today){ + cell.className += ' today'; + cell.title = cal.todayText; + } + if(t == sel){ + cell.className += ' selected'; + } + // disabling + if(t < min) { + cell.className = ' ypopcal-disabled'; + cell.title = cal.minText; + return; + } + if(t > max) { + cell.className = ' ypopcal-disabled'; + cell.title = cal.maxText; + return; + } + if(ddays){ + var day = d.getDay(); + for(var i = 0; i < ddays.length; i++) { + if(day === ddays[i]){ + cell.title = ddaysText; + cell.className = ' ypopcal-disabled'; + return; + } + } + } + if(ddMatch && format){ + var fvalue = d.format(format); + if(ddMatch.test(fvalue)){ + cell.title = ddText.replace('%0', fvalue); + cell.className = ' ypopcal-disabled'; + return; + } + } + }; + + var i = 0; + for(; i < startingPos; i++) { + cells[i].innerHTML = (++prevStart); + date.setDate(date.getDate()+1); + cells[i].className = 'prevday'; + setCellClass(this, cells[i], date); + } + for(; i < days; i++){ + intDay = i - startingPos + 1; + cells[i].innerHTML = (intDay); + date.setDate(date.getDate()+1); + cells[i].className = 'active'; + setCellClass(this, cells[i], date); + } + var extraDays = 0; + for(; i < 42; i++) { + cells[i].innerHTML = (++extraDays); + date.setDate(date.getDate()+1); + cells[i].className = 'nextday'; + setCellClass(this, cells[i], date); + } +}; + +YAHOO.ext.DatePicker.prototype.todayText = "Today"; +YAHOO.ext.DatePicker.prototype.minDate = null; +YAHOO.ext.DatePicker.prototype.maxDate = null; +YAHOO.ext.DatePicker.prototype.minText = "This date is before the minimum date"; +YAHOO.ext.DatePicker.prototype.maxText = "This date is after the maximum date"; +YAHOO.ext.DatePicker.prototype.format = 'm/d/y'; +YAHOO.ext.DatePicker.prototype.disabledDays = null; +YAHOO.ext.DatePicker.prototype.disabledDaysText = ''; +YAHOO.ext.DatePicker.prototype.disabledDatesRE = null; +YAHOO.ext.DatePicker.prototype.disabledDatesText = ''; +YAHOO.ext.DatePicker.prototype.constrainToViewport = true; + + +YAHOO.ext.DatePicker.prototype.monthNames = Date.monthNames; + +YAHOO.ext.DatePicker.prototype.dayNames = Date.dayNames; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Resizable.js b/www/extras/yui-ext/source/widgets/Resizable.js new file mode 100644 index 000000000..f68953dcf --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Resizable.js @@ -0,0 +1,567 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.Resizable + * @extends YAHOO.ext.util.Observable + *

      Applies drag handles to an element to make it resizable. The drag handles are inserted into the element + * and positioned absolute. Some elements, such as a textarea or image, don't support this. To overcome that, you can wrap + * the textarea in a div and set "resizeChild" to true (or the id of the textarea), or set wrap:true in your config and + * the element will be wrapped for you automatically.


      + * Here's a Resizable with every possible config option and it's default value: +
      
      +var resizer = new YAHOO.ext.Resizable('element-id', {
      +    resizeChild : false,
      +    adjustments : [0, 0],
      +    minWidth : 5,
      +    minHeight : 5,
      +    maxWidth : 10000,
      +    maxHeight : 10000,
      +    enabled : true,
      +    wrap: false, // true to wrap the element
      +    width: null, // initial size
      +    height: null, // initial size
      +    animate : false,
      +    duration : .35,
      +    dynamic : false,
      +    handles : false,
      +    multiDirectional : false,
      +    disableTrackOver : false,
      +    easing : YAHOO.util.Easing ? YAHOO.util.Easing.easeOutStrong : null,
      +    widthIncrement : 0,
      +    heightIncrement : 0,
      +    pinned : false,
      +    width : null,
      +    height : null,
      +    preserveRatio : false,
      +    transparent: false,
      +    minX: 0,
      +    minY: 0,
      +    draggable: false
      +});
      +resizer.on('resize', myHandler);
      +
      +*

      + * To hide a particular handle, set it's display to none in CSS, or through script:
      + * resizer.east.setDisplayed(false); + *

      + * @constructor + * Create a new resizable component + * @param {String/HTMLElement/YAHOO.ext.Element} el The id or element to resize + * @param {Object} config configuration options + */ +YAHOO.ext.Resizable = function(el, config){ + this.el = getEl(el); + + if(config && config.wrap){ + config.resizeChild = this.el; + this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : null); + this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap'; + this.el.setStyle('overflow', 'hidden'); + this.el.setPositioning(config.resizeChild.getPositioning()); + config.resizeChild.clearPositioning(); + if(!config.width || !config.height){ + var csize = config.resizeChild.getSize(); + //csize.width -= config.adjustments[0]; + //csize.height -= config.adjustments[1]; + this.el.setSize(csize.width, csize.height); + } + if(config.pinned && !config.adjustments){ + config.adjustments = 'auto'; + } + } + + this.proxy = this.el.createProxy({tag: 'div', cls: 'yresizable-proxy', id: this.el.id + '-rzproxy'}) + this.proxy.unselectable(); + + // the overlay traps mouse events while dragging and fixes iframe issue + this.overlay = this.el.createProxy({tag: 'div', cls: 'yresizable-overlay', html: ' '}); + this.overlay.unselectable(); + this.overlay.enableDisplayMode('block'); + this.overlay.mon('mousemove', this.onMouseMove, this, true); + this.overlay.mon('mouseup', this.onMouseUp, this, true); + + YAHOO.ext.util.Config.apply(this, config, { + /** True to resizeSize the first child or id/element to resize @type YAHOO.ext.Element */ + resizeChild : false, + /** String "auto" or an array [width, height] with values to be added to the resize operation's new size. @type Array/String */ + adjustments : [0, 0], + /** The minimum width for the element @type Number */ + minWidth : 5, + /** The minimum height for the element @type Number */ + minHeight : 5, + /** The maximum width for the element @type Number */ + maxWidth : 10000, + /** The maximum height for the element @type Number */ + maxHeight : 10000, + /** false to disable resizing @type Boolean */ + enabled : true, + /** True to animate the resize (not compatible with dynamic sizing) @type Boolean */ + animate : false, + /** Animation duration @type Float */ + duration : .35, + /** True to resize the element while dragging instead of using a proxy @type Boolean */ + dynamic : false, + // these 3 are only available at config time + /** String consisting of the resize handles to display. Valid handles are + * n (north), s (south) e (east), w (west), ne (northeast), nw (northwest), se (southeast), sw (southwest) + * and all (which applies them all). If this is blank it defaults to "e,s,se". Handles can be delimited using + * a space, comma or semi-colon. This is only applied at config time. @type String*/ + handles : false, + multiDirectional : false, + /** true to disable mouse tracking. This is only applied at config time. @type Boolean*/ + disableTrackOver : false, + /** Animation easing @type YAHOO.util.Easing */ + easing : YAHOO.util.Easing ? YAHOO.util.Easing.easeOutStrong : null, + /** The increment to snap the width resize in pixels (dynamic must be true) @type Number */ + widthIncrement : 0, + /** The increment to snap the height resize in pixels (dynamic must be true) @type Number */ + heightIncrement : 0, + /** true to pin the resize handles. This is only applied at config time. @type Boolean*/ + pinned : false, + /** The initial width for the element @type Number */ + width : null, + /** The initial height for the element @type Number */ + height : null, + /** true to preserve the initial size ratio. @type Boolean*/ + preserveRatio : false, + /** true for transparent handles. This is only applied at config time. @type Boolean*/ + transparent: false, + /** The minimum allowed page X for the element (only used for west resizing, defaults to 0) @type Number */ + minX: 0, + /** The minimum allowed page Y for the element (only used for north resizing, defaults to 0) @type Number */ + minY: 0, + /** convenience to initialize drag drop. @type Boolean*/ + draggable: false + }); + + if(this.pinned){ + this.disableTrackOver = true; + this.el.addClass('yresizable-pinned'); + } + // if the element isn't positioned, make it relative + if(this.el.getStyle('position') != 'absolute'){ + this.el.setStyle('position', 'relative'); + } + if(!this.handles){ // no handles passed, must be legacy style + this.handles = 's,e,se'; + if(this.multiDirectional){ + this.handles += ',n,w'; + } + } + if(this.handles == 'all'){ + this.handles = 'n s e w ne nw se sw'; + } + var hs = this.handles.split(/\s*?[,;]\s*?| /); + var ps = YAHOO.ext.Resizable.positions; + for(var i = 0, len = hs.length; i < len; i++){ + if(hs[i] && ps[hs[i]]){ + var pos = ps[hs[i]]; + this[pos] = new YAHOO.ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent); + } + } + // legacy + this.corner = this.southeast; + + this.activeHandle = null; + + if(this.resizeChild){ + if(typeof this.resizeChild == 'boolean'){ + this.resizeChild = YAHOO.ext.Element.get(this.el.dom.firstChild, true); + }else{ + this.resizeChild = YAHOO.ext.Element.get(this.resizeChild, true); + } + } + + if(this.adjustments == 'auto'){ + var rc = this.resizeChild; + var hw = this.west, he = this.east, hn = this.north, hs = this.south; + if(rc && (hw || hn)){ + rc.setRelativePositioned(); + rc.setLeft(hw ? hw.el.getWidth() : 0); + rc.setTop(hn ? hn.el.getHeight() : 0); + } + this.adjustments = [ + (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0), + (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 + ]; + } + + if(this.draggable){ + this.dd = this.dynamic ? + this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id}); + this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id); + } + + // public events + this.events = { + /** + * @event beforeresize + * Fired before resize is allowed. Set enabled to false to cancel resize. + * @param {YAHOO.ext.Resizable} this + * @param {YAHOO.ext.EventObject} e The mousedown event + */ + 'beforeresize' : new YAHOO.util.CustomEvent(), + /** + * @event resize + * Fired after a resize. + * @param {YAHOO.ext.Resizable} this + * @param {Number} width The new width + * @param {Number} height The new height + * @param {YAHOO.ext.EventObject} e The mouseup event + */ + 'resize' : new YAHOO.util.CustomEvent() + }; + + if(this.width !== null && this.height !== null){ + this.resizeTo(this.width, this.height); + }else{ + this.updateChildSize(); + } +}; + +YAHOO.extendX(YAHOO.ext.Resizable, YAHOO.ext.util.Observable, { + /** + * Perform a manual resize + * @param {Number} width + * @param {Number} height + */ + resizeTo : function(width, height){ + this.el.setSize(width, height); + this.updateChildSize(); + this.fireEvent('resize', this, width, height, null); + }, + + startSizing : function(e){ + this.fireEvent('beforeresize', this, e); + if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler + this.resizing = true; + this.startBox = this.el.getBox(); + this.startPoint = e.getXY(); + this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], + (this.startBox.y + this.startBox.height) - this.startPoint[1]]; + this.proxy.setBox(this.startBox); + + this.overlay.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + this.overlay.show(); + + if(!this.dynamic){ + this.proxy.show(); + } + } + }, + + onMouseDown : function(handle, e){ + if(this.enabled){ + e.stopEvent(); + this.activeHandle = handle; + this.overlay.setStyle('cursor', handle.el.getStyle('cursor')); + this.startSizing(e); + } + }, + + onMouseUp : function(e){ + var size = this.resizeElement(); + this.resizing = false; + this.handleOut(); + this.overlay.hide(); + this.fireEvent('resize', this, size.width, size.height, e); + }, + + updateChildSize : function(){ + if(this.resizeChild){ + var el = this.el; + var child = this.resizeChild; + var adj = this.adjustments; + if(el.dom.offsetWidth){ + var b = el.getSize(true); + child.setSize(b.width+adj[0], b.height+adj[1]); + } + // Second call here for IE + // The first call enables instant resizing and + // the second call corrects scroll bars if they + // exist + if(YAHOO.ext.util.Browser.isIE){ + setTimeout(function(){ + if(el.dom.offsetWidth){ + var b = el.getSize(true); + child.setSize(b.width+adj[0], b.height+adj[1]); + } + }, 10); + } + } + }, + + snap : function(value, inc, min){ + if(!inc || !value) return value; + var newValue = value; + var m = value % inc; + if(m > 0){ + if(m > (inc/2)){ + newValue = value + (inc-m); + }else{ + newValue = value - m; + } + } + return Math.max(min, newValue); + }, + + resizeElement : function(){ + var box = this.proxy.getBox(); + //box.width = this.snap(box.width, this.widthIncrement); + //box.height = this.snap(box.height, this.heightIncrement); + //if(this.multiDirectional){ + this.el.setBox(box, false, this.animate, this.duration, null, this.easing); + //}else{ + // this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing); + //} + this.updateChildSize(); + this.proxy.hide(); + return box; + }, + + constrain : function(v, diff, m, mx){ + if(v - diff < m){ + diff = v - m; + }else if(v - diff > mx){ + diff = mx - v; + } + return diff; + }, + + onMouseMove : function(e){ + if(this.enabled){ + try{// try catch so if something goes wrong the user doesn't get hung + + //var curXY = this.startPoint; + var curSize = this.curSize || this.startBox; + var x = this.startBox.x, y = this.startBox.y; + var ox = x, oy = y; + var w = curSize.width, h = curSize.height; + var ow = w, oh = h; + var mw = this.minWidth, mh = this.minHeight; + var mxw = this.maxWidth, mxh = this.maxHeight; + var wi = this.widthIncrement; + var hi = this.heightIncrement; + + var eventXY = e.getXY(); + var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])); + var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])); + + var pos = this.activeHandle.position; + + switch(pos){ + case 'east': + w += diffX; + w = Math.min(Math.max(mw, w), mxw); + break; + case 'south': + h += diffY; + h = Math.min(Math.max(mh, h), mxh); + break; + case 'southeast': + w += diffX; + h += diffY; + w = Math.min(Math.max(mw, w), mxw); + h = Math.min(Math.max(mh, h), mxh); + break; + case 'north': + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + break; + case 'west': + diffX = this.constrain(w, diffX, mw, mxw); + x += diffX; + w -= diffX; + break; + case 'northeast': + w += diffX; + w = Math.min(Math.max(mw, w), mxw); + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + break; + case 'northwest': + diffX = this.constrain(w, diffX, mw, mxw); + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + x += diffX; + w -= diffX; + break; + case 'southwest': + diffX = this.constrain(w, diffX, mw, mxw); + h += diffY; + h = Math.min(Math.max(mh, h), mxh); + x += diffX; + w -= diffX; + break; + } + + var sw = this.snap(w, wi, mw); + var sh = this.snap(h, hi, mh); + if(sw != w || sh != h){ + switch(pos){ + case 'northeast': + y -= sh - h; + break; + case 'north': + y -= sh - h; + break; + case 'southwest': + x -= sw - w; + break; + case 'west': + x -= sw - w; + break; + case 'northwest': + x -= sw - w; + y -= sh - h; + break; + } + w = sw; + h = sh; + } + + if(this.preserveRatio){ + switch(pos){ + case 'southeast': + case 'east': + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + w = ow * (h/oh); + break; + case 'south': + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + break; + case 'northeast': + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + break; + case 'north': + var tw = w; + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + x += (tw - w) / 2; + break; + case 'southwest': + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + var tw = w; + w = ow * (h/oh); + x += tw - w; + break; + case 'west': + var th = h; + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + y += (th - h) / 2; + var tw = w; + w = ow * (h/oh); + x += tw - w; + break; + case 'northwest': + var tw = w; + var th = h; + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + w = ow * (h/oh); + y += th - h; + x += tw - w; + break; + + } + } + this.proxy.setBounds(x, y, w, h); + if(this.dynamic){ + this.resizeElement(); + } + }catch(e){} + } + }, + + handleOver : function(){ + if(this.enabled){ + this.el.addClass('yresizable-over'); + } + }, + + handleOut : function(){ + if(!this.resizing){ + this.el.removeClass('yresizable-over'); + } + }, + + /** + * Returns the element this component is bound to. + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Returns the resizeChild element (or null). + * @return {YAHOO.ext.Element} + */ + getResizeChild : function(){ + return this.resizeChild; + } +}); + +// hash to map config positions to true positions +YAHOO.ext.Resizable.positions = { + n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast' +}; + + +YAHOO.ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){ + if(!this.tpl){ + // only initialize the template if resizable is used + var tpl = YAHOO.ext.DomHelper.createTemplate( + {tag: 'div', cls: 'yresizable-handle yresizable-handle-{0}', html: ' '} + ); + tpl.compile(); + YAHOO.ext.Resizable.Handle.prototype.tpl = tpl; + } + this.position = pos; + this.rz = rz; + this.el = this.tpl.append(rz.el.dom, [this.position], true); + this.el.unselectable(); + if(transparent){ + this.el.setOpacity(0); + } + this.el.mon('mousedown', this.onMouseDown, this, true); + if(!disableTrackOver){ + this.el.mon('mouseover', this.onMouseOver, this, true); + this.el.mon('mouseout', this.onMouseOut, this, true); + } +}; + +YAHOO.ext.Resizable.Handle.prototype = { + afterResize : function(rz){ + // do nothing + }, + + onMouseDown : function(e){ + this.rz.onMouseDown(this, e); + }, + + onMouseOver : function(e){ + this.rz.handleOver(this, e); + }, + + onMouseOut : function(e){ + this.rz.handleOut(this, e); + } +}; + + + \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/SplitBar.js b/www/extras/yui-ext/source/widgets/SplitBar.js new file mode 100644 index 000000000..8d539e108 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/SplitBar.js @@ -0,0 +1,455 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/* + * splitbar.js, version .7 + * Copyright(c) 2006, Jack Slocum. + * Code licensed under the BSD License + */ +if(YAHOO.util.DragDropMgr){ + YAHOO.util.DragDropMgr.clickTimeThresh = 350; +} +/** + * @class YAHOO.ext.SplitBar + * @extends YAHOO.ext.util.Observable + * Creates draggable splitter bar functionality from two elements. + *

      + * Usage: + *
      
      +var split = new YAHOO.ext.SplitBar('elementToDrag', 'elementToSize', 
      +                   YAHOO.ext.SplitBar.HORIZONTAL, YAHOO.ext.SplitBar.LEFT);
      +split.setAdapter(new YAHOO.ext.SplitBar.AbsoluteLayoutAdapter("container"));
      +split.minSize = 100;
      +split.maxSize = 600;
      +split.animate = true;
      +split.onMoved.subscribe(splitterMoved);
      +
      + * @requires YAHOO.ext.Element + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.DDProxy + * @requires YAHOO.util.Anim (optional) to support animation + * @requires YAHOO.util.Easing (optional) to support animation + * @constructor + * Create a new SplitBar + * @param {String/HTMLElement/Element} dragElement The element to be dragged and act as the SplitBar. + * @param {String/HTMLElement/Element} resizingElement The element to be resized based on where the SplitBar element is dragged + * @param {Number} orientation (optional) Either YAHOO.ext.SplitBar.HORIZONTAL or YAHOO.ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL) + * @param {Number} placement (optional) Either YAHOO.ext.SplitBar.LEFT or YAHOO.ext.SplitBar.RIGHT for horizontal or + YAHOO.ext.SplitBar.TOP or YAHOO.ext.SplitBar.BOTTOM for vertical. (By default, this is determined automatically by the intial position + position of the SplitBar). + */ +YAHOO.ext.SplitBar = function(dragElement, resizingElement, orientation, placement){ + + /** @private */ + this.el = YAHOO.ext.Element.get(dragElement, true); + this.el.dom.unselectable = 'on'; + /** @private */ + this.resizingEl = YAHOO.ext.Element.get(resizingElement, true); + + /** + * @private + * The orientation of the split. Either YAHOO.ext.SplitBar.HORIZONTAL or YAHOO.ext.SplitBar.VERTICAL. (Defaults to HORIZONTAL) + * Note: If this is changed after creating the SplitBar, the placement property must be manually updated + * @type Number + */ + this.orientation = orientation || YAHOO.ext.SplitBar.HORIZONTAL; + + /** + * The minimum size of the resizing element. (Defaults to 0) + * @type Number + */ + this.minSize = 0; + + /** + * The maximum size of the resizing element. (Defaults to 2000) + * @type Number + */ + this.maxSize = 2000; + + this.onMoved = new YAHOO.util.CustomEvent("SplitBarMoved", this); + + /** + * Whether to animate the transition to the new size + * @type Boolean + */ + this.animate = false; + + /** + * Whether to create a transparent shim that overlays the page when dragging, enables dragging across iframes. + * @type Boolean + */ + this.useShim = false; + + /** @private */ + this.shim = null; + + /** @private */ + this.proxy = YAHOO.ext.SplitBar.createProxy(this.orientation); + + /** @private */ + this.dd = new YAHOO.util.DDProxy(this.el.dom.id, "SplitBars", {dragElId : this.proxy.id}); + + /** @private */ + this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); + + /** @private */ + this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); + + /** @private */ + this.dragSpecs = {}; + + /** + * @private The adapter to use to positon and resize elements + */ + this.adapter = new YAHOO.ext.SplitBar.BasicLayoutAdapter(); + this.adapter.init(this); + + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + /** @private */ + this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? YAHOO.ext.SplitBar.LEFT : YAHOO.ext.SplitBar.RIGHT); + this.el.setStyle('cursor', 'e-resize'); + }else{ + /** @private */ + this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? YAHOO.ext.SplitBar.TOP : YAHOO.ext.SplitBar.BOTTOM); + this.el.setStyle('cursor', 'n-resize'); + } + + this.events = { + /** + * @event resize + * Fires when the splitter is moved (alias for moved) + * @param {YAHOO.ext.SplitBar} this + * @param {Number} newSize the new width or height + */ + 'resize' : this.onMoved, + /** + * @event moved + * Fires when the splitter is moved + * @param {YAHOO.ext.SplitBar} this + * @param {Number} newSize the new width or height + */ + 'moved' : this.onMoved, + /** + * @event beforeresize + * Fires before the splitter is dragged + * @param {YAHOO.ext.SplitBar} this + */ + 'beforeresize' : new YAHOO.util.CustomEvent('beforeresize') + } +} + +YAHOO.extendX(YAHOO.ext.SplitBar, YAHOO.ext.util.Observable, { + onStartProxyDrag : function(x, y){ + this.fireEvent('beforeresize', this); + if(this.useShim){ + if(!this.shim){ + this.shim = YAHOO.ext.SplitBar.createShim(); + } + this.shim.setVisible(true); + } + YAHOO.util.Dom.setStyle(this.proxy, 'display', 'block'); + var size = this.adapter.getElementSize(this); + this.activeMinSize = this.getMinimumSize();; + this.activeMaxSize = this.getMaximumSize();; + var c1 = size - this.activeMinSize; + var c2 = Math.max(this.activeMaxSize - size, 0); + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + this.dd.resetConstraints(); + this.dd.setXConstraint( + this.placement == YAHOO.ext.SplitBar.LEFT ? c1 : c2, + this.placement == YAHOO.ext.SplitBar.LEFT ? c2 : c1 + ); + this.dd.setYConstraint(0, 0); + }else{ + this.dd.resetConstraints(); + this.dd.setXConstraint(0, 0); + this.dd.setYConstraint( + this.placement == YAHOO.ext.SplitBar.TOP ? c1 : c2, + this.placement == YAHOO.ext.SplitBar.TOP ? c2 : c1 + ); + } + this.dragSpecs.startSize = size; + this.dragSpecs.startPoint = [x, y]; + + YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); + }, + + /** + * @private Called after the drag operation by the DDProxy + */ + onEndProxyDrag : function(e){ + YAHOO.util.Dom.setStyle(this.proxy, 'display', 'none'); + var endPoint = YAHOO.util.Event.getXY(e); + if(this.useShim){ + this.shim.setVisible(false); + } + var newSize; + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + newSize = this.dragSpecs.startSize + + (this.placement == YAHOO.ext.SplitBar.LEFT ? + endPoint[0] - this.dragSpecs.startPoint[0] : + this.dragSpecs.startPoint[0] - endPoint[0] + ); + }else{ + newSize = this.dragSpecs.startSize + + (this.placement == YAHOO.ext.SplitBar.TOP ? + endPoint[1] - this.dragSpecs.startPoint[1] : + this.dragSpecs.startPoint[1] - endPoint[1] + ); + } + newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize); + if(newSize != this.dragSpecs.startSize){ + this.adapter.setElementSize(this, newSize); + this.onMoved.fireDirect(this, newSize); + } + }, + + /** + * Get the adapter this SplitBar uses + * @return The adapter object + */ + getAdapter : function(){ + return this.adapter; + }, + + /** + * Set the adapter this SplitBar uses + * @param {Object} adapter A SplitBar adapter object + */ + setAdapter : function(adapter){ + this.adapter = adapter; + this.adapter.init(this); + }, + + /** + * Gets the minimum size for the resizing element + * @return {Number} The minimum size + */ + getMinimumSize : function(){ + return this.minSize; + }, + + /** + * Sets the minimum size for the resizing element + * @param {Number} minSize The minimum size + */ + setMinimumSize : function(minSize){ + this.minSize = minSize; + }, + + /** + * Gets the maximum size for the resizing element + * @return {Number} The maximum size + */ + getMaximumSize : function(){ + return this.maxSize; + }, + + /** + * Sets the maximum size for the resizing element + * @param {Number} maxSize The maximum size + */ + setMaximumSize : function(maxSize){ + this.maxSize = maxSize; + }, + + /** + * Sets the initialize size for the resizing element + * @param {Number} size The initial size + */ + setCurrentSize : function(size){ + var oldAnimate = this.animate; + this.animate = false; + this.adapter.setElementSize(this, size); + this.animate = oldAnimate; + } +}); + +/** + * @private static Create the shim to drag over iframes + */ +YAHOO.ext.SplitBar.createShim = function(){ + var shim = document.createElement('div'); + shim.unselectable = 'on'; + YAHOO.util.Dom.generateId(shim, 'split-shim'); + YAHOO.util.Dom.setStyle(shim, 'width', '100%'); + YAHOO.util.Dom.setStyle(shim, 'height', '100%'); + YAHOO.util.Dom.setStyle(shim, 'position', 'absolute'); + YAHOO.util.Dom.setStyle(shim, 'background', 'white'); + YAHOO.util.Dom.setStyle(shim, 'z-index', 11000); + window.document.body.appendChild(shim); + var shimEl = YAHOO.ext.Element.get(shim); + shimEl.setOpacity(.01); + shimEl.setXY([0, 0]); + return shimEl; +}; + +/** + * @private static Create our own proxy element element. So it will be the same same size on all browsers, we won't use borders. Instead we use a background color. + */ +YAHOO.ext.SplitBar.createProxy = function(orientation){ + var proxy = document.createElement('div'); + proxy.unselectable = 'on'; + YAHOO.util.Dom.generateId(proxy, 'split-proxy'); + YAHOO.util.Dom.setStyle(proxy, 'position', 'absolute'); + YAHOO.util.Dom.setStyle(proxy, 'visibility', 'hidden'); + YAHOO.util.Dom.setStyle(proxy, 'z-index', 11001); + YAHOO.util.Dom.setStyle(proxy, 'background-color', "#aaa"); + if(orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + YAHOO.util.Dom.setStyle(proxy, 'cursor', 'e-resize'); + }else{ + YAHOO.util.Dom.setStyle(proxy, 'cursor', 'n-resize'); + } + // the next 2 fix IE abs position div height problem + YAHOO.util.Dom.setStyle(proxy, 'line-height', '0px'); + YAHOO.util.Dom.setStyle(proxy, 'font-size', '0px'); + window.document.body.appendChild(proxy); + return proxy; +}; + +/** + * @class YAHOO.ext.SplitBar.BasicLayoutAdapter + * Default Adapter. It assumes the splitter and resizing element are not positioned + * elements and only gets/sets the width of the element. Generally used for table based layouts. + */ +YAHOO.ext.SplitBar.BasicLayoutAdapter = function(){ +}; + +YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype = { + // do nothing for now + init : function(s){ + + }, + /** + * Called before drag operations to get the current size of the resizing element. + * @param {YAHOO.ext.SplitBar} s The SplitBar using this adapter + */ + getElementSize : function(s){ + if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + return s.resizingEl.getWidth(); + }else{ + return s.resizingEl.getHeight(); + } + }, + + /** + * Called after drag operations to set the size of the resizing element. + * @param {YAHOO.ext.SplitBar} s The SplitBar using this adapter + * @param {Number} newSize The new size to set + * @param {Function} onComplete A function to be invoke when resizing is complete + */ + setElementSize : function(s, newSize, onComplete){ + if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + if(!YAHOO.util.Anim || !s.animate){ + s.resizingEl.setWidth(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setWidth(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut); + } + }else{ + + if(!YAHOO.util.Anim || !s.animate){ + s.resizingEl.setHeight(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setHeight(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut); + } + } + } +}; + +/** + *@class YAHOO.ext.SplitBar.AbsoluteLayoutAdapter + * @extends YAHOO.ext.SplitBar.BasicLayoutAdapter + * Adapter that moves the splitter element to align with the resized sizing element. + * Used with an absolute positioned SplitBar. + * @param {String/HTMLElement/Element} container The container that wraps around the absolute positioned content. If it's + * document.body, make sure you assign an id to the body element. + */ +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter = function(container){ + this.basic = new YAHOO.ext.SplitBar.BasicLayoutAdapter(); + this.container = getEl(container); +} + +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype = { + init : function(s){ + this.basic.init(s); + //YAHOO.util.Event.on(window, 'resize', this.moveSplitter.createDelegate(this, [s])); + }, + + getElementSize : function(s){ + return this.basic.getElementSize(s); + }, + + setElementSize : function(s, newSize, onComplete){ + this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s])); + }, + + moveSplitter : function(s){ + var yes = YAHOO.ext.SplitBar; + switch(s.placement){ + case yes.LEFT: + s.el.setX(s.resizingEl.getRight()); + break; + case yes.RIGHT: + s.el.setStyle('right', (this.container.getWidth() - s.resizingEl.getLeft()) + 'px'); + break; + case yes.TOP: + s.el.setY(s.resizingEl.getBottom()); + break; + case yes.BOTTOM: + s.el.setY(s.resizingEl.getTop() - s.el.getHeight()); + break; + } + } +}; + +/** + * Orientation constant - Create a vertical SplitBar + * @static + * @type Number + */ +YAHOO.ext.SplitBar.VERTICAL = 1; + +/** + * Orientation constant - Create a horizontal SplitBar + * @static + * @type Number + */ +YAHOO.ext.SplitBar.HORIZONTAL = 2; + +/** + * Placement constant - The resizing element is to the left of the splitter element + * @static + * @type Number + */ +YAHOO.ext.SplitBar.LEFT = 1; + +/** + * Placement constant - The resizing element is to the right of the splitter element + * @static + * @type Number + */ +YAHOO.ext.SplitBar.RIGHT = 2; + +/** + * Placement constant - The resizing element is positioned above the splitter element + * @static + * @type Number + */ +YAHOO.ext.SplitBar.TOP = 3; + +/** + * Placement constant - The resizing element is positioned under splitter element + * @static + * @type Number + */ +YAHOO.ext.SplitBar.BOTTOM = 4; diff --git a/www/extras/yui-ext/source/widgets/TabPanel.js b/www/extras/yui-ext/source/widgets/TabPanel.js new file mode 100644 index 000000000..42c7084e4 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/TabPanel.js @@ -0,0 +1,714 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.TabPanel + * @extends YAHOO.ext.util.Observable + * Creates a lightweight TabPanel component using Yahoo! UI. + *

      + * Usage: + *
      
      +    // basic tabs 1, built from existing content
      +    var tabs = new YAHOO.ext.TabPanel('tabs1');
      +    tabs.addTab('script', "View Script");
      +    tabs.addTab('markup', "View Markup");
      +    tabs.activate('script');
      +    
      +    // more advanced tabs, built from javascript
      +    var jtabs = new YAHOO.ext.TabPanel('jtabs');
      +    jtabs.addTab('jtabs-1', "Normal Tab", "My content was added during construction.");
      +    
      +    // set up the UpdateManager
      +    var tab2 = jtabs.addTab('jtabs-2', "Ajax Tab 1");
      +    var updater = tab2.getUpdateManager();
      +    updater.setDefaultUrl('ajax1.htm');
      +    tab2.onActivate.subscribe(updater.refresh, updater, true);
      +    
      +    // Use setUrl for Ajax loading
      +    var tab3 = jtabs.addTab('jtabs-3', "Ajax Tab 2");
      +    tab3.setUrl('ajax2.htm', null, true);
      +    
      +    // Disabled tab
      +    var tab4 = jtabs.addTab('tabs1-5', "Disabled Tab", "Can't see me cause I'm disabled");
      +    tab4.disable();
      +    
      +    jtabs.activate('jtabs-1');
      +}
      + * 
      + * @requires YAHOO.ext.Element + * @requires YAHOO.ext.UpdateManager + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @requires YAHOO.util.Connect (optional) + * @constructor + * Create new TabPanel. + * @param {String/HTMLElement/Element} container The id, DOM element or YAHOO.ext.Element container where this TabPanel is to be rendered. + * @param {Boolean} config Config object to set any properties for this TabPanel or true to render the tabs on the bottom. + */ +YAHOO.ext.TabPanel = function(container, config){ + /** + * The container element for this TabPanel. + * @type YAHOO.ext.Element + */ + this.el = getEl(container, true); + /** The position of the tabs. Can be 'top' or 'bottom' @type String */ + this.tabPosition = 'top'; + this.currentTabWidth = 0; + /** The minimum width of a tab (ignored if resizeTabs is not true). @type Number */ + this.minTabWidth = 40; + /** The maximum width of a tab (ignored if resizeTabs is not true). @type Number */ + this.maxTabWidth = 250; + /** The preferred (default) width of a tab (ignored if resizeTabs is not true). @type Number */ + this.preferredTabWidth = 175; + /** Set this to true to enable dynamic tab resizing. @type Boolean */ + this.resizeTabs = false; + /** Set this to true to turn on window resizing monitoring (ignored if resizeTabs is not true). @type Boolean */ + this.monitorResize = true; + + if(config){ + if(typeof config == 'boolean'){ + this.tabPosition = config ? 'bottom' : 'top'; + }else{ + YAHOO.ext.util.Config.apply(this, config); + } + } + if(this.tabPosition == 'bottom'){ + this.bodyEl = getEl(this.createBody(this.el.dom)); + this.el.addClass('ytabs-bottom'); + } + this.stripWrap = getEl(this.createStrip(this.el.dom), true); + this.stripEl = getEl(this.createStripList(this.stripWrap.dom), true); + this.stripBody = getEl(this.stripWrap.dom.firstChild.firstChild, true); + if(this.tabPosition != 'bottom'){ + /** The body element that contains TabPaneItem bodies. + * @type YAHOO.ext.Element + */ + this.bodyEl = getEl(this.createBody(this.el.dom)); + this.el.addClass('ytabs-top'); + } + this.items = []; + + this.bodyEl.setStyle('position', 'relative'); + + // add indexOf to array if it isn't present + if(!this.items.indexOf){ + this.items.indexOf = function(o){ + for(var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + } + } + this.active = null; + this.onTabChange = new YAHOO.util.CustomEvent('TabItem.onTabChange'); + this.activateDelegate = this.activate.createDelegate(this); + + this.events = { + /** + * @event tabchange + * Fires when the active tab changes + * @param {YAHOO.ext.TabPanel} this + * @param {YAHOO.ext.TabPanelItem} activePanel The new active tab + */ + 'tabchange': this.onTabChange, + /** + * @event beforetabchange + * Fires before the active tab changes, set cancel to true on the "e" parameter to cancel the change + * @param {YAHOO.ext.TabPanel} this + * @param {Object} e Set cancel to true on this object to cancel the tab change + * @param {YAHOO.ext.TabPanelItem} tab The tab being changed to + */ + 'beforetabchange' : new YAHOO.util.CustomEvent('beforechange') + }; + + YAHOO.ext.EventManager.onWindowResize(this.onResize, this, true); + this.cpad = this.el.getPadding('lr'); + this.hiddenCount = 0; +} + +YAHOO.ext.TabPanel.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + /** + * Creates a new TabPanelItem by looking for an existing element with the provided id - if it's not found it creates one. + * @param {String} id The id of the div to use or create + * @param {String} text The text for the tab + * @param {String} content (optional) Content to put in the TabPanelItem body + * @param {Boolean} closable (optional) True to create a close icon on the tab + * @return {YAHOO.ext.TabPanelItem} The created TabPanelItem + */ + addTab : function(id, text, content, closable){ + var item = new YAHOO.ext.TabPanelItem(this, id, text, closable); + this.addTabItem(item); + if(content){ + item.setContent(content); + } + return item; + }, + + /** + * Returns the TabPanelItem with the specified id/index + * @param {String/Number} id The id or index of the TabPanelItem to fetch. + * @return {YAHOO.ext.TabPanelItem} + */ + getTab : function(id){ + return this.items[id]; + }, + + /** + * Hides the TabPanelItem with the specified id/index + * @param {String/Number} id The id or index of the TabPanelItem to hide. + */ + hideTab : function(id){ + var t = this.items[id]; + if(!t.isHidden()){ + t.setHidden(true); + this.hiddenCount++; + this.autoSizeTabs(); + } + }, + + /** + * "Unhides" the TabPanelItem with the specified id/index + * @param {String/Number} id The id or index of the TabPanelItem to unhide. + */ + unhideTab : function(id){ + var t = this.items[id]; + if(t.isHidden()){ + t.setHidden(false); + this.hiddenCount--; + this.autoSizeTabs(); + } + }, + + /** + * Add an existing TabPanelItem. + * @param {YAHOO.ext.TabPanelItem} item The TabPanelItem to add + */ + addTabItem : function(item){ + this.items[item.id] = item; + this.items.push(item); + if(this.resizeTabs){ + item.setWidth(this.currentTabWidth || this.preferredTabWidth) + this.autoSizeTabs(); + }else{ + item.autoSize(); + } + }, + + /** + * Remove a TabPanelItem. + * @param {String/Number} id The id or index of the TabPanelItem to remove. + */ + removeTab : function(id){ + var items = this.items; + var tab = items[id]; + if(!tab) return; + var index = items.indexOf(tab); + if(this.active == tab && items.length > 1){ + var newTab = this.getNextAvailable(index); + if(newTab)newTab.activate(); + } + tab.purgeListeners(); + this.stripEl.dom.removeChild(tab.pnode.dom); + if(tab.bodyEl.dom.parentNode == this.bodyEl.dom){ // if it was moved already prevent error + this.bodyEl.dom.removeChild(tab.bodyEl.dom); + } + items.splice(index, 1); + delete this.items[tab.id]; + this.autoSizeTabs(); + }, + + getNextAvailable : function(start){ + var items = this.items; + var index = start; + // look for a next tab that will slide over to + // replace the one being removed + while(index < items.length){ + var item = items[++index]; + if(item && !item.isHidden()){ + return item; + } + } + // if one isn't found select the previous tab (on the left) + var index = start; + while(index >= 0){ + var item = items[--index]; + if(item && !item.isHidden()){ + return item; + } + } + return null; + }, + + /** + * Disable a TabPanelItem. It cannot be the active tab, if it is this call is ignored.. + * @param {String/Number} id The id or index of the TabPanelItem to disable. + */ + disableTab : function(id){ + var tab = this.items[id]; + if(tab && this.active != tab){ + tab.disable(); + } + }, + + /** + * Enable a TabPanelItem that is disabled. + * @param {String/Number} id The id or index of the TabPanelItem to enable. + */ + enableTab : function(id){ + var tab = this.items[id]; + tab.enable(); + }, + + /** + * Activate a TabPanelItem. The currently active will be deactivated. + * @param {String/Number} id The id or index of the TabPanelItem to activate. + */ + activate : function(id){ + var tab = this.items[id]; + if(tab == this.active){ + return tab; + } + var e = {}; + this.fireEvent('beforetabchange', this, e, tab); + if(e.cancel !== true && !tab.disabled){ + if(this.active){ + this.active.hide(); + } + this.active = this.items[id]; + this.active.show(); + this.onTabChange.fireDirect(this, this.active); + } + return tab; + }, + + /** + * Get the active TabPanelItem + * @return {YAHOO.ext.TabPanelItem} The active TabPanelItem or null if none are active. + */ + getActiveTab : function(){ + return this.active; + }, + + /** + * Updates the tab body element to fit the height of the container element + * for overflow scrolling + * @param {Number} targetHeight (optional) Override the starting height from the elements height + */ + syncHeight : function(targetHeight){ + var height = (targetHeight || this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb'); + var bm = this.bodyEl.getMargins(); + var newHeight = height-(this.stripWrap.getHeight())-(bm.top+bm.bottom); + this.bodyEl.setHeight(newHeight); + return newHeight; + }, + + onResize : function(){ + if(this.monitorResize){ + this.autoSizeTabs(); + } + }, + + /** + * Disables tab resizing while tabs are being added (if resizeTabs is false this does nothing) + */ + beginUpdate : function(){ + this.updating = true; + }, + + /** + * Stops an update and resizes the tabs (if resizeTabs is false this does nothing) + */ + endUpdate : function(){ + this.updating = false; + this.autoSizeTabs(); + }, + + /** + * Manual call to resize the tabs (if resizeTabs is false this does nothing) + */ + autoSizeTabs : function(){ + var count = this.items.length; + var vcount = count - this.hiddenCount; + if(!this.resizeTabs || count < 1 || vcount < 1 || this.updating) return; + var w = Math.max(this.el.getWidth() - this.cpad, 10); + var availWidth = Math.floor(w / vcount); + var b = this.stripBody; + if(b.getWidth() > w){ + var tabs = this.items; + this.setTabWidth(Math.max(availWidth, this.minTabWidth)); + if(availWidth < this.minTabWidth){ + /*if(!this.sleft){ // incomplete scrolling code + this.createScrollButtons(); + } + this.showScroll(); + this.stripClip.setWidth(w - (this.sleft.getWidth()+this.sright.getWidth()));*/ + } + }else{ + if(this.currentTabWidth < this.preferredTabWidth){ + this.setTabWidth(Math.min(availWidth, this.preferredTabWidth)); + } + } + }, + + /** + * Resizes all the tabs to the passed width + * @param {Number} The new width + */ + setTabWidth : function(width){ + this.currentTabWidth = width; + for(var i = 0, len = this.items.length; i < len; i++) { + if(!this.items[i].isHidden())this.items[i].setWidth(width); + } + }, + + /** + * Destroys this TabPanel + * @param {Boolean} removeEl (optional) True to remove the element from the DOM as well + */ + destroy : function(removeEl){ + YAHOO.ext.EventManager.removeResizeListener(this.onResize, this); + for(var i = 0, len = this.items.length; i < len; i++){ + this.items[i].purgeListeners(); + } + if(removeEl === true){ + this.el.update(''); + this.el.remove(); + } + } +}; + +/** +* @class YAHOO.ext.TabPanelItem +* @extends YAHOO.ext.util.Observable +*/ +YAHOO.ext.TabPanelItem = function(tabPanel, id, text, closable){ + /** + * The TabPanel this TabPanelItem belongs to + * @type YAHOO.ext.TabPanel + */ + this.tabPanel = tabPanel; + /** + * The id for this TabPanelItem + * @type String + */ + this.id = id; + /** @private */ + this.disabled = false; + /** @private */ + this.text = text; + /** @private */ + this.loaded = false; + this.closable = closable; + + /** + * The body element for this TabPanelItem + * @type YAHOO.ext.Element + */ + this.bodyEl = getEl(tabPanel.createItemBody(tabPanel.bodyEl.dom, id)); + this.bodyEl.setVisibilityMode(YAHOO.ext.Element.VISIBILITY); + this.bodyEl.setStyle('display', 'block'); + this.bodyEl.setStyle('zoom', '1'); + this.hideAction(); + + var els = tabPanel.createStripElements(tabPanel.stripEl.dom, text, closable); + /** @private */ + this.el = getEl(els.el, true); + this.inner = getEl(els.inner, true); + this.textEl = getEl(this.el.dom.firstChild.firstChild.firstChild, true); + this.pnode = getEl(els.el.parentNode, true); + this.el.mon('click', this.onTabClick, this, true); + /** @private */ + if(closable){ + var c = getEl(els.close, true); + c.dom.title = this.closeText; + c.addClassOnOver('close-over'); + c.mon('click', this.closeClick, this, true); + } + + // these two are now private and deprecated + this.onActivate = new YAHOO.util.CustomEvent('TabItem.onActivate'); + this.onDeactivate = new YAHOO.util.CustomEvent('TabItem.onDeactivate'); + + this.events = { + /** + * @event activate + * Fires when this tab becomes the active tab + * @param {YAHOO.ext.TabPanel} tabPanel + * @param {YAHOO.ext.TabPanelItem} this + */ + 'activate': this.onActivate, + /** + * @event beforeclose + * Fires before this tab is closed. To cancal the close, set cancel to true on e. (e.cancel = true) + * @param {YAHOO.ext.TabPanelItem} this + * @param {Object} e Set cancel to true on this object to cancel the close. + */ + 'beforeclose': new YAHOO.util.CustomEvent('beforeclose'), + /** + * @event close + * Fires when this tab is closed + * @param {YAHOO.ext.TabPanelItem} this + */ + 'close': new YAHOO.util.CustomEvent('close'), + /** + * @event deactivate + * Fires when this tab is no longer the active tab + * @param {YAHOO.ext.TabPanel} tabPanel + * @param {YAHOO.ext.TabPanelItem} this + */ + 'deactivate' : this.onDeactivate + }; + this.hidden = false; +}; + +YAHOO.ext.TabPanelItem.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : function(){ + YAHOO.ext.util.Observable.prototype.purgeListeners.call(this); + this.el.removeAllListeners(); + }, + /** + * Show this TabPanelItem - this does not deactivate the currently active TabPanelItem. + */ + show : function(){ + this.pnode.addClass('on'); + this.showAction(); + if(YAHOO.ext.util.Browser.isOpera){ + this.tabPanel.stripWrap.repaint(); + } + this.onActivate.fireDirect(this.tabPanel, this); + }, + + /** + * Hide this TabPanelItem - if you don't activate another TabPanelItem this could look odd. + */ + hide : function(){ + this.pnode.removeClass('on'); + this.hideAction(); + this.onDeactivate.fireDirect(this.tabPanel, this); + }, + + hideAction : function(){ + this.bodyEl.setStyle('position', 'absolute'); + this.bodyEl.setLeft('-20000px'); + this.bodyEl.setTop('-20000px'); + this.bodyEl.hide(); + }, + + showAction : function(){ + this.bodyEl.setStyle('position', 'relative'); + this.bodyEl.setTop(''); + this.bodyEl.setLeft(''); + this.bodyEl.show(); + this.tabPanel.el.repaint.defer(1); + }, + + setTooltip : function(text){ + this.titleEl.dom.title = text; + }, + + onTabClick : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + getWidth : function(){ + return this.inner.getWidth(); + }, + + setWidth : function(width){ + var iwidth = width - this.pnode.getPadding("lr"); + this.inner.setWidth(iwidth); + this.textEl.setWidth(iwidth-this.inner.getPadding('lr')); + this.pnode.setWidth(width); + }, + + setHidden : function(hidden){ + this.hidden = hidden; + this.pnode.setStyle('display', hidden ? 'none' : 'block'); + }, + + isHidden : function(){ + return this.hidden; + }, + + getText : function(){ + return this.text; + }, + + autoSize : function(){ + this.el.beginMeasure(); + this.textEl.setWidth(1); + this.setWidth(this.textEl.dom.scrollWidth+this.pnode.getPadding("lr")+this.inner.getPadding('lr')); + this.el.endMeasure(); + }, + + setText : function(text){ + this.text = text; + this.textEl.update(text); + this.textEl.dom.title = text; + if(!this.tabPanel.resizeTabs){ + this.autoSize(); + } + }, + /** + * Activate this TabPanelItem - this does deactivate the currently active TabPanelItem. + */ + activate : function(){ + this.tabPanel.activate(this.id); + }, + + /** + * Disable this TabPanelItem - this call is ignore if this is the active TabPanelItem. + */ + disable : function(){ + if(this.tabPanel.active != this){ + this.disabled = true; + this.pnode.addClass('disabled'); + } + }, + + /** + * Enable this TabPanelItem if it was previously disabled. + */ + enable : function(){ + this.disabled = false; + this.pnode.removeClass('disabled'); + }, + + /** + * Set the content for this TabPanelItem. + * @param {String} content The content + * @param {Boolean} loadScripts true to look for and load scripts + */ + setContent : function(content, loadScripts){ + this.bodyEl.update(content, loadScripts); + }, + + /** + * Get the {@link YAHOO.ext.UpdateManager} for the body of this TabPanelItem. Enables you to perform Ajax updates. + * @return {YAHOO.ext.UpdateManager} The UpdateManager + */ + getUpdateManager : function(){ + return this.bodyEl.getUpdateManager(); + }, + + /** + * Set a URL to be used to load the content for this TabPanelItem. + * @param {String/Function} url The url to load the content from or a function to call to get the url + * @param {String/Object} params (optional) The string params for the update call or an object of the params. See {@link YAHOO.ext.UpdateManager#update} for more details. (Defaults to null) + * @param {Boolean} loadOnce (optional) Whether to only load the content once. If this is false it makes the Ajax call every time this TabPanelItem is activated. (Defaults to false) + * @return {YAHOO.ext.UpdateManager} The UpdateManager + */ + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.onActivate.unsubscribe(this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.onActivate.subscribe(this.refreshDelegate); + return this.bodyEl.getUpdateManager(); + }, + + /** @private */ + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.bodyEl.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + /** @private */ + _setLoaded : function(){ + this.loaded = true; + }, + + /** @private */ + closeClick : function(e){ + var e = {}; + this.fireEvent('beforeclose', this, e); + if(e.cancel !== true){ + this.tabPanel.removeTab(this.id); + this.fireEvent('close', this); + } + }, + /** + * The text displayed in the tooltip for the close icon. + * @type String + */ + closeText : 'Close this tab' +}; + +/** @private */ +YAHOO.ext.TabPanel.prototype.createStrip = function(container){ + var strip = document.createElement('div'); + strip.className = 'ytab-wrap'; + container.appendChild(strip); + return strip; +}; +/** @private */ +YAHOO.ext.TabPanel.prototype.createStripList = function(strip){ + // div wrapper for retard IE + strip.innerHTML = '
      '; + return strip.firstChild.firstChild.firstChild.firstChild; +}; +/** @private */ +YAHOO.ext.TabPanel.prototype.createBody = function(container){ + var body = document.createElement('div'); + YAHOO.util.Dom.generateId(body, 'tab-body'); + YAHOO.util.Dom.addClass(body, 'yui-ext-tabbody'); + container.appendChild(body); + return body; +}; +/** @private */ +YAHOO.ext.TabPanel.prototype.createItemBody = function(bodyEl, id){ + var body = YAHOO.util.Dom.get(id); + if(!body){ + body = document.createElement('div'); + body.id = id; + } + YAHOO.util.Dom.addClass(body, 'yui-ext-tabitembody'); + bodyEl.appendChild(body); + return body; +}; +/** @private */ +YAHOO.ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){ + var td = document.createElement('td'); + stripEl.appendChild(td); + if(closable){ + td.className = "ytab-closable"; + if(!this.closeTpl){ + this.closeTpl = new YAHOO.ext.Template( + '' + + '{text}' + + '
       
      ' + ); + } + var el = this.closeTpl.overwrite(td, {'text': text}); + var close = el.getElementsByTagName('div')[0]; + var inner = el.getElementsByTagName('em')[0]; + return {'el': el, 'close': close, 'inner': inner}; + } else { + if(!this.tabTpl){ + this.tabTpl = new YAHOO.ext.Template( + '' + + '{text}' + ); + } + var el = this.tabTpl.overwrite(td, {'text': text}); + var inner = el.getElementsByTagName('em')[0]; + return {'el': el, 'inner': inner}; + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/TemplateView.js b/www/extras/yui-ext/source/widgets/TemplateView.js new file mode 100644 index 000000000..d47c02859 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/TemplateView.js @@ -0,0 +1,497 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.View + * @extends YAHOO.ext.util.Observable + * Create a "View" for an element based on a data model or UpdateManager and the supplied DomHelper template. + * This class also supports single and multi selection modes.
      + * Create a data model bound view: +
      
      +var dataModel = new YAHOO.ext.grid.XMLDataModel(...);
      +var view = new YAHOO.ext.View('my-element', 
      +           '<div id="{0}">{2} - {1}</div>', // auto create template
      +           dataModel, { 
      +              singleSelect: true, 
      +              selectedClass: 'ydataview-selected'
      +           });
      +
      +// listen for node click?
      +view.on('click', function(vw, index, node, e){
      +    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
      +});
      +
      +// load XML data
      +dataModel.load('foobar.xml');
      +
      +For an example of creating a JSON/UpdateManager view, see {@link YAHOO.ext.JsonView}. + *

      + * Note: The root of your template must be a single node. Table/row implementations may work but are not supported due to + * IE's limited insertion support with tables and Opera's faulty event bubbling. + * @constructor + * Create a new View + * @param {String/HTMLElement/Element} container The container element where the view is to be rendered. + * @param {String/DomHelper.Template} tpl The rendering template or a string to create a template with + * @param {DataModel} dataModel The bound data model + * @param {Object} config The config object +*/ +YAHOO.ext.View = function(container, tpl, dataModel, config){ + this.el = getEl(container, true); + this.nodes = this.el.dom.childNodes; + if(typeof tpl == 'string'){ + tpl = new YAHOO.ext.Template(tpl); + } + tpl.compile(); + /** + * The template used by this View + * @type {YAHOO.ext.DomHelper.Template} + */ + this.tpl = tpl; + this.setDataModel(dataModel); + var CE = YAHOO.util.CustomEvent; + /** @private */ + this.events = { + /** + * @event click + * Fires when a template node is clicked. + * @param {YAHOO.ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {YAHOO.ext.EventObject} e The raw event object + */ + 'click' : new CE('click'), + /** + * @event dblclick + * Fires when a template node is double clicked. + * @param {YAHOO.ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {YAHOO.ext.EventObject} e The raw event object + */ + 'dblclick' : new CE('dblclick'), + /** + * @event contextmenu + * Fires when a template node is right clicked. + * @param {YAHOO.ext.View} this + * @param {Number} index The index of the target node + * @param {HTMLElement} node The target node + * @param {YAHOO.ext.EventObject} e The raw event object + */ + 'contextmenu' : new CE('contextmenu'), + /** + * @event selectionchange + * Fires when the selected nodes change. + * @param {YAHOO.ext.View} this + * @param {Array} selections Array of the selected nodes + */ + 'selectionchange' : new CE('selectionchange') + }; + this.el.mon("click", this.onClick, this, true); + this.el.mon("dblclick", this.onDblClick, this, true); + this.el.mon("contextmenu", this.onContextMenu, this, true); + + /** + * The css class to add to selected nodes + * @type {YAHOO.ext.DomHelper.Template} + */ + this.selectedClass = 'ydataview-selected'; + + this.selections = []; + this.lastSelection = null; + + /** + * The root property in the loaded json object that contains the data + * @type {String} + */ + this.jsonRoot = null; + YAHOO.ext.util.Config.apply(this, config); + if(this.renderUpdates || this.jsonRoot){ + var um = this.el.getUpdateManager(); + um.setRenderer(this); + } +}; + +YAHOO.extendX(YAHOO.ext.View, YAHOO.ext.util.Observable, { + /** + * Returns the element this view is bound to. + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + render : function(el, response){ + this.clearSelections(); + this.el.update(''); + var o; + try{ + o = YAHOO.ext.util.JSON.decode(response.responseText); + if(this.jsonRoot){ + o = eval('o.' + this.jsonRoot); + } + }catch(e){} + if(o && o.length){ + this.html = []; + for(var i = 0, len = o.length; i < len; i++) { + this.renderEach(o[i]); + } + this.el.update(this.html.join('')); + this.html = null; + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + } + }, + + /** + * Refreshes the view. + */ + refresh : function(){ + this.clearSelections(); + this.el.update(''); + this.html = []; + this.dataModel.each(this.renderEach, this); + this.el.update(this.html.join('')); + this.html = null; + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + /** + * Function to override to reformat the data that is sent to + * the template for each node. + * @param {Array/Object} data The raw data (array of colData for a data model bound view or + * a JSON object for an UpdateManager bound view). + * @param {Number} index The index of the data within the data model + */ + prepareData : function(data, index){ + return data; + }, + + renderEach : function(data){ + this.html[this.html.length] = this.tpl.applyTemplate(this.prepareData(data)); + }, + + /** + * Refresh an individual node. + * @param {Number} index + */ + refreshNode : function(index){ + this.refreshNodes(index, index); + }, + + refreshNodes : function(dm, startIndex, endIndex){ + this.clearSelections(); + var dm = this.dataModel; + var ns = this.nodes; + for(var i = startIndex; i <= endIndex; i++){ + var d = this.prepareData(dm.getRow(i), i); + if(i < ns.length-1){ + var old = ns[i]; + this.tpl.insertBefore(old, d); + this.el.dom.removeChild(old); + }else{ + this.tpl.append(this.el.dom, d); + } + } + this.updateIndexes(startIndex, endIndex); + }, + + deleteNodes : function(dm, startIndex, endIndex){ + this.clearSelections(); + if(startIndex == 0 && endIndex >= this.nodes.length-1){ + this.el.update(''); + }else{ + var el = this.el.dom; + for(var i = startIndex; i <= endIndex; i++){ + el.removeChild(this.nodes[startIndex]); + } + this.updateIndexes(startIndex); + } + }, + + insertNodes : function(dm, startIndex, endIndex){ + if(this.nodes.length == 0){ + this.refresh(); + }else{ + this.clearSelections(); + var t = this.tpl; + var before = this.nodes[startIndex]; + var dm = this.dataModel; + if(before){ + for(var i = startIndex; i <= endIndex; i++){ + t.insertBefore(before, this.prepareData(dm.getRow(i), i)); + } + }else{ + var el = this.el.dom; + for(var i = startIndex; i <= endIndex; i++){ + t.append(el, this.prepareData(dm.getRow(i), i)); + } + } + this.updateIndexes(startIndex); + } + }, + + updateIndexes : function(dm, startIndex, endIndex){ + var ns = this.nodes; + startIndex = startIndex || 0; + endIndex = endIndex || ns.length-1; + for(var i = startIndex; i <= endIndex; i++){ + ns[i].nodeIndex = i; + } + }, + + /** + * Changes the data model this view uses and refresh the view. + * @param {DataModel} dataModel + */ + setDataModel : function(dm){ + if(!dm) return; + this.unplugDataModel(this.dataModel); + this.dataModel = dm; + dm.on('cellupdated', this.refreshNode, this, true); + dm.on('datachanged', this.refresh, this, true); + dm.on('rowsdeleted', this.deleteNodes, this, true); + dm.on('rowsinserted', this.insertNodes, this, true); + dm.on('rowsupdated', this.refreshNodes, this, true); + dm.on('rowssorted', this.refresh, this, true); + this.refresh(); + }, + + /** + * Unplug the data model and stop updates. + * @param {DataModel} dataModel + */ + unplugDataModel : function(dm){ + if(!dm) return; + dm.removeListener('cellupdated', this.refreshNode, this); + dm.removeListener('datachanged', this.refresh, this); + dm.removeListener('rowsdeleted', this.deleteNodes, this); + dm.removeListener('rowsinserted', this.insertNodes, this); + dm.removeListener('rowsupdated', this.refreshNodes, this); + dm.removeListener('rowssorted', this.refresh, this); + this.dataModel = null; + }, + + /** + * Returns the template node the passed child belongs to or null if it doesn't belong to one. + * @param {HTMLElement} node + * @return {HTMLElement} The template node + */ + findItemFromChild : function(node){ + var el = this.el.dom; + if(!node || node.parentNode == el){ + return node; + } + var p = node.parentNode; + while(p && p != el){ + if(p.parentNode == el){ + return p; + } + p = p.parentNode; + } + return null; + }, + + /** @ignore */ + onClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + var index = this.indexOf(item); + this.onItemClick(item, index, e); + this.fireEvent('click', this, index, item, e); + }else{ + this.clearSelections(); + } + }, + + /** @ignore */ + onContextMenu : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent('contextmenu', this, this.indexOf(item), item, e); + } + }, + + /** @ignore */ + onDblClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent('dblclick', this, this.indexOf(item), item, e); + } + }, + + onItemClick : function(item, index, e){ + if(this.multiSelect || this.singleSelect){ + if(this.multiSelect && e.shiftKey && this.lastSelection){ + this.select(this.getNodes(this.indexOf(this.lastSelection), index), false); + }else{ + this.select(item, this.multiSelect && e.ctrlKey); + this.lastSelection = item; + } + } + }, + + /** + * Get the number of selected nodes. + * @return {Number} + */ + getSelectionCount : function(){ + return this.selections.length; + }, + + /** + * Get the currently selected nodes. + * @return {Array} An array of HTMLElements + */ + getSelectedNodes : function(){ + return this.selections; + }, + + /** + * Get the indexes of the selected nodes. + * @return {Array} + */ + getSelectedIndexes : function(){ + var indexes = []; + for(var i = 0, len = this.selections.length; i < len; i++) { + indexes.push(this.selections[i].nodeIndex); + } + return indexes; + }, + + /** + * Clear all selections + * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange event + */ + clearSelections : function(suppressEvent){ + if(this.multiSelect || this.singleSelect){ + YAHOO.util.Dom.removeClass(this.selections, this.selectedClass); + this.selections = []; + if(!suppressEvent){ + this.fireEvent('selectionchange', this, this.selections); + } + } + }, + + /** + * Selects nodes. + * @param {Array/HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node, id of a template node or an array of any of those to select + * @param {Boolean} keepExisting (optional) true to keep existing selections + * @param {Boolean} suppressEvent (optional) true to skip firing of the selectionchange vent + */ + select : function(nodeInfo, keepExisting, suppressEvent){ + if(!keepExisting){ + this.clearSelections(true); + } + if(nodeInfo instanceof Array){ + for(var i = 0, len = nodeInfo.length; i < len; i++) { + this.select(nodeInfo[i], true, true); + } + }else{ + var node = this.getNode(nodeInfo); + if(node){ + YAHOO.util.Dom.addClass(node, this.selectedClass); + this.selections.push(node); + } + } + if(!suppressEvent){ + this.fireEvent('selectionchange', this, this.selections); + } + }, + + /** + * Gets a template node. + * @param {HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node or the id of a template node + * @return {HTMLElement} The node or null if it wasn't found + */ + getNode : function(nodeInfo){ + if(typeof nodeInfo == 'object'){ + return nodeInfo; + }else if(typeof nodeInfo == 'string'){ + return document.getElementById(nodeInfo); + }else if(typeof nodeInfo == 'number'){ + return this.nodes[nodeInfo]; + } + return null; + }, + + /** + * Gets a range template nodes. + * @param {Number} startIndex + * @param {Number} endIndex + * @return {Array} An array of nodes + */ + getNodes : function(start, end){ + var ns = this.nodes; + startIndex = startIndex || 0; + endIndex = typeof endIndex == 'undefined' ? ns.length-1 : endIndex; + var nodes = []; + for(var i = start; i <= end; i++) { + nodes.push(ns[i]); + } + return nodes; + }, + + /** + * Finds the index of the passed node + * @param {HTMLElement/String/Number} nodeInfo An HTMLElement template node, index of a template node or the id of a template node + * @return {Number} The index of the node or -1 + */ + indexOf : function(node){ + node = this.getNode(node); + if(typeof node.nodeIndex == 'number'){ + return node.nodeIndex; + } + var ns = this.nodes; + for(var i = 0, len = ns.length; i < len; i++) { + if(ns[i] == node){ + return i; + } + } + return -1; + } +}); + +/** + * @class YAHOO.ext.JsonView + * @extends YAHOO.ext.View + * Shortcut class to create a JSON + UpdateManager template view. Usage: +
      
      +var view = new YAHOO.ext.View('my-element', 
      +           '<div id="{id}">{foo} - {bar}</div>', // auto create template
      +           { multiSelect: true, jsonRoot: 'data' });
      +
      +// listen for node click?
      +view.on('click', function(vw, index, node, e){
      +    alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');
      +});
      +
      +// direct load of JSON data
      +view.load('foobar.php');
      +
      + * @constructor + * Create a new JsonView + * @param {String/HTMLElement/Element} container The container element where the view is to be rendered. + * @param {DomHelper.Template} tpl The rendering template + * @param {Object} config The config object + */ +YAHOO.ext.JsonView = function(container, tpl, config){ + var cfg = config || {}; + cfg.renderUpdates = true; + YAHOO.ext.JsonView.superclass.constructor.call(this, container, tpl, null, cfg); +}; +YAHOO.extendX(YAHOO.ext.JsonView, YAHOO.ext.View, { + /** + * Direct access to the elements UpdateManager update() method (takes the same parameters). + * @param {String/Function} url The url for this request or a function to call to get the url + * @param {String/Object} params (optional) The parameters to pass as either a url encoded string "param1=1&param2=2" or an object {param1: 1, param2: 2} + * @param {Function} callback (optional) Callback when transaction is complete - called with signature (oElement, bSuccess) + * @param {Boolean} discardUrl (optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url. + */ + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + } +}); \ No newline at end of file diff --git a/www/extras/yui-ext/source/widgets/Toolbar.js b/www/extras/yui-ext/source/widgets/Toolbar.js new file mode 100644 index 000000000..0f3847e50 --- /dev/null +++ b/www/extras/yui-ext/source/widgets/Toolbar.js @@ -0,0 +1,291 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +/** + * @class YAHOO.ext.Toolbar + * Basic Toolbar used by the Grid to create the paging toolbar. This class is reusable but functionality + * is limited. Look for more functionality in a future version. + */ + YAHOO.ext.Toolbar = function(container){ + this.el = getEl(container, true); + var div = document.createElement('div'); + div.className = 'ytoolbar'; + var tb = document.createElement('table'); + tb.border = 0; + tb.cellPadding = 0; + tb.cellSpacing = 0; + div.appendChild(tb); + var tbody = document.createElement('tbody'); + tb.appendChild(tbody); + var tr = document.createElement('tr'); + tbody.appendChild(tr); + this.el.dom.appendChild(div); + this.tr = tr; +}; + +YAHOO.ext.Toolbar.prototype = { + /** + * Adds element(s) to the toolbar - this function takes a variable number of + * arguments of mixed type and adds them to the toolbar... + * + * @param {Mixed} arg If arg is a ToolbarButton, it is added. If arg is a string, it is wrapped + * in a ytb-text element and added unless the text is "separator" in which case a separator + * is added. Otherwise, it is assumed the element is an HTMLElement and it is added directly. + */ + add : function(){ + for(var i = 0; i < arguments.length; i++){ + var el = arguments[i]; + var td = document.createElement('td'); + this.tr.appendChild(td); + if(el instanceof YAHOO.ext.ToolbarButton){ + el.init(td); + }else if(el instanceof Array){ + this.addButton(el); + }else if(typeof el == 'string'){ + var span = document.createElement('span'); + if(el == 'separator'){ + span.className = 'ytb-sep'; + }else{ + span.innerHTML = el; + span.className = 'ytb-text'; + } + td.appendChild(span); + }else if(typeof el == 'object'){ // must be element? + td.appendChild(el); + } + } + }, + + /** + * Returns the element for this toolbar + * @return {YAHOO.ext.Element} + */ + getEl : function(){ + return this.el; + }, + + /** + * Adds a separator + */ + addSeparator : function(){ + var td = document.createElement('td'); + this.tr.appendChild(td); + var span = document.createElement('span'); + span.className = 'ytb-sep'; + td.appendChild(span); + }, + + /** + * Add a button (or buttons), see {@link YAHOO.ext.ToolbarButton} for more info on the config + * @param {Object/Array} config A button config or array of configs + * @return {YAHOO.ext.ToolbarButton/Array} + */ + addButton : function(config){ + if(config instanceof Array){ + var buttons = []; + for(var i = 0, len = config.length; i < len; i++) { + buttons.push(this.addButton(config[i])); + } + return buttons; + } + var b = config; + if(!(config instanceof YAHOO.ext.ToolbarButton)){ + b = new YAHOO.ext.ToolbarButton(config); + } + this.add(b); + return b; + }, + + /** + * Adds text to the toolbar + * @param {String} text The text to add + * @return {HTMLElement} The span element created which you can use to update the text. + */ + addText : function(text){ + var td = document.createElement('td'); + this.tr.appendChild(td); + var span = document.createElement('span'); + span.className = 'ytb-text'; + span.innerHTML = text; + td.appendChild(span); + return span; + }, + + /** + * Inserts a button (or buttons) at the specified index + * @param {Number} index The index where the buttons are to be inserted + * @param {Object/Array} config A button config or array of configs + * @return {YAHOO.ext.ToolbarButton/Array} + */ + insertButton : function(index, config){ + if(config instanceof Array){ + var buttons = []; + for(var i = 0, len = config.length; i < len; i++) { + buttons.push(this.insertButton(index + i, config[i])); + } + return buttons; + } + var b = new YAHOO.ext.ToolbarButton(config); + var td = document.createElement('td'); + var nextSibling = this.tr.childNodes[index]; + if (nextSibling) + this.tr.insertBefore(td, nextSibling); + else + this.tr.appendChild(td); + b.init(td); + return b; + } +}; + +/** + * @class YAHOO.ext.ToolbarButton + * A toolbar button. The config has the following options: + *
        + *
      • className - The CSS class for the button. Use this to attach a background image for an icon.
      • + *
      • text - The button's text
      • + *
      • tooltip - The buttons tooltip text
      • + *
      • click - function to call when the button is clicked
      • + *
      • mouseover - function to call when the mouse moves over the button
      • + *
      • mouseout - function to call when the mouse moves off the button
      • + *
      • scope - The scope of the above event handlers
      • + *
      • + *
      • + */ +YAHOO.ext.ToolbarButton = function(config){ + YAHOO.ext.util.Config.apply(this, config); +}; + +YAHOO.ext.ToolbarButton.prototype = { + /** @private */ + init : function(appendTo){ + var element = document.createElement('span'); + element.className = 'ytb-button'; + if(this.id){ + element.id = this.id; + } + this.disabled = (this.disabled === true); + var inner = document.createElement('span'); + inner.className = 'ytb-button-inner ' + this.className; + inner.unselectable = 'on'; + if(this.tooltip){ + element.setAttribute('title', this.tooltip); + } + if(this.style){ + YAHOO.ext.DomHelper.applyStyles(inner, this.style); + } + element.appendChild(inner); + appendTo.appendChild(element); + this.el = getEl(element, true); + this.el.unselectable(); + inner.innerHTML = (this.text ? this.text : ' '); + this.inner = inner; + this.el.mon('click', this.onClick, this, true); + this.el.mon('mouseover', this.onMouseOver, this, true); + this.el.mon('mouseout', this.onMouseOut, this, true); + }, + + /** + * Sets this buttons click handler + * @param {Function} click The function to call when the button is clicked + * @param {Object} scope (optional) Scope for the function passed above + */ + setHandler : function(click, scope){ + this.click = click; + this.scope = scope; + }, + + /** + * Set this buttons text + * @param {String} text + */ + setText : function(text){ + this.inner.innerHTML = text; + }, + + /** + * Set this buttons tooltip text + * @param {String} text + */ + setTooltip : function(text){ + this.el.dom.title = text; + }, + + /** + * Show this button + */ + show: function(){ + this.el.dom.parentNode.style.display = ''; + }, + + /** + * Hide this button + */ + hide: function(){ + this.el.dom.parentNode.style.display = 'none'; + }, + + /** + * Disable this button + */ + disable : function(){ + this.disabled = true; + if(this.el){ + this.el.addClass('ytb-button-disabled'); + } + }, + + /** + * Enable this button + */ + enable : function(){ + this.disabled = false; + if(this.el){ + this.el.removeClass('ytb-button-disabled'); + } + }, + + /** + * Returns true if this button is disabled. + * @return {Boolean} + */ + isDisabled : function(){ + return this.disabled === true; + }, + + setDisabled : function(disabled){ + if(disabled){ + this.disable(); + }else{ + this.enable(); + } + }, + + /** @private */ + onClick : function(){ + if(!this.disabled && this.click){ + this.click.call(this.scope || window, this); + } + }, + + /** @private */ + onMouseOver : function(){ + if(!this.disabled){ + this.el.addClass('ytb-button-over'); + if(this.mouseover){ + this.mouseover.call(this.scope || window, this); + } + } + }, + + /** @private */ + onMouseOut : function(){ + this.el.removeClass('ytb-button-over'); + if(!this.disabled){ + if(this.mouseout){ + this.mouseout.call(this.scope || window, this); + } + } + } +}; \ No newline at end of file diff --git a/www/extras/yui-ext/source/yutil.js b/www/extras/yui-ext/source/yutil.js new file mode 100644 index 000000000..a6c18221c --- /dev/null +++ b/www/extras/yui-ext/source/yutil.js @@ -0,0 +1,472 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +YAHOO.namespace('ext'); +YAHOO.namespace('ext.util'); +YAHOO.namespace('ext.grid'); +YAHOO.ext.Strict = (document.compatMode == 'CSS1Compat'); +YAHOO.ext.SSL_SECURE_URL = 'javascript:false'; +// for old browsers +window.undefined = undefined; +/** + * @class Function + */ + // +/** + * Creates a callback that passes arguments[0], arguments[1], arguments[2], ... + * Call directly on any function. Example: myFunction.createCallback(myarg, myarg2) + * Will create a function that is bound to those 2 args. + * @return {Function} The new function +*/ +Function.prototype.createCallback = function(/*args...*/){ + // make args available, in function below + var args = arguments; + var method = this; + return function() { + return method.apply(window, args); + }; +}; + +/** + * Creates a delegate (callback) that sets the scope to obj. + * Call directly on any function. Example: this.myFunction.createDelegate(this) + * Will create a function that is automatically scoped to this. + * @param {Object} obj (optional) The object for which the scope is set + * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) + * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, + * if a number the args are inserted at the specified position + * @return {Function} The new function + */ +Function.prototype.createDelegate = function(obj, args, appendArgs){ + var method = this; + return function() { + var callargs = args || arguments; + if(appendArgs === true){ + callArgs = Array.prototype.slice.call(arguments, 0); + callargs = callArgs.concat(args); + }else if(typeof appendArgs == 'number'){ + callargs = Array.prototype.slice.call(arguments, 0); // copy arguments first + var applyArgs = [appendArgs, 0].concat(args); // create method call params + Array.prototype.splice.apply(callargs, applyArgs); // splice them in + } + return method.apply(obj || window, callargs); + }; +}; + +/** + * Calls this function after the number of millseconds specified. + * @param {Number} millis The number of milliseconds for the setTimeout call + * @param {Object} obj (optional) The object for which the scope is set + * @param {Array} args (optional) Overrides arguments for the call. (Defaults to the arguments passed by the caller) + * @param {Boolean/Number} appendArgs (optional) if True args are appended to call args instead of overriding, + * if a number the args are inserted at the specified position + * @return {Number} The timeout id that can be used with clearTimeout + */ +Function.prototype.defer = function(millis, obj, args, appendArgs){ + return setTimeout(this.createDelegate(obj, args, appendArgs), millis); +}; +/** + * Create a combined function call sequence of the original function + the passed function. + * The resulting function returns the results of the original function. + * The passed fcn is called with the parameters of the original function + * @param {Function} fcn The function to sequence + * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window) + * @return {Function} The new function + */ +Function.prototype.createSequence = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + var retval = method.apply(this || window, arguments); + fcn.apply(scope || this || window, arguments); + return retval; + }; +}; + +/** + * Creates an interceptor function. The passed fcn is called before the original one. If it returns false, the original one is not called. + * The resulting function returns the results of the original function. + * The passed fcn is called with the parameters of the original function. + * @addon + * @param {Function} fcn The function to call before the original + * @param {Object} scope (optional) The scope of the passed fcn (Defaults to scope of original function or window) + * @return {Function} The new function + */ +Function.prototype.createInterceptor = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + fcn.target = this; + fcn.method = method; + if(fcn.apply(scope || this || window, arguments) === false){ + return; + } + return method.apply(this || window, arguments);; + }; +}; + +/** + * @class YAHOO.ext.util.Browser + * @singleton + */ +YAHOO.ext.util.Browser = new function(){ + var ua = navigator.userAgent.toLowerCase(); + /** @type Boolean */ + this.isOpera = (ua.indexOf('opera') > -1); + /** @type Boolean */ + this.isSafari = (ua.indexOf('webkit') > -1); + /** @type Boolean */ + this.isIE = (window.ActiveXObject); + /** @type Boolean */ + this.isIE7 = (ua.indexOf('msie 7') > -1); + /** @type Boolean */ + this.isGecko = !this.isSafari && (ua.indexOf('gecko') > -1); + + if(ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1){ + /** @type Boolean */ + this.isWindows = true; + }else if(ua.indexOf("macintosh") != -1){ + /** @type Boolean */ + this.isMac = true; + } +}(); + +YAHOO.print = function(arg1, arg2, etc){ + if(!YAHOO.ext._console){ + var cs = YAHOO.ext.DomHelper.insertBefore(document.body.firstChild, + {tag: 'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;' + + 'background:white;position:absolute;right:5px;top:5px;' + + 'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'}, true); + new YAHOO.ext.Resizable(cs, { + transparent:true, + handles: 'all', + pinned:true, + adjustments: [0,0], + wrap:true, + draggable:(YAHOO.util.DD ? true : false) + }); + cs.on('dblclick', cs.hide); + YAHOO.ext._console = cs; + } + var msg = ''; + for(var i = 0, len = arguments.length; i < len; i++) { + msg += arguments[i] + '
        '; + } + YAHOO.ext._console.dom.innerHTML = msg + YAHOO.ext._console.dom.innerHTML; + YAHOO.ext._console.dom.scrollTop = 0; + YAHOO.ext._console.show(); +}; + +YAHOO.printf = function(format, arg1, arg2, etc){ + var args = Array.prototype.slice.call(arguments, 1); + YAHOO.print(format.replace( + /\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g, + function(m, a1, a2, a3) { + if (m.chatAt == '{') { + return m.slice(1, -1); + } + var rpl = args[a1]; + if (a3) { + var f = eval(a3); + rpl = f(rpl); + } + return rpl ? rpl : ''; + })); +} + + /** + * Enable custom handler signature and event cancelling. Using fireDirect() instead of fire() calls the subscribed event handlers + * with the exact parameters passed to fireDirect, instead of the usual (eventType, args[], obj). IMO this is more intuitive + * and promotes cleaner code. Also, if an event handler returns false, it is returned by fireDirect and no other handlers will be called.
        + * Example:

        
        + * if(beforeUpdateEvent.fireDirect(myArg, myArg2) !== false){
        + *     // do update
        + * }
        + */ +YAHOO.util.CustomEvent.prototype.fireDirect = function(){ + var len=this.subscribers.length; + for (var i=0; iFunction
        } fn (optional) The default function to timeout + * @param {Object} scope (optional) The default scope of that timeout + * @param {Array} args (optional) The default Array of arguments + */ +YAHOO.ext.util.DelayedTask = function(fn, scope, args){ + var timeoutId = null; + + /** + * Cancels any pending timeout and queues a new one + * @param {Number} delay The milliseconds to delay + * @param {Function} newFn (optional) Overrides function passed to constructor + * @param {Object} newScope (optional) Overrides scope passed to constructor + * @param {Array} newArgs (optional) Overrides args passed to constructor + */ + this.delay = function(delay, newFn, newScope, newArgs){ + if(timeoutId){ + clearTimeout(timeoutId); + } + fn = newFn || fn; + scope = newScope || scope; + args = newArgs || args; + timeoutId = setTimeout(fn.createDelegate(scope, args), delay); + }; + + /** + * Cancel the last queued timeout + */ + this.cancel = function(){ + if(timeoutId){ + clearTimeout(timeoutId); + timeoutId = null; + } + }; +}; + +/** + * @class YAHOO.ext.util.Observable + * Abstract base class that provides a common interface for publishing events. Subclasses are expected to + * to have a property "events" with all the events defined.
        + * For example: + *
        
        + var Employee = function(name){
        +    this.name = name;
        +    this.events = {
        +        'fired' : new YAHOO.util.CustomEvent('fired'),
        +        'quit' : new YAHOO.util.CustomEvent('quit')
        +    }
        + }
        + YAHOO.extend(Employee, YAHOO.ext.util.Observable);
        +
        + */ +YAHOO.ext.util.Observable = function(){}; +YAHOO.ext.util.Observable.prototype = { + /** + * Fires the specified event with the passed parameters (minus the event name). + * @param {String} eventName + * @param {Object...} args Variable number of parameters are passed to handlers + * @return {Boolean} returns false if any of the handlers return false otherwise it returns true + */ + fireEvent : function(){ + var ce = this.events[arguments[0].toLowerCase()]; + return ce.fireDirect.apply(ce, Array.prototype.slice.call(arguments, 1)); + }, + + /** + * Appends an event handler to this element + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) The scope (this object) for the handler + * @param {boolean} override (optional) If true, scope becomes the scope + */ + addListener : function(eventName, fn, scope, override){ + eventName = eventName.toLowerCase(); + if(!this.events[eventName]){ + // added for a better message when subscribing to wrong event + throw 'You are trying to listen for an event that does not exist: "' + eventName + '".'; + } + this.events[eventName].subscribe(fn, scope, override); + }, + + /** + * Appends an event handler to this element that is delayed the specified number of milliseconds. + * @param {String} eventName The type of event to listen for + * @param {Function} handler The method the event invokes + * @param {Object} scope (optional) The scope (this object) for the handler + * @param {Number} delay (optional) The number of milliseconds to delay + * @return {Function} The wrapped function that was created (can be used to remove the listener) + */ + delayedListener : function(eventName, fn, scope, delay){ + var newFn = function(){ + setTimeout(fn.createDelegate(scope, arguments), delay || 1); + } + this.addListener(eventName, newFn); + return newFn; + }, + + /** + * Removes a listener + * @param {String} eventName The type of event to listen for + * @param {Function} handler The handler to remove + * @param {Object} scope (optional) The scope (this object) for the handler + */ + removeListener : function(eventName, fn, scope){ + this.events[eventName.toLowerCase()].unsubscribe(fn, scope); + }, + + /** + * Removes all listeners for this object + */ + purgeListeners : function(){ + for(var evt in this.events){ + if(typeof this.events[evt] != 'function'){ + this.events[evt].unsubscribeAll(); + } + } + } +}; +YAHOO.ext.util.Observable.prototype.on = YAHOO.ext.util.Observable.prototype.addListener; + +/** + * @class YAHOO.ext.util.Config + * Class with one useful method + * @singleton + */ +YAHOO.ext.util.Config = { + /** + * Copies all the properties of config to obj. + * @param {Object} obj The receiver of the properties + * @param {Object} config The source of the properties + * @param {Object} defaults A different object that will also be applied for default values + * @return {Object} returns obj + */ + apply : function(obj, config, defaults){ + if(defaults){ + this.apply(obj, defaults); + } + if(config){ + for(var prop in config){ + obj[prop] = config[prop]; + } + } + return obj; + } +}; + +if(!String.escape){ + String.escape = function(string) { + return string.replace(/('|\\)/g, "\\$1"); + }; +}; + +String.leftPad = function (val, size, ch) { + var result = new String(val); + if (ch == null) { + ch = " "; + } + while (result.length < size) { + result = ch + result; + } + return result; +}; + +// workaround for Safari 1.3 not supporting hasOwnProperty +if(YAHOO.util.Connect){ + YAHOO.util.Connect.setHeader = function(o){ + for(var prop in this._http_header){ + // if(this._http_header.hasOwnProperty(prop)){ + if(typeof this._http_header[prop] != 'function'){ + o.conn.setRequestHeader(prop, this._http_header[prop]); + } + } + delete this._http_header; + this._http_header = {}; + this._has_http_headers = false; + }; +} +/** + * A simple enhancement to drag drop that allows you to constrain the movement of the + * DD or DDProxy object to a particular element.

        + * + * Usage: +
        
        + var dd = new YAHOO.util.DDProxy("dragDiv1", "proxytest",  
        +                { dragElId: "existingProxyDiv" });
        + dd.startDrag = function(){
        +     this.constrainTo('parent-id');
        + }; 
        + 
        + * Or you can initalize it using the {@link YAHOO.ext.Element} object: +
        
        + getEl('dragDiv1').initDDProxy('proxytest', {dragElId: "existingProxyDiv"}, {
        +     startDrag : function(){
        +         this.constrainTo('parent-id');
        +     }
        + });
        + 
        + */ +if(YAHOO.util.DragDrop){ + /** + * Provides default constraint padding to "constrainTo" elements (defaults to {left: 0, right:0, top:0, bottom:0}). + * @type Object + */ + YAHOO.util.DragDrop.prototype.defaultPadding = {left:0, right:0, top:0, bottom:0}; + + /** + * Initializes the drag drop object's constraints to restrict movement to a certain element. + * @param {String/HTMLElement/Element} constrainTo The element to constrain to. + * @param {Object/Number} pad (optional) Pad provides a way to specify "padding" of the constraints, + * and can be either a number for symmetrical padding (4 would be equal to {left:4, right:4, top:4, bottom:4}) or + * an object containing the sides to pad. For example: {right:10, bottom:10} + * @param {Boolean} inContent (optional) Constrain the draggable in the content box of the element (inside padding and borders) + */ + YAHOO.util.DragDrop.prototype.constrainTo = function(constrainTo, pad, inContent){ + if(typeof pad == 'number'){ + pad = {left: pad, right:pad, top:pad, bottom:pad}; + } + pad = pad || this.defaultPadding; + var b = getEl(this.getEl()).getBox(); + var ce = getEl(constrainTo); + var c = ce.dom == document.body ? { x: 0, y: 0, + width: YAHOO.util.Dom.getViewportWidth(), + height: YAHOO.util.Dom.getViewportHeight()} : ce.getBox(inContent || false); + this.resetConstraints(); + this.setXConstraint( + b.x - c.x - (pad.left||0), // left + c.width - b.x - b.width - (pad.right||0) // right + ); + this.setYConstraint( + b.y - c.y - (pad.top||0), // top + c.height - b.y - b.height - (pad.bottom||0) //bottom + ); + } +} \ No newline at end of file diff --git a/www/extras/yui-ext/splitbar-lib.js b/www/extras/yui-ext/splitbar-lib.js new file mode 100644 index 000000000..8e820f40e --- /dev/null +++ b/www/extras/yui-ext/splitbar-lib.js @@ -0,0 +1,19 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +if(YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr.clickTimeThresh=350;} +YAHOO.ext.SplitBar=function(dragElement,resizingElement,orientation,placement){this.el=YAHOO.ext.Element.get(dragElement,true);this.el.dom.unselectable='on';this.resizingEl=YAHOO.ext.Element.get(resizingElement,true);this.orientation=orientation||YAHOO.ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.onMoved=new YAHOO.util.CustomEvent("SplitBarMoved",this);this.animate=false;this.useShim=false;this.shim=null;this.proxy=YAHOO.ext.SplitBar.createProxy(this.orientation);this.dd=new YAHOO.util.DDProxy(this.el.dom.id,"SplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.placement=placement||(this.el.getX()>this.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; diff --git a/www/extras/yui-ext/state-manager-lib.js b/www/extras/yui-ext/state-manager-lib.js new file mode 100644 index 000000000..9c0b4e518 --- /dev/null +++ b/www/extras/yui-ext/state-manager-lib.js @@ -0,0 +1,21 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.namespace('ext.state');YAHOO.ext.state.Provider=function(){YAHOO.ext.state.Provider.superclass.constructor.call(this);this.events={'statechange':new YAHOO.util.CustomEvent('statechange')};this.state={};};YAHOO.extendX(YAHOO.ext.state.Provider,YAHOO.ext.util.Observable,{get:function(name,defaultValue){return typeof this.state[name]=='undefined'?defaultValue:this.state[name];},clear:function(name){delete this.state[name];this.fireEvent('statechange',this,name,null);},set:function(name,value){this.state[name]=value;this.fireEvent('statechange',this,name,value);},decodeValue:function(cookie){var re=/^(a|n|d|b|s|o)\:(.*)$/;var matches=re.exec(unescape(cookie));if(!matches||!matches[1])return;var type=matches[1];var v=matches[2];switch(type){case'n':return parseFloat(v);case'd':return new Date(Date.parse(v));case'b':return(v=='1');case'a':var all=[];var values=v.split('^');for(var i=0,len=values.length;i1){var newTab=this.getNextAvailable(index);if(newTab)newTab.activate();} +tab.purgeListeners();this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);} +items.splice(index,1);delete this.items[tab.id];this.autoSizeTabs();},getNextAvailable:function(start){var items=this.items;var index=start;while(index=0){var item=items[--index];if(item&&!item.isHidden()){return item;}} +return null;},disableTab:function(id){var tab=this.items[id];if(tab&&this.active!=tab){tab.disable();}},enableTab:function(id){var tab=this.items[id];tab.enable();},activate:function(id){var tab=this.items[id];if(tab==this.active){return tab;} +var e={};this.fireEvent('beforetabchange',this,e,tab);if(e.cancel!==true&&!tab.disabled){if(this.active){this.active.hide();} +this.active=this.items[id];this.active.show();this.onTabChange.fireDirect(this,this.active);} +return tab;},getActiveTab:function(){return this.active;},syncHeight:function(targetHeight){var height=(targetHeight||this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb');var bm=this.bodyEl.getMargins();var newHeight=height-(this.stripWrap.getHeight())-(bm.top+bm.bottom);this.bodyEl.setHeight(newHeight);return newHeight;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var count=this.items.length;var vcount=count-this.hiddenCount;if(!this.resizeTabs||count<1||vcount<1||this.updating)return;var w=Math.max(this.el.getWidth()-this.cpad,10);var availWidth=Math.floor(w/vcount);var b=this.stripBody;if(b.getWidth()>w){var tabs=this.items;this.setTabWidth(Math.max(availWidth,this.minTabWidth));if(availWidth
        ';return strip.firstChild.firstChild.firstChild.firstChild;};YAHOO.ext.TabPanel.prototype.createBody=function(container){var body=document.createElement('div');YAHOO.util.Dom.generateId(body,'tab-body');YAHOO.util.Dom.addClass(body,'yui-ext-tabbody');container.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createItemBody=function(bodyEl,id){var body=YAHOO.util.Dom.get(id);if(!body){body=document.createElement('div');body.id=id;} +YAHOO.util.Dom.addClass(body,'yui-ext-tabitembody');bodyEl.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createStripElements=function(stripEl,text,closable){var td=document.createElement('td');stripEl.appendChild(td);if(closable){td.className="ytab-closable";if(!this.closeTpl){this.closeTpl=new YAHOO.ext.Template(''+'{text}'+'
         
        ');} +var el=this.closeTpl.overwrite(td,{'text':text});var close=el.getElementsByTagName('div')[0];var inner=el.getElementsByTagName('em')[0];return{'el':el,'close':close,'inner':inner};}else{if(!this.tabTpl){this.tabTpl=new YAHOO.ext.Template(''+'{text}');} +var el=this.tabTpl.overwrite(td,{'text':text});var inner=el.getElementsByTagName('em')[0];return{'el':el,'inner':inner};}}; diff --git a/www/extras/yui-ext/yui-ext-core-debug.js b/www/extras/yui-ext/yui-ext-core-debug.js new file mode 100644 index 000000000..6724ea367 --- /dev/null +++ b/www/extras/yui-ext/yui-ext-core-debug.js @@ -0,0 +1,2552 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +YAHOO.namespace('ext'); +YAHOO.namespace('ext.util'); +YAHOO.namespace('ext.grid'); +YAHOO.ext.Strict = (document.compatMode == 'CSS1Compat'); +YAHOO.ext.SSL_SECURE_URL = 'javascript:false'; + +window.undefined = undefined; + + + +Function.prototype.createCallback = function(){ + + var args = arguments; + var method = this; + return function() { + return method.apply(window, args); + }; +}; + + +Function.prototype.createDelegate = function(obj, args, appendArgs){ + var method = this; + return function() { + var callargs = args || arguments; + if(appendArgs === true){ + callArgs = Array.prototype.slice.call(arguments, 0); + callargs = callArgs.concat(args); + }else if(typeof appendArgs == 'number'){ + callargs = Array.prototype.slice.call(arguments, 0); + var applyArgs = [appendArgs, 0].concat(args); + Array.prototype.splice.apply(callargs, applyArgs); + } + return method.apply(obj || window, callargs); + }; +}; + + +Function.prototype.defer = function(millis, obj, args, appendArgs){ + return setTimeout(this.createDelegate(obj, args, appendArgs), millis); +}; + +Function.prototype.createSequence = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + var retval = method.apply(this || window, arguments); + fcn.apply(scope || this || window, arguments); + return retval; + }; +}; + + +Function.prototype.createInterceptor = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + fcn.target = this; + fcn.method = method; + if(fcn.apply(scope || this || window, arguments) === false){ + return; + } + return method.apply(this || window, arguments);; + }; +}; + + +YAHOO.ext.util.Browser = new function(){ + var ua = navigator.userAgent.toLowerCase(); + + this.isOpera = (ua.indexOf('opera') > -1); + + this.isSafari = (ua.indexOf('webkit') > -1); + + this.isIE = (window.ActiveXObject); + + this.isIE7 = (ua.indexOf('msie 7') > -1); + + this.isGecko = !this.isSafari && (ua.indexOf('gecko') > -1); + + if(ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1){ + + this.isWindows = true; + }else if(ua.indexOf("macintosh") != -1){ + + this.isMac = true; + } +}(); + +YAHOO.print = function(arg1, arg2, etc){ + if(!YAHOO.ext._console){ + var cs = YAHOO.ext.DomHelper.insertBefore(document.body.firstChild, + {tag: 'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;' + + 'background:white;position:absolute;right:5px;top:5px;' + + 'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'}, true); + new YAHOO.ext.Resizable(cs, { + transparent:true, + handles: 'all', + pinned:true, + adjustments: [0,0], + wrap:true, + draggable:(YAHOO.util.DD ? true : false) + }); + cs.on('dblclick', cs.hide); + YAHOO.ext._console = cs; + } + var msg = ''; + for(var i = 0, len = arguments.length; i < len; i++) { + msg += arguments[i] + '
        '; + } + YAHOO.ext._console.dom.innerHTML = msg + YAHOO.ext._console.dom.innerHTML; + YAHOO.ext._console.dom.scrollTop = 0; + YAHOO.ext._console.show(); +}; + +YAHOO.printf = function(format, arg1, arg2, etc){ + var args = Array.prototype.slice.call(arguments, 1); + YAHOO.print(format.replace( + /\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g, + function(m, a1, a2, a3) { + if (m.chatAt == '{') { + return m.slice(1, -1); + } + var rpl = args[a1]; + if (a3) { + var f = eval(a3); + rpl = f(rpl); + } + return rpl ? rpl : ''; + })); +} + + +YAHOO.util.CustomEvent.prototype.fireDirect = function(){ + var len=this.subscribers.length; + for (var i=0; i'; + } + return b; + } + + + + var createDom = function(o, parentNode){ + var el = d.createElement(o.tag); + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + if(o.children){ + for(var i = 0, len = o.children.length; i < len; i++) { + createDom(o.children[i], el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + if(tag == 'table' || tag == 'tbody'){ + tempTableEl.innerHTML = ''+html+'
        '; + node = tempTableEl.firstChild.firstChild.firstChild; + }else{ + tempTableEl.innerHTML = ''+html+'
        '; + node = tempTableEl.firstChild.firstChild.firstChild.firstChild; + } + if(where == 'beforebegin'){ + el.parentNode.insertBefore(node, el); + return node; + }else if(where == 'afterbegin'){ + el.insertBefore(node, el.firstChild); + return node; + }else if(where == 'beforeend'){ + el.appendChild(node); + return node; + }else if(where == 'afterend'){ + el.parentNode.insertBefore(node, el.nextSibling); + return node; + } + } + + + this.insertHtml = function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == 'table' || tag == 'tbody' || tag == 'tr'){ + return insertIntoTable(tag, where, el, html); + } + switch(where){ + case 'beforebegin': + el.insertAdjacentHTML(where, html); + return el.previousSibling; + case 'afterbegin': + el.insertAdjacentHTML(where, html); + return el.firstChild; + case 'beforeend': + el.insertAdjacentHTML(where, html); + return el.lastChild; + case 'afterend': + el.insertAdjacentHTML(where, html); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + } + var range = el.ownerDocument.createRange(); + var frag; + switch(where){ + case 'beforebegin': + range.setStartBefore(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el); + return el.previousSibling; + case 'afterbegin': + if(el.firstChild){ + range.setStartBefore(el.firstChild); + }else{ + range.selectNodeContents(el); + range.collapse(true); + } + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + case 'beforeend': + if(el.lastChild){ + range.setStartAfter(el.lastChild); + }else{ + range.selectNodeContents(el); + range.collapse(false); + } + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + case 'afterend': + range.setStartAfter(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el.nextSibling); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + }; + + + this.insertBefore = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeBegin', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.insertAfter = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el.nextSibling); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('afterEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.append = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.appendChild(newNode); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.overwrite = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = createHtml(o); + return returnElement ? YAHOO.ext.Element.get(el.firstChild, true) : el.firstChild; + }; + + + this.createTemplate = function(o){ + var html = createHtml(o); + return new YAHOO.ext.DomHelper.Template(html); + }; +}(); + + +YAHOO.ext.DomHelper.Template = function(html){ + + this.html = html; + + this.re = /\{(\w+)\}/g; +}; +YAHOO.ext.DomHelper.Template.prototype = { + + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var empty = ''; + var fn = function(match, index){ + if(typeof values[index] != 'undefined'){ + return values[index]; + }else{ + return empty; + } + } + return this.html.replace(this.re, fn); + }, + + + compile : function(){ + var html = this.html; + var re = /\{(\w+)\}/g; + var body = []; + body.push("this.compiled = function(values){ return ["); + var result; + var lastMatchEnd = 0; + while ((result = re.exec(html)) != null){ + body.push("'", html.substring(lastMatchEnd, result.index), "', "); + body.push("values['", html.substring(result.index+1,re.lastIndex-1), "'], "); + lastMatchEnd = re.lastIndex; + } + body.push("'", html.substr(lastMatchEnd), "'].join('');};"); + eval(body.join('')); + }, + + + insertBefore: function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + insertAfter : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + append : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + overwrite : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = ''; + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + } +}; + +YAHOO.ext.Template = YAHOO.ext.DomHelper.Template; + +YAHOO.ext.Element = function(element, forceNew){ + var dom = YAHOO.util.Dom.get(element); + if(!dom){ + return null; + } + if(!forceNew && YAHOO.ext.Element.cache[dom.id]){ + return YAHOO.ext.Element.cache[dom.id]; + } + + this.dom = dom; + + + this.id = this.dom.id; + + this.visibilityMode = YAHOO.ext.Element.VISIBILITY; + + + + this.originalDisplay = YAHOO.util.Dom.getStyle(this.dom, 'display') || ''; + if(this.autoDisplayMode){ + if(this.originalDisplay == 'none'){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + } + } + if(this.originalDisplay == 'none'){ + this.originalDisplay = ''; + } + + + this.defaultUnit = 'px'; +} + +YAHOO.ext.Element.prototype = { + + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + + enableDisplayMode : function(display){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + if(typeof display != 'undefined') this.originalDisplay = display; + return this; + }, + + + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, duration, onComplete, easing, animType); + return this; + }, + + + anim : function(args, duration, onComplete, easing, animType){ + animType = animType || YAHOO.util.Anim; + var anim = new animType(this.dom, args, duration || .35, + easing || YAHOO.util.Easing.easeBoth); + if(onComplete){ + if(!(onComplete instanceof Array)){ + anim.onComplete.subscribe(onComplete, this, true); + }else{ + for(var i = 0; i < onComplete.length; i++){ + var fn = onComplete[i]; + if(fn) anim.onComplete.subscribe(fn, this, true); + } + } + } + anim.animate(); + }, + + + scrollIntoView : function(container){ + var c = getEl(container || document.body, true); + var cp = c.getStyle('position'); + var restorePos = false; + if(cp != 'relative' && cp != 'absolute'){ + c.setStyle('position', 'relative'); + restorePos = true; + } + var el = this.dom; + var childTop = parseInt(el.offsetTop, 10); + var childBottom = childTop + el.offsetHeight; + var containerTop = parseInt(c.scrollTop, 10); + var containerBottom = containerTop + c.clientHeight; + if(childTop < containerTop){ + c.scrollTop = childTop; + }else if(childBottom > containerBottom){ + c.scrollTop = childBottom-c.clientHeight; + } + if(restorePos){ + c.setStyle('position', cp); + } + return this; + }, + + + autoHeight : function(animate, duration, onComplete, easing){ + var oldHeight = this.getHeight(); + this.clip(); + this.setHeight(1); + setTimeout(function(){ + var height = parseInt(this.dom.scrollHeight, 10); + if(!animate){ + this.setHeight(height); + this.unclip(); + if(typeof onComplete == 'function'){ + onComplete(); + } + }else{ + this.setHeight(oldHeight); + this.setHeight(height, animate, duration, function(){ + this.unclip(); + if(typeof onComplete == 'function') onComplete(); + }.createDelegate(this), easing); + } + }.createDelegate(this), 0); + return this; + }, + + + isVisible : function(deep) { + var vis = YAHOO.util.Dom.getStyle(this.dom, 'visibility') != 'hidden' + && YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + if(!deep || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'visibility') == 'hidden' || YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + return false; + } + p = p.parentNode; + } + return true; + }, + + + select : function(selector, unique){ + return YAHOO.ext.Element.select('#' + this.dom.id + ' ' + selector, unique); + }, + + + initDD : function(group, config, overrides){ + var dd = new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + initDDProxy : function(group, config, overrides){ + var dd = new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + initDDTarget : function(group, config, overrides){ + var dd = new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + setVisible : function(visible, animate, duration, onComplete, easing){ + + if(!animate || !YAHOO.util.Anim){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }else{ + + this.setOpacity(visible?0:1); + YAHOO.util.Dom.setStyle(this.dom, 'visibility', 'visible'); + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(true); + } + var args = {opacity: { from: (visible?0:1), to: (visible?1:0) }}; + var anim = new YAHOO.util.Anim(this.dom, args, duration || .35, + easing || (visible ? YAHOO.util.Easing.easeIn : YAHOO.util.Easing.easeOut)); + anim.onComplete.subscribe((function(){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }).createDelegate(this)); + if(onComplete){ + anim.onComplete.subscribe(onComplete); + } + anim.animate(); + } + return this; + }, + + + isDisplayed : function() { + return YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + }, + + + toggle : function(animate, duration, onComplete, easing){ + this.setVisible(!this.isVisible(), animate, duration, onComplete, easing); + return this; + }, + + + setDisplayed : function(value) { + if(typeof value == 'boolean'){ + value = value ? this.originalDisplay : 'none'; + } + YAHOO.util.Dom.setStyle(this.dom, 'display', value); + return this; + }, + + + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + + addClass : function(className){ + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + + + radioClass : function(className){ + var siblings = this.dom.parentNode.childNodes; + for(var i = 0; i < siblings.length; i++) { + var s = siblings[i]; + if(s.nodeType == 1){ + YAHOO.util.Dom.removeClass(s, className); + } + } + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + + removeClass : function(className){ + YAHOO.util.Dom.removeClass(this.dom, className); + return this; + }, + + + toggleClass : function(className){ + if(YAHOO.util.Dom.hasClass(this.dom, className)){ + YAHOO.util.Dom.removeClass(this.dom, className); + }else{ + YAHOO.util.Dom.addClass(this.dom, className); + } + return this; + }, + + + hasClass : function(className){ + return YAHOO.util.Dom.hasClass(this.dom, className); + }, + + + replaceClass : function(oldClassName, newClassName){ + YAHOO.util.Dom.replaceClass(this.dom, oldClassName, newClassName); + return this; + }, + + + getStyle : function(name){ + return YAHOO.util.Dom.getStyle(this.dom, name); + }, + + + setStyle : function(name, value){ + if(typeof name == 'string'){ + YAHOO.util.Dom.setStyle(this.dom, name, value); + }else{ + var D = YAHOO.util.Dom; + for(var style in name){ + if(typeof name[style] != 'function'){ + D.setStyle(this.dom, style, name[style]); + } + } + } + return this; + }, + + + applyStyles : function(style){ + YAHOO.ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + + getX : function(){ + return YAHOO.util.Dom.getX(this.dom); + }, + + + getY : function(){ + return YAHOO.util.Dom.getY(this.dom); + }, + + + getXY : function(){ + return YAHOO.util.Dom.getXY(this.dom); + }, + + + setX : function(x, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], animate, duration, onComplete, easing); + } + return this; + }, + + + setY : function(y, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], animate, duration, onComplete, easing); + } + return this; + }, + + + setLeft : function(left){ + YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(left)); + return this; + }, + + + setTop : function(top){ + YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(top)); + return this; + }, + + + setRight : function(right){ + YAHOO.util.Dom.setStyle(this.dom, 'right', this.addUnits(right)); + return this; + }, + + + setBottom : function(bottom){ + YAHOO.util.Dom.setStyle(this.dom, 'bottom', this.addUnits(bottom)); + return this; + }, + + + setXY : function(pos, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + + setLocation : function(x, y, animate, duration, onComplete, easing){ + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + + moveTo : function(x, y, animate, duration, onComplete, easing){ + + + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + + getRegion : function(){ + return YAHOO.util.Dom.getRegion(this.dom); + }, + + + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight; + return contentHeight !== true ? h : h-this.getBorderWidth('tb')-this.getPadding('tb'); + }, + + + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth; + return contentWidth !== true ? w : w-this.getBorderWidth('lr')-this.getPadding('lr'); + }, + + + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + + adjustWidth : function(width){ + if(typeof width == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + width -= (this.getBorderWidth('lr') + this.getPadding('lr')); + } + if(width < 0){ + width = 0; + } + } + return width; + }, + + + adjustHeight : function(height){ + if(typeof height == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + height -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + if(height < 0){ + height = 0; + } + } + return height; + }, + + + setWidth : function(width, animate, duration, onComplete, easing){ + width = this.adjustWidth(width); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'width', this.addUnits(width)); + }else{ + this.anim({width: {to: width}}, duration, onComplete, + easing || (width > this.getWidth() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + + setHeight : function(height, animate, duration, onComplete, easing){ + height = this.adjustHeight(height); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'height', this.addUnits(height)); + }else{ + this.anim({height: {to: height}}, duration, onComplete, + easing || (height > this.getHeight() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + + setSize : function(width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({width: {to: width}, height: {to: height}}, duration, onComplete, easing); + } + return this; + }, + + + setBounds : function(x, y, width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + this.setLocation(x, y); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + + setRegion : function(region, animate, duration, onComplete, easing){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, animate, duration, onComplete, easing); + return this; + }, + + + addListener : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + + addHandler : function(eventName, stopPropagation, handler, scope, override){ + var fn = YAHOO.ext.Element.createStopHandler(stopPropagation, handler, scope || this, true); + YAHOO.util.Event.addListener(this.dom, eventName, fn); + return this; + }, + + + on : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + + addManagedListener : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + + + mon : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + + removeListener : function(eventName, handler, scope){ + YAHOO.util.Event.removeListener(this.dom, eventName, handler, scope || this); + return this; + }, + + + removeAllListeners : function(){ + YAHOO.util.Event.purgeElement(this.dom); + return this; + }, + + + + setOpacity : function(opacity, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'opacity', opacity); + }else{ + this.anim({opacity: {to: opacity}}, duration, onComplete, easing); + } + return this; + }, + + + getLeft : function(local){ + if(!local){ + return this.getX(); + }else{ + return parseInt(this.getStyle('left'), 10) || 0; + } + }, + + + getRight : function(local){ + if(!local){ + return this.getX() + this.getWidth(); + }else{ + return (this.getLeft(true) + this.getWidth()) || 0; + } + }, + + + getTop : function(local) { + if(!local){ + return this.getY(); + }else{ + return parseInt(this.getStyle('top'), 10) || 0; + } + }, + + + getBottom : function(local){ + if(!local){ + return this.getY() + this.getHeight(); + }else{ + return (this.getTop(true) + this.getHeight()) || 0; + } + }, + + + setAbsolutePositioned : function(zIndex){ + this.setStyle('position', 'absolute'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + + setRelativePositioned : function(zIndex){ + this.setStyle('position', 'relative'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + + clearPositioning : function(){ + this.setStyle('position', ''); + this.setStyle('left', ''); + this.setStyle('right', ''); + this.setStyle('top', ''); + this.setStyle('bottom', ''); + return this; + }, + + + getPositioning : function(){ + return { + 'position' : this.getStyle('position'), + 'left' : this.getStyle('left'), + 'right' : this.getStyle('right'), + 'top' : this.getStyle('top'), + 'bottom' : this.getStyle('bottom') + }; + }, + + + getBorderWidth : function(side){ + return this.addStyles(side, YAHOO.ext.Element.borders); + }, + + + getPadding : function(side){ + return this.addStyles(side, YAHOO.ext.Element.paddings); + }, + + + setPositioning : function(positionCfg){ + if(positionCfg.position)this.setStyle('position', positionCfg.position); + if(positionCfg.left)this.setLeft(positionCfg.left); + if(positionCfg.right)this.setRight(positionCfg.right); + if(positionCfg.top)this.setTop(positionCfg.top); + if(positionCfg.bottom)this.setBottom(positionCfg.bottom); + return this; + }, + + + + setLeftTop : function(left, top){ + this.dom.style.left = this.addUnits(left); + this.dom.style.top = this.addUnits(top); + return this; + }, + + + move : function(direction, distance, animate, duration, onComplete, easing){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case 'l': + case 'left': + this.moveTo(xy[0]-distance, xy[1], animate, duration, onComplete, easing); + break; + case 'r': + case 'right': + this.moveTo(xy[0]+distance, xy[1], animate, duration, onComplete, easing); + break; + case 't': + case 'top': + case 'up': + this.moveTo(xy[0], xy[1]-distance, animate, duration, onComplete, easing); + break; + case 'b': + case 'bottom': + case 'down': + this.moveTo(xy[0], xy[1]+distance, animate, duration, onComplete, easing); + break; + } + return this; + }, + + + clip : function(){ + if(!this.isClipped){ + this.isClipped = true; + this.originalClip = { + 'o': this.getStyle('overflow'), + 'x': this.getStyle('overflow-x'), + 'y': this.getStyle('overflow-y') + }; + this.setStyle('overflow', 'hidden'); + this.setStyle('overflow-x', 'hidden'); + this.setStyle('overflow-y', 'hidden'); + } + return this; + }, + + + unclip : function(){ + if(this.isClipped){ + this.isClipped = false; + var o = this.originalClip; + if(o.o){this.setStyle('overflow', o.o);} + if(o.x){this.setStyle('overflow-x', o.x);} + if(o.y){this.setStyle('overflow-y', o.y);} + } + return this; + }, + + + alignTo : function(element, position, offsets, animate, duration, onComplete, easing){ + var otherEl = getEl(element); + if(!otherEl){ + return this; + } + offsets = offsets || [0, 0]; + var r = otherEl.getRegion(); + position = position.toLowerCase(); + switch(position){ + case 'bl': + this.moveTo(r.left + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'br': + this.moveTo(r.right + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tl': + this.moveTo(r.left + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tr': + this.moveTo(r.right + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + } + return this; + }, + + + clearOpacity : function(){ + if (window.ActiveXObject) { + this.dom.style.filter = ''; + } else { + this.dom.style.opacity = ''; + this.dom.style['-moz-opacity'] = ''; + this.dom.style['-khtml-opacity'] = ''; + } + return this; + }, + + + hide : function(animate, duration, onComplete, easing){ + this.setVisible(false, animate, duration, onComplete, easing); + return this; + }, + + + show : function(animate, duration, onComplete, easing){ + this.setVisible(true, animate, duration, onComplete, easing); + return this; + }, + + + addUnits : function(size){ + if(size === '' || size == 'auto' || typeof size == 'undefined'){ + return size; + } + if(typeof size == 'number' || !YAHOO.ext.Element.unitPattern.test(size)){ + return size + this.defaultUnit; + } + return size; + }, + + + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; + } + var changed = []; + var p = this.dom; + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + changed.push({el: p, visibility: YAHOO.util.Dom.getStyle(p, 'visibility')}); + p.style.visibility = 'hidden'; + p.style.display = 'block'; + } + p = p.parentNode; + } + this._measureChanged = changed; + return this; + + }, + + + endMeasure : function(){ + var changed = this._measureChanged; + if(changed){ + for(var i = 0, len = changed.length; i < len; i++) { + var r = changed[i]; + r.el.style.visibility = r.visibility; + r.el.style.display = 'none'; + } + this._measureChanged = null; + } + return this; + }, + + + update : function(html, loadScripts, callback){ + if(typeof html == 'undefined'){ + html = ''; + } + if(loadScripts !== true){ + this.dom.innerHTML = html; + if(typeof callback == 'function'){ + callback(); + } + return this; + } + var id = YAHOO.util.Dom.generateId(); + var dom = this.dom; + + html += ''; + + YAHOO.util.Event.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:)((\n|\r|.)*?)(?:<\/script>)/img; + var srcRe = /\ssrc=[\'\"](.*)[\'\"]/i; + var match; + while(match = re.exec(html)){ + var srcMatch = match[0].match(srcRe); + if(srcMatch && srcMatch[1]){ + var s0 = document.createElement("script"); + s0.src = srcMatch[1]; + hd.appendChild(s0); + }else if(match[1]){ + eval(match[1]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == 'function'){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img, ''); + return this; + }, + + + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new YAHOO.ext.UpdateManager(this); + } + return this.updateManager; + }, + + + unselectable : function(){ + this.dom.unselectable = 'on'; + this.swallowEvent('selectstart', true); + this.applyStyles('-moz-user-select:none;-khtml-user-select:none;'); + return this; + }, + + + getCenterXY : function(offsetScroll){ + var centerX = Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2); + var centerY = Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2); + if(!offsetScroll){ + return [centerX, centerY]; + }else{ + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop || 0; + return[centerX + scrollX, centerY + scrollY]; + } + }, + + + center : function(centerIn) { + if(!centerIn){ + this.setXY(this.getCenterXY(true)); + }else{ + var box = YAHOO.ext.Element.get(centerIn).getBox(); + this.setXY([box.x + (box.width / 2) - (this.getWidth() / 2), + box.y + (box.height / 2) - (this.getHeight() / 2)]); + } + return this; + }, + + + getChildrenByTagName : function(tagName){ + var children = this.dom.getElementsByTagName(tagName); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + + getChildrenByClassName : function(className, tagName){ + var children = YAHOO.util.Dom.getElementsByClassName(className, tagName, this.dom); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + + isBorderBox : function(){ + if(typeof this.bbox == 'undefined'){ + var el = this.dom; + var b = YAHOO.ext.util.Browser; + var strict = YAHOO.ext.Strict; + this.bbox = ((b.isIE && !strict && el.style.boxSizing != 'content-box') || + (b.isGecko && YAHOO.util.Dom.getStyle(el, "-moz-box-sizing") == 'border-box') || + (!b.isSafari && YAHOO.util.Dom.getStyle(el, "box-sizing") == 'border-box')); + } + return this.bbox; + }, + + + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(YAHOO.util.Dom.getStyle('left'), 10) || 0; + var top = parseInt(YAHOO.util.Dom.getStyle('top'), 10) || 0; + xy = [left, top]; + } + var el = this.dom; + var w = el.offsetWidth; + var h = el.offsetHeight; + if(!contentBox){ + return {x: xy[0], y: xy[1], width: w, height: h}; + }else{ + var l = this.getBorderWidth('l')+this.getPadding('l'); + var r = this.getBorderWidth('r')+this.getPadding('r'); + var t = this.getBorderWidth('t')+this.getPadding('t'); + var b = this.getBorderWidth('b')+this.getPadding('b'); + return {x: xy[0]+l, y: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + }, + + + setBox : function(box, adjust, animate, duration, onComplete, easing){ + var w = box.width, h = box.height; + if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){ + w -= (this.getBorderWidth('lr') + this.getPadding('lr')); + h -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + this.setBounds(box.x, box.y, w, h, animate, duration, onComplete, easing); + return this; + }, + + + repaint : function(){ + var dom = this.dom; + YAHOO.util.Dom.addClass(dom, 'yui-ext-repaint'); + setTimeout(function(){ + YAHOO.util.Dom.removeClass(dom, 'yui-ext-repaint'); + }, 1); + return this; + }, + + + getMargins : function(side){ + if(!side){ + return { + top: parseInt(this.getStyle('margin-top'), 10) || 0, + left: parseInt(this.getStyle('margin-left'), 10) || 0, + bottom: parseInt(this.getStyle('margin-bottom'), 10) || 0, + right: parseInt(this.getStyle('margin-right'), 10) || 0 + }; + }else{ + return this.addStyles(side, YAHOO.ext.Element.margins); + } + }, + + addStyles : function(sides, styles){ + var val = 0; + for(var i = 0, len = sides.length; i < len; i++){ + var w = parseInt(this.getStyle(styles[sides.charAt(i)]), 10); + if(!isNaN(w)) val += w; + } + return val; + }, + + + createProxy : function(config, renderTo, matchBox){ + if(renderTo){ + renderTo = YAHOO.util.Dom.get(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == 'object' ? + config : {tag : 'div', cls: config}; + var proxy = YAHOO.ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + + createShim : function(){ + var config = {tag : 'iframe', frameBorder:'no', cls: 'yiframe-shim', src: YAHOO.ext.SSL_SECURE_URL}; + var shim = YAHOO.ext.DomHelper.append(this.dom.parentNode, config, true); + shim.setBox(this.getBox()); + return shim; + }, + + + remove : function(){ + this.dom.parentNode.removeChild(this.dom); + delete YAHOO.ext.Element.cache[this.dom.id]; + }, + + + addClassOnOver : function(className){ + this.on('mouseover', function(){ + this.addClass(className); + }, this, true); + this.on('mouseout', function(){ + this.removeClass(className); + }, this, true); + return this; + }, + + + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + this.mon(eventName, fn); + return this; + }, + + + fitToParent : function(monitorResize){ + var p = getEl(this.dom.parentNode, true); + p.beginMeasure(); + var box = p.getBox(true, true); + p.endMeasure(); + this.setSize(box.width, box.height); + if(monitorResize === true){ + YAHOO.ext.EventManager.onWindowResize(this.fitToParent, this, true); + } + return this; + }, + + + getNextSibling : function(){ + var n = this.dom.nextSibling; + while(n && n.nodeType != 1){ + n = n.nextSibling; + } + return n; + }, + + + getPrevSibling : function(){ + var n = this.dom.previousSibling; + while(n && n.nodeType != 1){ + n = n.previousSibling; + } + return n; + }, + + + + appendChild: function(el){ + el = getEl(el); + el.appendTo(this); + return this; + }, + + + createChild: function(config, insertBefore){ + var c; + if(insertBefore){ + c = YAHOO.ext.DomHelper.insertBefore(insertBefore, config, true); + }else{ + c = YAHOO.ext.DomHelper.append(this.dom, config, true); + } + return c; + }, + + + appendTo: function(el){ + var node = getEl(el).dom; + node.appendChild(this.dom); + return this; + }, + + + insertBefore: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node); + return this; + }, + + + insertAfter: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node.nextSibling); + return this; + }, + + + wrap: function(config){ + if(!config){ + config = {tag: 'div'}; + } + var newEl = YAHOO.ext.DomHelper.insertBefore(this.dom, config, true); + newEl.dom.appendChild(this.dom); + return newEl; + }, + + + replace: function(el){ + el = getEl(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + + insertHtml : function(where, html){ + YAHOO.ext.DomHelper.insertHtml(where, this.dom, html); + return this; + }, + + + set : function(o){ + var el = this.dom; + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + return this; + } +}; + + +YAHOO.ext.Element.prototype.autoBoxAdjust = true; + +YAHOO.ext.Element.prototype.autoDisplayMode = true; + +YAHOO.ext.Element.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + +YAHOO.ext.Element.VISIBILITY = 1; + +YAHOO.ext.Element.DISPLAY = 2; + +YAHOO.ext.Element.blockElements = /^(?:address|blockquote|center|dir|div|dl|fieldset|form|h\d|hr|isindex|menu|ol|ul|p|pre|table|dd|dt|li|tbody|tr|td|thead|tfoot|iframe)$/i; +YAHOO.ext.Element.borders = {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'}; +YAHOO.ext.Element.paddings = {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'}; +YAHOO.ext.Element.margins = {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'}; + + +YAHOO.ext.Element.createStopHandler = function(stopPropagation, handler, scope, override){ + return function(e){ + if(e){ + if(stopPropagation){ + YAHOO.util.Event.stopEvent(e); + }else { + YAHOO.util.Event.preventDefault(e); + } + } + handler.call(override && scope ? scope : window, e, scope); + }; +}; + + +YAHOO.ext.Element.cache = {}; + + +YAHOO.ext.Element.get = function(el, autoGenerateId){ + if(!el){ return null; } + autoGenerateId = true; + if(el instanceof YAHOO.ext.Element){ + el.dom = YAHOO.util.Dom.get(el.id); + YAHOO.ext.Element.cache[el.id] = el; + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return YAHOO.ext.Element.select(el); + } + var key = el; + if(typeof el != 'string'){ + if(!el.id && !autoGenerateId){ return null; } + YAHOO.util.Dom.generateId(el, 'elgen-'); + key = el.id; + } + var element = YAHOO.ext.Element.cache[key]; + if(!element){ + element = new YAHOO.ext.Element(key); + if(!element.dom) return null; + YAHOO.ext.Element.cache[key] = element; + }else{ + element.dom = YAHOO.util.Dom.get(key); + } + return element; +}; + + +var getEl = YAHOO.ext.Element.get; + + +YAHOO.util.Event.addListener(window, 'unload', function(){ YAHOO.ext.Element.cache = null; }); + +YAHOO.ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +YAHOO.ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = getEl(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + YAHOO.ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + + add : function(els){ + if(typeof els == 'string'){ + this.addElements(YAHOO.ext.Element.selectorFunction(string)); + }else if(els instanceof Array){ + this.addElements(els); + }else{ + this.addElements([els]); + } + return this; + }, + + each : function(fn, scope){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++){ + fn.call(scope || els[i], els[i], this, i); + } + return this; + } +}; + +YAHOO.ext.CompositeElementLite = function(els){ + YAHOO.ext.CompositeElementLite.superclass.constructor.call(this, els); + this.el = YAHOO.ext.Element.get(this.elements[0], true); +}; +YAHOO.extendX(YAHOO.ext.CompositeElementLite, YAHOO.ext.CompositeElement, { + addElements : function(els){ + if(els){ + this.elements = this.elements.concat(els); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++) { + el.dom = els[i]; + YAHOO.ext.Element.prototype[fn].apply(el, args); + } + return this; + } +}); +YAHOO.ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in YAHOO.ext.Element.prototype){ + if(typeof YAHOO.ext.Element.prototype[fnName] == 'function'){ + YAHOO.ext.CompositeElement.createCall(YAHOO.ext.CompositeElement.prototype, fnName); + } +} +if(typeof cssQuery == 'function'){ + YAHOO.ext.Element.selectorFunction = cssQuery; +}else if(typeof document.getElementsBySelector == 'function'){ + YAHOO.ext.Element.selectorFunction = document.getElementsBySelector.createDelegate(document); +} + +YAHOO.ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == 'string'){ + els = YAHOO.ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw 'Invalid selector'; + } + if(unique === true){ + return new YAHOO.ext.CompositeElement(els); + }else{ + return new YAHOO.ext.CompositeElementLite(els); + } +}; + +var getEls = YAHOO.ext.Element.select; + + +YAHOO.ext.EventManager = new function(){ + var docReadyEvent; + var docReadyProcId; + var docReadyState = false; + this.ieDeferSrc = null; + var resizeEvent; + var resizeTask; + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(docReadyEvent){ + docReadyEvent.fire(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new YAHOO.util.CustomEvent('documentready'); + if(document.addEventListener) { + YAHOO.util.Event.on(document, "DOMContentLoaded", fireDocReady); + }else if(YAHOO.ext.util.Browser.isIE){ + + document.write(''); + YAHOO.util.Event.on('ie-deferred-loader', 'readystatechange', function(){ + if(this.readyState == 'complete'){ + fireDocReady(); + } + }); + }else if(YAHOO.ext.util.Browser.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == 'loaded' || rs == 'complete') { + fireDocReady(); + } + }, 10); + } + + YAHOO.util.Event.on(window, 'load', fireDocReady); + }; + + this.wrap = function(fn, scope, override){ + var wrappedFn = function(e){ + YAHOO.ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, YAHOO.ext.EventObject, scope); + }; + return wrappedFn; + }; + + + this.addListener = function(element, eventName, fn, scope, override){ + var wrappedFn = this.wrap(fn, scope, override); + YAHOO.util.Event.addListener(element, eventName, wrappedFn); + return wrappedFn; + }; + + + this.removeListener = function(element, eventName, wrappedFn){ + return YAHOO.util.Event.removeListener(element, eventName, wrappedFn); + }; + + + this.on = this.addListener; + + + this.onDocumentReady = function(fn, scope, override){ + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.subscribe(fn, scope, override); + } + + + this.onWindowResize = function(fn, scope, override){ + if(!resizeEvent){ + resizeEvent = new YAHOO.util.CustomEvent('windowresize'); + resizeTask = new YAHOO.ext.util.DelayedTask(function(){ + resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight()); + }); + YAHOO.util.Event.on(window, 'resize', function(){ + resizeTask.delay(50); + }); + } + resizeEvent.subscribe(fn, scope, override); + }, + + + this.removeResizeListener = function(fn, scope){ + if(resizeEvent){ + resizeEvent.unsubscribe(fn, scope); + } + } +}; + + +YAHOO.ext.EventObject = new function(){ + + this.browserEvent = null; + + this.button = -1; + + this.shiftKey = false; + + this.ctrlKey = false; + + this.altKey = false; + + + this.BACKSPACE = 8; + + this.TAB = 9; + + this.RETURN = 13; + + this.ESC = 27; + + this.SPACE = 32; + + this.PAGEUP = 33; + + this.PAGEDOWN = 34; + + this.END = 35; + + this.HOME = 36; + + this.LEFT = 37; + + this.UP = 38; + + this.RIGHT = 39; + + this.DOWN = 40; + + this.DELETE = 46; + + this.F5 = 116; + + + this.setEvent = function(e){ + this.browserEvent = e; + if(e){ + this.button = e.button; + this.shiftKey = e.shiftKey; + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + } + }; + + + this.stopEvent = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopEvent(this.browserEvent); + } + }; + + + this.preventDefault = function(){ + if(this.browserEvent){ + YAHOO.util.Event.preventDefault(this.browserEvent); + } + }; + + + this.isNavKeyPress = function(){ + return (this.browserEvent.keyCode && this.browserEvent.keyCode >= 33 && this.browserEvent.keyCode <= 40); + }; + + + this.stopPropagation = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopPropagation(this.browserEvent); + } + }; + + + this.getCharCode = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getCharCode(this.browserEvent); + } + return null; + }; + + + this.getKey = function(){ + if(this.browserEvent){ + return this.browserEvent.charCode || this.browserEvent.keyCode; + } + return null; + }; + + + this.getPageX = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageX(this.browserEvent); + } + return null; + }; + + + this.getPageY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageY(this.browserEvent); + } + return null; + }; + + + this.getTime = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTime(this.browserEvent); + } + return null; + }; + + + this.getXY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getXY(this.browserEvent); + } + return []; + }; + + + this.getTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTarget(this.browserEvent); + } + return null; + }; + + + this.findTarget = function(className, tagName){ + if(tagName) tagName = tagName.toLowerCase(); + if(this.browserEvent){ + function isMatch(el){ + if(!el){ + return false; + } + if(className && !YAHOO.util.Dom.hasClass(el, className)){ + return false; + } + if(tagName && el.tagName.toLowerCase() != tagName){ + return false; + } + return true; + }; + + var t = this.getTarget(); + if(!t || isMatch(t)){ + return t; + } + var p = t.parentNode; + var b = document.body; + while(p && p != b){ + if(isMatch(p)){ + return p; + } + p = p.parentNode; + } + } + return null; + }; + + this.getRelatedTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getRelatedTarget(this.browserEvent); + } + return null; + }; + + + this.getWheelDelta = function(){ + var e = this.browserEvent; + var delta = 0; + if(e.wheelDelta){ + delta = e.wheelDelta/120; + + if(window.opera) delta = -delta; + }else if(e.detail){ + delta = -e.detail/3; + } + return delta; + }; + + + this.hasModifier = function(){ + return this.ctrlKey || this.altKey || this.shiftKey; + }; +}(); + + + +YAHOO.ext.UpdateManager = function(el, forceNew){ + el = YAHOO.ext.Element.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + + this.el = el; + + this.defaultUrl = null; + this.beforeUpdate = new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate'); + this.onUpdate = new YAHOO.util.CustomEvent('UpdateManager.onUpdate'); + this.onFailure = new YAHOO.util.CustomEvent('UpdateManager.onFailure'); + + this.events = { + + 'beforeupdate': this.beforeUpdate, + + 'update': this.onUpdate, + + 'failure': this.onFailure + }; + + + this.sslBlankUrl = YAHOO.ext.UpdateManager.defaults.sslBlankUrl; + + this.disableCaching = YAHOO.ext.UpdateManager.defaults.disableCaching; + + this.indicatorText = YAHOO.ext.UpdateManager.defaults.indicatorText; + + this.showLoadIndicator = YAHOO.ext.UpdateManager.defaults.showLoadIndicator; + + this.timeout = YAHOO.ext.UpdateManager.defaults.timeout; + + + this.loadScripts = YAHOO.ext.UpdateManager.defaults.loadScripts; + + + this.transaction = null; + + + this.autoRefreshProcId = null; + + this.refreshDelegate = this.refresh.createDelegate(this); + + this.updateDelegate = this.update.createDelegate(this); + + this.formUpdateDelegate = this.formUpdate.createDelegate(this); + + this.successDelegate = this.processSuccess.createDelegate(this); + + this.failureDelegate = this.processFailure.createDelegate(this); + + + this.renderer = new YAHOO.ext.UpdateManager.BasicRenderer(); +}; + +YAHOO.ext.UpdateManager.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + getEl : function(){ + return this.el; + }, + + + update : function(url, params, callback, discardUrl){ + if(this.beforeUpdate.fireDirect(this.el, url, params) !== false){ + if(typeof url == 'object'){ + var cfg = url; + url = cfg.url; + params = params || cfg.params; + callback = callback || cfg.callback; + discardUrl = discardUrl || cfg.discardUrl; + if(callback && cfg.scope){ + callback = callback.createDelegate(cfg.scope); + } + if(typeof cfg.nocache != 'undefined'){this.disableCaching = cfg.nocache}; + if(typeof cfg.text != 'undefined'){this.indicatorText = cfg.text}; + if(typeof cfg.scripts != 'undefined'){this.loadScripts = cfg.scripts}; + if(typeof cfg.timeout != 'undefined'){this.timeout = cfg.timeout}; + } + this.showLoading(); + if(!discardUrl){ + this.defaultUrl = url; + } + if(typeof url == 'function'){ + url = url(); + } + if(params && typeof params != 'string'){ + var buf = []; + for(var key in params){ + if(typeof params[key] != 'function'){ + buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&'); + } + } + delete buf[buf.length-1]; + params = buf.join(''); + } + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': null, 'callback': callback, 'params': params} + }; + var method = params ? 'POST' : 'GET'; + if(method == 'GET'){ + url = this.prepareUrl(url); + } + this.transaction = YAHOO.util.Connect.asyncRequest(method, url, callback, params); + } + }, + + + formUpdate : function(form, url, reset, callback){ + if(this.beforeUpdate.fireDirect(this.el, form, url) !== false){ + this.showLoading(); + formEl = YAHOO.util.Dom.get(form); + if(typeof url == 'function'){ + url = url(); + } + url = url || formEl.action; + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': form, 'callback': callback, 'reset': reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute('enctype'); + if(enctype && enctype.toLowerCase() == 'multipart/form-data'){ + isUpload = true; + } + YAHOO.util.Connect.setForm(form, isUpload, this.sslBlankUrl); + this.transaction = YAHOO.util.Connect.asyncRequest('POST', url, callback); + } + }, + + + refresh : function(callback){ + if(this.defaultUrl == null){ + return; + } + this.update(this.defaultUrl, null, callback, true); + }, + + + startAutoRefresh : function(interval, url, params, callback, refreshNow){ + if(refreshNow){ + this.update(url || this.defaultUrl, params, callback, true); + } + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000); + }, + + + stopAutoRefresh : function(){ + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + }, + + + showLoading : function(){ + if(this.showLoadIndicator){ + this.el.update(this.indicatorText); + } + }, + + + prepareUrl : function(url){ + if(this.disableCaching){ + var append = '_dc=' + (new Date().getTime()); + if(url.indexOf('?') !== -1){ + url += '&' + append; + }else{ + url += '?' + append; + } + } + return url; + }, + + + processSuccess : function(response){ + this.transaction = null; + if(response.argument.form && response.argument.reset){ + try{ + response.argument.form.reset(); + }catch(e){} + } + if(this.loadScripts){ + this.renderer.render(this.el, response, this, + this.updateComplete.createDelegate(this, [response])); + }else{ + this.renderer.render(this.el, response, this); + this.updateComplete(response); + } + }, + + updateComplete : function(response){ + this.fireEvent('update', this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, true); + } + }, + + + processFailure : function(response){ + this.transaction = null; + this.onFailure.fireDirect(this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, false); + } + }, + + + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + + abort : function(){ + if(this.transaction){ + YAHOO.util.Connect.abort(this.transaction); + } + }, + + + isUpdating : function(){ + if(this.transaction){ + return YAHOO.util.Connect.isCallInProgress(this.transaction); + } + return false; + } +}; + + + YAHOO.ext.UpdateManager.defaults = { + + timeout : 30, + + + loadScripts : false, + + + sslBlankUrl : (YAHOO.ext.SSL_SECURE_URL || 'javascript:false'), + + disableCaching : false, + + showLoadIndicator : true, + + indicatorText : '
        Loading...
        ' + }; + + +YAHOO.ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = getEl(el, true).getUpdateManager(); + YAHOO.ext.util.Config.apply(um, options); + um.update(url, params, options.callback); +} + +YAHOO.ext.UpdateManager.update = YAHOO.ext.UpdateManager.updateElement; + +YAHOO.ext.UpdateManager.BasicRenderer = function(){}; + +YAHOO.ext.UpdateManager.BasicRenderer.prototype = { + + render : function(el, response, updateManager, callback){ + el.update(response.responseText, updateManager.loadScripts, callback); + } +}; + diff --git a/www/extras/yui-ext/yui-ext-core.js b/www/extras/yui-ext/yui-ext-core.js new file mode 100644 index 000000000..96834c795 --- /dev/null +++ b/www/extras/yui-ext/yui-ext-core.js @@ -0,0 +1,187 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.namespace('ext');YAHOO.namespace('ext.util');YAHOO.namespace('ext.grid');YAHOO.ext.Strict=(document.compatMode=='CSS1Compat');YAHOO.ext.SSL_SECURE_URL='javascript:false';window.undefined=undefined;Function.prototype.createCallback=function(){var args=arguments;var method=this;return function(){return method.apply(window,args);};};Function.prototype.createDelegate=function(obj,args,appendArgs){var method=this;return function(){var callargs=args||arguments;if(appendArgs===true){callArgs=Array.prototype.slice.call(arguments,0);callargs=callArgs.concat(args);}else if(typeof appendArgs=='number'){callargs=Array.prototype.slice.call(arguments,0);var applyArgs=[appendArgs,0].concat(args);Array.prototype.splice.apply(callargs,applyArgs);} +return method.apply(obj||window,callargs);};};Function.prototype.defer=function(millis,obj,args,appendArgs){return setTimeout(this.createDelegate(obj,args,appendArgs),millis);};Function.prototype.createSequence=function(fcn,scope){if(typeof fcn!='function'){return this;} +var method=this;return function(){var retval=method.apply(this||window,arguments);fcn.apply(scope||this||window,arguments);return retval;};};Function.prototype.createInterceptor=function(fcn,scope){if(typeof fcn!='function'){return this;} +var method=this;return function(){fcn.target=this;fcn.method=method;if(fcn.apply(scope||this||window,arguments)===false){return;} +return method.apply(this||window,arguments);;};};YAHOO.ext.util.Browser=new function(){var ua=navigator.userAgent.toLowerCase();this.isOpera=(ua.indexOf('opera')>-1);this.isSafari=(ua.indexOf('webkit')>-1);this.isIE=(window.ActiveXObject);this.isIE7=(ua.indexOf('msie 7')>-1);this.isGecko=!this.isSafari&&(ua.indexOf('gecko')>-1);if(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1){this.isWindows=true;}else if(ua.indexOf("macintosh")!=-1){this.isMac=true;}}();YAHOO.print=function(arg1,arg2,etc){if(!YAHOO.ext._console){var cs=YAHOO.ext.DomHelper.insertBefore(document.body.firstChild,{tag:'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;'+'background:white;position:absolute;right:5px;top:5px;'+'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'},true);new YAHOO.ext.Resizable(cs,{transparent:true,handles:'all',pinned:true,adjustments:[0,0],wrap:true,draggable:(YAHOO.util.DD?true:false)});cs.on('dblclick',cs.hide);YAHOO.ext._console=cs;} +var msg='';for(var i=0,len=arguments.length;i';} +YAHOO.ext._console.dom.innerHTML=msg+YAHOO.ext._console.dom.innerHTML;YAHOO.ext._console.dom.scrollTop=0;YAHOO.ext._console.show();};YAHOO.printf=function(format,arg1,arg2,etc){var args=Array.prototype.slice.call(arguments,1);YAHOO.print(format.replace(/\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g,function(m,a1,a2,a3){if(m.chatAt=='{'){return m.slice(1,-1);} +var rpl=args[a1];if(a3){var f=eval(a3);rpl=f(rpl);} +return rpl?rpl:'';}));} +YAHOO.util.CustomEvent.prototype.fireDirect=function(){var len=this.subscribers.length;for(var i=0;i';} +return b;} +var createDom=function(o,parentNode){var el=d.createElement(o.tag);var useSet=el.setAttribute?true:false;for(var attr in o){if(attr=='tag'||attr=='children'||attr=='html'||attr=='style'||typeof o[attr]=='function')continue;if(attr=='cls'){el.className=o['cls'];}else{if(useSet)el.setAttribute(attr,o[attr]);else el[attr]=o[attr];}} +YAHOO.ext.DomHelper.applyStyles(el,o.style);if(o.children){for(var i=0,len=o.children.length;i'+html+'';node=tempTableEl.firstChild.firstChild.firstChild;}else{tempTableEl.innerHTML=''+html+'
        ';node=tempTableEl.firstChild.firstChild.firstChild.firstChild;} +if(where=='beforebegin'){el.parentNode.insertBefore(node,el);return node;}else if(where=='afterbegin'){el.insertBefore(node,el.firstChild);return node;}else if(where=='beforeend'){el.appendChild(node);return node;}else if(where=='afterend'){el.parentNode.insertBefore(node,el.nextSibling);return node;}} +this.insertHtml=function(where,el,html){where=where.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=='table'||tag=='tbody'||tag=='tr'){return insertIntoTable(tag,where,el,html);} +switch(where){case'beforebegin':el.insertAdjacentHTML(where,html);return el.previousSibling;case'afterbegin':el.insertAdjacentHTML(where,html);return el.firstChild;case'beforeend':el.insertAdjacentHTML(where,html);return el.lastChild;case'afterend':el.insertAdjacentHTML(where,html);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';} +var range=el.ownerDocument.createRange();var frag;switch(where){case'beforebegin':range.setStartBefore(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el);return el.previousSibling;case'afterbegin':if(el.firstChild){range.setStartBefore(el.firstChild);}else{range.selectNodeContents(el);range.collapse(true);} +frag=range.createContextualFragment(html);el.insertBefore(frag,el.firstChild);return el.firstChild;case'beforeend':if(el.lastChild){range.setStartAfter(el.lastChild);}else{range.selectNodeContents(el);range.collapse(false);} +frag=range.createContextualFragment(html);el.appendChild(frag);return el.lastChild;case'afterend':range.setStartAfter(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el.nextSibling);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';};this.insertBefore=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el);}else{var html=createHtml(o);newNode=this.insertHtml('beforeBegin',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.insertAfter=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el.nextSibling);}else{var html=createHtml(o);newNode=this.insertHtml('afterEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.append=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.appendChild(newNode);}else{var html=createHtml(o);newNode=this.insertHtml('beforeEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.overwrite=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML=createHtml(o);return returnElement?YAHOO.ext.Element.get(el.firstChild,true):el.firstChild;};this.createTemplate=function(o){var html=createHtml(o);return new YAHOO.ext.DomHelper.Template(html);};}();YAHOO.ext.DomHelper.Template=function(html){this.html=html;this.re=/\{(\w+)\}/g;};YAHOO.ext.DomHelper.Template.prototype={applyTemplate:function(values){if(this.compiled){return this.compiled(values);} +var empty='';var fn=function(match,index){if(typeof values[index]!='undefined'){return values[index];}else{return empty;}} +return this.html.replace(this.re,fn);},compile:function(){var html=this.html;var re=/\{(\w+)\}/g;var body=[];body.push("this.compiled = function(values){ return [");var result;var lastMatchEnd=0;while((result=re.exec(html))!=null){body.push("'",html.substring(lastMatchEnd,result.index),"', ");body.push("values['",html.substring(result.index+1,re.lastIndex-1),"'], ");lastMatchEnd=re.lastIndex;} +body.push("'",html.substr(lastMatchEnd),"'].join('');};");eval(body.join(''));},insertBefore:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeBegin',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},insertAfter:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('afterEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},append:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},overwrite:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML='';var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;}};YAHOO.ext.Template=YAHOO.ext.DomHelper.Template; + +YAHOO.ext.Element=function(element,forceNew){var dom=YAHOO.util.Dom.get(element);if(!dom){return null;} +if(!forceNew&&YAHOO.ext.Element.cache[dom.id]){return YAHOO.ext.Element.cache[dom.id];} +this.dom=dom;this.id=this.dom.id;this.visibilityMode=YAHOO.ext.Element.VISIBILITY;this.originalDisplay=YAHOO.util.Dom.getStyle(this.dom,'display')||'';if(this.autoDisplayMode){if(this.originalDisplay=='none'){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);}} +if(this.originalDisplay=='none'){this.originalDisplay='';} +this.defaultUnit='px';} +YAHOO.ext.Element.prototype={setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this;},enableDisplayMode:function(display){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);if(typeof display!='undefined')this.originalDisplay=display;return this;},animate:function(args,duration,onComplete,easing,animType){this.anim(args,duration,onComplete,easing,animType);return this;},anim:function(args,duration,onComplete,easing,animType){animType=animType||YAHOO.util.Anim;var anim=new animType(this.dom,args,duration||.35,easing||YAHOO.util.Easing.easeBoth);if(onComplete){if(!(onComplete instanceof Array)){anim.onComplete.subscribe(onComplete,this,true);}else{for(var i=0;icontainerBottom){c.scrollTop=childBottom-c.clientHeight;} +if(restorePos){c.setStyle('position',cp);} +return this;},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=='function'){onComplete();}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=='function')onComplete();}.createDelegate(this),easing);}}.createDelegate(this),0);return this;},isVisible:function(deep){var vis=YAHOO.util.Dom.getStyle(this.dom,'visibility')!='hidden'&&YAHOO.util.Dom.getStyle(this.dom,'display')!='none';if(!deep||!vis){return vis;} +var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'visibility')=='hidden'||YAHOO.util.Dom.getStyle(p,'display')=='none'){return false;} +p=p.parentNode;} +return true;},select:function(selector,unique){return YAHOO.ext.Element.select('#'+this.dom.id+' '+selector,unique);},initDD:function(group,config,overrides){var dd=new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDProxy:function(group,config,overrides){var dd=new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDTarget:function(group,config,overrides){var dd=new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},setVisible:function(visible,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}else{this.setOpacity(visible?0:1);YAHOO.util.Dom.setStyle(this.dom,'visibility','visible');if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(true);} +var args={opacity:{from:(visible?0:1),to:(visible?1:0)}};var anim=new YAHOO.util.Anim(this.dom,args,duration||.35,easing||(visible?YAHOO.util.Easing.easeIn:YAHOO.util.Easing.easeOut));anim.onComplete.subscribe((function(){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}).createDelegate(this));if(onComplete){anim.onComplete.subscribe(onComplete);} +anim.animate();} +return this;},isDisplayed:function(){return YAHOO.util.Dom.getStyle(this.dom,'display')!='none';},toggle:function(animate,duration,onComplete,easing){this.setVisible(!this.isVisible(),animate,duration,onComplete,easing);return this;},setDisplayed:function(value){if(typeof value=='boolean'){value=value?this.originalDisplay:'none';} +YAHOO.util.Dom.setStyle(this.dom,'display',value);return this;},focus:function(){try{this.dom.focus();}catch(e){} +return this;},addClass:function(className){YAHOO.util.Dom.addClass(this.dom,className);return this;},radioClass:function(className){var siblings=this.dom.parentNode.childNodes;for(var i=0;ithis.getWidth()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setHeight:function(height,animate,duration,onComplete,easing){height=this.adjustHeight(height);if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'height',this.addUnits(height));}else{this.anim({height:{to:height}},duration,onComplete,easing||(height>this.getHeight()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setSize:function(width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({width:{to:width},height:{to:height}},duration,onComplete,easing);} +return this;},setBounds:function(x,y,width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);this.setLocation(x,y);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({points:{to:[x,y]},width:{to:width},height:{to:height}},duration,onComplete,easing,YAHOO.util.Motion);} +return this;},setRegion:function(region,animate,duration,onComplete,easing){this.setBounds(region.left,region.top,region.right-region.left,region.bottom-region.top,animate,duration,onComplete,easing);return this;},addListener:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addHandler:function(eventName,stopPropagation,handler,scope,override){var fn=YAHOO.ext.Element.createStopHandler(stopPropagation,handler,scope||this,true);YAHOO.util.Event.addListener(this.dom,eventName,fn);return this;},on:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addManagedListener:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},mon:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},removeListener:function(eventName,handler,scope){YAHOO.util.Event.removeListener(this.dom,eventName,handler,scope||this);return this;},removeAllListeners:function(){YAHOO.util.Event.purgeElement(this.dom);return this;},setOpacity:function(opacity,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'opacity',opacity);}else{this.anim({opacity:{to:opacity}},duration,onComplete,easing);} +return this;},getLeft:function(local){if(!local){return this.getX();}else{return parseInt(this.getStyle('left'),10)||0;}},getRight:function(local){if(!local){return this.getX()+this.getWidth();}else{return(this.getLeft(true)+this.getWidth())||0;}},getTop:function(local){if(!local){return this.getY();}else{return parseInt(this.getStyle('top'),10)||0;}},getBottom:function(local){if(!local){return this.getY()+this.getHeight();}else{return(this.getTop(true)+this.getHeight())||0;}},setAbsolutePositioned:function(zIndex){this.setStyle('position','absolute');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},setRelativePositioned:function(zIndex){this.setStyle('position','relative');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},clearPositioning:function(){this.setStyle('position','');this.setStyle('left','');this.setStyle('right','');this.setStyle('top','');this.setStyle('bottom','');return this;},getPositioning:function(){return{'position':this.getStyle('position'),'left':this.getStyle('left'),'right':this.getStyle('right'),'top':this.getStyle('top'),'bottom':this.getStyle('bottom')};},getBorderWidth:function(side){return this.addStyles(side,YAHOO.ext.Element.borders);},getPadding:function(side){return this.addStyles(side,YAHOO.ext.Element.paddings);},setPositioning:function(positionCfg){if(positionCfg.position)this.setStyle('position',positionCfg.position);if(positionCfg.left)this.setLeft(positionCfg.left);if(positionCfg.right)this.setRight(positionCfg.right);if(positionCfg.top)this.setTop(positionCfg.top);if(positionCfg.bottom)this.setBottom(positionCfg.bottom);return this;},setLeftTop:function(left,top){this.dom.style.left=this.addUnits(left);this.dom.style.top=this.addUnits(top);return this;},move:function(direction,distance,animate,duration,onComplete,easing){var xy=this.getXY();direction=direction.toLowerCase();switch(direction){case'l':case'left':this.moveTo(xy[0]-distance,xy[1],animate,duration,onComplete,easing);break;case'r':case'right':this.moveTo(xy[0]+distance,xy[1],animate,duration,onComplete,easing);break;case't':case'top':case'up':this.moveTo(xy[0],xy[1]-distance,animate,duration,onComplete,easing);break;case'b':case'bottom':case'down':this.moveTo(xy[0],xy[1]+distance,animate,duration,onComplete,easing);break;} +return this;},clip:function(){if(!this.isClipped){this.isClipped=true;this.originalClip={'o':this.getStyle('overflow'),'x':this.getStyle('overflow-x'),'y':this.getStyle('overflow-y')};this.setStyle('overflow','hidden');this.setStyle('overflow-x','hidden');this.setStyle('overflow-y','hidden');} +return this;},unclip:function(){if(this.isClipped){this.isClipped=false;var o=this.originalClip;if(o.o){this.setStyle('overflow',o.o);} +if(o.x){this.setStyle('overflow-x',o.x);} +if(o.y){this.setStyle('overflow-y',o.y);}} +return this;},alignTo:function(element,position,offsets,animate,duration,onComplete,easing){var otherEl=getEl(element);if(!otherEl){return this;} +offsets=offsets||[0,0];var r=otherEl.getRegion();position=position.toLowerCase();switch(position){case'bl':this.moveTo(r.left+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'br':this.moveTo(r.right+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'tl':this.moveTo(r.left+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;case'tr':this.moveTo(r.right+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;} +return this;},clearOpacity:function(){if(window.ActiveXObject){this.dom.style.filter='';}else{this.dom.style.opacity='';this.dom.style['-moz-opacity']='';this.dom.style['-khtml-opacity']='';} +return this;},hide:function(animate,duration,onComplete,easing){this.setVisible(false,animate,duration,onComplete,easing);return this;},show:function(animate,duration,onComplete,easing){this.setVisible(true,animate,duration,onComplete,easing);return this;},addUnits:function(size){if(size===''||size=='auto'||typeof size=='undefined'){return size;} +if(typeof size=='number'||!YAHOO.ext.Element.unitPattern.test(size)){return size+this.defaultUnit;} +return size;},beginMeasure:function(){var el=this.dom;if(el.offsetWidth||el.offsetHeight){return this;} +var changed=[];var p=this.dom;while((!el.offsetWidth&&!el.offsetHeight)&&p&&p.tagName&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'display')=='none'){changed.push({el:p,visibility:YAHOO.util.Dom.getStyle(p,'visibility')});p.style.visibility='hidden';p.style.display='block';} +p=p.parentNode;} +this._measureChanged=changed;return this;},endMeasure:function(){var changed=this._measureChanged;if(changed){for(var i=0,len=changed.length;i';YAHOO.util.Event.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:)((\n|\r|.)*?)(?:<\/script>)/img;var srcRe=/\ssrc=[\'\"](.*)[\'\"]/i;var match;while(match=re.exec(html)){var srcMatch=match[0].match(srcRe);if(srcMatch&&srcMatch[1]){var s0=document.createElement("script");s0.src=srcMatch[1];hd.appendChild(s0);}else if(match[1]){eval(match[1]);}} +var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);} +if(typeof callback=='function'){callback();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img,'');return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new YAHOO.ext.UpdateManager(this);} +return this.updateManager;},unselectable:function(){this.dom.unselectable='on';this.swallowEvent('selectstart',true);this.applyStyles('-moz-user-select:none;-khtml-user-select:none;');return this;},getCenterXY:function(offsetScroll){var centerX=Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2);var centerY=Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2);if(!offsetScroll){return[centerX,centerY];}else{var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft||0;var scrollY=document.documentElement.scrollTop||document.body.scrollTop||0;return[centerX+scrollX,centerY+scrollY];}},center:function(centerIn){if(!centerIn){this.setXY(this.getCenterXY(true));}else{var box=YAHOO.ext.Element.get(centerIn).getBox();this.setXY([box.x+(box.width/2)-(this.getWidth()/2),box.y+(box.height/2)-(this.getHeight()/2)]);} +return this;},getChildrenByTagName:function(tagName){var children=this.dom.getElementsByTagName(tagName);var len=children.length;var ce=new Array(len);for(var i=0;i');YAHOO.util.Event.on('ie-deferred-loader','readystatechange',function(){if(this.readyState=='complete'){fireDocReady();}});}else if(YAHOO.ext.util.Browser.isSafari){docReadyProcId=setInterval(function(){var rs=document.readyState;if(rs=='loaded'||rs=='complete'){fireDocReady();}},10);} +YAHOO.util.Event.on(window,'load',fireDocReady);};this.wrap=function(fn,scope,override){var wrappedFn=function(e){YAHOO.ext.EventObject.setEvent(e);fn.call(override?scope||window:window,YAHOO.ext.EventObject,scope);};return wrappedFn;};this.addListener=function(element,eventName,fn,scope,override){var wrappedFn=this.wrap(fn,scope,override);YAHOO.util.Event.addListener(element,eventName,wrappedFn);return wrappedFn;};this.removeListener=function(element,eventName,wrappedFn){return YAHOO.util.Event.removeListener(element,eventName,wrappedFn);};this.on=this.addListener;this.onDocumentReady=function(fn,scope,override){if(!docReadyEvent){initDocReady();} +docReadyEvent.subscribe(fn,scope,override);} +this.onWindowResize=function(fn,scope,override){if(!resizeEvent){resizeEvent=new YAHOO.util.CustomEvent('windowresize');resizeTask=new YAHOO.ext.util.DelayedTask(function(){resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight());});YAHOO.util.Event.on(window,'resize',function(){resizeTask.delay(50);});} +resizeEvent.subscribe(fn,scope,override);},this.removeResizeListener=function(fn,scope){if(resizeEvent){resizeEvent.unsubscribe(fn,scope);}}};YAHOO.ext.EventObject=new function(){this.browserEvent=null;this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;this.BACKSPACE=8;this.TAB=9;this.RETURN=13;this.ESC=27;this.SPACE=32;this.PAGEUP=33;this.PAGEDOWN=34;this.END=35;this.HOME=36;this.LEFT=37;this.UP=38;this.RIGHT=39;this.DOWN=40;this.DELETE=46;this.F5=116;this.setEvent=function(e){this.browserEvent=e;if(e){this.button=e.button;this.shiftKey=e.shiftKey;this.ctrlKey=e.ctrlKey;this.altKey=e.altKey;}else{this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;}};this.stopEvent=function(){if(this.browserEvent){YAHOO.util.Event.stopEvent(this.browserEvent);}};this.preventDefault=function(){if(this.browserEvent){YAHOO.util.Event.preventDefault(this.browserEvent);}};this.isNavKeyPress=function(){return(this.browserEvent.keyCode&&this.browserEvent.keyCode>=33&&this.browserEvent.keyCode<=40);};this.stopPropagation=function(){if(this.browserEvent){YAHOO.util.Event.stopPropagation(this.browserEvent);}};this.getCharCode=function(){if(this.browserEvent){return YAHOO.util.Event.getCharCode(this.browserEvent);} +return null;};this.getKey=function(){if(this.browserEvent){return this.browserEvent.charCode||this.browserEvent.keyCode;} +return null;};this.getPageX=function(){if(this.browserEvent){return YAHOO.util.Event.getPageX(this.browserEvent);} +return null;};this.getPageY=function(){if(this.browserEvent){return YAHOO.util.Event.getPageY(this.browserEvent);} +return null;};this.getTime=function(){if(this.browserEvent){return YAHOO.util.Event.getTime(this.browserEvent);} +return null;};this.getXY=function(){if(this.browserEvent){return YAHOO.util.Event.getXY(this.browserEvent);} +return[];};this.getTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getTarget(this.browserEvent);} +return null;};this.findTarget=function(className,tagName){if(tagName)tagName=tagName.toLowerCase();if(this.browserEvent){function isMatch(el){if(!el){return false;} +if(className&&!YAHOO.util.Dom.hasClass(el,className)){return false;} +if(tagName&&el.tagName.toLowerCase()!=tagName){return false;} +return true;};var t=this.getTarget();if(!t||isMatch(t)){return t;} +var p=t.parentNode;var b=document.body;while(p&&p!=b){if(isMatch(p)){return p;} +p=p.parentNode;}} +return null;};this.getRelatedTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getRelatedTarget(this.browserEvent);} +return null;};this.getWheelDelta=function(){var e=this.browserEvent;var delta=0;if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera)delta=-delta;}else if(e.detail){delta=-e.detail/3;} +return delta;};this.hasModifier=function(){return this.ctrlKey||this.altKey||this.shiftKey;};}(); + +YAHOO.ext.UpdateManager=function(el,forceNew){el=YAHOO.ext.Element.get(el);if(!forceNew&&el.updateManager){return el.updateManager;} +this.el=el;this.defaultUrl=null;this.beforeUpdate=new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate');this.onUpdate=new YAHOO.util.CustomEvent('UpdateManager.onUpdate');this.onFailure=new YAHOO.util.CustomEvent('UpdateManager.onFailure');this.events={'beforeupdate':this.beforeUpdate,'update':this.onUpdate,'failure':this.onFailure};this.sslBlankUrl=YAHOO.ext.UpdateManager.defaults.sslBlankUrl;this.disableCaching=YAHOO.ext.UpdateManager.defaults.disableCaching;this.indicatorText=YAHOO.ext.UpdateManager.defaults.indicatorText;this.showLoadIndicator=YAHOO.ext.UpdateManager.defaults.showLoadIndicator;this.timeout=YAHOO.ext.UpdateManager.defaults.timeout;this.loadScripts=YAHOO.ext.UpdateManager.defaults.loadScripts;this.transaction=null;this.autoRefreshProcId=null;this.refreshDelegate=this.refresh.createDelegate(this);this.updateDelegate=this.update.createDelegate(this);this.formUpdateDelegate=this.formUpdate.createDelegate(this);this.successDelegate=this.processSuccess.createDelegate(this);this.failureDelegate=this.processFailure.createDelegate(this);this.renderer=new YAHOO.ext.UpdateManager.BasicRenderer();};YAHOO.ext.UpdateManager.prototype={fireEvent:YAHOO.ext.util.Observable.prototype.fireEvent,on:YAHOO.ext.util.Observable.prototype.on,addListener:YAHOO.ext.util.Observable.prototype.addListener,delayedListener:YAHOO.ext.util.Observable.prototype.delayedListener,removeListener:YAHOO.ext.util.Observable.prototype.removeListener,purgeListeners:YAHOO.ext.util.Observable.prototype.purgeListeners,getEl:function(){return this.el;},update:function(url,params,callback,discardUrl){if(this.beforeUpdate.fireDirect(this.el,url,params)!==false){if(typeof url=='object'){var cfg=url;url=cfg.url;params=params||cfg.params;callback=callback||cfg.callback;discardUrl=discardUrl||cfg.discardUrl;if(callback&&cfg.scope){callback=callback.createDelegate(cfg.scope);} +if(typeof cfg.nocache!='undefined'){this.disableCaching=cfg.nocache};if(typeof cfg.text!='undefined'){this.indicatorText=cfg.text};if(typeof cfg.scripts!='undefined'){this.loadScripts=cfg.scripts};if(typeof cfg.timeout!='undefined'){this.timeout=cfg.timeout};} +this.showLoading();if(!discardUrl){this.defaultUrl=url;} +if(typeof url=='function'){url=url();} +if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':null,'callback':callback,'params':params}};var method=params?'POST':'GET';if(method=='GET'){url=this.prepareUrl(url);} +this.transaction=YAHOO.util.Connect.asyncRequest(method,url,callback,params);}},formUpdate:function(form,url,reset,callback){if(this.beforeUpdate.fireDirect(this.el,form,url)!==false){this.showLoading();formEl=YAHOO.util.Dom.get(form);if(typeof url=='function'){url=url();} +url=url||formEl.action;var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':form,'callback':callback,'reset':reset}};var isUpload=false;var enctype=formEl.getAttribute('enctype');if(enctype&&enctype.toLowerCase()=='multipart/form-data'){isUpload=true;} +YAHOO.util.Connect.setForm(form,isUpload,this.sslBlankUrl);this.transaction=YAHOO.util.Connect.asyncRequest('POST',url,callback);}},refresh:function(callback){if(this.defaultUrl==null){return;} +this.update(this.defaultUrl,null,callback,true);},startAutoRefresh:function(interval,url,params,callback,refreshNow){if(refreshNow){this.update(url||this.defaultUrl,params,callback,true);} +if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);} +this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[url||this.defaultUrl,params,callback,true]),interval*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);}},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText);}},prepareUrl:function(url){if(this.disableCaching){var append='_dc='+(new Date().getTime());if(url.indexOf('?')!==-1){url+='&'+append;}else{url+='?'+append;}} +return url;},processSuccess:function(response){this.transaction=null;if(response.argument.form&&response.argument.reset){try{response.argument.form.reset();}catch(e){}} +if(this.loadScripts){this.renderer.render(this.el,response,this,this.updateComplete.createDelegate(this,[response]));}else{this.renderer.render(this.el,response,this);this.updateComplete(response);}},updateComplete:function(response){this.fireEvent('update',this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,true);}},processFailure:function(response){this.transaction=null;this.onFailure.fireDirect(this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,false);}},setRenderer:function(renderer){this.renderer=renderer;},getRenderer:function(){return this.renderer;},setDefaultUrl:function(defaultUrl){this.defaultUrl=defaultUrl;},abort:function(){if(this.transaction){YAHOO.util.Connect.abort(this.transaction);}},isUpdating:function(){if(this.transaction){return YAHOO.util.Connect.isCallInProgress(this.transaction);} +return false;}};YAHOO.ext.UpdateManager.defaults={timeout:30,loadScripts:false,sslBlankUrl:(YAHOO.ext.SSL_SECURE_URL||'javascript:false'),disableCaching:false,showLoadIndicator:true,indicatorText:'
        Loading...
        '};YAHOO.ext.UpdateManager.updateElement=function(el,url,params,options){var um=getEl(el,true).getUpdateManager();YAHOO.ext.util.Config.apply(um,options);um.update(url,params,options.callback);} +YAHOO.ext.UpdateManager.update=YAHOO.ext.UpdateManager.updateElement;YAHOO.ext.UpdateManager.BasicRenderer=function(){};YAHOO.ext.UpdateManager.BasicRenderer.prototype={render:function(el,response,updateManager,callback){el.update(response.responseText,updateManager.loadScripts,callback);}}; diff --git a/www/extras/yui-ext/yui-ext-debug.js b/www/extras/yui-ext/yui-ext-debug.js new file mode 100644 index 000000000..999269a8c --- /dev/null +++ b/www/extras/yui-ext/yui-ext-debug.js @@ -0,0 +1,12918 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + +YAHOO.namespace('ext'); +YAHOO.namespace('ext.util'); +YAHOO.namespace('ext.grid'); +YAHOO.ext.Strict = (document.compatMode == 'CSS1Compat'); +YAHOO.ext.SSL_SECURE_URL = 'javascript:false'; + +window.undefined = undefined; + + + +Function.prototype.createCallback = function(){ + + var args = arguments; + var method = this; + return function() { + return method.apply(window, args); + }; +}; + + +Function.prototype.createDelegate = function(obj, args, appendArgs){ + var method = this; + return function() { + var callargs = args || arguments; + if(appendArgs === true){ + callArgs = Array.prototype.slice.call(arguments, 0); + callargs = callArgs.concat(args); + }else if(typeof appendArgs == 'number'){ + callargs = Array.prototype.slice.call(arguments, 0); + var applyArgs = [appendArgs, 0].concat(args); + Array.prototype.splice.apply(callargs, applyArgs); + } + return method.apply(obj || window, callargs); + }; +}; + + +Function.prototype.defer = function(millis, obj, args, appendArgs){ + return setTimeout(this.createDelegate(obj, args, appendArgs), millis); +}; + +Function.prototype.createSequence = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + var retval = method.apply(this || window, arguments); + fcn.apply(scope || this || window, arguments); + return retval; + }; +}; + + +Function.prototype.createInterceptor = function(fcn, scope){ + if(typeof fcn != 'function'){ + return this; + } + var method = this; + return function() { + fcn.target = this; + fcn.method = method; + if(fcn.apply(scope || this || window, arguments) === false){ + return; + } + return method.apply(this || window, arguments);; + }; +}; + + +YAHOO.ext.util.Browser = new function(){ + var ua = navigator.userAgent.toLowerCase(); + + this.isOpera = (ua.indexOf('opera') > -1); + + this.isSafari = (ua.indexOf('webkit') > -1); + + this.isIE = (window.ActiveXObject); + + this.isIE7 = (ua.indexOf('msie 7') > -1); + + this.isGecko = !this.isSafari && (ua.indexOf('gecko') > -1); + + if(ua.indexOf("windows") != -1 || ua.indexOf("win32") != -1){ + + this.isWindows = true; + }else if(ua.indexOf("macintosh") != -1){ + + this.isMac = true; + } +}(); + +YAHOO.print = function(arg1, arg2, etc){ + if(!YAHOO.ext._console){ + var cs = YAHOO.ext.DomHelper.insertBefore(document.body.firstChild, + {tag: 'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;' + + 'background:white;position:absolute;right:5px;top:5px;' + + 'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'}, true); + new YAHOO.ext.Resizable(cs, { + transparent:true, + handles: 'all', + pinned:true, + adjustments: [0,0], + wrap:true, + draggable:(YAHOO.util.DD ? true : false) + }); + cs.on('dblclick', cs.hide); + YAHOO.ext._console = cs; + } + var msg = ''; + for(var i = 0, len = arguments.length; i < len; i++) { + msg += arguments[i] + '
        '; + } + YAHOO.ext._console.dom.innerHTML = msg + YAHOO.ext._console.dom.innerHTML; + YAHOO.ext._console.dom.scrollTop = 0; + YAHOO.ext._console.show(); +}; + +YAHOO.printf = function(format, arg1, arg2, etc){ + var args = Array.prototype.slice.call(arguments, 1); + YAHOO.print(format.replace( + /\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g, + function(m, a1, a2, a3) { + if (m.chatAt == '{') { + return m.slice(1, -1); + } + var rpl = args[a1]; + if (a3) { + var f = eval(a3); + rpl = f(rpl); + } + return rpl ? rpl : ''; + })); +} + + +YAHOO.util.CustomEvent.prototype.fireDirect = function(){ + var len=this.subscribers.length; + for (var i=0; i 1 || objs instanceof Array){ + var args = arguments.length > 1 ? arguments : objs; + for(var i = 0, len = args.length; i < len; i++){ + this.add(args[i]); + } + }else{ + for(var key in objs){ + if(this.allowFunctions || typeof objs[key] != 'function'){ + this.add(objs[key], key); + } + } + } + }, + + + each : function(fn, scope){ + for(var i = 0, len = this.items.length; i < len; i++){ + fn.call(scope || window, this.items[i]); + } + }, + + + eachKey : function(fn, scope){ + for(var i = 0, len = this.keys.length; i < len; i++){ + fn.call(scope || window, this.keys[i], this.items[i]); + } + }, + + + find : function(fn, scope){ + for(var i = 0, len = this.items.length; i < len; i++){ + if(fn.call(scope || window, this.items[i])){ + return this.items[i]; + } + } + return null; + }, + + + insert : function(index, key, o){ + if(arguments.length == 2){ + o = arguments[1]; + key = this.getKey(o); + } + if(index >= this.items.length){ + return this.add(o, key); + } + this.items.splice(index, 0, o); + if(typeof key != 'undefined' && key != null){ + this.items[key] = o; + this.keys.splice(index, 0, key); + } + this.fireEvent('add', index, o, key); + return o; + }, + + + remove : function(o){ + var index = this.indexOf(o); + this.items.splice(index, 1); + if(typeof this.keys[index] != 'undefined'){ + var key = this.keys[index]; + this.keys.splice(index, 1); + delete this.items[key]; + } + this.fireEvent('remove', o); + return o; + }, + + + removeAt : function(index){ + this.items.splice(index, 1); + var key = this.keys[index]; + if(typeof key != 'undefined'){ + this.keys.splice(index, 1); + delete this.items[key]; + } + this.fireEvent('remove', o, key); + }, + + + removeKey : function(key){ + var o = this.items[key]; + var index = this.indexOf(o); + this.items.splice(index, 1); + this.keys.splice(index, 1); + delete this.items[key]; + this.fireEvent('remove', o, key); + }, + + + getCount : function(){ + return this.items.length; + }, + + + indexOf : function(o){ + if(!this.items.indexOf){ + for(var i = 0, len = this.items.length; i < len; i++){ + if(this.items[i] == o) return i; + } + return -1; + }else{ + return this.items.indexOf(o); + } + }, + + + indexOfKey : function(key){ + if(!this.keys.indexOf){ + for(var i = 0, len = this.keys.length; i < len; i++){ + if(this.keys[i] == key) return i; + } + return -1; + }else{ + return this.keys.indexOf(key); + } + }, + + + item : function(key){ + return this.items[key]; + }, + + + contains : function(o){ + return this.indexOf(o) != -1; + }, + + + containsKey : function(key){ + return typeof this.items[key] != 'undefined'; + }, + + + clear : function(o){ + this.items = []; + this.keys = []; + this.fireEvent('clear'); + }, + + + first : function(){ + return this.items[0]; + }, + + + last : function(){ + return this.items[this.items.length]; + } +}); + +YAHOO.ext.util.MixedCollection.prototype.get = YAHOO.ext.util.MixedCollection.prototype.item; + +YAHOO.ext.util.JSON = new function(){ + var useHasOwn = {}.hasOwnProperty ? true : false; + var validRE = /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/; + + var pad = function(n) { + return n < 10 ? '0' + n : n; + }; + + var m = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; + + var encodeString = function(s){ + if (/["\\\x00-\x1f]/.test(s)) { + return '"' + s.replace(/([\x00-\x1f\\"])/g, function(a, b) { + var c = m[b]; + if(c){ + return c; + } + c = b.charCodeAt(); + return '\\u00' + + Math.floor(c / 16).toString(16) + + (c % 16).toString(16); + }) + '"'; + } + return '"' + s + '"'; + }; + + var encodeArray = function(o){ + var a = ['['], b, i, l = o.length, v; + for (i = 0; i < l; i += 1) { + v = o[i]; + switch (typeof v) { + case 'undefined': + case 'function': + case 'unknown': + break; + default: + if (b) { + a.push(','); + } + a.push(v === null ? "null" : YAHOO.ext.util.JSON.encode(v)); + b = true; + } + } + a.push(']'); + return a.join(''); + }; + + var encodeDate = function(o){ + return '"' + o.getFullYear() + '-' + + pad(o.getMonth() + 1) + '-' + + pad(o.getDate()) + 'T' + + pad(o.getHours()) + ':' + + pad(o.getMinutes()) + ':' + + pad(o.getSeconds()) + '"'; + }; + + + this.encode = function(o){ + if(typeof o == 'undefined' || o === null){ + return 'null'; + }else if(o instanceof Array){ + return encodeArray(o); + }else if(o instanceof Date){ + return encodeDate(o); + }else if(typeof o == 'string'){ + return encodeString(o); + }else if(typeof o == 'number'){ + return isFinite(o) ? String(o) : "null"; + }else if(typeof o == 'boolean'){ + return String(o); + }else { + var a = ['{'], b, i, v; + for (var i in o) { + if(!useHasOwn || o.hasOwnProperty(i)) { + v = o[i]; + switch (typeof v) { + case 'undefined': + case 'function': + case 'unknown': + break; + default: + if(b){ + a.push(','); + } + a.push(this.encode(i), ':', + v === null ? "null" : this.encode(v)); + b = true; + } + } + } + a.push('}'); + return a.join(''); + } + }; + + + this.decode = function(json){ + try{ + if(validRE.test(json)) { + return eval('(' + json + ')'); + } + }catch(e){ + } + throw new SyntaxError("parseJSON"); + }; +}(); + +YAHOO.ext.util.CSS = new function(){ + var rules = null; + + var toCamel = function(property) { + var convert = function(prop) { + var test = /(-[a-z])/i.exec(prop); + return prop.replace(RegExp.$1, RegExp.$1.substr(1).toUpperCase()); + }; + while(property.indexOf('-') > -1) { + property = convert(property); + } + return property; + }; + + + this.getRules = function(refreshCache){ + if(rules == null || refreshCache){ + rules = {}; + var ds = document.styleSheets; + for(var i =0, len = ds.length; i < len; i++){ + try{ + var ss = ds[i]; + var ssRules = ss.cssRules || ss.rules; + for(var j = ssRules.length-1; j >= 0; --j){ + rules[ssRules[j].selectorText] = ssRules[j]; + } + }catch(e){} + } + } + return rules; + }; + + + this.getRule = function(selector, refreshCache){ + var rs = this.getRules(refreshCache); + if(!(selector instanceof Array)){ + return rs[selector]; + } + for(var i = 0; i < selector.length; i++){ + if(rs[selector[i]]){ + return rs[selector[i]]; + } + } + return null; + }; + + + + this.updateRule = function(selector, property, value){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + rule.style[toCamel(property)] = value; + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.updateRule(selector[i], property, value)){ + return true; + } + } + } + return false; + }; + + + this.apply = function(el, selector){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + var s = rule.style; + for(var key in s){ + if(typeof s[key] != 'function'){ + if(s[key] && String(s[key]).indexOf(':') < 0 && s[key] != 'false'){ + try{el.style[key] = s[key];}catch(e){} + } + } + } + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.apply(el, selector[i])){ + return true; + } + } + } + return false; + }; + + this.applyFirst = function(el, id, selector){ + var selectors = [ + '#' + id + ' ' + selector, + selector + ]; + return this.apply(el, selectors); + }; + + this.revert = function(el, selector){ + if(!(selector instanceof Array)){ + var rule = this.getRule(selector); + if(rule){ + for(key in rule.style){ + if(rule.style[key] && String(rule.style[key]).indexOf(':') < 0 && rule.style[key] != 'false'){ + try{el.style[key] = '';}catch(e){} + } + } + return true; + } + }else{ + for(var i = 0; i < selector.length; i++){ + if(this.revert(el, selector[i])){ + return true; + } + } + } + return false; + }; + + this.revertFirst = function(el, id, selector){ + var selectors = [ + '#' + id + ' ' + selector, + selector + ]; + return this.revert(el, selectors); + }; +}(); +YAHOO.ext.util.Bench = function(){ + this.timers = {}; + this.lastKey = null; +}; +YAHOO.ext.util.Bench.prototype = { + start : function(key){ + this.lastKey = key; + this.timers[key] = {}; + this.timers[key].startTime = new Date().getTime(); + }, + + stop : function(key){ + key = key || this.lastKey; + this.timers[key].endTime = new Date().getTime(); + }, + + getElapsed : function(key){ + key = key || this.lastKey; + return this.timers[key].endTime - this.timers[key].startTime; + }, + + toString : function(html){ + var results = ""; + for(var key in this.timers){ + if(typeof this.timers[key] != 'function'){ + results += key + ":\t" + (this.getElapsed(key) / 1000) + " seconds\n"; + } + } + if(html){ + results = results.replace("\n", '
        '); + } + return results; + }, + + show : function(){ + alert(this.toString()); + } +}; + +YAHOO.ext.DomHelper = new function(){ + + var d = document; + var tempTableEl = null; + + this.useDom = false; + var emptyTags = /^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i; + + this.applyStyles = function(el, styles){ + if(styles){ + var D = YAHOO.util.Dom; + if (typeof styles == "string"){ + var re = /\s?([a-z\-]*)\:([^;]*);?/gi; + var matches; + while ((matches = re.exec(styles)) != null){ + D.setStyle(el, matches[1], matches[2]); + } + }else if (typeof styles == "object"){ + for (var style in styles){ + D.setStyle(el, style, styles[style]); + } + }else if (typeof styles == "function"){ + YAHOO.ext.DomHelper.applyStyles(el, styles.call()); + } + } + }; + + + + var createHtml = function(o){ + var b = ''; + b += '<' + o.tag; + for(var attr in o){ + if(attr == 'tag' || attr == 'children' || attr == 'html' || typeof o[attr] == 'function') continue; + if(attr == 'style'){ + var s = o['style']; + if(typeof s == 'function'){ + s = s.call(); + } + if(typeof s == 'string'){ + b += ' style="' + s + '"'; + }else if(typeof s == 'object'){ + b += ' style="'; + for(var key in s){ + if(typeof s[key] != 'function'){ + b += key + ':' + s[key] + ';'; + } + } + b += '"'; + } + }else{ + if(attr == 'cls'){ + b += ' class="' + o['cls'] + '"'; + }else if(attr == 'htmlFor'){ + b += ' for="' + o['htmlFor'] + '"'; + }else{ + b += ' ' + attr + '="' + o[attr] + '"'; + } + } + } + if(emptyTags.test(o.tag)){ + b += ' />'; + }else{ + b += '>'; + if(o.children){ + for(var i = 0, len = o.children.length; i < len; i++) { + b += createHtml(o.children[i], b); + } + } + if(o.html){ + b += o.html; + } + b += ''; + } + return b; + } + + + + var createDom = function(o, parentNode){ + var el = d.createElement(o.tag); + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == 'tag' || attr == 'children' || attr == 'html' || attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + if(o.children){ + for(var i = 0, len = o.children.length; i < len; i++) { + createDom(o.children[i], el); + } + } + if(o.html){ + el.innerHTML = o.html; + } + if(parentNode){ + parentNode.appendChild(el); + } + return el; + }; + + + var insertIntoTable = function(tag, where, el, html){ + if(!tempTableEl){ + tempTableEl = document.createElement('div'); + } + var node; + if(tag == 'table' || tag == 'tbody'){ + tempTableEl.innerHTML = ''+html+'
        '; + node = tempTableEl.firstChild.firstChild.firstChild; + }else{ + tempTableEl.innerHTML = ''+html+'
        '; + node = tempTableEl.firstChild.firstChild.firstChild.firstChild; + } + if(where == 'beforebegin'){ + el.parentNode.insertBefore(node, el); + return node; + }else if(where == 'afterbegin'){ + el.insertBefore(node, el.firstChild); + return node; + }else if(where == 'beforeend'){ + el.appendChild(node); + return node; + }else if(where == 'afterend'){ + el.parentNode.insertBefore(node, el.nextSibling); + return node; + } + } + + + this.insertHtml = function(where, el, html){ + where = where.toLowerCase(); + if(el.insertAdjacentHTML){ + var tag = el.tagName.toLowerCase(); + if(tag == 'table' || tag == 'tbody' || tag == 'tr'){ + return insertIntoTable(tag, where, el, html); + } + switch(where){ + case 'beforebegin': + el.insertAdjacentHTML(where, html); + return el.previousSibling; + case 'afterbegin': + el.insertAdjacentHTML(where, html); + return el.firstChild; + case 'beforeend': + el.insertAdjacentHTML(where, html); + return el.lastChild; + case 'afterend': + el.insertAdjacentHTML(where, html); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + } + var range = el.ownerDocument.createRange(); + var frag; + switch(where){ + case 'beforebegin': + range.setStartBefore(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el); + return el.previousSibling; + case 'afterbegin': + if(el.firstChild){ + range.setStartBefore(el.firstChild); + }else{ + range.selectNodeContents(el); + range.collapse(true); + } + frag = range.createContextualFragment(html); + el.insertBefore(frag, el.firstChild); + return el.firstChild; + case 'beforeend': + if(el.lastChild){ + range.setStartAfter(el.lastChild); + }else{ + range.selectNodeContents(el); + range.collapse(false); + } + frag = range.createContextualFragment(html); + el.appendChild(frag); + return el.lastChild; + case 'afterend': + range.setStartAfter(el); + frag = range.createContextualFragment(html); + el.parentNode.insertBefore(frag, el.nextSibling); + return el.nextSibling; + } + throw 'Illegal insertion point -> "' + where + '"'; + }; + + + this.insertBefore = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeBegin', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.insertAfter = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.parentNode.insertBefore(newNode, el.nextSibling); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('afterEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.append = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode; + if(this.useDom){ + newNode = createDom(o, null); + el.appendChild(newNode); + }else{ + var html = createHtml(o); + newNode = this.insertHtml('beforeEnd', el, html); + } + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }; + + + this.overwrite = function(el, o, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = createHtml(o); + return returnElement ? YAHOO.ext.Element.get(el.firstChild, true) : el.firstChild; + }; + + + this.createTemplate = function(o){ + var html = createHtml(o); + return new YAHOO.ext.DomHelper.Template(html); + }; +}(); + + +YAHOO.ext.DomHelper.Template = function(html){ + + this.html = html; + + this.re = /\{(\w+)\}/g; +}; +YAHOO.ext.DomHelper.Template.prototype = { + + applyTemplate : function(values){ + if(this.compiled){ + return this.compiled(values); + } + var empty = ''; + var fn = function(match, index){ + if(typeof values[index] != 'undefined'){ + return values[index]; + }else{ + return empty; + } + } + return this.html.replace(this.re, fn); + }, + + + compile : function(){ + var html = this.html; + var re = /\{(\w+)\}/g; + var body = []; + body.push("this.compiled = function(values){ return ["); + var result; + var lastMatchEnd = 0; + while ((result = re.exec(html)) != null){ + body.push("'", html.substring(lastMatchEnd, result.index), "', "); + body.push("values['", html.substring(result.index+1,re.lastIndex-1), "'], "); + lastMatchEnd = re.lastIndex; + } + body.push("'", html.substr(lastMatchEnd), "'].join('');};"); + eval(body.join('')); + }, + + + insertBefore: function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeBegin', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + insertAfter : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('afterEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + append : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + }, + + + overwrite : function(el, values, returnElement){ + el = YAHOO.util.Dom.get(el); + el.innerHTML = ''; + var newNode = YAHOO.ext.DomHelper.insertHtml('beforeEnd', el, this.applyTemplate(values)); + return returnElement ? YAHOO.ext.Element.get(newNode, true) : newNode; + } +}; + +YAHOO.ext.Template = YAHOO.ext.DomHelper.Template; + +YAHOO.ext.Element = function(element, forceNew){ + var dom = YAHOO.util.Dom.get(element); + if(!dom){ + return null; + } + if(!forceNew && YAHOO.ext.Element.cache[dom.id]){ + return YAHOO.ext.Element.cache[dom.id]; + } + + this.dom = dom; + + + this.id = this.dom.id; + + this.visibilityMode = YAHOO.ext.Element.VISIBILITY; + + + + this.originalDisplay = YAHOO.util.Dom.getStyle(this.dom, 'display') || ''; + if(this.autoDisplayMode){ + if(this.originalDisplay == 'none'){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + } + } + if(this.originalDisplay == 'none'){ + this.originalDisplay = ''; + } + + + this.defaultUnit = 'px'; +} + +YAHOO.ext.Element.prototype = { + + setVisibilityMode : function(visMode){ + this.visibilityMode = visMode; + return this; + }, + + + enableDisplayMode : function(display){ + this.setVisibilityMode(YAHOO.ext.Element.DISPLAY); + if(typeof display != 'undefined') this.originalDisplay = display; + return this; + }, + + + animate : function(args, duration, onComplete, easing, animType){ + this.anim(args, duration, onComplete, easing, animType); + return this; + }, + + + anim : function(args, duration, onComplete, easing, animType){ + animType = animType || YAHOO.util.Anim; + var anim = new animType(this.dom, args, duration || .35, + easing || YAHOO.util.Easing.easeBoth); + if(onComplete){ + if(!(onComplete instanceof Array)){ + anim.onComplete.subscribe(onComplete, this, true); + }else{ + for(var i = 0; i < onComplete.length; i++){ + var fn = onComplete[i]; + if(fn) anim.onComplete.subscribe(fn, this, true); + } + } + } + anim.animate(); + }, + + + scrollIntoView : function(container){ + var c = getEl(container || document.body, true); + var cp = c.getStyle('position'); + var restorePos = false; + if(cp != 'relative' && cp != 'absolute'){ + c.setStyle('position', 'relative'); + restorePos = true; + } + var el = this.dom; + var childTop = parseInt(el.offsetTop, 10); + var childBottom = childTop + el.offsetHeight; + var containerTop = parseInt(c.scrollTop, 10); + var containerBottom = containerTop + c.clientHeight; + if(childTop < containerTop){ + c.scrollTop = childTop; + }else if(childBottom > containerBottom){ + c.scrollTop = childBottom-c.clientHeight; + } + if(restorePos){ + c.setStyle('position', cp); + } + return this; + }, + + + autoHeight : function(animate, duration, onComplete, easing){ + var oldHeight = this.getHeight(); + this.clip(); + this.setHeight(1); + setTimeout(function(){ + var height = parseInt(this.dom.scrollHeight, 10); + if(!animate){ + this.setHeight(height); + this.unclip(); + if(typeof onComplete == 'function'){ + onComplete(); + } + }else{ + this.setHeight(oldHeight); + this.setHeight(height, animate, duration, function(){ + this.unclip(); + if(typeof onComplete == 'function') onComplete(); + }.createDelegate(this), easing); + } + }.createDelegate(this), 0); + return this; + }, + + + isVisible : function(deep) { + var vis = YAHOO.util.Dom.getStyle(this.dom, 'visibility') != 'hidden' + && YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + if(!deep || !vis){ + return vis; + } + var p = this.dom.parentNode; + while(p && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'visibility') == 'hidden' || YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + return false; + } + p = p.parentNode; + } + return true; + }, + + + select : function(selector, unique){ + return YAHOO.ext.Element.select('#' + this.dom.id + ' ' + selector, unique); + }, + + + initDD : function(group, config, overrides){ + var dd = new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + initDDProxy : function(group, config, overrides){ + var dd = new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + initDDTarget : function(group, config, overrides){ + var dd = new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom), group, config); + return YAHOO.ext.util.Config.apply(dd, overrides); + }, + + + setVisible : function(visible, animate, duration, onComplete, easing){ + + if(!animate || !YAHOO.util.Anim){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }else{ + + this.setOpacity(visible?0:1); + YAHOO.util.Dom.setStyle(this.dom, 'visibility', 'visible'); + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(true); + } + var args = {opacity: { from: (visible?0:1), to: (visible?1:0) }}; + var anim = new YAHOO.util.Anim(this.dom, args, duration || .35, + easing || (visible ? YAHOO.util.Easing.easeIn : YAHOO.util.Easing.easeOut)); + anim.onComplete.subscribe((function(){ + if(this.visibilityMode == YAHOO.ext.Element.DISPLAY){ + this.setDisplayed(visible); + }else{ + YAHOO.util.Dom.setStyle(this.dom, 'visibility', visible ? 'visible' : 'hidden'); + } + }).createDelegate(this)); + if(onComplete){ + anim.onComplete.subscribe(onComplete); + } + anim.animate(); + } + return this; + }, + + + isDisplayed : function() { + return YAHOO.util.Dom.getStyle(this.dom, 'display') != 'none'; + }, + + + toggle : function(animate, duration, onComplete, easing){ + this.setVisible(!this.isVisible(), animate, duration, onComplete, easing); + return this; + }, + + + setDisplayed : function(value) { + if(typeof value == 'boolean'){ + value = value ? this.originalDisplay : 'none'; + } + YAHOO.util.Dom.setStyle(this.dom, 'display', value); + return this; + }, + + + focus : function() { + try{ + this.dom.focus(); + }catch(e){} + return this; + }, + + + addClass : function(className){ + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + + + radioClass : function(className){ + var siblings = this.dom.parentNode.childNodes; + for(var i = 0; i < siblings.length; i++) { + var s = siblings[i]; + if(s.nodeType == 1){ + YAHOO.util.Dom.removeClass(s, className); + } + } + YAHOO.util.Dom.addClass(this.dom, className); + return this; + }, + + removeClass : function(className){ + YAHOO.util.Dom.removeClass(this.dom, className); + return this; + }, + + + toggleClass : function(className){ + if(YAHOO.util.Dom.hasClass(this.dom, className)){ + YAHOO.util.Dom.removeClass(this.dom, className); + }else{ + YAHOO.util.Dom.addClass(this.dom, className); + } + return this; + }, + + + hasClass : function(className){ + return YAHOO.util.Dom.hasClass(this.dom, className); + }, + + + replaceClass : function(oldClassName, newClassName){ + YAHOO.util.Dom.replaceClass(this.dom, oldClassName, newClassName); + return this; + }, + + + getStyle : function(name){ + return YAHOO.util.Dom.getStyle(this.dom, name); + }, + + + setStyle : function(name, value){ + if(typeof name == 'string'){ + YAHOO.util.Dom.setStyle(this.dom, name, value); + }else{ + var D = YAHOO.util.Dom; + for(var style in name){ + if(typeof name[style] != 'function'){ + D.setStyle(this.dom, style, name[style]); + } + } + } + return this; + }, + + + applyStyles : function(style){ + YAHOO.ext.DomHelper.applyStyles(this.dom, style); + return this; + }, + + + getX : function(){ + return YAHOO.util.Dom.getX(this.dom); + }, + + + getY : function(){ + return YAHOO.util.Dom.getY(this.dom); + }, + + + getXY : function(){ + return YAHOO.util.Dom.getXY(this.dom); + }, + + + setX : function(x, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setX(this.dom, x); + }else{ + this.setXY([x, this.getY()], animate, duration, onComplete, easing); + } + return this; + }, + + + setY : function(y, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setY(this.dom, y); + }else{ + this.setXY([this.getX(), y], animate, duration, onComplete, easing); + } + return this; + }, + + + setLeft : function(left){ + YAHOO.util.Dom.setStyle(this.dom, 'left', this.addUnits(left)); + return this; + }, + + + setTop : function(top){ + YAHOO.util.Dom.setStyle(this.dom, 'top', this.addUnits(top)); + return this; + }, + + + setRight : function(right){ + YAHOO.util.Dom.setStyle(this.dom, 'right', this.addUnits(right)); + return this; + }, + + + setBottom : function(bottom){ + YAHOO.util.Dom.setStyle(this.dom, 'bottom', this.addUnits(bottom)); + return this; + }, + + + setXY : function(pos, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setXY(this.dom, pos); + }else{ + this.anim({points: {to: pos}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + + setLocation : function(x, y, animate, duration, onComplete, easing){ + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + + moveTo : function(x, y, animate, duration, onComplete, easing){ + + + this.setXY([x, y], animate, duration, onComplete, easing); + return this; + }, + + + getRegion : function(){ + return YAHOO.util.Dom.getRegion(this.dom); + }, + + + getHeight : function(contentHeight){ + var h = this.dom.offsetHeight; + return contentHeight !== true ? h : h-this.getBorderWidth('tb')-this.getPadding('tb'); + }, + + + getWidth : function(contentWidth){ + var w = this.dom.offsetWidth; + return contentWidth !== true ? w : w-this.getBorderWidth('lr')-this.getPadding('lr'); + }, + + + getSize : function(contentSize){ + return {width: this.getWidth(contentSize), height: this.getHeight(contentSize)}; + }, + + + adjustWidth : function(width){ + if(typeof width == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + width -= (this.getBorderWidth('lr') + this.getPadding('lr')); + } + if(width < 0){ + width = 0; + } + } + return width; + }, + + + adjustHeight : function(height){ + if(typeof height == 'number'){ + if(this.autoBoxAdjust && !this.isBorderBox()){ + height -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + if(height < 0){ + height = 0; + } + } + return height; + }, + + + setWidth : function(width, animate, duration, onComplete, easing){ + width = this.adjustWidth(width); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'width', this.addUnits(width)); + }else{ + this.anim({width: {to: width}}, duration, onComplete, + easing || (width > this.getWidth() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + + setHeight : function(height, animate, duration, onComplete, easing){ + height = this.adjustHeight(height); + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'height', this.addUnits(height)); + }else{ + this.anim({height: {to: height}}, duration, onComplete, + easing || (height > this.getHeight() ? YAHOO.util.Easing.easeOut : YAHOO.util.Easing.easeIn)); + } + return this; + }, + + + setSize : function(width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({width: {to: width}, height: {to: height}}, duration, onComplete, easing); + } + return this; + }, + + + setBounds : function(x, y, width, height, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + this.setWidth(width); + this.setHeight(height); + this.setLocation(x, y); + }else{ + width = this.adjustWidth(width); height = this.adjustHeight(height); + this.anim({points: {to: [x, y]}, width: {to: width}, height: {to: height}}, duration, onComplete, easing, YAHOO.util.Motion); + } + return this; + }, + + + setRegion : function(region, animate, duration, onComplete, easing){ + this.setBounds(region.left, region.top, region.right-region.left, region.bottom-region.top, animate, duration, onComplete, easing); + return this; + }, + + + addListener : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + + addHandler : function(eventName, stopPropagation, handler, scope, override){ + var fn = YAHOO.ext.Element.createStopHandler(stopPropagation, handler, scope || this, true); + YAHOO.util.Event.addListener(this.dom, eventName, fn); + return this; + }, + + + on : function(eventName, handler, scope, override){ + YAHOO.util.Event.addListener(this.dom, eventName, handler, scope || this, true); + return this; + }, + + + addManagedListener : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + + + mon : function(eventName, fn, scope, override){ + return YAHOO.ext.EventManager.on(this.dom, eventName, fn, scope || this, true); + }, + + removeListener : function(eventName, handler, scope){ + YAHOO.util.Event.removeListener(this.dom, eventName, handler, scope || this); + return this; + }, + + + removeAllListeners : function(){ + YAHOO.util.Event.purgeElement(this.dom); + return this; + }, + + + + setOpacity : function(opacity, animate, duration, onComplete, easing){ + if(!animate || !YAHOO.util.Anim){ + YAHOO.util.Dom.setStyle(this.dom, 'opacity', opacity); + }else{ + this.anim({opacity: {to: opacity}}, duration, onComplete, easing); + } + return this; + }, + + + getLeft : function(local){ + if(!local){ + return this.getX(); + }else{ + return parseInt(this.getStyle('left'), 10) || 0; + } + }, + + + getRight : function(local){ + if(!local){ + return this.getX() + this.getWidth(); + }else{ + return (this.getLeft(true) + this.getWidth()) || 0; + } + }, + + + getTop : function(local) { + if(!local){ + return this.getY(); + }else{ + return parseInt(this.getStyle('top'), 10) || 0; + } + }, + + + getBottom : function(local){ + if(!local){ + return this.getY() + this.getHeight(); + }else{ + return (this.getTop(true) + this.getHeight()) || 0; + } + }, + + + setAbsolutePositioned : function(zIndex){ + this.setStyle('position', 'absolute'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + + setRelativePositioned : function(zIndex){ + this.setStyle('position', 'relative'); + if(zIndex){ + this.setStyle('z-index', zIndex); + } + return this; + }, + + + clearPositioning : function(){ + this.setStyle('position', ''); + this.setStyle('left', ''); + this.setStyle('right', ''); + this.setStyle('top', ''); + this.setStyle('bottom', ''); + return this; + }, + + + getPositioning : function(){ + return { + 'position' : this.getStyle('position'), + 'left' : this.getStyle('left'), + 'right' : this.getStyle('right'), + 'top' : this.getStyle('top'), + 'bottom' : this.getStyle('bottom') + }; + }, + + + getBorderWidth : function(side){ + return this.addStyles(side, YAHOO.ext.Element.borders); + }, + + + getPadding : function(side){ + return this.addStyles(side, YAHOO.ext.Element.paddings); + }, + + + setPositioning : function(positionCfg){ + if(positionCfg.position)this.setStyle('position', positionCfg.position); + if(positionCfg.left)this.setLeft(positionCfg.left); + if(positionCfg.right)this.setRight(positionCfg.right); + if(positionCfg.top)this.setTop(positionCfg.top); + if(positionCfg.bottom)this.setBottom(positionCfg.bottom); + return this; + }, + + + + setLeftTop : function(left, top){ + this.dom.style.left = this.addUnits(left); + this.dom.style.top = this.addUnits(top); + return this; + }, + + + move : function(direction, distance, animate, duration, onComplete, easing){ + var xy = this.getXY(); + direction = direction.toLowerCase(); + switch(direction){ + case 'l': + case 'left': + this.moveTo(xy[0]-distance, xy[1], animate, duration, onComplete, easing); + break; + case 'r': + case 'right': + this.moveTo(xy[0]+distance, xy[1], animate, duration, onComplete, easing); + break; + case 't': + case 'top': + case 'up': + this.moveTo(xy[0], xy[1]-distance, animate, duration, onComplete, easing); + break; + case 'b': + case 'bottom': + case 'down': + this.moveTo(xy[0], xy[1]+distance, animate, duration, onComplete, easing); + break; + } + return this; + }, + + + clip : function(){ + if(!this.isClipped){ + this.isClipped = true; + this.originalClip = { + 'o': this.getStyle('overflow'), + 'x': this.getStyle('overflow-x'), + 'y': this.getStyle('overflow-y') + }; + this.setStyle('overflow', 'hidden'); + this.setStyle('overflow-x', 'hidden'); + this.setStyle('overflow-y', 'hidden'); + } + return this; + }, + + + unclip : function(){ + if(this.isClipped){ + this.isClipped = false; + var o = this.originalClip; + if(o.o){this.setStyle('overflow', o.o);} + if(o.x){this.setStyle('overflow-x', o.x);} + if(o.y){this.setStyle('overflow-y', o.y);} + } + return this; + }, + + + alignTo : function(element, position, offsets, animate, duration, onComplete, easing){ + var otherEl = getEl(element); + if(!otherEl){ + return this; + } + offsets = offsets || [0, 0]; + var r = otherEl.getRegion(); + position = position.toLowerCase(); + switch(position){ + case 'bl': + this.moveTo(r.left + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'br': + this.moveTo(r.right + offsets[0], r.bottom + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tl': + this.moveTo(r.left + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + case 'tr': + this.moveTo(r.right + offsets[0], r.top + offsets[1], + animate, duration, onComplete, easing); + break; + } + return this; + }, + + + clearOpacity : function(){ + if (window.ActiveXObject) { + this.dom.style.filter = ''; + } else { + this.dom.style.opacity = ''; + this.dom.style['-moz-opacity'] = ''; + this.dom.style['-khtml-opacity'] = ''; + } + return this; + }, + + + hide : function(animate, duration, onComplete, easing){ + this.setVisible(false, animate, duration, onComplete, easing); + return this; + }, + + + show : function(animate, duration, onComplete, easing){ + this.setVisible(true, animate, duration, onComplete, easing); + return this; + }, + + + addUnits : function(size){ + if(size === '' || size == 'auto' || typeof size == 'undefined'){ + return size; + } + if(typeof size == 'number' || !YAHOO.ext.Element.unitPattern.test(size)){ + return size + this.defaultUnit; + } + return size; + }, + + + beginMeasure : function(){ + var el = this.dom; + if(el.offsetWidth || el.offsetHeight){ + return this; + } + var changed = []; + var p = this.dom; + while((!el.offsetWidth && !el.offsetHeight) && p && p.tagName && p.tagName.toLowerCase() != 'body'){ + if(YAHOO.util.Dom.getStyle(p, 'display') == 'none'){ + changed.push({el: p, visibility: YAHOO.util.Dom.getStyle(p, 'visibility')}); + p.style.visibility = 'hidden'; + p.style.display = 'block'; + } + p = p.parentNode; + } + this._measureChanged = changed; + return this; + + }, + + + endMeasure : function(){ + var changed = this._measureChanged; + if(changed){ + for(var i = 0, len = changed.length; i < len; i++) { + var r = changed[i]; + r.el.style.visibility = r.visibility; + r.el.style.display = 'none'; + } + this._measureChanged = null; + } + return this; + }, + + + update : function(html, loadScripts, callback){ + if(typeof html == 'undefined'){ + html = ''; + } + if(loadScripts !== true){ + this.dom.innerHTML = html; + if(typeof callback == 'function'){ + callback(); + } + return this; + } + var id = YAHOO.util.Dom.generateId(); + var dom = this.dom; + + html += ''; + + YAHOO.util.Event.onAvailable(id, function(){ + var hd = document.getElementsByTagName("head")[0]; + var re = /(?:)((\n|\r|.)*?)(?:<\/script>)/img; + var srcRe = /\ssrc=[\'\"](.*)[\'\"]/i; + var match; + while(match = re.exec(html)){ + var srcMatch = match[0].match(srcRe); + if(srcMatch && srcMatch[1]){ + var s0 = document.createElement("script"); + s0.src = srcMatch[1]; + hd.appendChild(s0); + }else if(match[1]){ + eval(match[1]); + } + } + var el = document.getElementById(id); + if(el){el.parentNode.removeChild(el);} + if(typeof callback == 'function'){ + callback(); + } + }); + dom.innerHTML = html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img, ''); + return this; + }, + + + load : function(){ + var um = this.getUpdateManager(); + um.update.apply(um, arguments); + return this; + }, + + + getUpdateManager : function(){ + if(!this.updateManager){ + this.updateManager = new YAHOO.ext.UpdateManager(this); + } + return this.updateManager; + }, + + + unselectable : function(){ + this.dom.unselectable = 'on'; + this.swallowEvent('selectstart', true); + this.applyStyles('-moz-user-select:none;-khtml-user-select:none;'); + return this; + }, + + + getCenterXY : function(offsetScroll){ + var centerX = Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2); + var centerY = Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2); + if(!offsetScroll){ + return [centerX, centerY]; + }else{ + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft || 0; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop || 0; + return[centerX + scrollX, centerY + scrollY]; + } + }, + + + center : function(centerIn) { + if(!centerIn){ + this.setXY(this.getCenterXY(true)); + }else{ + var box = YAHOO.ext.Element.get(centerIn).getBox(); + this.setXY([box.x + (box.width / 2) - (this.getWidth() / 2), + box.y + (box.height / 2) - (this.getHeight() / 2)]); + } + return this; + }, + + + getChildrenByTagName : function(tagName){ + var children = this.dom.getElementsByTagName(tagName); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + + getChildrenByClassName : function(className, tagName){ + var children = YAHOO.util.Dom.getElementsByClassName(className, tagName, this.dom); + var len = children.length; + var ce = new Array(len); + for(var i = 0; i < len; ++i){ + ce[i] = YAHOO.ext.Element.get(children[i], true); + } + return ce; + }, + + + isBorderBox : function(){ + if(typeof this.bbox == 'undefined'){ + var el = this.dom; + var b = YAHOO.ext.util.Browser; + var strict = YAHOO.ext.Strict; + this.bbox = ((b.isIE && !strict && el.style.boxSizing != 'content-box') || + (b.isGecko && YAHOO.util.Dom.getStyle(el, "-moz-box-sizing") == 'border-box') || + (!b.isSafari && YAHOO.util.Dom.getStyle(el, "box-sizing") == 'border-box')); + } + return this.bbox; + }, + + + getBox : function(contentBox, local){ + var xy; + if(!local){ + xy = this.getXY(); + }else{ + var left = parseInt(YAHOO.util.Dom.getStyle('left'), 10) || 0; + var top = parseInt(YAHOO.util.Dom.getStyle('top'), 10) || 0; + xy = [left, top]; + } + var el = this.dom; + var w = el.offsetWidth; + var h = el.offsetHeight; + if(!contentBox){ + return {x: xy[0], y: xy[1], width: w, height: h}; + }else{ + var l = this.getBorderWidth('l')+this.getPadding('l'); + var r = this.getBorderWidth('r')+this.getPadding('r'); + var t = this.getBorderWidth('t')+this.getPadding('t'); + var b = this.getBorderWidth('b')+this.getPadding('b'); + return {x: xy[0]+l, y: xy[1]+t, width: w-(l+r), height: h-(t+b)}; + } + }, + + + setBox : function(box, adjust, animate, duration, onComplete, easing){ + var w = box.width, h = box.height; + if((adjust && !this.autoBoxAdjust) && !this.isBorderBox()){ + w -= (this.getBorderWidth('lr') + this.getPadding('lr')); + h -= (this.getBorderWidth('tb') + this.getPadding('tb')); + } + this.setBounds(box.x, box.y, w, h, animate, duration, onComplete, easing); + return this; + }, + + + repaint : function(){ + var dom = this.dom; + YAHOO.util.Dom.addClass(dom, 'yui-ext-repaint'); + setTimeout(function(){ + YAHOO.util.Dom.removeClass(dom, 'yui-ext-repaint'); + }, 1); + return this; + }, + + + getMargins : function(side){ + if(!side){ + return { + top: parseInt(this.getStyle('margin-top'), 10) || 0, + left: parseInt(this.getStyle('margin-left'), 10) || 0, + bottom: parseInt(this.getStyle('margin-bottom'), 10) || 0, + right: parseInt(this.getStyle('margin-right'), 10) || 0 + }; + }else{ + return this.addStyles(side, YAHOO.ext.Element.margins); + } + }, + + addStyles : function(sides, styles){ + var val = 0; + for(var i = 0, len = sides.length; i < len; i++){ + var w = parseInt(this.getStyle(styles[sides.charAt(i)]), 10); + if(!isNaN(w)) val += w; + } + return val; + }, + + + createProxy : function(config, renderTo, matchBox){ + if(renderTo){ + renderTo = YAHOO.util.Dom.get(renderTo); + }else{ + renderTo = document.body; + } + config = typeof config == 'object' ? + config : {tag : 'div', cls: config}; + var proxy = YAHOO.ext.DomHelper.append(renderTo, config, true); + if(matchBox){ + proxy.setBox(this.getBox()); + } + return proxy; + }, + + + createShim : function(){ + var config = {tag : 'iframe', frameBorder:'no', cls: 'yiframe-shim', src: YAHOO.ext.SSL_SECURE_URL}; + var shim = YAHOO.ext.DomHelper.append(this.dom.parentNode, config, true); + shim.setBox(this.getBox()); + return shim; + }, + + + remove : function(){ + this.dom.parentNode.removeChild(this.dom); + delete YAHOO.ext.Element.cache[this.dom.id]; + }, + + + addClassOnOver : function(className){ + this.on('mouseover', function(){ + this.addClass(className); + }, this, true); + this.on('mouseout', function(){ + this.removeClass(className); + }, this, true); + return this; + }, + + + swallowEvent : function(eventName, preventDefault){ + var fn = function(e){ + e.stopPropagation(); + if(preventDefault){ + e.preventDefault(); + } + }; + this.mon(eventName, fn); + return this; + }, + + + fitToParent : function(monitorResize){ + var p = getEl(this.dom.parentNode, true); + p.beginMeasure(); + var box = p.getBox(true, true); + p.endMeasure(); + this.setSize(box.width, box.height); + if(monitorResize === true){ + YAHOO.ext.EventManager.onWindowResize(this.fitToParent, this, true); + } + return this; + }, + + + getNextSibling : function(){ + var n = this.dom.nextSibling; + while(n && n.nodeType != 1){ + n = n.nextSibling; + } + return n; + }, + + + getPrevSibling : function(){ + var n = this.dom.previousSibling; + while(n && n.nodeType != 1){ + n = n.previousSibling; + } + return n; + }, + + + + appendChild: function(el){ + el = getEl(el); + el.appendTo(this); + return this; + }, + + + createChild: function(config, insertBefore){ + var c; + if(insertBefore){ + c = YAHOO.ext.DomHelper.insertBefore(insertBefore, config, true); + }else{ + c = YAHOO.ext.DomHelper.append(this.dom, config, true); + } + return c; + }, + + + appendTo: function(el){ + var node = getEl(el).dom; + node.appendChild(this.dom); + return this; + }, + + + insertBefore: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node); + return this; + }, + + + insertAfter: function(el){ + var node = getEl(el).dom; + node.parentNode.insertBefore(this.dom, node.nextSibling); + return this; + }, + + + wrap: function(config){ + if(!config){ + config = {tag: 'div'}; + } + var newEl = YAHOO.ext.DomHelper.insertBefore(this.dom, config, true); + newEl.dom.appendChild(this.dom); + return newEl; + }, + + + replace: function(el){ + el = getEl(el); + this.insertBefore(el); + el.remove(); + return this; + }, + + + insertHtml : function(where, html){ + YAHOO.ext.DomHelper.insertHtml(where, this.dom, html); + return this; + }, + + + set : function(o){ + var el = this.dom; + var useSet = el.setAttribute ? true : false; + for(var attr in o){ + if(attr == 'style' || typeof o[attr] == 'function') continue; + if(attr=='cls'){ + el.className = o['cls']; + }else{ + if(useSet) el.setAttribute(attr, o[attr]); + else el[attr] = o[attr]; + } + } + YAHOO.ext.DomHelper.applyStyles(el, o.style); + return this; + } +}; + + +YAHOO.ext.Element.prototype.autoBoxAdjust = true; + +YAHOO.ext.Element.prototype.autoDisplayMode = true; + +YAHOO.ext.Element.unitPattern = /\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i; + +YAHOO.ext.Element.VISIBILITY = 1; + +YAHOO.ext.Element.DISPLAY = 2; + +YAHOO.ext.Element.blockElements = /^(?:address|blockquote|center|dir|div|dl|fieldset|form|h\d|hr|isindex|menu|ol|ul|p|pre|table|dd|dt|li|tbody|tr|td|thead|tfoot|iframe)$/i; +YAHOO.ext.Element.borders = {l: 'border-left-width', r: 'border-right-width', t: 'border-top-width', b: 'border-bottom-width'}; +YAHOO.ext.Element.paddings = {l: 'padding-left', r: 'padding-right', t: 'padding-top', b: 'padding-bottom'}; +YAHOO.ext.Element.margins = {l: 'margin-left', r: 'margin-right', t: 'margin-top', b: 'margin-bottom'}; + + +YAHOO.ext.Element.createStopHandler = function(stopPropagation, handler, scope, override){ + return function(e){ + if(e){ + if(stopPropagation){ + YAHOO.util.Event.stopEvent(e); + }else { + YAHOO.util.Event.preventDefault(e); + } + } + handler.call(override && scope ? scope : window, e, scope); + }; +}; + + +YAHOO.ext.Element.cache = {}; + + +YAHOO.ext.Element.get = function(el, autoGenerateId){ + if(!el){ return null; } + autoGenerateId = true; + if(el instanceof YAHOO.ext.Element){ + el.dom = YAHOO.util.Dom.get(el.id); + YAHOO.ext.Element.cache[el.id] = el; + return el; + }else if(el.isComposite){ + return el; + }else if(el instanceof Array){ + return YAHOO.ext.Element.select(el); + } + var key = el; + if(typeof el != 'string'){ + if(!el.id && !autoGenerateId){ return null; } + YAHOO.util.Dom.generateId(el, 'elgen-'); + key = el.id; + } + var element = YAHOO.ext.Element.cache[key]; + if(!element){ + element = new YAHOO.ext.Element(key); + if(!element.dom) return null; + YAHOO.ext.Element.cache[key] = element; + }else{ + element.dom = YAHOO.util.Dom.get(key); + } + return element; +}; + + +var getEl = YAHOO.ext.Element.get; + + +YAHOO.util.Event.addListener(window, 'unload', function(){ YAHOO.ext.Element.cache = null; }); + +YAHOO.ext.CompositeElement = function(els){ + this.elements = []; + this.addElements(els); +}; +YAHOO.ext.CompositeElement.prototype = { + isComposite: true, + addElements : function(els){ + if(!els) return this; + var yels = this.elements; + var index = yels.length-1; + for(var i = 0, len = els.length; i < len; i++) { + yels[++index] = getEl(els[i], true); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++) { + YAHOO.ext.Element.prototype[fn].apply(els[i], args); + } + return this; + }, + + add : function(els){ + if(typeof els == 'string'){ + this.addElements(YAHOO.ext.Element.selectorFunction(string)); + }else if(els instanceof Array){ + this.addElements(els); + }else{ + this.addElements([els]); + } + return this; + }, + + each : function(fn, scope){ + var els = this.elements; + for(var i = 0, len = els.length; i < len; i++){ + fn.call(scope || els[i], els[i], this, i); + } + return this; + } +}; + +YAHOO.ext.CompositeElementLite = function(els){ + YAHOO.ext.CompositeElementLite.superclass.constructor.call(this, els); + this.el = YAHOO.ext.Element.get(this.elements[0], true); +}; +YAHOO.extendX(YAHOO.ext.CompositeElementLite, YAHOO.ext.CompositeElement, { + addElements : function(els){ + if(els){ + this.elements = this.elements.concat(els); + } + return this; + }, + invoke : function(fn, args){ + var els = this.elements; + var el = this.el; + for(var i = 0, len = els.length; i < len; i++) { + el.dom = els[i]; + YAHOO.ext.Element.prototype[fn].apply(el, args); + } + return this; + } +}); +YAHOO.ext.CompositeElement.createCall = function(proto, fnName){ + if(!proto[fnName]){ + proto[fnName] = function(){ + return this.invoke(fnName, arguments); + }; + } +}; +for(var fnName in YAHOO.ext.Element.prototype){ + if(typeof YAHOO.ext.Element.prototype[fnName] == 'function'){ + YAHOO.ext.CompositeElement.createCall(YAHOO.ext.CompositeElement.prototype, fnName); + } +} +if(typeof cssQuery == 'function'){ + YAHOO.ext.Element.selectorFunction = cssQuery; +}else if(typeof document.getElementsBySelector == 'function'){ + YAHOO.ext.Element.selectorFunction = document.getElementsBySelector.createDelegate(document); +} + +YAHOO.ext.Element.select = function(selector, unique){ + var els; + if(typeof selector == 'string'){ + els = YAHOO.ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw 'Invalid selector'; + } + if(unique === true){ + return new YAHOO.ext.CompositeElement(els); + }else{ + return new YAHOO.ext.CompositeElementLite(els); + } +}; + +var getEls = YAHOO.ext.Element.select; +YAHOO.namespace('ext.state'); + +YAHOO.ext.state.Provider = function(){ + YAHOO.ext.state.Provider.superclass.constructor.call(this); + + this.events = { + 'statechange': new YAHOO.util.CustomEvent('statechange') + }; + this.state = {}; +}; +YAHOO.extendX(YAHOO.ext.state.Provider, YAHOO.ext.util.Observable, { + + get : function(name, defaultValue){ + return typeof this.state[name] == 'undefined' ? + defaultValue : this.state[name]; + }, + + + clear : function(name){ + delete this.state[name]; + this.fireEvent('statechange', this, name, null); + }, + + + set : function(name, value){ + this.state[name] = value; + this.fireEvent('statechange', this, name, value); + }, + + + decodeValue : function(cookie){ + var re = /^(a|n|d|b|s|o)\:(.*)$/; + var matches = re.exec(unescape(cookie)); + if(!matches || !matches[1]) return; + var type = matches[1]; + var v = matches[2]; + switch(type){ + case 'n': + return parseFloat(v); + case 'd': + return new Date(Date.parse(v)); + case 'b': + return (v == '1'); + case 'a': + var all = []; + var values = v.split('^'); + for(var i = 0, len = values.length; i < len; i++){ + all.push(this.decodeValue(values[i])) + } + return all; + case 'o': + var all = {}; + var values = v.split('^'); + for(var i = 0, len = values.length; i < len; i++){ + var kv = values[i].split('='); + all[kv[0]] = this.decodeValue(kv[1]); + } + return all; + default: + return v; + } + }, + + + encodeValue : function(v){ + var enc; + if(typeof v == 'number'){ + enc = 'n:' + v; + }else if(typeof v == 'boolean'){ + enc = 'b:' + (v ? '1' : '0'); + }else if(v instanceof Date){ + enc = 'd:' + v.toGMTString(); + }else if(v instanceof Array){ + var flat = ''; + for(var i = 0, len = v.length; i < len; i++){ + flat += this.encodeValue(v[i]); + if(i != len-1) flat += '^'; + } + enc = 'a:' + flat; + }else if(typeof v == 'object'){ + var flat = ''; + for(var key in v){ + if(typeof v[key] != 'function'){ + flat += key + '=' + this.encodeValue(v[key]) + '^'; + } + } + enc = 'o:' + flat.substring(0, flat.length-1); + }else{ + enc = 's:' + v; + } + return escape(enc); + } +}); + + +YAHOO.ext.state.Manager = new function(){ + var provider = new YAHOO.ext.state.Provider(); + + return { + + setProvider : function(stateProvider){ + provider = stateProvider; + }, + + + get : function(key, defaultValue){ + return provider.get(key, defaultValue); + }, + + + set : function(key, value){ + provider.set(key, value); + }, + + + clear : function(key){ + provider.clear(key); + }, + + + getProvider : function(){ + return provider; + } + }; +}(); + + +YAHOO.ext.state.CookieProvider = function(config){ + YAHOO.ext.state.CookieProvider.superclass.constructor.call(this); + this.path = '/'; + this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); + this.domain = null; + this.secure = false; + YAHOO.ext.util.Config.apply(this, config); + this.state = this.readCookies(); +}; + +YAHOO.extendX(YAHOO.ext.state.CookieProvider, YAHOO.ext.state.Provider, { + set : function(name, value){ + if(typeof value == 'undefined' || value === null){ + this.clear(name); + return; + } + this.setCookie(name, value); + YAHOO.ext.state.CookieProvider.superclass.set.call(this, name, value); + }, + + clear : function(name){ + this.clearCookie(name); + YAHOO.ext.state.CookieProvider.superclass.clear.call(this, name); + }, + + readCookies : function(){ + var cookies = {}; + var c = document.cookie + ';'; + var re = /\s?(.*?)=(.*?);/g; + var matches; + while((matches = re.exec(c)) != null){ + var name = matches[1]; + var value = matches[2]; + if(name && name.substring(0,3) == 'ys-'){ + cookies[name.substr(3)] = this.decodeValue(value); + } + } + return cookies; + }, + + setCookie : function(name, value){ + document.cookie = "ys-"+ name + "=" + this.encodeValue(value) + + ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + }, + + clearCookie : function(name){ + document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" + + ((this.path == null) ? "" : ("; path=" + this.path)) + + ((this.domain == null) ? "" : ("; domain=" + this.domain)) + + ((this.secure == true) ? "; secure" : ""); + } +}); + + + +YAHOO.ext.EventManager = new function(){ + var docReadyEvent; + var docReadyProcId; + var docReadyState = false; + this.ieDeferSrc = null; + var resizeEvent; + var resizeTask; + + var fireDocReady = function(){ + if(!docReadyState){ + docReadyState = true; + if(docReadyProcId){ + clearInterval(docReadyProcId); + } + if(docReadyEvent){ + docReadyEvent.fire(); + } + } + }; + + var initDocReady = function(){ + docReadyEvent = new YAHOO.util.CustomEvent('documentready'); + if(document.addEventListener) { + YAHOO.util.Event.on(document, "DOMContentLoaded", fireDocReady); + }else if(YAHOO.ext.util.Browser.isIE){ + + document.write(''); + YAHOO.util.Event.on('ie-deferred-loader', 'readystatechange', function(){ + if(this.readyState == 'complete'){ + fireDocReady(); + } + }); + }else if(YAHOO.ext.util.Browser.isSafari){ + docReadyProcId = setInterval(function(){ + var rs = document.readyState; + if(rs == 'loaded' || rs == 'complete') { + fireDocReady(); + } + }, 10); + } + + YAHOO.util.Event.on(window, 'load', fireDocReady); + }; + + this.wrap = function(fn, scope, override){ + var wrappedFn = function(e){ + YAHOO.ext.EventObject.setEvent(e); + fn.call(override ? scope || window : window, YAHOO.ext.EventObject, scope); + }; + return wrappedFn; + }; + + + this.addListener = function(element, eventName, fn, scope, override){ + var wrappedFn = this.wrap(fn, scope, override); + YAHOO.util.Event.addListener(element, eventName, wrappedFn); + return wrappedFn; + }; + + + this.removeListener = function(element, eventName, wrappedFn){ + return YAHOO.util.Event.removeListener(element, eventName, wrappedFn); + }; + + + this.on = this.addListener; + + + this.onDocumentReady = function(fn, scope, override){ + if(!docReadyEvent){ + initDocReady(); + } + docReadyEvent.subscribe(fn, scope, override); + } + + + this.onWindowResize = function(fn, scope, override){ + if(!resizeEvent){ + resizeEvent = new YAHOO.util.CustomEvent('windowresize'); + resizeTask = new YAHOO.ext.util.DelayedTask(function(){ + resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight()); + }); + YAHOO.util.Event.on(window, 'resize', function(){ + resizeTask.delay(50); + }); + } + resizeEvent.subscribe(fn, scope, override); + }, + + + this.removeResizeListener = function(fn, scope){ + if(resizeEvent){ + resizeEvent.unsubscribe(fn, scope); + } + } +}; + + +YAHOO.ext.EventObject = new function(){ + + this.browserEvent = null; + + this.button = -1; + + this.shiftKey = false; + + this.ctrlKey = false; + + this.altKey = false; + + + this.BACKSPACE = 8; + + this.TAB = 9; + + this.RETURN = 13; + + this.ESC = 27; + + this.SPACE = 32; + + this.PAGEUP = 33; + + this.PAGEDOWN = 34; + + this.END = 35; + + this.HOME = 36; + + this.LEFT = 37; + + this.UP = 38; + + this.RIGHT = 39; + + this.DOWN = 40; + + this.DELETE = 46; + + this.F5 = 116; + + + this.setEvent = function(e){ + this.browserEvent = e; + if(e){ + this.button = e.button; + this.shiftKey = e.shiftKey; + this.ctrlKey = e.ctrlKey; + this.altKey = e.altKey; + }else{ + this.button = -1; + this.shiftKey = false; + this.ctrlKey = false; + this.altKey = false; + } + }; + + + this.stopEvent = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopEvent(this.browserEvent); + } + }; + + + this.preventDefault = function(){ + if(this.browserEvent){ + YAHOO.util.Event.preventDefault(this.browserEvent); + } + }; + + + this.isNavKeyPress = function(){ + return (this.browserEvent.keyCode && this.browserEvent.keyCode >= 33 && this.browserEvent.keyCode <= 40); + }; + + + this.stopPropagation = function(){ + if(this.browserEvent){ + YAHOO.util.Event.stopPropagation(this.browserEvent); + } + }; + + + this.getCharCode = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getCharCode(this.browserEvent); + } + return null; + }; + + + this.getKey = function(){ + if(this.browserEvent){ + return this.browserEvent.charCode || this.browserEvent.keyCode; + } + return null; + }; + + + this.getPageX = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageX(this.browserEvent); + } + return null; + }; + + + this.getPageY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getPageY(this.browserEvent); + } + return null; + }; + + + this.getTime = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTime(this.browserEvent); + } + return null; + }; + + + this.getXY = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getXY(this.browserEvent); + } + return []; + }; + + + this.getTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getTarget(this.browserEvent); + } + return null; + }; + + + this.findTarget = function(className, tagName){ + if(tagName) tagName = tagName.toLowerCase(); + if(this.browserEvent){ + function isMatch(el){ + if(!el){ + return false; + } + if(className && !YAHOO.util.Dom.hasClass(el, className)){ + return false; + } + if(tagName && el.tagName.toLowerCase() != tagName){ + return false; + } + return true; + }; + + var t = this.getTarget(); + if(!t || isMatch(t)){ + return t; + } + var p = t.parentNode; + var b = document.body; + while(p && p != b){ + if(isMatch(p)){ + return p; + } + p = p.parentNode; + } + } + return null; + }; + + this.getRelatedTarget = function(){ + if(this.browserEvent){ + return YAHOO.util.Event.getRelatedTarget(this.browserEvent); + } + return null; + }; + + + this.getWheelDelta = function(){ + var e = this.browserEvent; + var delta = 0; + if(e.wheelDelta){ + delta = e.wheelDelta/120; + + if(window.opera) delta = -delta; + }else if(e.detail){ + delta = -e.detail/3; + } + return delta; + }; + + + this.hasModifier = function(){ + return this.ctrlKey || this.altKey || this.shiftKey; + }; +}(); + + + +YAHOO.ext.UpdateManager = function(el, forceNew){ + el = YAHOO.ext.Element.get(el); + if(!forceNew && el.updateManager){ + return el.updateManager; + } + + this.el = el; + + this.defaultUrl = null; + this.beforeUpdate = new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate'); + this.onUpdate = new YAHOO.util.CustomEvent('UpdateManager.onUpdate'); + this.onFailure = new YAHOO.util.CustomEvent('UpdateManager.onFailure'); + + this.events = { + + 'beforeupdate': this.beforeUpdate, + + 'update': this.onUpdate, + + 'failure': this.onFailure + }; + + + this.sslBlankUrl = YAHOO.ext.UpdateManager.defaults.sslBlankUrl; + + this.disableCaching = YAHOO.ext.UpdateManager.defaults.disableCaching; + + this.indicatorText = YAHOO.ext.UpdateManager.defaults.indicatorText; + + this.showLoadIndicator = YAHOO.ext.UpdateManager.defaults.showLoadIndicator; + + this.timeout = YAHOO.ext.UpdateManager.defaults.timeout; + + + this.loadScripts = YAHOO.ext.UpdateManager.defaults.loadScripts; + + + this.transaction = null; + + + this.autoRefreshProcId = null; + + this.refreshDelegate = this.refresh.createDelegate(this); + + this.updateDelegate = this.update.createDelegate(this); + + this.formUpdateDelegate = this.formUpdate.createDelegate(this); + + this.successDelegate = this.processSuccess.createDelegate(this); + + this.failureDelegate = this.processFailure.createDelegate(this); + + + this.renderer = new YAHOO.ext.UpdateManager.BasicRenderer(); +}; + +YAHOO.ext.UpdateManager.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + getEl : function(){ + return this.el; + }, + + + update : function(url, params, callback, discardUrl){ + if(this.beforeUpdate.fireDirect(this.el, url, params) !== false){ + if(typeof url == 'object'){ + var cfg = url; + url = cfg.url; + params = params || cfg.params; + callback = callback || cfg.callback; + discardUrl = discardUrl || cfg.discardUrl; + if(callback && cfg.scope){ + callback = callback.createDelegate(cfg.scope); + } + if(typeof cfg.nocache != 'undefined'){this.disableCaching = cfg.nocache}; + if(typeof cfg.text != 'undefined'){this.indicatorText = cfg.text}; + if(typeof cfg.scripts != 'undefined'){this.loadScripts = cfg.scripts}; + if(typeof cfg.timeout != 'undefined'){this.timeout = cfg.timeout}; + } + this.showLoading(); + if(!discardUrl){ + this.defaultUrl = url; + } + if(typeof url == 'function'){ + url = url(); + } + if(params && typeof params != 'string'){ + var buf = []; + for(var key in params){ + if(typeof params[key] != 'function'){ + buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&'); + } + } + delete buf[buf.length-1]; + params = buf.join(''); + } + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': null, 'callback': callback, 'params': params} + }; + var method = params ? 'POST' : 'GET'; + if(method == 'GET'){ + url = this.prepareUrl(url); + } + this.transaction = YAHOO.util.Connect.asyncRequest(method, url, callback, params); + } + }, + + + formUpdate : function(form, url, reset, callback){ + if(this.beforeUpdate.fireDirect(this.el, form, url) !== false){ + this.showLoading(); + formEl = YAHOO.util.Dom.get(form); + if(typeof url == 'function'){ + url = url(); + } + url = url || formEl.action; + var callback = { + success: this.successDelegate, + failure: this.failureDelegate, + timeout: (this.timeout*1000), + argument: {'url': url, 'form': form, 'callback': callback, 'reset': reset} + }; + var isUpload = false; + var enctype = formEl.getAttribute('enctype'); + if(enctype && enctype.toLowerCase() == 'multipart/form-data'){ + isUpload = true; + } + YAHOO.util.Connect.setForm(form, isUpload, this.sslBlankUrl); + this.transaction = YAHOO.util.Connect.asyncRequest('POST', url, callback); + } + }, + + + refresh : function(callback){ + if(this.defaultUrl == null){ + return; + } + this.update(this.defaultUrl, null, callback, true); + }, + + + startAutoRefresh : function(interval, url, params, callback, refreshNow){ + if(refreshNow){ + this.update(url || this.defaultUrl, params, callback, true); + } + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + this.autoRefreshProcId = setInterval(this.update.createDelegate(this, [url || this.defaultUrl, params, callback, true]), interval*1000); + }, + + + stopAutoRefresh : function(){ + if(this.autoRefreshProcId){ + clearInterval(this.autoRefreshProcId); + } + }, + + + showLoading : function(){ + if(this.showLoadIndicator){ + this.el.update(this.indicatorText); + } + }, + + + prepareUrl : function(url){ + if(this.disableCaching){ + var append = '_dc=' + (new Date().getTime()); + if(url.indexOf('?') !== -1){ + url += '&' + append; + }else{ + url += '?' + append; + } + } + return url; + }, + + + processSuccess : function(response){ + this.transaction = null; + if(response.argument.form && response.argument.reset){ + try{ + response.argument.form.reset(); + }catch(e){} + } + if(this.loadScripts){ + this.renderer.render(this.el, response, this, + this.updateComplete.createDelegate(this, [response])); + }else{ + this.renderer.render(this.el, response, this); + this.updateComplete(response); + } + }, + + updateComplete : function(response){ + this.fireEvent('update', this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, true); + } + }, + + + processFailure : function(response){ + this.transaction = null; + this.onFailure.fireDirect(this.el, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this.el, false); + } + }, + + + setRenderer : function(renderer){ + this.renderer = renderer; + }, + + getRenderer : function(){ + return this.renderer; + }, + + + setDefaultUrl : function(defaultUrl){ + this.defaultUrl = defaultUrl; + }, + + + abort : function(){ + if(this.transaction){ + YAHOO.util.Connect.abort(this.transaction); + } + }, + + + isUpdating : function(){ + if(this.transaction){ + return YAHOO.util.Connect.isCallInProgress(this.transaction); + } + return false; + } +}; + + + YAHOO.ext.UpdateManager.defaults = { + + timeout : 30, + + + loadScripts : false, + + + sslBlankUrl : (YAHOO.ext.SSL_SECURE_URL || 'javascript:false'), + + disableCaching : false, + + showLoadIndicator : true, + + indicatorText : '
        Loading...
        ' + }; + + +YAHOO.ext.UpdateManager.updateElement = function(el, url, params, options){ + var um = getEl(el, true).getUpdateManager(); + YAHOO.ext.util.Config.apply(um, options); + um.update(url, params, options.callback); +} + +YAHOO.ext.UpdateManager.update = YAHOO.ext.UpdateManager.updateElement; + +YAHOO.ext.UpdateManager.BasicRenderer = function(){}; + +YAHOO.ext.UpdateManager.BasicRenderer.prototype = { + + render : function(el, response, updateManager, callback){ + el.update(response.responseText, updateManager.loadScripts, callback); + } +}; + + + +Date.parseFunctions = {count:0}; + +Date.parseRegexes = []; + +Date.formatFunctions = {count:0}; + + +Date.prototype.dateFormat = function(format) { + if (Date.formatFunctions[format] == null) { + Date.createNewFormat(format); + } + var func = Date.formatFunctions[format]; + return this[func](); +}; + + +Date.prototype.format = Date.prototype.dateFormat; + + +Date.createNewFormat = function(format) { + var funcName = "format" + Date.formatFunctions.count++; + Date.formatFunctions[format] = funcName; + var code = "Date.prototype." + funcName + " = function(){return "; + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + code += "'" + String.escape(ch) + "' + "; + } + else { + code += Date.getFormatCode(ch); + } + } + eval(code.substring(0, code.length - 3) + ";}"); +}; + + +Date.getFormatCode = function(character) { + switch (character) { + case "d": + return "String.leftPad(this.getDate(), 2, '0') + "; + case "D": + return "Date.dayNames[this.getDay()].substring(0, 3) + "; + case "j": + return "this.getDate() + "; + case "l": + return "Date.dayNames[this.getDay()] + "; + case "S": + return "this.getSuffix() + "; + case "w": + return "this.getDay() + "; + case "z": + return "this.getDayOfYear() + "; + case "W": + return "this.getWeekOfYear() + "; + case "F": + return "Date.monthNames[this.getMonth()] + "; + case "m": + return "String.leftPad(this.getMonth() + 1, 2, '0') + "; + case "M": + return "Date.monthNames[this.getMonth()].substring(0, 3) + "; + case "n": + return "(this.getMonth() + 1) + "; + case "t": + return "this.getDaysInMonth() + "; + case "L": + return "(this.isLeapYear() ? 1 : 0) + "; + case "Y": + return "this.getFullYear() + "; + case "y": + return "('' + this.getFullYear()).substring(2, 4) + "; + case "a": + return "(this.getHours() < 12 ? 'am' : 'pm') + "; + case "A": + return "(this.getHours() < 12 ? 'AM' : 'PM') + "; + case "g": + return "((this.getHours() %12) ? this.getHours() % 12 : 12) + "; + case "G": + return "this.getHours() + "; + case "h": + return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + "; + case "H": + return "String.leftPad(this.getHours(), 2, '0') + "; + case "i": + return "String.leftPad(this.getMinutes(), 2, '0') + "; + case "s": + return "String.leftPad(this.getSeconds(), 2, '0') + "; + case "O": + return "this.getGMTOffset() + "; + case "T": + return "this.getTimezone() + "; + case "Z": + return "(this.getTimezoneOffset() * -60) + "; + default: + return "'" + String.escape(character) + "' + "; + }; +}; + + +Date.parseDate = function(input, format) { + if (Date.parseFunctions[format] == null) { + Date.createParser(format); + } + var func = Date.parseFunctions[format]; + return Date[func](input); +}; + + +Date.createParser = function(format) { + var funcName = "parse" + Date.parseFunctions.count++; + var regexNum = Date.parseRegexes.length; + var currentGroup = 1; + Date.parseFunctions[format] = funcName; + + var code = "Date." + funcName + " = function(input){\n" + + "var y = -1, m = -1, d = -1, h = -1, i = -1, s = -1;\n" + + "var d = new Date();\n" + + "y = d.getFullYear();\n" + + "m = d.getMonth();\n" + + "d = d.getDate();\n" + + "var results = input.match(Date.parseRegexes[" + regexNum + "]);\n" + + "if (results && results.length > 0) {" + var regex = ""; + + var special = false; + var ch = ''; + for (var i = 0; i < format.length; ++i) { + ch = format.charAt(i); + if (!special && ch == "\\") { + special = true; + } + else if (special) { + special = false; + regex += String.escape(ch); + } + else { + obj = Date.formatCodeToRegex(ch, currentGroup); + currentGroup += obj.g; + regex += obj.s; + if (obj.g && obj.c) { + code += obj.c; + } + } + } + + code += "if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n" + + "{return new Date(y, m, d, h, i, s);}\n" + + "else if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" + + "{return new Date(y, m, d, h, i);}\n" + + "else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n" + + "{return new Date(y, m, d, h);}\n" + + "else if (y > 0 && m >= 0 && d > 0)\n" + + "{return new Date(y, m, d);}\n" + + "else if (y > 0 && m >= 0)\n" + + "{return new Date(y, m);}\n" + + "else if (y > 0)\n" + + "{return new Date(y);}\n" + + "}return null;}"; + + Date.parseRegexes[regexNum] = new RegExp("^" + regex + "$"); + eval(code); +}; + + +Date.formatCodeToRegex = function(character, currentGroup) { + switch (character) { + case "D": + return {g:0, + c:null, + s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"}; + case "j": + case "d": + return {g:1, + c:"d = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "l": + return {g:0, + c:null, + s:"(?:" + Date.dayNames.join("|") + ")"}; + case "S": + return {g:0, + c:null, + s:"(?:st|nd|rd|th)"}; + case "w": + return {g:0, + c:null, + s:"\\d"}; + case "z": + return {g:0, + c:null, + s:"(?:\\d{1,3})"}; + case "W": + return {g:0, + c:null, + s:"(?:\\d{2})"}; + case "F": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "].substring(0, 3)], 10);\n", + s:"(" + Date.monthNames.join("|") + ")"}; + case "M": + return {g:1, + c:"m = parseInt(Date.monthNumbers[results[" + currentGroup + "]], 10);\n", + s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"}; + case "n": + case "m": + return {g:1, + c:"m = parseInt(results[" + currentGroup + "], 10) - 1;\n", + s:"(\\d{1,2})"}; + case "t": + return {g:0, + c:null, + s:"\\d{1,2}"}; + case "L": + return {g:0, + c:null, + s:"(?:1|0)"}; + case "Y": + return {g:1, + c:"y = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{4})"}; + case "y": + return {g:1, + c:"var ty = parseInt(results[" + currentGroup + "], 10);\n" + + "y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n", + s:"(\\d{1,2})"}; + case "a": + return {g:1, + c:"if (results[" + currentGroup + "] == 'am') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(am|pm)"}; + case "A": + return {g:1, + c:"if (results[" + currentGroup + "] == 'AM') {\n" + + "if (h == 12) { h = 0; }\n" + + "} else { if (h < 12) { h += 12; }}", + s:"(AM|PM)"}; + case "g": + case "G": + case "h": + case "H": + return {g:1, + c:"h = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{1,2})"}; + case "i": + return {g:1, + c:"i = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "s": + return {g:1, + c:"s = parseInt(results[" + currentGroup + "], 10);\n", + s:"(\\d{2})"}; + case "O": + return {g:0, + c:null, + s:"[+-]\\d{4}"}; + case "T": + return {g:0, + c:null, + s:"[A-Z]{3}"}; + case "Z": + return {g:0, + c:null, + s:"[+-]\\d{1,5}"}; + default: + return {g:0, + c:null, + s:String.escape(character)}; + } +}; + +Date.prototype.getTimezone = function() { + return this.toString().replace( + /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace( + /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); +}; + +Date.prototype.getGMTOffset = function() { + return (this.getTimezoneOffset() > 0 ? "-" : "+") + + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0") + + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); +}; + +Date.prototype.getDayOfYear = function() { + var num = 0; + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + for (var i = 0; i < this.getMonth(); ++i) { + num += Date.daysInMonth[i]; + } + return num + this.getDate() - 1; +}; + +Date.prototype.getWeekOfYear = function() { + + var now = this.getDayOfYear() + (4 - this.getDay()); + + var jan1 = new Date(this.getFullYear(), 0, 1); + var then = (7 - jan1.getDay() + 4); + document.write(then); + return String.leftPad(((now - then) / 7) + 1, 2, "0"); +}; + +Date.prototype.isLeapYear = function() { + var year = this.getFullYear(); + return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); +}; + +Date.prototype.getFirstDayOfMonth = function() { + var day = (this.getDay() - (this.getDate() - 1)) % 7; + return (day < 0) ? (day + 7) : day; +}; + +Date.prototype.getLastDayOfMonth = function() { + var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7; + return (day < 0) ? (day + 7) : day; +}; + +Date.prototype.getDaysInMonth = function() { + Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; + return Date.daysInMonth[this.getMonth()]; +}; + + +Date.prototype.getSuffix = function() { + switch (this.getDate()) { + case 1: + case 21: + case 31: + return "st"; + case 2: + case 22: + return "nd"; + case 3: + case 23: + return "rd"; + default: + return "th"; + } +}; + + +Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; + + +Date.monthNames = + ["January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December"]; + + +Date.dayNames = + ["Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday"]; + + +Date.y2kYear = 50; + + +Date.monthNumbers = { + Jan:0, + Feb:1, + Mar:2, + Apr:3, + May:4, + Jun:5, + Jul:6, + Aug:7, + Sep:8, + Oct:9, + Nov:10, + Dec:11}; + +YAHOO.ext.TabPanel = function(container, config){ + + this.el = getEl(container, true); + + this.tabPosition = 'top'; + this.currentTabWidth = 0; + + this.minTabWidth = 40; + + this.maxTabWidth = 250; + + this.preferredTabWidth = 175; + + this.resizeTabs = false; + + this.monitorResize = true; + + if(config){ + if(typeof config == 'boolean'){ + this.tabPosition = config ? 'bottom' : 'top'; + }else{ + YAHOO.ext.util.Config.apply(this, config); + } + } + if(this.tabPosition == 'bottom'){ + this.bodyEl = getEl(this.createBody(this.el.dom)); + this.el.addClass('ytabs-bottom'); + } + this.stripWrap = getEl(this.createStrip(this.el.dom), true); + this.stripEl = getEl(this.createStripList(this.stripWrap.dom), true); + this.stripBody = getEl(this.stripWrap.dom.firstChild.firstChild, true); + if(this.tabPosition != 'bottom'){ + + this.bodyEl = getEl(this.createBody(this.el.dom)); + this.el.addClass('ytabs-top'); + } + this.items = []; + + this.bodyEl.setStyle('position', 'relative'); + + + if(!this.items.indexOf){ + this.items.indexOf = function(o){ + for(var i = 0, len = this.length; i < len; i++){ + if(this[i] == o) return i; + } + return -1; + } + } + this.active = null; + this.onTabChange = new YAHOO.util.CustomEvent('TabItem.onTabChange'); + this.activateDelegate = this.activate.createDelegate(this); + + this.events = { + + 'tabchange': this.onTabChange, + + 'beforetabchange' : new YAHOO.util.CustomEvent('beforechange') + }; + + YAHOO.ext.EventManager.onWindowResize(this.onResize, this, true); + this.cpad = this.el.getPadding('lr'); + this.hiddenCount = 0; +} + +YAHOO.ext.TabPanel.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + addTab : function(id, text, content, closable){ + var item = new YAHOO.ext.TabPanelItem(this, id, text, closable); + this.addTabItem(item); + if(content){ + item.setContent(content); + } + return item; + }, + + + getTab : function(id){ + return this.items[id]; + }, + + + hideTab : function(id){ + var t = this.items[id]; + if(!t.isHidden()){ + t.setHidden(true); + this.hiddenCount++; + this.autoSizeTabs(); + } + }, + + + unhideTab : function(id){ + var t = this.items[id]; + if(t.isHidden()){ + t.setHidden(false); + this.hiddenCount--; + this.autoSizeTabs(); + } + }, + + + addTabItem : function(item){ + this.items[item.id] = item; + this.items.push(item); + if(this.resizeTabs){ + item.setWidth(this.currentTabWidth || this.preferredTabWidth) + this.autoSizeTabs(); + }else{ + item.autoSize(); + } + }, + + + removeTab : function(id){ + var items = this.items; + var tab = items[id]; + if(!tab) return; + var index = items.indexOf(tab); + if(this.active == tab && items.length > 1){ + var newTab = this.getNextAvailable(index); + if(newTab)newTab.activate(); + } + tab.purgeListeners(); + this.stripEl.dom.removeChild(tab.pnode.dom); + if(tab.bodyEl.dom.parentNode == this.bodyEl.dom){ + this.bodyEl.dom.removeChild(tab.bodyEl.dom); + } + items.splice(index, 1); + delete this.items[tab.id]; + this.autoSizeTabs(); + }, + + getNextAvailable : function(start){ + var items = this.items; + var index = start; + + + while(index < items.length){ + var item = items[++index]; + if(item && !item.isHidden()){ + return item; + } + } + + var index = start; + while(index >= 0){ + var item = items[--index]; + if(item && !item.isHidden()){ + return item; + } + } + return null; + }, + + + disableTab : function(id){ + var tab = this.items[id]; + if(tab && this.active != tab){ + tab.disable(); + } + }, + + + enableTab : function(id){ + var tab = this.items[id]; + tab.enable(); + }, + + + activate : function(id){ + var tab = this.items[id]; + if(tab == this.active){ + return tab; + } + var e = {}; + this.fireEvent('beforetabchange', this, e, tab); + if(e.cancel !== true && !tab.disabled){ + if(this.active){ + this.active.hide(); + } + this.active = this.items[id]; + this.active.show(); + this.onTabChange.fireDirect(this, this.active); + } + return tab; + }, + + + getActiveTab : function(){ + return this.active; + }, + + + syncHeight : function(targetHeight){ + var height = (targetHeight || this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb'); + var bm = this.bodyEl.getMargins(); + var newHeight = height-(this.stripWrap.getHeight())-(bm.top+bm.bottom); + this.bodyEl.setHeight(newHeight); + return newHeight; + }, + + onResize : function(){ + if(this.monitorResize){ + this.autoSizeTabs(); + } + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(){ + this.updating = false; + this.autoSizeTabs(); + }, + + + autoSizeTabs : function(){ + var count = this.items.length; + var vcount = count - this.hiddenCount; + if(!this.resizeTabs || count < 1 || vcount < 1 || this.updating) return; + var w = Math.max(this.el.getWidth() - this.cpad, 10); + var availWidth = Math.floor(w / vcount); + var b = this.stripBody; + if(b.getWidth() > w){ + var tabs = this.items; + this.setTabWidth(Math.max(availWidth, this.minTabWidth)); + if(availWidth < this.minTabWidth){ + + } + }else{ + if(this.currentTabWidth < this.preferredTabWidth){ + this.setTabWidth(Math.min(availWidth, this.preferredTabWidth)); + } + } + }, + + + setTabWidth : function(width){ + this.currentTabWidth = width; + for(var i = 0, len = this.items.length; i < len; i++) { + if(!this.items[i].isHidden())this.items[i].setWidth(width); + } + }, + + + destroy : function(removeEl){ + YAHOO.ext.EventManager.removeResizeListener(this.onResize, this); + for(var i = 0, len = this.items.length; i < len; i++){ + this.items[i].purgeListeners(); + } + if(removeEl === true){ + this.el.update(''); + this.el.remove(); + } + } +}; + + +YAHOO.ext.TabPanelItem = function(tabPanel, id, text, closable){ + + this.tabPanel = tabPanel; + + this.id = id; + + this.disabled = false; + + this.text = text; + + this.loaded = false; + this.closable = closable; + + + this.bodyEl = getEl(tabPanel.createItemBody(tabPanel.bodyEl.dom, id)); + this.bodyEl.setVisibilityMode(YAHOO.ext.Element.VISIBILITY); + this.bodyEl.setStyle('display', 'block'); + this.bodyEl.setStyle('zoom', '1'); + this.hideAction(); + + var els = tabPanel.createStripElements(tabPanel.stripEl.dom, text, closable); + + this.el = getEl(els.el, true); + this.inner = getEl(els.inner, true); + this.textEl = getEl(this.el.dom.firstChild.firstChild.firstChild, true); + this.pnode = getEl(els.el.parentNode, true); + this.el.mon('click', this.onTabClick, this, true); + + if(closable){ + var c = getEl(els.close, true); + c.dom.title = this.closeText; + c.addClassOnOver('close-over'); + c.mon('click', this.closeClick, this, true); + } + + + this.onActivate = new YAHOO.util.CustomEvent('TabItem.onActivate'); + this.onDeactivate = new YAHOO.util.CustomEvent('TabItem.onDeactivate'); + + this.events = { + + 'activate': this.onActivate, + + 'beforeclose': new YAHOO.util.CustomEvent('beforeclose'), + + 'close': new YAHOO.util.CustomEvent('close'), + + 'deactivate' : this.onDeactivate + }; + this.hidden = false; +}; + +YAHOO.ext.TabPanelItem.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : function(){ + YAHOO.ext.util.Observable.prototype.purgeListeners.call(this); + this.el.removeAllListeners(); + }, + + show : function(){ + this.pnode.addClass('on'); + this.showAction(); + if(YAHOO.ext.util.Browser.isOpera){ + this.tabPanel.stripWrap.repaint(); + } + this.onActivate.fireDirect(this.tabPanel, this); + }, + + + hide : function(){ + this.pnode.removeClass('on'); + this.hideAction(); + this.onDeactivate.fireDirect(this.tabPanel, this); + }, + + hideAction : function(){ + this.bodyEl.setStyle('position', 'absolute'); + this.bodyEl.setLeft('-20000px'); + this.bodyEl.setTop('-20000px'); + this.bodyEl.hide(); + }, + + showAction : function(){ + this.bodyEl.setStyle('position', 'relative'); + this.bodyEl.setTop(''); + this.bodyEl.setLeft(''); + this.bodyEl.show(); + this.tabPanel.el.repaint.defer(1); + }, + + setTooltip : function(text){ + this.titleEl.dom.title = text; + }, + + onTabClick : function(e){ + e.preventDefault(); + this.tabPanel.activate(this.id); + }, + + getWidth : function(){ + return this.inner.getWidth(); + }, + + setWidth : function(width){ + var iwidth = width - this.pnode.getPadding("lr"); + this.inner.setWidth(iwidth); + this.textEl.setWidth(iwidth-this.inner.getPadding('lr')); + this.pnode.setWidth(width); + }, + + setHidden : function(hidden){ + this.hidden = hidden; + this.pnode.setStyle('display', hidden ? 'none' : 'block'); + }, + + isHidden : function(){ + return this.hidden; + }, + + getText : function(){ + return this.text; + }, + + autoSize : function(){ + this.el.beginMeasure(); + this.textEl.setWidth(1); + this.setWidth(this.textEl.dom.scrollWidth+this.pnode.getPadding("lr")+this.inner.getPadding('lr')); + this.el.endMeasure(); + }, + + setText : function(text){ + this.text = text; + this.textEl.update(text); + this.textEl.dom.title = text; + if(!this.tabPanel.resizeTabs){ + this.autoSize(); + } + }, + + activate : function(){ + this.tabPanel.activate(this.id); + }, + + + disable : function(){ + if(this.tabPanel.active != this){ + this.disabled = true; + this.pnode.addClass('disabled'); + } + }, + + + enable : function(){ + this.disabled = false; + this.pnode.removeClass('disabled'); + }, + + + setContent : function(content, loadScripts){ + this.bodyEl.update(content, loadScripts); + }, + + + getUpdateManager : function(){ + return this.bodyEl.getUpdateManager(); + }, + + + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.onActivate.unsubscribe(this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.onActivate.subscribe(this.refreshDelegate); + return this.bodyEl.getUpdateManager(); + }, + + + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.bodyEl.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + + _setLoaded : function(){ + this.loaded = true; + }, + + + closeClick : function(e){ + var e = {}; + this.fireEvent('beforeclose', this, e); + if(e.cancel !== true){ + this.tabPanel.removeTab(this.id); + this.fireEvent('close', this); + } + }, + + closeText : 'Close this tab' +}; + + +YAHOO.ext.TabPanel.prototype.createStrip = function(container){ + var strip = document.createElement('div'); + strip.className = 'ytab-wrap'; + container.appendChild(strip); + return strip; +}; + +YAHOO.ext.TabPanel.prototype.createStripList = function(strip){ + + strip.innerHTML = '
        '; + return strip.firstChild.firstChild.firstChild.firstChild; +}; + +YAHOO.ext.TabPanel.prototype.createBody = function(container){ + var body = document.createElement('div'); + YAHOO.util.Dom.generateId(body, 'tab-body'); + YAHOO.util.Dom.addClass(body, 'yui-ext-tabbody'); + container.appendChild(body); + return body; +}; + +YAHOO.ext.TabPanel.prototype.createItemBody = function(bodyEl, id){ + var body = YAHOO.util.Dom.get(id); + if(!body){ + body = document.createElement('div'); + body.id = id; + } + YAHOO.util.Dom.addClass(body, 'yui-ext-tabitembody'); + bodyEl.appendChild(body); + return body; +}; + +YAHOO.ext.TabPanel.prototype.createStripElements = function(stripEl, text, closable){ + var td = document.createElement('td'); + stripEl.appendChild(td); + if(closable){ + td.className = "ytab-closable"; + if(!this.closeTpl){ + this.closeTpl = new YAHOO.ext.Template( + '' + + '{text}' + + '
         
        ' + ); + } + var el = this.closeTpl.overwrite(td, {'text': text}); + var close = el.getElementsByTagName('div')[0]; + var inner = el.getElementsByTagName('em')[0]; + return {'el': el, 'close': close, 'inner': inner}; + } else { + if(!this.tabTpl){ + this.tabTpl = new YAHOO.ext.Template( + '' + + '{text}' + ); + } + var el = this.tabTpl.overwrite(td, {'text': text}); + var inner = el.getElementsByTagName('em')[0]; + return {'el': el, 'inner': inner}; + } +}; + + +YAHOO.ext.Actor = function(element, animator, selfCapture){ + this.el = YAHOO.ext.Element.get(element, true); + YAHOO.ext.Actor.superclass.constructor.call(this, element, true); + this.onCapture = new YAHOO.util.CustomEvent('Actor.onCapture'); + if(animator){ + + animator.addActor(this); + } + + this.capturing = selfCapture; + this.playlist = selfCapture ? new YAHOO.ext.Animator.AnimSequence() : null; +}; + +YAHOO.extendX(YAHOO.ext.Actor, YAHOO.ext.Element); + + +YAHOO.ext.Actor.prototype.capture = function(action){ + if(this.playlist != null){ + this.playlist.add(action); + } + this.onCapture.fireDirect(this, action); + return action; +}; + + +YAHOO.ext.Actor.overrideAnimation = function(method, animParam, onParam){ + return function(){ + if(!this.capturing){ + return method.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + if(args[animParam] === true){ + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, method, args, onParam)); + }else{ + return this.capture(new YAHOO.ext.Actor.Action(this, method, args)); + } + }; +} + + +YAHOO.ext.Actor.overrideBasic = function(method){ + return function(){ + if(!this.capturing){ + return method.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new YAHOO.ext.Actor.Action(this, method, args)); + }; +} + + + +YAHOO.ext.Actor.prototype.setVisibilityMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode); + +YAHOO.ext.Actor.prototype.enableDisplayMode = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode); + +YAHOO.ext.Actor.prototype.focus = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus); + +YAHOO.ext.Actor.prototype.addClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass); + +YAHOO.ext.Actor.prototype.removeClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass); + +YAHOO.ext.Actor.prototype.replaceClass = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass); + +YAHOO.ext.Actor.prototype.setStyle = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle); + +YAHOO.ext.Actor.prototype.setLeft = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft); + +YAHOO.ext.Actor.prototype.setTop = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop); + +YAHOO.ext.Actor.prototype.setAbsolutePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned); + +YAHOO.ext.Actor.prototype.setRelativePositioned = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned); + +YAHOO.ext.Actor.prototype.clearPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning); + +YAHOO.ext.Actor.prototype.setPositioning = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning); + +YAHOO.ext.Actor.prototype.clip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip); + +YAHOO.ext.Actor.prototype.unclip = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip); + +YAHOO.ext.Actor.prototype.clearOpacity = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity); + +YAHOO.ext.Actor.prototype.update = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update); + +YAHOO.ext.Actor.prototype.remove = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove); +YAHOO.ext.Actor.prototype.fitToParent = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent); +YAHOO.ext.Actor.prototype.appendChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild); +YAHOO.ext.Actor.prototype.createChild = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild); +YAHOO.ext.Actor.prototype.appendTo = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo); +YAHOO.ext.Actor.prototype.insertBefore = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore); +YAHOO.ext.Actor.prototype.insertAfter = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter); +YAHOO.ext.Actor.prototype.wrap = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap); +YAHOO.ext.Actor.prototype.replace = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace); +YAHOO.ext.Actor.prototype.insertHtml = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml); +YAHOO.ext.Actor.prototype.set = YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set); + + +YAHOO.ext.Actor.prototype.load = function(){ + if(!this.capturing){ + return YAHOO.ext.Actor.superclass.load.apply(this, arguments); + } + var args = Array.prototype.slice.call(arguments, 0); + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.load, + args, 2)); +}; + + +YAHOO.ext.Actor.prototype.animate = function(args, duration, onComplete, easing, animType){ + if(!this.capturing){ + return YAHOO.ext.Actor.superclass.animate.apply(this, arguments); + } + return this.capture(new YAHOO.ext.Actor.AsyncAction(this, YAHOO.ext.Actor.superclass.animate, + [args, duration, onComplete, easing, animType], 2)); +}; + + +YAHOO.ext.Actor.prototype.setVisible = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible, 1, 3); + +YAHOO.ext.Actor.prototype.toggle = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle, 0, 2); + +YAHOO.ext.Actor.prototype.setXY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY, 1, 3); + +YAHOO.ext.Actor.prototype.setLocation = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation, 2, 4); + +YAHOO.ext.Actor.prototype.setWidth = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth, 1, 3); + +YAHOO.ext.Actor.prototype.setHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight, 1, 3); + +YAHOO.ext.Actor.prototype.setSize = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize, 2, 4); + +YAHOO.ext.Actor.prototype.setBounds = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds, 4, 6); + +YAHOO.ext.Actor.prototype.setOpacity = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity, 1, 3); + +YAHOO.ext.Actor.prototype.moveTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo, 2, 4); + +YAHOO.ext.Actor.prototype.move = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move, 2, 4); + +YAHOO.ext.Actor.prototype.alignTo = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo, 3, 5); + +YAHOO.ext.Actor.prototype.hide = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide, 0, 2); + +YAHOO.ext.Actor.prototype.show = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show, 0, 2); + + +YAHOO.ext.Actor.prototype.setBox = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox, 2, 4); + + +YAHOO.ext.Actor.prototype.autoHeight = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight, 0, 2); + +YAHOO.ext.Actor.prototype.setX = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX, 1, 3); + +YAHOO.ext.Actor.prototype.setY = YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY, 1, 3); + + +YAHOO.ext.Actor.prototype.startCapture = function(){ + this.capturing = true; + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + }; + + + YAHOO.ext.Actor.prototype.stopCapture = function(){ + this.capturing = false; + }; + + +YAHOO.ext.Actor.prototype.clear = function(){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); +}; + + +YAHOO.ext.Actor.prototype.play = function(oncomplete){ + this.capturing = false; + if(this.playlist){ + this.playlist.play(oncomplete); + } + }; + + +YAHOO.ext.Actor.prototype.addCall = function(fcn, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + } +}; + + +YAHOO.ext.Actor.prototype.addAsyncCall = function(fcn, callbackIndex, args, scope){ + if(!this.capturing){ + fcn.apply(scope || this, args || []); + }else{ + this.capture(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + } + }, + + +YAHOO.ext.Actor.prototype.pause = function(seconds){ + this.capture(new YAHOO.ext.Actor.PauseAction(seconds)); + }; + + +YAHOO.ext.Actor.prototype.shake = function(){ + this.move('left', 20, true, .05); + this.move('right', 40, true, .05); + this.move('left', 40, true, .05); + this.move('right', 20, true, .05); +}; + + +YAHOO.ext.Actor.prototype.bounce = function(){ + this.move('up', 20, true, .05); + this.move('down', 40, true, .05); + this.move('up', 40, true, .05); + this.move('down', 20, true, .05); +}; + + +YAHOO.ext.Actor.prototype.blindShow = function(anchor, newSize, duration, easing){ + var size = newSize || this.getSize(); + this.clip(); + this.setVisible(true); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'l': + case 'left': + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + } + this.unclip(); + return size; +}; + + +YAHOO.ext.Actor.prototype.blindHide = function(anchor, duration, easing){ + var size = this.getSize(); + this.clip(); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'l': + case 'left': + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'r': + case 'right': + this.animate({width: {to: 1}, points: {by: [this.getWidth(), 0]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); + break; + case 'b': + case 'bottom': + this.animate({height: {to: 1}, points: {by: [0, this.getHeight()]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); + break; + } + return size; +}; + + +YAHOO.ext.Actor.prototype.slideShow = function(anchor, newSize, duration, easing, clearPositioning){ + var size = newSize || this.getSize(); + this.clip(); + var firstChild = this.dom.firstChild; + if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { + this.blindShow(anchor, newSize, duration, easing); + return; + } + var child = YAHOO.ext.Element.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.setAbsolutePositioned, null, child); + this.setVisible(true); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', '0px'], child); + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'l': + case 'left': + this.addCall(child.setStyle, ['left', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['right', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'r': + case 'right': + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setWidth(1); + this.setWidth(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + case 'b': + case 'bottom': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setHeight(1); + this.setHeight(newSize, true, duration || .5, null, easing || YAHOO.util.Easing.easeOut); + break; + } + if(clearPositioning !== false){ + this.addCall(child.setPositioning, [pos], child); + } + this.unclip(); + return size; +}; + + +YAHOO.ext.Actor.prototype.slideHide = function(anchor, duration, easing){ + var size = this.getSize(); + this.clip(); + var firstChild = this.dom.firstChild; + if(!firstChild || (firstChild.nodeName && "#TEXT" == firstChild.nodeName.toUpperCase())) { + this.blindHide(anchor, duration, easing); + return; + } + var child = YAHOO.ext.Element.get(firstChild, true); + var pos = child.getPositioning(); + this.addCall(child.setAbsolutePositioned, null, child); + anchor = anchor.toLowerCase(); + switch(anchor){ + case 't': + case 'top': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', '0px'], child); + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'l': + case 'left': + this.addCall(child.setStyle, ['left', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['right', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'r': + case 'right': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.setSize(1, size.height, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + case 'b': + case 'bottom': + this.addCall(child.setStyle, ['right', ''], child); + this.addCall(child.setStyle, ['top', '0px'], child); + this.addCall(child.setStyle, ['left', '0px'], child); + this.addCall(child.setStyle, ['bottom', ''], child); + this.setSize(size.width, 1, true, duration || .5, null, easing || YAHOO.util.Easing.easeIn); + this.setVisible(false); + break; + } + this.addCall(child.setPositioning, [pos], child); + return size; +}; + + +YAHOO.ext.Actor.prototype.squish = function(duration){ + var size = this.getSize(); + this.clip(); + this.setSize(1, 1, true, duration || .5); + this.setVisible(false); + return size; +}; + + +YAHOO.ext.Actor.prototype.appear = function(duration){ + this.setVisible(true, true, duration); +}; + + +YAHOO.ext.Actor.prototype.fade = function(duration){ + this.setVisible(false, true, duration); +}; + + +YAHOO.ext.Actor.prototype.switchOff = function(duration){ + this.clip(); + this.setVisible(false, true, .1); + this.clearOpacity(); + this.setVisible(true); + this.animate({height: {to: 1}, points: {by: [0, this.getHeight()/2]}}, + duration || .5, null, YAHOO.util.Easing.easeOut, YAHOO.util.Motion); + this.setVisible(false); +}; + + +YAHOO.ext.Actor.prototype.highlight = function(color, fromColor, duration, attribute){ + attribute = attribute || 'background-color'; + var original = this.getStyle(attribute); + fromColor = fromColor || ((original && original != '' && original != 'transparent') ? original : '#FFFFFF'); + var cfg = {}; + cfg[attribute] = {to: color, from: fromColor}; + this.setVisible(true); + this.animate(cfg, duration || .5, null, YAHOO.util.Easing.bounceOut, YAHOO.util.ColorAnim); + this.setStyle(attribute, original); +}; + + +YAHOO.ext.Actor.prototype.pulsate = function(count, duration){ + count = count || 3; + for(var i = 0; i < count; i++){ + this.toggle(true, duration || .25); + this.toggle(true, duration || .25); + } +}; + + +YAHOO.ext.Actor.prototype.dropOut = function(duration){ + this.animate({opacity: {to: 0}, points: {by: [0, this.getHeight()]}}, + duration || .5, null, YAHOO.util.Easing.easeIn, YAHOO.util.Motion); + this.setVisible(false); +}; + + +YAHOO.ext.Actor.prototype.moveOut = function(anchor, duration, easing){ + var Y = YAHOO.util; + var vw = Y.Dom.getViewportWidth(); + var vh = Y.Dom.getViewportHeight(); + var cpoints = this.getCenterXY() + var centerX = cpoints[0]; + var centerY = cpoints[1]; + var anchor = anchor.toLowerCase(); + var p; + switch(anchor){ + case 't': + case 'top': + p = [centerX, -this.getHeight()]; + break; + case 'l': + case 'left': + p = [-this.getWidth(), centerY]; + break; + case 'r': + case 'right': + p = [vw+this.getWidth(), centerY]; + break; + case 'b': + case 'bottom': + p = [centerX, vh+this.getHeight()]; + break; + case 'tl': + case 'top-left': + p = [-this.getWidth(), -this.getHeight()]; + break; + case 'bl': + case 'bottom': + p = [-this.getWidth(), vh+this.getHeight()]; + break; + case 'br': + case 'bottom-right': + p = [vw+this.getWidth(), vh+this.getHeight()]; + break; + case 'tr': + case 'top-right': + p = [vw+this.getWidth(), -this.getHeight()]; + break; + } + this.moveTo(p[0], p[1], true, duration || .35, null, easing || Y.Easing.easeIn); + this.setVisible(false); +}; + + +YAHOO.ext.Actor.prototype.moveIn = function(anchor, to, duration, easing){ + to = to || this.getCenterXY(); + this.moveOut(anchor, .01); + this.setVisible(true); + this.setXY(to, true, duration || .35, null, easing || YAHOO.util.Easing.easeOut); +}; + +YAHOO.ext.Actor.prototype.frame = function(color, count, duration){ + color = color || "red"; + count = count || 3; + duration = duration || .5; + var frameFn = function(callback){ + var box = this.getBox(); + var animFn = function(){ + var proxy = this.createProxy({ + tag:"div", + style:{ + visbility:"hidden", + position:"absolute", + zIndex:this.getStyle("zIndex"), + border:"0px solid " + color + } + }); + var scale = proxy.isBorderBox() ? 2 : 1; + proxy.animate({ + top:{from:box.y, to:box.y - 20}, + left:{from:box.x, to:box.x - 20}, + borderWidth:{from:0, to:10}, + opacity:{from:1, to:0}, + height:{from:box.height, to:(box.height + (20*scale))}, + width:{from:box.width, to:(box.width + (20*scale))} + }, duration, function(){ + proxy.remove(); + }); + if(--count > 0){ + animFn.defer((duration/2)*1000, this); + }else{ + if(typeof callback == 'function'){ + callback(); + } + } + } + animFn.call(this); + } + this.addAsyncCall(frameFn, 0, null, this); +}; + +YAHOO.ext.Actor.Action = function(actor, method, args){ + this.actor = actor; + this.method = method; + this.args = args; + } + +YAHOO.ext.Actor.Action.prototype = { + play : function(onComplete){ + this.method.apply(this.actor || window, this.args); + onComplete(); + } +}; + + +YAHOO.ext.Actor.AsyncAction = function(actor, method, args, onIndex){ + YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this, actor, method, args); + this.onIndex = onIndex; + this.originalCallback = this.args[onIndex]; +} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction, YAHOO.ext.Actor.Action); + +YAHOO.ext.Actor.AsyncAction.prototype.play = function(onComplete){ + var callbackArg = this.originalCallback ? + this.originalCallback.createSequence(onComplete) : onComplete; + this.args[this.onIndex] = callbackArg; + this.method.apply(this.actor, this.args); +}; + + +YAHOO.ext.Actor.PauseAction = function(seconds){ + this.seconds = seconds; +}; +YAHOO.ext.Actor.PauseAction.prototype = { + play : function(onComplete){ + setTimeout(onComplete, this.seconds * 1000); + } +}; + + YAHOO.ext.Animator = function(){ + this.actors = []; + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + this.captureDelegate = this.capture.createDelegate(this); + this.playDelegate = this.play.createDelegate(this); + this.syncing = false; + this.stopping = false; + this.playing = false; + for(var i = 0; i < arguments.length; i++){ + this.addActor(arguments[i]); + } + }; + + YAHOO.ext.Animator.prototype = { + + capture : function(actor, action){ + if(this.syncing){ + if(!this.syncMap[actor.id]){ + this.syncMap[actor.id] = new YAHOO.ext.Animator.AnimSequence(); + } + this.syncMap[actor.id].add(action); + }else{ + this.playlist.add(action); + } + }, + + + addActor : function(actor){ + actor.onCapture.subscribe(this.captureDelegate); + this.actors.push(actor); + }, + + + + startCapture : function(clearPlaylist){ + for(var i = 0; i < this.actors.length; i++){ + var a = this.actors[i]; + if(!this.isCapturing(a)){ + a.onCapture.subscribe(this.captureDelegate); + } + a.capturing = true; + } + if(clearPlaylist){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + } + }, + + + isCapturing : function(actor){ + var subscribers = actor.onCapture.subscribers; + if(subscribers){ + for(var i = 0; i < subscribers.length; i++){ + if(subscribers[i] && subscribers[i].contains(this.captureDelegate)){ + return true; + } + } + } + return false; + }, + + + stopCapture : function(){ + for(var i = 0; i < this.actors.length; i++){ + var a = this.actors[i]; + a.onCapture.unsubscribe(this.captureDelegate); + a.capturing = false; + } + }, + + + beginSync : function(){ + this.syncing = true; + this.syncMap = {}; + }, + + + endSync : function(){ + this.syncing = false; + var composite = new YAHOO.ext.Animator.CompositeSequence(); + for(key in this.syncMap){ + if(typeof this.syncMap[key] != 'function'){ + composite.add(this.syncMap[key]); + } + } + this.playlist.add(composite); + this.syncMap = null; + }, + + + play : function(oncomplete){ + if(this.playing) return; + this.stopCapture(); + this.playlist.play(oncomplete); + }, + + + stop : function(){ + this.playlist.stop(); + }, + + + isPlaying : function(){ + return this.playlist.isPlaying(); + }, + + clear : function(){ + this.playlist = new YAHOO.ext.Animator.AnimSequence(); + }, + + + addCall : function(fcn, args, scope){ + this.playlist.add(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + }, + + + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.playlist.add(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + }, + + + pause : function(seconds){ + this.playlist.add(new YAHOO.ext.Actor.PauseAction(seconds)); + } + + }; + +YAHOO.ext.Animator.select = function(selector){ + var els; + if(typeof selector == 'string'){ + els = YAHOO.ext.Element.selectorFunction(selector); + }else if(selector instanceof Array){ + els = selector; + }else{ + throw 'Invalid selector'; + } + return new YAHOO.ext.AnimatorComposite(els); +}; +var getActors = YAHOO.ext.Animator.select; + + +YAHOO.ext.AnimatorComposite = function(els){ + this.animator = new YAHOO.ext.Animator(); + this.addElements(els); + this.syncAnims = true; +}; +YAHOO.ext.AnimatorComposite.prototype = { + isComposite: true, + + addElements : function(els){ + if(!els) return this; + var anim = this.animator; + for(var i = 0, len = els.length; i < len; i++) { + anim.addActor(new YAHOO.ext.Actor(els[i])); + } + anim.startCapture(); + return this; + }, + + sequence : function(){ + this.syncAnims = false; + return this; + }, + + sync : function(){ + this.syncAnims = true; + return this; + }, + invoke : function(fn, args){ + var els = this.animator.actors; + if(this.syncAnims) this.animator.beginSync(); + for(var i = 0, len = els.length; i < len; i++) { + YAHOO.ext.Actor.prototype[fn].apply(els[i], args); + } + if(this.syncAnims) this.animator.endSync(); + return this; + }, + + play : function(callback){ + this.animator.play(callback); + return this; + }, + + reset : function(callback){ + this.animator.startCapture(true); + return this; + }, + + pause : function(seconds){ + this.animator.pause(seconds); + return this; + }, + + getAnimator : function(){ + return this.animator; + }, + + each : function(fn, scope){ + var els = this.animator.actors; + if(this.syncAnims) this.animator.beginSync(); + for(var i = 0, len = els.length; i < len; i++){ + fn.call(scope || els[i], els[i], this, i); + } + if(this.syncAnims) this.animator.endSync(); + return this; + }, + + addCall : function(fcn, args, scope){ + this.animator.addCall(fcn, args, scope); + return this; + }, + + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.animator.addAsyncCall(fcn, callbackIndex, args, scope); + return this; + } +}; +for(var fnName in YAHOO.ext.Actor.prototype){ + if(typeof YAHOO.ext.Actor.prototype[fnName] == 'function'){ + YAHOO.ext.CompositeElement.createCall(YAHOO.ext.AnimatorComposite.prototype, fnName); + } +} + + +YAHOO.ext.Animator.AnimSequence = function(){ + this.actions = []; + this.nextDelegate = this.next.createDelegate(this); + this.playDelegate = this.play.createDelegate(this); + this.oncomplete = null; + this.playing = false; + this.stopping = false; + this.actionIndex = -1; + }; + + YAHOO.ext.Animator.AnimSequence.prototype = { + + add : function(action){ + this.actions.push(action); + }, + + next : function(){ + if(this.stopping){ + this.playing = false; + if(this.oncomplete){ + this.oncomplete(this, false); + } + return; + } + var nextAction = this.actions[++this.actionIndex]; + if(nextAction){ + nextAction.play(this.nextDelegate); + }else{ + this.playing = false; + if(this.oncomplete){ + this.oncomplete(this, true); + } + } + }, + + play : function(oncomplete){ + if(this.playing) return; + this.oncomplete = oncomplete; + this.stopping = false; + this.playing = true; + this.actionIndex = -1; + this.next(); + }, + + stop : function(){ + this.stopping = true; + }, + + isPlaying : function(){ + return this.playing; + }, + + clear : function(){ + this.actions = []; + }, + + addCall : function(fcn, args, scope){ + this.actions.push(new YAHOO.ext.Actor.Action(scope, fcn, args || [])); + }, + + addAsyncCall : function(fcn, callbackIndex, args, scope){ + this.actions.push(new YAHOO.ext.Actor.AsyncAction(scope, fcn, args || [], callbackIndex)); + }, + + pause : function(seconds){ + this.actions.push(new YAHOO.ext.Actor.PauseAction(seconds)); + } + + }; + +YAHOO.ext.Animator.CompositeSequence = function(){ + this.sequences = []; + this.completed = 0; + this.trackDelegate = this.trackCompletion.createDelegate(this); +} + +YAHOO.ext.Animator.CompositeSequence.prototype = { + add : function(sequence){ + this.sequences.push(sequence); + }, + + play : function(onComplete){ + this.completed = 0; + if(this.sequences.length < 1){ + if(onComplete)onComplete(); + return; + } + this.onComplete = onComplete; + for(var i = 0; i < this.sequences.length; i++){ + this.sequences[i].play(this.trackDelegate); + } + }, + + trackCompletion : function(){ + ++this.completed; + if(this.completed >= this.sequences.length && this.onComplete){ + this.onComplete(); + } + }, + + stop : function(){ + for(var i = 0; i < this.sequences.length; i++){ + this.sequences[i].stop(); + } + }, + + isPlaying : function(){ + for(var i = 0; i < this.sequences.length; i++){ + if(this.sequences[i].isPlaying()){ + return true; + } + } + return false; + } +}; + + + + + YAHOO.ext.Toolbar = function(container){ + this.el = getEl(container, true); + var div = document.createElement('div'); + div.className = 'ytoolbar'; + var tb = document.createElement('table'); + tb.border = 0; + tb.cellPadding = 0; + tb.cellSpacing = 0; + div.appendChild(tb); + var tbody = document.createElement('tbody'); + tb.appendChild(tbody); + var tr = document.createElement('tr'); + tbody.appendChild(tr); + this.el.dom.appendChild(div); + this.tr = tr; +}; + +YAHOO.ext.Toolbar.prototype = { + + add : function(){ + for(var i = 0; i < arguments.length; i++){ + var el = arguments[i]; + var td = document.createElement('td'); + this.tr.appendChild(td); + if(el instanceof YAHOO.ext.ToolbarButton){ + el.init(td); + }else if(el instanceof Array){ + this.addButton(el); + }else if(typeof el == 'string'){ + var span = document.createElement('span'); + if(el == 'separator'){ + span.className = 'ytb-sep'; + }else{ + span.innerHTML = el; + span.className = 'ytb-text'; + } + td.appendChild(span); + }else if(typeof el == 'object'){ + td.appendChild(el); + } + } + }, + + + getEl : function(){ + return this.el; + }, + + + addSeparator : function(){ + var td = document.createElement('td'); + this.tr.appendChild(td); + var span = document.createElement('span'); + span.className = 'ytb-sep'; + td.appendChild(span); + }, + + + addButton : function(config){ + if(config instanceof Array){ + var buttons = []; + for(var i = 0, len = config.length; i < len; i++) { + buttons.push(this.addButton(config[i])); + } + return buttons; + } + var b = config; + if(!(config instanceof YAHOO.ext.ToolbarButton)){ + b = new YAHOO.ext.ToolbarButton(config); + } + this.add(b); + return b; + }, + + + addText : function(text){ + var td = document.createElement('td'); + this.tr.appendChild(td); + var span = document.createElement('span'); + span.className = 'ytb-text'; + span.innerHTML = text; + td.appendChild(span); + return span; + }, + + + insertButton : function(index, config){ + if(config instanceof Array){ + var buttons = []; + for(var i = 0, len = config.length; i < len; i++) { + buttons.push(this.insertButton(index + i, config[i])); + } + return buttons; + } + var b = new YAHOO.ext.ToolbarButton(config); + var td = document.createElement('td'); + var nextSibling = this.tr.childNodes[index]; + if (nextSibling) + this.tr.insertBefore(td, nextSibling); + else + this.tr.appendChild(td); + b.init(td); + return b; + } +}; + + +YAHOO.ext.ToolbarButton = function(config){ + YAHOO.ext.util.Config.apply(this, config); +}; + +YAHOO.ext.ToolbarButton.prototype = { + + init : function(appendTo){ + var element = document.createElement('span'); + element.className = 'ytb-button'; + if(this.id){ + element.id = this.id; + } + this.disabled = (this.disabled === true); + var inner = document.createElement('span'); + inner.className = 'ytb-button-inner ' + this.className; + inner.unselectable = 'on'; + if(this.tooltip){ + element.setAttribute('title', this.tooltip); + } + if(this.style){ + YAHOO.ext.DomHelper.applyStyles(inner, this.style); + } + element.appendChild(inner); + appendTo.appendChild(element); + this.el = getEl(element, true); + this.el.unselectable(); + inner.innerHTML = (this.text ? this.text : ' '); + this.inner = inner; + this.el.mon('click', this.onClick, this, true); + this.el.mon('mouseover', this.onMouseOver, this, true); + this.el.mon('mouseout', this.onMouseOut, this, true); + }, + + + setHandler : function(click, scope){ + this.click = click; + this.scope = scope; + }, + + + setText : function(text){ + this.inner.innerHTML = text; + }, + + + setTooltip : function(text){ + this.el.dom.title = text; + }, + + + show: function(){ + this.el.dom.parentNode.style.display = ''; + }, + + + hide: function(){ + this.el.dom.parentNode.style.display = 'none'; + }, + + + disable : function(){ + this.disabled = true; + if(this.el){ + this.el.addClass('ytb-button-disabled'); + } + }, + + + enable : function(){ + this.disabled = false; + if(this.el){ + this.el.removeClass('ytb-button-disabled'); + } + }, + + + isDisabled : function(){ + return this.disabled === true; + }, + + setDisabled : function(disabled){ + if(disabled){ + this.disable(); + }else{ + this.enable(); + } + }, + + + onClick : function(){ + if(!this.disabled && this.click){ + this.click.call(this.scope || window, this); + } + }, + + + onMouseOver : function(){ + if(!this.disabled){ + this.el.addClass('ytb-button-over'); + if(this.mouseover){ + this.mouseover.call(this.scope || window, this); + } + } + }, + + + onMouseOut : function(){ + this.el.removeClass('ytb-button-over'); + if(!this.disabled){ + if(this.mouseout){ + this.mouseout.call(this.scope || window, this); + } + } + } +}; + +YAHOO.ext.Resizable = function(el, config){ + this.el = getEl(el); + + if(config && config.wrap){ + config.resizeChild = this.el; + this.el = this.el.wrap(typeof config.wrap == 'object' ? config.wrap : null); + this.el.id = this.el.dom.id = config.resizeChild.id + '-rzwrap'; + this.el.setStyle('overflow', 'hidden'); + this.el.setPositioning(config.resizeChild.getPositioning()); + config.resizeChild.clearPositioning(); + if(!config.width || !config.height){ + var csize = config.resizeChild.getSize(); + + + this.el.setSize(csize.width, csize.height); + } + if(config.pinned && !config.adjustments){ + config.adjustments = 'auto'; + } + } + + this.proxy = this.el.createProxy({tag: 'div', cls: 'yresizable-proxy', id: this.el.id + '-rzproxy'}) + this.proxy.unselectable(); + + + this.overlay = this.el.createProxy({tag: 'div', cls: 'yresizable-overlay', html: ' '}); + this.overlay.unselectable(); + this.overlay.enableDisplayMode('block'); + this.overlay.mon('mousemove', this.onMouseMove, this, true); + this.overlay.mon('mouseup', this.onMouseUp, this, true); + + YAHOO.ext.util.Config.apply(this, config, { + + resizeChild : false, + + adjustments : [0, 0], + + minWidth : 5, + + minHeight : 5, + + maxWidth : 10000, + + maxHeight : 10000, + + enabled : true, + + animate : false, + + duration : .35, + + dynamic : false, + + + handles : false, + multiDirectional : false, + + disableTrackOver : false, + + easing : YAHOO.util.Easing ? YAHOO.util.Easing.easeOutStrong : null, + + widthIncrement : 0, + + heightIncrement : 0, + + pinned : false, + + width : null, + + height : null, + + preserveRatio : false, + + transparent: false, + + minX: 0, + + minY: 0, + + draggable: false + }); + + if(this.pinned){ + this.disableTrackOver = true; + this.el.addClass('yresizable-pinned'); + } + + if(this.el.getStyle('position') != 'absolute'){ + this.el.setStyle('position', 'relative'); + } + if(!this.handles){ + this.handles = 's,e,se'; + if(this.multiDirectional){ + this.handles += ',n,w'; + } + } + if(this.handles == 'all'){ + this.handles = 'n s e w ne nw se sw'; + } + var hs = this.handles.split(/\s*?[,;]\s*?| /); + var ps = YAHOO.ext.Resizable.positions; + for(var i = 0, len = hs.length; i < len; i++){ + if(hs[i] && ps[hs[i]]){ + var pos = ps[hs[i]]; + this[pos] = new YAHOO.ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent); + } + } + + this.corner = this.southeast; + + this.activeHandle = null; + + if(this.resizeChild){ + if(typeof this.resizeChild == 'boolean'){ + this.resizeChild = YAHOO.ext.Element.get(this.el.dom.firstChild, true); + }else{ + this.resizeChild = YAHOO.ext.Element.get(this.resizeChild, true); + } + } + + if(this.adjustments == 'auto'){ + var rc = this.resizeChild; + var hw = this.west, he = this.east, hn = this.north, hs = this.south; + if(rc && (hw || hn)){ + rc.setRelativePositioned(); + rc.setLeft(hw ? hw.el.getWidth() : 0); + rc.setTop(hn ? hn.el.getHeight() : 0); + } + this.adjustments = [ + (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0), + (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 + ]; + } + + if(this.draggable){ + this.dd = this.dynamic ? + this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id}); + this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id); + } + + + this.events = { + + 'beforeresize' : new YAHOO.util.CustomEvent(), + + 'resize' : new YAHOO.util.CustomEvent() + }; + + if(this.width !== null && this.height !== null){ + this.resizeTo(this.width, this.height); + }else{ + this.updateChildSize(); + } +}; + +YAHOO.extendX(YAHOO.ext.Resizable, YAHOO.ext.util.Observable, { + + resizeTo : function(width, height){ + this.el.setSize(width, height); + this.updateChildSize(); + this.fireEvent('resize', this, width, height, null); + }, + + startSizing : function(e){ + this.fireEvent('beforeresize', this, e); + if(this.enabled){ + this.resizing = true; + this.startBox = this.el.getBox(); + this.startPoint = e.getXY(); + this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0], + (this.startBox.y + this.startBox.height) - this.startPoint[1]]; + this.proxy.setBox(this.startBox); + + this.overlay.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + this.overlay.show(); + + if(!this.dynamic){ + this.proxy.show(); + } + } + }, + + onMouseDown : function(handle, e){ + if(this.enabled){ + e.stopEvent(); + this.activeHandle = handle; + this.overlay.setStyle('cursor', handle.el.getStyle('cursor')); + this.startSizing(e); + } + }, + + onMouseUp : function(e){ + var size = this.resizeElement(); + this.resizing = false; + this.handleOut(); + this.overlay.hide(); + this.fireEvent('resize', this, size.width, size.height, e); + }, + + updateChildSize : function(){ + if(this.resizeChild){ + var el = this.el; + var child = this.resizeChild; + var adj = this.adjustments; + if(el.dom.offsetWidth){ + var b = el.getSize(true); + child.setSize(b.width+adj[0], b.height+adj[1]); + } + + + + + if(YAHOO.ext.util.Browser.isIE){ + setTimeout(function(){ + if(el.dom.offsetWidth){ + var b = el.getSize(true); + child.setSize(b.width+adj[0], b.height+adj[1]); + } + }, 10); + } + } + }, + + snap : function(value, inc, min){ + if(!inc || !value) return value; + var newValue = value; + var m = value % inc; + if(m > 0){ + if(m > (inc/2)){ + newValue = value + (inc-m); + }else{ + newValue = value - m; + } + } + return Math.max(min, newValue); + }, + + resizeElement : function(){ + var box = this.proxy.getBox(); + + + + this.el.setBox(box, false, this.animate, this.duration, null, this.easing); + + + + this.updateChildSize(); + this.proxy.hide(); + return box; + }, + + constrain : function(v, diff, m, mx){ + if(v - diff < m){ + diff = v - m; + }else if(v - diff > mx){ + diff = mx - v; + } + return diff; + }, + + onMouseMove : function(e){ + if(this.enabled){ + try{ + + + var curSize = this.curSize || this.startBox; + var x = this.startBox.x, y = this.startBox.y; + var ox = x, oy = y; + var w = curSize.width, h = curSize.height; + var ow = w, oh = h; + var mw = this.minWidth, mh = this.minHeight; + var mxw = this.maxWidth, mxh = this.maxHeight; + var wi = this.widthIncrement; + var hi = this.heightIncrement; + + var eventXY = e.getXY(); + var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0])); + var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1])); + + var pos = this.activeHandle.position; + + switch(pos){ + case 'east': + w += diffX; + w = Math.min(Math.max(mw, w), mxw); + break; + case 'south': + h += diffY; + h = Math.min(Math.max(mh, h), mxh); + break; + case 'southeast': + w += diffX; + h += diffY; + w = Math.min(Math.max(mw, w), mxw); + h = Math.min(Math.max(mh, h), mxh); + break; + case 'north': + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + break; + case 'west': + diffX = this.constrain(w, diffX, mw, mxw); + x += diffX; + w -= diffX; + break; + case 'northeast': + w += diffX; + w = Math.min(Math.max(mw, w), mxw); + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + break; + case 'northwest': + diffX = this.constrain(w, diffX, mw, mxw); + diffY = this.constrain(h, diffY, mh, mxh); + y += diffY; + h -= diffY; + x += diffX; + w -= diffX; + break; + case 'southwest': + diffX = this.constrain(w, diffX, mw, mxw); + h += diffY; + h = Math.min(Math.max(mh, h), mxh); + x += diffX; + w -= diffX; + break; + } + + var sw = this.snap(w, wi, mw); + var sh = this.snap(h, hi, mh); + if(sw != w || sh != h){ + switch(pos){ + case 'northeast': + y -= sh - h; + break; + case 'north': + y -= sh - h; + break; + case 'southwest': + x -= sw - w; + break; + case 'west': + x -= sw - w; + break; + case 'northwest': + x -= sw - w; + y -= sh - h; + break; + } + w = sw; + h = sh; + } + + if(this.preserveRatio){ + switch(pos){ + case 'southeast': + case 'east': + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + w = ow * (h/oh); + break; + case 'south': + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + break; + case 'northeast': + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + break; + case 'north': + var tw = w; + w = ow * (h/oh); + w = Math.min(Math.max(mw, w), mxw); + h = oh * (w/ow); + x += (tw - w) / 2; + break; + case 'southwest': + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + var tw = w; + w = ow * (h/oh); + x += tw - w; + break; + case 'west': + var th = h; + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + y += (th - h) / 2; + var tw = w; + w = ow * (h/oh); + x += tw - w; + break; + case 'northwest': + var tw = w; + var th = h; + h = oh * (w/ow); + h = Math.min(Math.max(mh, h), mxh); + w = ow * (h/oh); + y += th - h; + x += tw - w; + break; + + } + } + this.proxy.setBounds(x, y, w, h); + if(this.dynamic){ + this.resizeElement(); + } + }catch(e){} + } + }, + + handleOver : function(){ + if(this.enabled){ + this.el.addClass('yresizable-over'); + } + }, + + handleOut : function(){ + if(!this.resizing){ + this.el.removeClass('yresizable-over'); + } + }, + + + getEl : function(){ + return this.el; + }, + + + getResizeChild : function(){ + return this.resizeChild; + } +}); + + +YAHOO.ext.Resizable.positions = { + n: 'north', s: 'south', e: 'east', w: 'west', se: 'southeast', sw: 'southwest', nw: 'northwest', ne: 'northeast' +}; + + +YAHOO.ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){ + if(!this.tpl){ + + var tpl = YAHOO.ext.DomHelper.createTemplate( + {tag: 'div', cls: 'yresizable-handle yresizable-handle-{0}', html: ' '} + ); + tpl.compile(); + YAHOO.ext.Resizable.Handle.prototype.tpl = tpl; + } + this.position = pos; + this.rz = rz; + this.el = this.tpl.append(rz.el.dom, [this.position], true); + this.el.unselectable(); + if(transparent){ + this.el.setOpacity(0); + } + this.el.mon('mousedown', this.onMouseDown, this, true); + if(!disableTrackOver){ + this.el.mon('mouseover', this.onMouseOver, this, true); + this.el.mon('mouseout', this.onMouseOut, this, true); + } +}; + +YAHOO.ext.Resizable.Handle.prototype = { + afterResize : function(rz){ + + }, + + onMouseDown : function(e){ + this.rz.onMouseDown(this, e); + }, + + onMouseOver : function(e){ + this.rz.handleOver(this, e); + }, + + onMouseOut : function(e){ + this.rz.handleOut(this, e); + } +}; + + + + +if(YAHOO.util.DragDropMgr){ + YAHOO.util.DragDropMgr.clickTimeThresh = 350; +} + +YAHOO.ext.SplitBar = function(dragElement, resizingElement, orientation, placement){ + + + this.el = YAHOO.ext.Element.get(dragElement, true); + this.el.dom.unselectable = 'on'; + + this.resizingEl = YAHOO.ext.Element.get(resizingElement, true); + + + this.orientation = orientation || YAHOO.ext.SplitBar.HORIZONTAL; + + + this.minSize = 0; + + + this.maxSize = 2000; + + this.onMoved = new YAHOO.util.CustomEvent("SplitBarMoved", this); + + + this.animate = false; + + + this.useShim = false; + + + this.shim = null; + + + this.proxy = YAHOO.ext.SplitBar.createProxy(this.orientation); + + + this.dd = new YAHOO.util.DDProxy(this.el.dom.id, "SplitBars", {dragElId : this.proxy.id}); + + + this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this); + + + this.dd.endDrag = this.onEndProxyDrag.createDelegate(this); + + + this.dragSpecs = {}; + + + this.adapter = new YAHOO.ext.SplitBar.BasicLayoutAdapter(); + this.adapter.init(this); + + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + + this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? YAHOO.ext.SplitBar.LEFT : YAHOO.ext.SplitBar.RIGHT); + this.el.setStyle('cursor', 'e-resize'); + }else{ + + this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? YAHOO.ext.SplitBar.TOP : YAHOO.ext.SplitBar.BOTTOM); + this.el.setStyle('cursor', 'n-resize'); + } + + this.events = { + + 'resize' : this.onMoved, + + 'moved' : this.onMoved, + + 'beforeresize' : new YAHOO.util.CustomEvent('beforeresize') + } +} + +YAHOO.extendX(YAHOO.ext.SplitBar, YAHOO.ext.util.Observable, { + onStartProxyDrag : function(x, y){ + this.fireEvent('beforeresize', this); + if(this.useShim){ + if(!this.shim){ + this.shim = YAHOO.ext.SplitBar.createShim(); + } + this.shim.setVisible(true); + } + YAHOO.util.Dom.setStyle(this.proxy, 'display', 'block'); + var size = this.adapter.getElementSize(this); + this.activeMinSize = this.getMinimumSize();; + this.activeMaxSize = this.getMaximumSize();; + var c1 = size - this.activeMinSize; + var c2 = Math.max(this.activeMaxSize - size, 0); + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + this.dd.resetConstraints(); + this.dd.setXConstraint( + this.placement == YAHOO.ext.SplitBar.LEFT ? c1 : c2, + this.placement == YAHOO.ext.SplitBar.LEFT ? c2 : c1 + ); + this.dd.setYConstraint(0, 0); + }else{ + this.dd.resetConstraints(); + this.dd.setXConstraint(0, 0); + this.dd.setYConstraint( + this.placement == YAHOO.ext.SplitBar.TOP ? c1 : c2, + this.placement == YAHOO.ext.SplitBar.TOP ? c2 : c1 + ); + } + this.dragSpecs.startSize = size; + this.dragSpecs.startPoint = [x, y]; + + YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd, x, y); + }, + + + onEndProxyDrag : function(e){ + YAHOO.util.Dom.setStyle(this.proxy, 'display', 'none'); + var endPoint = YAHOO.util.Event.getXY(e); + if(this.useShim){ + this.shim.setVisible(false); + } + var newSize; + if(this.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + newSize = this.dragSpecs.startSize + + (this.placement == YAHOO.ext.SplitBar.LEFT ? + endPoint[0] - this.dragSpecs.startPoint[0] : + this.dragSpecs.startPoint[0] - endPoint[0] + ); + }else{ + newSize = this.dragSpecs.startSize + + (this.placement == YAHOO.ext.SplitBar.TOP ? + endPoint[1] - this.dragSpecs.startPoint[1] : + this.dragSpecs.startPoint[1] - endPoint[1] + ); + } + newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize); + if(newSize != this.dragSpecs.startSize){ + this.adapter.setElementSize(this, newSize); + this.onMoved.fireDirect(this, newSize); + } + }, + + + getAdapter : function(){ + return this.adapter; + }, + + + setAdapter : function(adapter){ + this.adapter = adapter; + this.adapter.init(this); + }, + + + getMinimumSize : function(){ + return this.minSize; + }, + + + setMinimumSize : function(minSize){ + this.minSize = minSize; + }, + + + getMaximumSize : function(){ + return this.maxSize; + }, + + + setMaximumSize : function(maxSize){ + this.maxSize = maxSize; + }, + + + setCurrentSize : function(size){ + var oldAnimate = this.animate; + this.animate = false; + this.adapter.setElementSize(this, size); + this.animate = oldAnimate; + } +}); + + +YAHOO.ext.SplitBar.createShim = function(){ + var shim = document.createElement('div'); + shim.unselectable = 'on'; + YAHOO.util.Dom.generateId(shim, 'split-shim'); + YAHOO.util.Dom.setStyle(shim, 'width', '100%'); + YAHOO.util.Dom.setStyle(shim, 'height', '100%'); + YAHOO.util.Dom.setStyle(shim, 'position', 'absolute'); + YAHOO.util.Dom.setStyle(shim, 'background', 'white'); + YAHOO.util.Dom.setStyle(shim, 'z-index', 11000); + window.document.body.appendChild(shim); + var shimEl = YAHOO.ext.Element.get(shim); + shimEl.setOpacity(.01); + shimEl.setXY([0, 0]); + return shimEl; +}; + + +YAHOO.ext.SplitBar.createProxy = function(orientation){ + var proxy = document.createElement('div'); + proxy.unselectable = 'on'; + YAHOO.util.Dom.generateId(proxy, 'split-proxy'); + YAHOO.util.Dom.setStyle(proxy, 'position', 'absolute'); + YAHOO.util.Dom.setStyle(proxy, 'visibility', 'hidden'); + YAHOO.util.Dom.setStyle(proxy, 'z-index', 11001); + YAHOO.util.Dom.setStyle(proxy, 'background-color', "#aaa"); + if(orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + YAHOO.util.Dom.setStyle(proxy, 'cursor', 'e-resize'); + }else{ + YAHOO.util.Dom.setStyle(proxy, 'cursor', 'n-resize'); + } + + YAHOO.util.Dom.setStyle(proxy, 'line-height', '0px'); + YAHOO.util.Dom.setStyle(proxy, 'font-size', '0px'); + window.document.body.appendChild(proxy); + return proxy; +}; + + +YAHOO.ext.SplitBar.BasicLayoutAdapter = function(){ +}; + +YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype = { + + init : function(s){ + + }, + + getElementSize : function(s){ + if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + return s.resizingEl.getWidth(); + }else{ + return s.resizingEl.getHeight(); + } + }, + + + setElementSize : function(s, newSize, onComplete){ + if(s.orientation == YAHOO.ext.SplitBar.HORIZONTAL){ + if(!YAHOO.util.Anim || !s.animate){ + s.resizingEl.setWidth(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setWidth(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut); + } + }else{ + + if(!YAHOO.util.Anim || !s.animate){ + s.resizingEl.setHeight(newSize); + if(onComplete){ + onComplete(s, newSize); + } + }else{ + s.resizingEl.setHeight(newSize, true, .1, onComplete, YAHOO.util.Easing.easeOut); + } + } + } +}; + + +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter = function(container){ + this.basic = new YAHOO.ext.SplitBar.BasicLayoutAdapter(); + this.container = getEl(container); +} + +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype = { + init : function(s){ + this.basic.init(s); + + }, + + getElementSize : function(s){ + return this.basic.getElementSize(s); + }, + + setElementSize : function(s, newSize, onComplete){ + this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s])); + }, + + moveSplitter : function(s){ + var yes = YAHOO.ext.SplitBar; + switch(s.placement){ + case yes.LEFT: + s.el.setX(s.resizingEl.getRight()); + break; + case yes.RIGHT: + s.el.setStyle('right', (this.container.getWidth() - s.resizingEl.getLeft()) + 'px'); + break; + case yes.TOP: + s.el.setY(s.resizingEl.getBottom()); + break; + case yes.BOTTOM: + s.el.setY(s.resizingEl.getTop() - s.el.getHeight()); + break; + } + } +}; + + +YAHOO.ext.SplitBar.VERTICAL = 1; + + +YAHOO.ext.SplitBar.HORIZONTAL = 2; + + +YAHOO.ext.SplitBar.LEFT = 1; + + +YAHOO.ext.SplitBar.RIGHT = 2; + + +YAHOO.ext.SplitBar.TOP = 3; + + +YAHOO.ext.SplitBar.BOTTOM = 4; + + +YAHOO.ext.grid.Grid = function(container, dataModel, colModel, selectionModel){ + + this.container = YAHOO.ext.Element.get(container); + this.container.update(''); + this.container.setStyle('overflow', 'hidden'); + this.id = this.container.id; + this.rows = []; + this.rowCount = 0; + this.fieldId = null; + this.dataModel = dataModel; + this.colModel = colModel; + this.selModel = selectionModel; + this.activeEditor = null; + this.editingCell = null; + + + this.minColumnWidth = 25; + + + this.autoSizeColumns = false; + + + this.autoSizeHeaders = false; + + + this.monitorWindowResize = true; + + + this.maxRowsToMeasure = 0; + + + this.trackMouseOver = false; + + + this.enableDragDrop = false; + + + this.stripeRows = true; + + this.autoHeight = false; + + + this.autoWidth = false; + + + this.allowTextSelectionPattern = /INPUT|TEXTAREA|SELECT/i; + + + this.setValueDelegate = this.setCellValue.createDelegate(this); + + var CE = YAHOO.util.CustomEvent; + + this.events = { + + + 'click' : new CE('click'), + + 'dblclick' : new CE('dblclick'), + + 'mousedown' : new CE('mousedown'), + + 'mouseup' : new CE('mouseup'), + + 'mouseover' : new CE('mouseover'), + + 'mouseout' : new CE('mouseout'), + + 'keypress' : new CE('keypress'), + + 'keydown' : new CE('keydown'), + + + + + 'cellclick' : new CE('cellclick'), + + 'celldblclick' : new CE('celldblclick'), + + 'rowclick' : new CE('rowclick'), + + 'rowdblclick' : new CE('rowdblclick'), + + 'headerclick' : new CE('headerclick'), + + 'rowcontextmenu' : new CE('rowcontextmenu'), + + 'headercontextmenu' : new CE('headercontextmenu'), + + 'beforeedit' : new CE('beforeedit'), + + 'afteredit' : new CE('afteredit'), + + 'bodyscroll' : new CE('bodyscroll'), + + 'columnresize' : new CE('columnresize'), + + 'startdrag' : new CE('startdrag'), + + 'enddrag' : new CE('enddrag'), + + 'dragdrop' : new CE('dragdrop'), + + 'dragover' : new CE('dragover'), + + 'dragenter' : new CE('dragenter'), + + 'dragout' : new CE('dragout') + }; +}; + +YAHOO.ext.grid.Grid.prototype = { + + render : function(){ + if((!this.container.dom.offsetHeight || this.container.dom.offsetHeight < 20) + || this.container.getStyle('height') == 'auto'){ + this.autoHeight = true; + } + if((!this.container.dom.offsetWidth || this.container.dom.offsetWidth < 20)){ + this.autoWidth = true; + } + if(!this.view){ + if(this.dataModel.isPaged()){ + this.view = new YAHOO.ext.grid.PagedGridView(); + }else{ + this.view = new YAHOO.ext.grid.GridView(); + } + } + this.view.init(this); + this.el = getEl(this.view.render(), true); + var c = this.container; + c.mon("click", this.onClick, this, true); + c.mon("dblclick", this.onDblClick, this, true); + c.mon("contextmenu", this.onContextMenu, this, true); + c.mon("selectstart", this.cancelTextSelection, this, true); + c.mon("mousedown", this.cancelTextSelection, this, true); + c.mon("mousedown", this.onMouseDown, this, true); + c.mon("mouseup", this.onMouseUp, this, true); + if(this.trackMouseOver){ + this.el.mon("mouseover", this.onMouseOver, this, true); + this.el.mon("mouseout", this.onMouseOut, this, true); + } + c.mon("keypress", this.onKeyPress, this, true); + c.mon("keydown", this.onKeyDown, this, true); + this.init(); + }, + + + setDataModel : function(dm, rerender){ + this.view.unplugDataModel(this.dataModel); + this.dataModel = dm; + this.view.plugDataModel(dm); + if(rerender){ + dm.fireEvent('datachanged'); + } + }, + + init : function(){ + this.rows = this.el.dom.rows; + if(!this.disableSelection){ + if(!this.selModel){ + this.selModel = new YAHOO.ext.grid.DefaultSelectionModel(this); + } + this.selModel.init(this); + this.selModel.onSelectionChange.subscribe(this.updateField, this, true); + }else{ + this.selModel = new YAHOO.ext.grid.DisableSelectionModel(this); + this.selModel.init(this); + } + + if(this.enableDragDrop){ + this.dd = new YAHOO.ext.grid.GridDD(this, this.container.dom); + } + }, + + onMouseDown : function(e){ + this.fireEvent('mousedown', e); + }, + + onMouseUp : function(e){ + this.fireEvent('mouseup', e); + }, + + onMouseOver : function(e){ + this.fireEvent('mouseover', e); + }, + + onMouseOut : function(e){ + this.fireEvent('mouseout', e); + }, + + onKeyPress : function(e){ + this.fireEvent('keypress', e); + }, + + onKeyDown : function(e){ + this.fireEvent('keydown', e); + }, + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + onClick : function(e){ + this.fireEvent('click', e); + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var cell = this.getCellFromChild(target); + var header = this.getHeaderFromChild(target); + if(row){ + this.fireEvent('rowclick', this, row.rowIndex, e); + } + if(cell){ + this.fireEvent('cellclick', this, row.rowIndex, cell.columnIndex, e); + } + if(header){ + this.fireEvent('headerclick', this, header.columnIndex, e); + } + }, + + onContextMenu : function(e){ + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var header = this.getHeaderFromChild(target); + if(row){ + this.fireEvent('rowcontextmenu', this, row.rowIndex, e); + } + if(header){ + this.fireEvent('headercontextmenu', this, header.columnIndex, e); + } + e.preventDefault(); + }, + + onDblClick : function(e){ + this.fireEvent('dblclick', e); + var target = e.getTarget(); + var row = this.getRowFromChild(target); + var cell = this.getCellFromChild(target); + if(row){ + this.fireEvent('rowdblclick', this, row.rowIndex, e); + } + if(cell){ + this.fireEvent('celldblclick', this, row.rowIndex, cell.columnIndex, e); + } + }, + + + startEditing : function(rowIndex, colIndex){ + var row = this.rows[rowIndex]; + var cell = row.childNodes[colIndex]; + this.stopEditing(); + setTimeout(this.doEdit.createDelegate(this, [row, cell]), 10); + }, + + + stopEditing : function(){ + if(this.activeEditor){ + this.activeEditor.stopEditing(); + } + }, + + + doEdit : function(row, cell){ + if(!row || !cell) return; + var cm = this.colModel; + var dm = this.dataModel; + var colIndex = cell.columnIndex; + var rowIndex = row.rowIndex; + if(cm.isCellEditable(colIndex, rowIndex)){ + var ed = cm.getCellEditor(colIndex, rowIndex); + if(ed){ + if(this.activeEditor){ + this.activeEditor.stopEditing(); + } + this.fireEvent('beforeedit', this, rowIndex, colIndex); + this.activeEditor = ed; + this.editingCell = cell; + this.view.ensureVisible(row, true); + try{ + cell.focus(); + }catch(e){} + ed.init(this, this.el.dom.parentNode, this.setValueDelegate); + var value = dm.getValueAt(rowIndex, cm.getDataIndex(colIndex)); + + setTimeout(ed.startEditing.createDelegate(ed, [value, row, cell]), 1); + } + } + }, + + setCellValue : function(value, rowIndex, colIndex){ + this.dataModel.setValueAt(value, rowIndex, this.colModel.getDataIndex(colIndex)); + this.fireEvent('afteredit', this, rowIndex, colIndex); + }, + + + cancelTextSelection : function(e){ + var target = e.getTarget(); + if(target && target != this.el.dom.parentNode && !this.allowTextSelectionPattern.test(target.tagName)){ + e.preventDefault(); + } + }, + + + autoSize : function(){ + this.view.updateWrapHeight(); + this.view.adjustForScroll(); + }, + + + scrollTo : function(row){ + if(typeof row == 'number'){ + row = this.rows[row]; + } + this.view.ensureVisible(row, true); + }, + + + getEditingCell : function(){ + return this.editingCell; + }, + + + bindToField : function(fieldId){ + this.fieldId = fieldId; + this.readField(); + }, + + + updateField : function(){ + if(this.fieldId){ + var field = YAHOO.util.Dom.get(this.fieldId); + field.value = this.getSelectedRowIds().join(','); + } + }, + + + readField : function(){ + if(this.fieldId){ + var field = YAHOO.util.Dom.get(this.fieldId); + var values = field.value.split(','); + var rows = this.getRowsById(values); + this.selModel.selectRows(rows, false); + } + }, + + + getRow : function(index){ + return this.rows[index]; + }, + + + getRowsById : function(id){ + var dm = this.dataModel; + if(!(id instanceof Array)){ + for(var i = 0; i < this.rows.length; i++){ + if(dm.getRowId(i) == id){ + return this.rows[i]; + } + } + return null; + } + var found = []; + var re = "^(?:"; + for(var i = 0; i < id.length; i++){ + re += id[i]; + if(i != id.length-1) re += "|"; + } + var regex = new RegExp(re + ")$"); + for(var i = 0; i < this.rows.length; i++){ + if(regex.test(dm.getRowId(i))){ + found.push(this.rows[i]); + } + } + return found; + }, + + + getRowAfter : function(row){ + return this.getSibling('next', row); + }, + + + getRowBefore : function(row){ + return this.getSibling('previous', row); + }, + + + getCellAfter : function(cell, includeHidden){ + var next = this.getSibling('next', cell); + if(next && !includeHidden && this.colModel.isHidden(next.columnIndex)){ + return this.getCellAfter(next); + } + return next; + }, + + + getCellBefore : function(cell, includeHidden){ + var prev = this.getSibling('previous', cell); + if(prev && !includeHidden && this.colModel.isHidden(prev.columnIndex)){ + return this.getCellBefore(prev); + } + return prev; + }, + + + getLastCell : function(row, includeHidden){ + var cell = this.getElement('previous', row.lastChild); + if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){ + return this.getCellBefore(cell); + } + return cell; + }, + + + getFirstCell : function(row, includeHidden){ + var cell = this.getElement('next', row.firstChild); + if(cell && !includeHidden && this.colModel.isHidden(cell.columnIndex)){ + return this.getCellAfter(cell); + } + return cell; + }, + + + getSibling : function(type, node){ + if(!node) return null; + type += 'Sibling'; + var n = node[type]; + while(n && n.nodeType != 1){ + n = n[type]; + } + return n; + }, + + + getElement : function(direction, node){ + if(!node || node.nodeType == 1) return node; + else return this.getSibling(direction, node); + }, + + + getElementFromChild : function(childEl, parentClass){ + if(!childEl || (YAHOO.util.Dom.hasClass(childEl, parentClass))){ + return childEl; + } + var p = childEl.parentNode; + var b = document.body; + while(p && p != b){ + if(YAHOO.util.Dom.hasClass(p, parentClass)){ + return p; + } + p = p.parentNode; + } + return null; + }, + + + getRowFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-row'); + }, + + + getCellFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-col'); + }, + + + + getHeaderFromChild : function(childEl){ + return this.getElementFromChild(childEl, 'ygrid-hd'); + }, + + + getSelectedRows : function(){ + return this.selModel.getSelectedRows(); + }, + + + getSelectedRow : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRows()[0]; + } + return null; + }, + + + getSelectedRowIndexes : function(){ + var a = []; + var rows = this.selModel.getSelectedRows(); + for(var i = 0; i < rows.length; i++) { + a[i] = rows[i].rowIndex; + } + return a; + }, + + + getSelectedRowIndex : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRows()[0].rowIndex; + } + return -1; + }, + + + getSelectedRowId : function(){ + if(this.selModel.hasSelection()){ + return this.selModel.getSelectedRowIds()[0]; + } + return null; + }, + + + getSelectedRowIds : function(){ + return this.selModel.getSelectedRowIds(); + }, + + + clearSelections : function(){ + this.selModel.clearSelections(); + }, + + + + selectAll : function(){ + this.selModel.selectAll(); + }, + + + + getSelectionCount : function(){ + return this.selModel.getCount(); + }, + + + hasSelection : function(){ + return this.selModel.hasSelection(); + }, + + + getSelectionModel : function(){ + if(!this.selModel){ + this.selModel = new DefaultSelectionModel(); + } + return this.selModel; + }, + + + getDataModel : function(){ + return this.dataModel; + }, + + + getColumnModel : function(){ + return this.colModel; + }, + + + getView : function(){ + return this.view; + }, + + getDragDropText : function(){ + return this.ddText.replace('%0', this.selModel.getCount()); + } +}; + +YAHOO.ext.grid.Grid.prototype.ddText = "%0 selected row(s)"; + + +if(YAHOO.util.DDProxy){ + +YAHOO.ext.grid.GridDD = function(grid, bwrap){ + this.grid = grid; + var ddproxy = document.createElement('div'); + ddproxy.id = grid.container.id + '-ddproxy'; + ddproxy.className = 'ygrid-drag-proxy'; + document.body.insertBefore(ddproxy, document.body.firstChild); + YAHOO.util.Dom.setStyle(ddproxy, 'opacity', .80); + var ddicon = document.createElement('span'); + ddicon.className = 'ygrid-drop-icon ygrid-drop-nodrop'; + ddproxy.appendChild(ddicon); + var ddtext = document.createElement('span'); + ddtext.className = 'ygrid-drag-text'; + ddtext.innerHTML = " "; + ddproxy.appendChild(ddtext); + + this.ddproxy = ddproxy; + this.ddtext = ddtext; + this.ddicon = ddicon; + YAHOO.util.Event.on(bwrap, 'click', this.handleClick, this, true); + YAHOO.ext.grid.GridDD.superclass.constructor.call(this, bwrap.id, 'GridDD', + {dragElId : ddproxy.id, resizeFrame: false}); + + this.unlockDelegate = grid.selModel.unlock.createDelegate(grid.selModel); +}; +YAHOO.extendX(YAHOO.ext.grid.GridDD, YAHOO.util.DDProxy); + +YAHOO.ext.grid.GridDD.prototype.handleMouseDown = function(e){ + var row = this.grid.getRowFromChild(YAHOO.util.Event.getTarget(e)); + if(!row) return; + if(this.grid.selModel.isSelected(row)){ + YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e); + }else { + this.grid.selModel.unlock(); + YAHOO.ext.EventObject.setEvent(e); + this.grid.selModel.rowClick(this.grid, row.rowIndex, YAHOO.ext.EventObject); + YAHOO.ext.grid.GridDD.superclass.handleMouseDown.call(this, e); + this.grid.selModel.lock(); + } +}; + +YAHOO.ext.grid.GridDD.prototype.handleClick = function(e){ + if(this.grid.selModel.isLocked()){ + setTimeout(this.unlockDelegate, 1); + YAHOO.util.Event.stopEvent(e); + } +}; + + +YAHOO.ext.grid.GridDD.prototype.setDropStatus = function(dropStatus){ + if(dropStatus === true){ + YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-nodrop', 'ygrid-drop-ok'); + }else{ + YAHOO.util.Dom.replaceClass(this.ddicon, 'ygrid-drop-ok', 'ygrid-drop-nodrop'); + } +}; + +YAHOO.ext.grid.GridDD.prototype.startDrag = function(e){ + this.ddtext.innerHTML = this.grid.getDragDropText(); + this.setDropStatus(false); + this.grid.selModel.lock(); + this.grid.fireEvent('startdrag', this.grid, this, e); +}; + +YAHOO.ext.grid.GridDD.prototype.endDrag = function(e){ + YAHOO.util.Dom.setStyle(this.ddproxy, 'visibility', 'hidden'); + this.grid.fireEvent('enddrag', this.grid, this, e); +}; + +YAHOO.ext.grid.GridDD.prototype.autoOffset = function(iPageX, iPageY) { + this.setDelta(-12, -20); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragEnter = function(e, id) { + this.setDropStatus(true); + this.grid.fireEvent('dragenter', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragDrop = function(e, id) { + this.grid.fireEvent('dragdrop', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragOver = function(e, id) { + this.grid.fireEvent('dragover', this.grid, this, id, e); +}; + +YAHOO.ext.grid.GridDD.prototype.onDragOut = function(e, id) { + this.setDropStatus(false); + this.grid.fireEvent('dragout', this.grid, this, id, e); +}; +}; + +YAHOO.ext.grid.GridView = function(){ + this.grid = null; + this.lastFocusedRow = null; + this.onScroll = new YAHOO.util.CustomEvent('onscroll'); + this.adjustScrollTask = new YAHOO.ext.util.DelayedTask(this._adjustForScroll, this); + this.ensureVisibleTask = new YAHOO.ext.util.DelayedTask(); +}; + +YAHOO.ext.grid.GridView.prototype = { + init: function(grid){ + this.grid = grid; + }, + + fireScroll: function(scrollLeft, scrollTop){ + this.onScroll.fireDirect(this.grid, scrollLeft, scrollTop); + }, + + + getColumnRenderers : function(){ + var renderers = []; + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + for(var i = 0; i < colCount; i++){ + renderers.push(cm.getRenderer(i)); + } + return renderers; + }, + + buildIndexMap : function(){ + var colToData = {}; + var dataToCol = {}; + var cm = this.grid.colModel; + for(var i = 0, len = cm.getColumnCount(); i < len; i++){ + var di = cm.getDataIndex(i); + colToData[i] = di; + dataToCol[di] = i; + } + return {'colToData': colToData, 'dataToCol': dataToCol}; + }, + + getDataIndexes : function(){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.colToData; + }, + + getColumnIndexByDataIndex : function(dataIndex){ + if(!this.indexMap){ + this.indexMap = this.buildIndexMap(); + } + return this.indexMap.dataToCol[dataIndex]; + }, + + updateHeaders : function(){ + var colModel = this.grid.colModel; + var hcells = this.headers; + var colCount = colModel.getColumnCount(); + for(var i = 0; i < colCount; i++){ + hcells[i].textNode.innerHTML = colModel.getColumnHeader(i); + } + }, + + adjustForScroll : function(disableDelay){ + if(!disableDelay){ + this.adjustScrollTask.delay(50); + }else{ + this._adjustForScroll(); + } + }, + + + getCellAtPoint : function(x, y){ + var colIndex = null; + var rowIndex = null; + + + var xy = YAHOO.util.Dom.getXY(this.wrap); + x = (x - xy[0]) + this.wrap.scrollLeft; + y = (y - xy[1]) + this.wrap.scrollTop; + + var colModel = this.grid.colModel; + var pos = 0; + var colCount = colModel.getColumnCount(); + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)) continue; + var width = colModel.getColumnWidth(i); + if(x >= pos && x < pos+width){ + colIndex = i; + break; + } + pos += width; + } + if(colIndex != null){ + rowIndex = (y == 0 ? 0 : Math.floor(y / this.getRowHeight())); + if(rowIndex >= this.grid.dataModel.getRowCount()){ + return null; + } + return [colIndex, rowIndex]; + } + return null; + }, + + + _adjustForScroll : function(){ + this.forceScrollUpdate(); + if(this.scrollbarMode == YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){ + var adjustment = 0; + if(this.wrap.clientWidth && this.wrap.clientWidth !== 0){ + adjustment = this.wrap.offsetWidth - this.wrap.clientWidth; + } + this.hwrap.setWidth(this.wrap.offsetWidth-adjustment); + }else{ + this.hwrap.setWidth(this.wrap.offsetWidth); + } + this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(), this.wrap.clientWidth)); + }, + + + focusRow : function(row){ + if(typeof row == 'number'){ + row = this.getBodyTable().childNodes[row]; + } + if(!row) return; + var left = this.wrap.scrollLeft; + try{ + row.childNodes.item(0).hideFocus = true; + row.childNodes.item(0).focus(); + }catch(e){} + this.ensureVisible(row); + this.wrap.scrollLeft = left; + this.handleScroll(); + this.lastFocusedRow = row; + }, + + + ensureVisible : function(row, disableDelay){ + if(!disableDelay){ + this.ensureVisibleTask.delay(50, this._ensureVisible, this, [row]); + }else{ + this._ensureVisible(row); + } + }, + + + _ensureVisible : function(row){ + if(typeof row == 'number'){ + row = this.getBodyTable().childNodes[row]; + } + if(!row) return; + var left = this.wrap.scrollLeft; + var rowTop = parseInt(row.offsetTop, 10); + var rowBottom = rowTop + row.offsetHeight; + var clientTop = parseInt(this.wrap.scrollTop, 10); + var clientBottom = clientTop + this.wrap.clientHeight; + if(rowTop < clientTop){ + this.wrap.scrollTop = rowTop; + }else if(rowBottom > clientBottom){ + this.wrap.scrollTop = rowBottom-this.wrap.clientHeight; + } + this.wrap.scrollLeft = left; + this.handleScroll(); + }, + + updateColumns : function(){ + this.grid.stopEditing(); + var colModel = this.grid.colModel; + var hcols = this.headers; + var colCount = colModel.getColumnCount(); + var pos = 0; + var totalWidth = colModel.getTotalWidth(); + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)) continue; + var width = colModel.getColumnWidth(i); + hcols[i].style.width = width + 'px'; + hcols[i].style.left = pos + 'px'; + hcols[i].split.style.left = (pos+width-3) + 'px'; + this.setCSSWidth(i, width, pos); + pos += width; + } + this.lastWidth = totalWidth; + if(this.grid.autoWidth){ + this.grid.container.setWidth(totalWidth+this.grid.container.getBorderWidth('lr')); + this.grid.autoSize(); + } + this.bwrap.setWidth(Math.max(totalWidth, this.wrap.clientWidth)); + if(!YAHOO.ext.util.Browser.isIE){ + this.wrap.scrollLeft = this.hwrap.dom.scrollLeft; + } + this.syncScroll(); + this.forceScrollUpdate(); + if(this.grid.autoHeight){ + this.autoHeight(); + this.updateWrapHeight(); + } + }, + + setCSSWidth : function(colIndex, width, pos){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'width', width + 'px'); + if(typeof pos == 'number'){ + YAHOO.ext.util.CSS.updateRule(selector, 'left', pos + 'px'); + } + }, + + + setCSSStyle : function(colIndex, name, value){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, name, value); + }, + + handleHiddenChange : function(colModel, colIndex, hidden){ + if(hidden){ + this.hideColumn(colIndex); + }else{ + this.unhideColumn(colIndex); + } + this.updateColumns(); + }, + + hideColumn : function(colIndex){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'position', 'absolute'); + YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'hidden'); + + this.headers[colIndex].style.display = 'none'; + this.headers[colIndex].split.style.display = 'none'; + }, + + unhideColumn : function(colIndex){ + var selector = ["#" + this.grid.id + " .ygrid-col-" + colIndex, ".ygrid-col-" + colIndex]; + YAHOO.ext.util.CSS.updateRule(selector, 'position', ''); + YAHOO.ext.util.CSS.updateRule(selector, 'visibility', 'visible'); + + this.headers[colIndex].style.display = ''; + this.headers[colIndex].split.style.display = ''; + }, + + getBodyTable : function(){ + return this.bwrap.dom; + }, + + updateRowIndexes : function(firstRow, lastRow){ + var stripeRows = this.grid.stripeRows; + var bt = this.getBodyTable(); + var nodes = bt.childNodes; + firstRow = firstRow || 0; + lastRow = lastRow || nodes.length-1; + var re = /^(?:ygrid-row ygrid-row-alt|ygrid-row)/; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var node = nodes[rowIndex]; + if(stripeRows && (rowIndex+1) % 2 == 0){ + node.className = node.className.replace(re, 'ygrid-row ygrid-row-alt'); + }else{ + node.className = node.className.replace(re, 'ygrid-row'); + } + node.rowIndex = rowIndex; + nodes[rowIndex].style.top = (rowIndex * this.rowHeight) + 'px'; + } + }, + + insertRows : function(dataModel, firstRow, lastRow){ + this.updateBodyHeight(); + this.adjustForScroll(true); + var renderers = this.getColumnRenderers(); + var dindexes = this.getDataIndexes(); + var colCount = this.grid.colModel.getColumnCount(); + var beforeRow = null; + var bt = this.getBodyTable(); + if(firstRow < bt.childNodes.length){ + beforeRow = bt.childNodes[firstRow]; + } + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var row = document.createElement('span'); + row.className = 'ygrid-row'; + row.style.top = (rowIndex * this.rowHeight) + 'px'; + this.renderRow(dataModel, row, rowIndex, colCount, renderers, dindexes); + if(beforeRow){ + bt.insertBefore(row, beforeRow); + }else{ + bt.appendChild(row); + } + } + this.updateRowIndexes(firstRow); + this.adjustForScroll(true); + }, + + renderRow : function(dataModel, row, rowIndex, colCount, renderers, dindexes){ + for(var colIndex = 0; colIndex < colCount; colIndex++){ + var td = document.createElement('span'); + td.className = 'ygrid-col ygrid-col-' + colIndex + (colIndex == colCount-1 ? ' ygrid-col-last' : ''); + td.columnIndex = colIndex; + td.tabIndex = 0; + var span = document.createElement('span'); + span.className = 'ygrid-cell-text'; + td.appendChild(span); + var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + span.innerHTML = val; + row.appendChild(td); + } + }, + + deleteRows : function(dataModel, firstRow, lastRow){ + this.updateBodyHeight(); + + this.grid.selModel.deselectRange(firstRow, lastRow); + var bt = this.getBodyTable(); + var rows = []; + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + rows.push(bt.childNodes[rowIndex]); + } + for(var i = 0; i < rows.length; i++){ + bt.removeChild(rows[i]); + rows[i] = null; + } + rows = null; + this.updateRowIndexes(firstRow); + this.adjustForScroll(); + }, + + updateRows : function(dataModel, firstRow, lastRow){ + var bt = this.getBodyTable(); + var dindexes = this.getDataIndexes(); + var renderers = this.getColumnRenderers(); + var colCount = this.grid.colModel.getColumnCount(); + for(var rowIndex = firstRow; rowIndex <= lastRow; rowIndex++){ + var row = bt.rows[rowIndex]; + var cells = row.childNodes; + for(var colIndex = 0; colIndex < colCount; colIndex++){ + var td = cells[colIndex]; + var val = renderers[colIndex](dataModel.getValueAt(rowIndex, dindexes[colIndex]), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + td.firstChild.innerHTML = val; + } + } + }, + + handleSort : function(dataModel, sortColumnIndex, sortDir, noRefresh){ + this.grid.selModel.syncSelectionsToIds(); + if(!noRefresh){ + this.updateRows(dataModel, 0, dataModel.getRowCount()-1); + } + this.updateHeaderSortState(); + if(this.lastFocusedRow){ + this.focusRow(this.lastFocusedRow); + } + }, + + syncScroll : function(){ + this.hwrap.dom.scrollLeft = this.wrap.scrollLeft; + }, + + handleScroll : function(){ + this.syncScroll(); + this.fireScroll(this.wrap.scrollLeft, this.wrap.scrollTop); + this.grid.fireEvent('bodyscroll', this.wrap.scrollLeft, this.wrap.scrollTop); + }, + + getRowHeight : function(){ + if(!this.rowHeight){ + var rule = YAHOO.ext.util.CSS.getRule(["#" + this.grid.id + " .ygrid-row", ".ygrid-row"]); + if(rule && rule.style.height){ + this.rowHeight = parseInt(rule.style.height, 10); + }else{ + this.rowHeight = 21; + } + } + return this.rowHeight; + }, + + renderRows : function(dataModel){ + this.grid.stopEditing(); + if(this.grid.selModel){ + this.grid.selModel.clearSelections(); + } + var bt = this.getBodyTable(); + bt.innerHTML = ''; + this.rowHeight = this.getRowHeight(); + this.insertRows(dataModel, 0, dataModel.getRowCount()-1); + }, + + updateCell : function(dataModel, rowIndex, dataIndex){ + var colIndex = this.getColumnIndexByDataIndex(dataIndex); + if(typeof colIndex == 'undefined'){ + return; + } + var bt = this.getBodyTable(); + var row = bt.childNodes[rowIndex]; + var cell = row.childNodes[colIndex]; + var renderer = this.grid.colModel.getRenderer(colIndex); + var val = renderer(dataModel.getValueAt(rowIndex, dataIndex), rowIndex, colIndex); + if(typeof val == 'undefined' || val === '') val = ' '; + cell.firstChild.innerHTML = val; + }, + + calcColumnWidth : function(colIndex, maxRowsToMeasure){ + var maxWidth = 0; + var bt = this.getBodyTable(); + var rows = bt.childNodes; + var stopIndex = Math.min(maxRowsToMeasure || rows.length, rows.length); + if(this.grid.autoSizeHeaders){ + var h = this.headers[colIndex]; + var curWidth = h.style.width; + h.style.width = this.grid.minColumnWidth+'px'; + maxWidth = Math.max(maxWidth, h.scrollWidth); + h.style.width = curWidth; + } + for(var i = 0; i < stopIndex; i++){ + var cell = rows[i].childNodes[colIndex].firstChild; + maxWidth = Math.max(maxWidth, cell.scrollWidth); + } + return maxWidth + 5; + }, + + + autoSizeColumn : function(colIndex, forceMinSize){ + if(forceMinSize){ + this.setCSSWidth(colIndex, this.grid.minColumnWidth); + } + var newWidth = this.calcColumnWidth(colIndex); + this.grid.colModel.setColumnWidth(colIndex, + Math.max(this.grid.minColumnWidth, newWidth)); + this.grid.fireEvent('columnresize', colIndex, newWidth); + }, + + + autoSizeColumns : function(){ + var colModel = this.grid.colModel; + var colCount = colModel.getColumnCount(); + var wrap = this.wrap; + for(var i = 0; i < colCount; i++){ + this.setCSSWidth(i, this.grid.minColumnWidth); + colModel.setColumnWidth(i, this.calcColumnWidth(i, this.grid.maxRowsToMeasure), true); + } + if(colModel.getTotalWidth() < wrap.clientWidth){ + var diff = Math.floor((wrap.clientWidth - colModel.getTotalWidth()) / colCount); + for(var i = 0; i < colCount; i++){ + colModel.setColumnWidth(i, colModel.getColumnWidth(i) + diff, true); + } + } + this.updateColumns(); + }, + + + fitColumns : function(){ + var cm = this.grid.colModel; + var colCount = cm.getColumnCount(); + var cols = []; + var width = 0; + var i, w; + for (i = 0; i < colCount; i++){ + if(!cm.isHidden(i) && !cm.isFixed(i)){ + w = cm.getColumnWidth(i); + cols.push(i); + cols.push(w); + width += w; + } + } + var frac = (this.wrap.clientWidth - cm.getTotalWidth())/width; + while (cols.length){ + w = cols.pop(); + i = cols.pop(); + cm.setColumnWidth(i, Math.floor(w + w*frac), true); + } + this.updateColumns(); + }, + + onWindowResize : function(){ + if(this.grid.monitorWindowResize){ + this.adjustForScroll(); + this.updateWrapHeight(); + this.adjustForScroll(); + } + }, + + updateWrapHeight : function(){ + this.grid.container.beginMeasure(); + this.autoHeight(); + var box = this.grid.container.getSize(true); + this.wrapEl.setHeight(box.height-this.footerHeight-parseInt(this.wrap.offsetTop, 10)); + this.pwrap.setSize(box.width, box.height); + this.grid.container.endMeasure(); + }, + + forceScrollUpdate : function(){ + var wrap = this.wrapEl; + wrap.setWidth(wrap.getWidth(true)); + setTimeout(function(){ + wrap.setWidth(''); + }, 1); + }, + + updateHeaderSortState : function(){ + var state = this.grid.dataModel.getSortState(); + if(!state || typeof state.column == 'undefined') return; + var sortColumn = this.getColumnIndexByDataIndex(state.column); + var sortDir = state.direction; + for(var i = 0, len = this.headers.length; i < len; i++){ + var h = this.headers[i]; + if(i != sortColumn){ + h.sortDesc.style.display = 'none'; + h.sortAsc.style.display = 'none'; + }else{ + h.sortDesc.style.display = sortDir == 'DESC' ? 'block' : 'none'; + h.sortAsc.style.display = sortDir == 'ASC' ? 'block' : 'none'; + } + } + }, + + unplugDataModel : function(dm){ + dm.removeListener('cellupdated', this.updateCell, this); + dm.removeListener('datachanged', this.renderRows, this); + dm.removeListener('rowsdeleted', this.deleteRows, this); + dm.removeListener('rowsinserted', this.insertRows, this); + dm.removeListener('rowsupdated', this.updateRows, this); + dm.removeListener('rowssorted', this.handleSort, this); + }, + + plugDataModel : function(dm){ + dm.on('cellupdated', this.updateCell, this, true); + dm.on('datachanged', this.renderRows, this, true); + dm.on('rowsdeleted', this.deleteRows, this, true); + dm.on('rowsinserted', this.insertRows, this, true); + dm.on('rowsupdated', this.updateRows, this, true); + dm.on('rowssorted', this.handleSort, this, true); + }, + + render : function(){ + var grid = this.grid; + var container = grid.container.dom; + var dataModel = grid.dataModel; + this.plugDataModel(dataModel); + + var colModel = grid.colModel; + colModel.onWidthChange.subscribe(this.updateColumns, this, true); + colModel.onHeaderChange.subscribe(this.updateHeaders, this, true); + colModel.onHiddenChange.subscribe(this.handleHiddenChange, this, true); + + YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true); + + var autoSizeDelegate = this.autoSizeColumn.createDelegate(this); + + var colCount = colModel.getColumnCount(); + + var dh = YAHOO.ext.DomHelper; + this.pwrap = dh.append(container, + {tag: 'div', cls: 'ygrid-positioner', + style: 'position:relative;width:100%;height:100%;left:0;top:0;overflow:hidden;'}, true); + var pos = this.pwrap.dom; + + + var wrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap'}); + this.wrap = wrap; + this.wrapEl = getEl(wrap, true); + YAHOO.ext.EventManager.on(wrap, 'scroll', this.handleScroll, this, true); + + var hwrap = dh.append(pos, {tag: 'div', cls: 'ygrid-wrap-headers'}); + this.hwrap = getEl(hwrap, true); + + var bwrap = dh.append(wrap, {tag: 'div', cls: 'ygrid-wrap-body', id: container.id + '-body'}); + this.bwrap = getEl(bwrap, true); + this.bwrap.setWidth(colModel.getTotalWidth()); + bwrap.rows = bwrap.childNodes; + + this.footerHeight = 0; + var foot = this.appendFooter(this.pwrap.dom); + if(foot){ + this.footer = getEl(foot, true); + this.footerHeight = this.footer.getHeight(); + } + this.updateWrapHeight(); + + var hrow = dh.append(hwrap, {tag: 'span', cls: 'ygrid-hrow'}); + this.hrow = hrow; + + if(!YAHOO.ext.util.Browser.isGecko){ + + var iframe = document.createElement('iframe'); + iframe.className = 'ygrid-hrow-frame'; + iframe.frameBorder = 0; + iframe.src = YAHOO.ext.SSL_SECURE_URL; + hwrap.appendChild(iframe); + } + this.headerCtrl = new YAHOO.ext.grid.HeaderController(this.grid); + this.headers = []; + this.cols = []; + + var htemplate = dh.createTemplate({ + tag: 'span', cls: 'ygrid-hd ygrid-header-{0}', children: [{ + tag: 'span', + cls: 'ygrid-hd-body', + html: '' + + '' + + '' + + '
        {1}
        ' + }] + }); + htemplate.compile(); + for(var i = 0; i < colCount; i++){ + var hd = htemplate.append(hrow, [i, colModel.getColumnHeader(i)]); + var spans = hd.getElementsByTagName('span'); + hd.textNode = spans[1]; + hd.sortDesc = spans[2]; + hd.sortAsc = spans[3]; + hd.columnIndex = i; + this.headers.push(hd); + if(colModel.isSortable(i)){ + this.headerCtrl.register(hd); + } + var split = dh.append(hrow, {tag: 'span', cls: 'ygrid-hd-split'}); + hd.split = split; + + if(colModel.isResizable(i) && !colModel.isFixed(i)){ + YAHOO.util.Event.on(split, 'dblclick', autoSizeDelegate.createCallback(i+0, true)); + var sb = new YAHOO.ext.SplitBar(split, hd, null, YAHOO.ext.SplitBar.LEFT); + sb.columnIndex = i; + sb.minSize = grid.minColumnWidth; + sb.onMoved.subscribe(this.onColumnSplitterMoved, this, true); + YAHOO.util.Dom.addClass(sb.proxy, 'ygrid-column-sizer'); + YAHOO.util.Dom.setStyle(sb.proxy, 'background-color', ''); + sb.dd._resizeProxy = function(){ + var el = this.getDragEl(); + YAHOO.util.Dom.setStyle(el, 'height', (hwrap.clientHeight+wrap.clientHeight-2) +'px'); + }; + }else{ + split.style.cursor = 'default'; + } + } + if(grid.autoSizeColumns){ + this.renderRows(dataModel); + this.autoSizeColumns(); + }else{ + this.updateColumns(); + this.renderRows(dataModel); + } + + for(var i = 0; i < colCount; i++){ + if(colModel.isHidden(i)){ + this.hideColumn(i); + } + } + this.updateHeaderSortState(); + return this.bwrap; + }, + + onColumnSplitterMoved : function(splitter, newSize){ + this.grid.colModel.setColumnWidth(splitter.columnIndex, newSize); + this.grid.fireEvent('columnresize', splitter.columnIndex, newSize); + }, + + appendFooter : function(parentEl){ + return null; + }, + + autoHeight : function(){ + if(this.grid.autoHeight){ + var h = this.getBodyHeight(); + var c = this.grid.container; + var total = h + (parseInt(this.wrap.offsetTop, 10)||0) + + this.footerHeight + c.getBorderWidth('tb') + c.getPadding('tb') + + (this.wrap.offsetHeight - this.wrap.clientHeight); + c.setHeight(total); + + } + }, + + getBodyHeight : function(){ + return this.grid.dataModel.getRowCount() * this.getRowHeight();; + }, + + updateBodyHeight : function(){ + this.getBodyTable().style.height = this.getBodyHeight() + 'px'; + if(this.grid.autoHeight){ + this.autoHeight(); + this.updateWrapHeight(); + } + } +}; +YAHOO.ext.grid.GridView.SCROLLBARS_UNDER = 0; +YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP = 1; +YAHOO.ext.grid.GridView.prototype.scrollbarMode = YAHOO.ext.grid.GridView.SCROLLBARS_UNDER; + +YAHOO.ext.grid.GridView.prototype.fitColumnsToContainer = YAHOO.ext.grid.GridView.prototype.fitColumns; + +YAHOO.ext.grid.HeaderController = function(grid){ + this.grid = grid; + this.headers = []; +}; + +YAHOO.ext.grid.HeaderController.prototype = { + register : function(header){ + this.headers.push(header); + YAHOO.ext.EventManager.on(header, 'selectstart', this.cancelTextSelection, this, true); + YAHOO.ext.EventManager.on(header, 'mousedown', this.cancelTextSelection, this, true); + YAHOO.ext.EventManager.on(header, 'mouseover', this.headerOver, this, true); + YAHOO.ext.EventManager.on(header, 'mouseout', this.headerOut, this, true); + YAHOO.ext.EventManager.on(header, 'click', this.headerClick, this, true); + }, + + headerClick : function(e){ + var grid = this.grid, cm = grid.colModel, dm = grid.dataModel; + grid.stopEditing(); + var header = grid.getHeaderFromChild(e.getTarget()); + var state = dm.getSortState(); + var direction = header.sortDir || 'ASC'; + if(typeof state.column != 'undefined' && + grid.getView().getColumnIndexByDataIndex(state.column) == header.columnIndex){ + direction = (state.direction == 'ASC' ? 'DESC' : 'ASC'); + } + header.sortDir = direction; + dm.sort(cm, cm.getDataIndex(header.columnIndex), direction); + }, + + headerOver : function(e){ + var header = this.grid.getHeaderFromChild(e.getTarget()); + YAHOO.util.Dom.addClass(header, 'ygrid-hd-over'); + + }, + + headerOut : function(e){ + var header = this.grid.getHeaderFromChild(e.getTarget()); + YAHOO.util.Dom.removeClass(header, 'ygrid-hd-over'); + + }, + + cancelTextSelection : function(e){ + e.preventDefault(); + } +}; + +YAHOO.ext.grid.PagedGridView = function(){ + YAHOO.ext.grid.PagedGridView.superclass.constructor.call(this); + this.cursor = 1; +}; + +YAHOO.extendX(YAHOO.ext.grid.PagedGridView, YAHOO.ext.grid.GridView, { + appendFooter : function(parentEl){ + var fwrap = document.createElement('div'); + fwrap.className = 'ygrid-wrap-footer'; + var fbody = document.createElement('span'); + fbody.className = 'ygrid-footer'; + fwrap.appendChild(fbody); + parentEl.appendChild(fwrap); + this.createPagingToolbar(fbody); + return fwrap; + }, + + createPagingToolbar : function(container){ + var tb = new YAHOO.ext.Toolbar(container); + this.pageToolbar = tb; + this.first = tb.addButton({ + tooltip: this.firstText, + className: 'ygrid-page-first', + disabled: true, + click: this.onClick.createDelegate(this, ['first']) + }); + this.prev = tb.addButton({ + tooltip: this.prevText, + className: 'ygrid-page-prev', + disabled: true, + click: this.onClick.createDelegate(this, ['prev']) + }); + tb.addSeparator(); + tb.add(this.beforePageText); + var pageBox = document.createElement('input'); + pageBox.type = 'text'; + pageBox.size = 3; + pageBox.value = '1'; + pageBox.className = 'ygrid-page-number'; + tb.add(pageBox); + this.field = getEl(pageBox, true); + this.field.mon('keydown', this.onEnter, this, true); + this.field.on('focus', function(){pageBox.select();}); + this.afterTextEl = tb.addText(this.afterPageText.replace('%0', '1')); + this.field.setHeight(18); + tb.addSeparator(); + this.next = tb.addButton({ + tooltip: this.nextText, + className: 'ygrid-page-next', + disabled: true, + click: this.onClick.createDelegate(this, ['next']) + }); + this.last = tb.addButton({ + tooltip: this.lastText, + className: 'ygrid-page-last', + disabled: true, + click: this.onClick.createDelegate(this, ['last']) + }); + tb.addSeparator(); + this.loading = tb.addButton({ + tooltip: this.refreshText, + className: 'ygrid-loading', + disabled: true, + click: this.onClick.createDelegate(this, ['refresh']) + }); + this.onPageLoaded(1, this.grid.dataModel.getTotalPages()); + }, + + + getPageToolbar : function(){ + return this.pageToolbar; + }, + + onPageLoaded : function(pageNum, totalPages){ + this.cursor = pageNum; + this.lastPage = totalPages; + this.afterTextEl.innerHTML = this.afterPageText.replace('%0', totalPages); + this.field.dom.value = pageNum; + this.first.setDisabled(pageNum == 1); + this.prev.setDisabled(pageNum == 1); + this.next.setDisabled(pageNum == totalPages); + this.last.setDisabled(pageNum == totalPages); + this.loading.enable(); + }, + + onLoadError : function(){ + this.loading.enable(); + }, + + onEnter : function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + var v = this.field.dom.value; + if(!v){ + this.field.dom.value = this.cursor; + return; + } + var pageNum = parseInt(v, 10); + if(isNaN(pageNum)){ + this.field.dom.value = this.cursor; + return; + } + pageNum = Math.min(Math.max(1, pageNum), this.lastPage); + this.grid.dataModel.loadPage(pageNum); + e.stopEvent(); + } + }, + + beforeLoad : function(){ + this.grid.stopEditing(); + if(this.loading){ + this.loading.disable(); + } + }, + + onClick : function(which){ + switch(which){ + case 'first': + this.grid.dataModel.loadPage(1); + break; + case 'prev': + this.grid.dataModel.loadPage(this.cursor -1); + break; + case 'next': + this.grid.dataModel.loadPage(this.cursor + 1); + break; + case 'last': + this.grid.dataModel.loadPage(this.lastPage); + break; + case 'refresh': + this.grid.dataModel.loadPage(this.cursor); + break; + } + }, + + unplugDataModel : function(dm){ + dm.removeListener('beforeload', this.beforeLoad, this); + dm.removeListener('load', this.onPageLoaded, this); + dm.removeListener('loadexception', this.onLoadError, this); + YAHOO.ext.grid.PagedGridView.superclass.unplugDataModel.call(this, dm); + }, + + plugDataModel : function(dm){ + dm.on('beforeload', this.beforeLoad, this, true); + dm.on('load', this.onPageLoaded, this, true); + dm.on('loadexception', this.onLoadError, this); + YAHOO.ext.grid.PagedGridView.superclass.plugDataModel.call(this, dm); + }, + + + beforePageText : "Page", + + afterPageText : "of %0", + + firstText : "First Page", + + prevText : "Previous Page", + + nextText : "Next Page", + + lastText : "Last Page", + + refreshText : "Refresh" +}); + + +YAHOO.ext.grid.EditorGrid = function(container, dataModel, colModel){ + YAHOO.ext.grid.EditorGrid.superclass.constructor.call(this, container, dataModel, + colModel, new YAHOO.ext.grid.EditorSelectionModel()); + this.container.addClass('yeditgrid'); +}; +YAHOO.extendX(YAHOO.ext.grid.EditorGrid, YAHOO.ext.grid.Grid); + +YAHOO.ext.grid.AbstractColumnModel = function(){ + + this.onWidthChange = new YAHOO.util.CustomEvent('widthChanged'); + this.onHeaderChange = new YAHOO.util.CustomEvent('headerChanged'); + this.onHiddenChange = new YAHOO.util.CustomEvent('hiddenChanged'); + + this.events = { + + 'widthchange': this.onWidthChange, + + 'headerchange': this.onHeaderChange, + + 'hiddenchange': this.onHiddenChange + }; +}; + +YAHOO.ext.grid.AbstractColumnModel.prototype = { + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + fireWidthChange : function(colIndex, newWidth){ + this.onWidthChange.fireDirect(this, colIndex, newWidth); + }, + + fireHeaderChange : function(colIndex, newHeader){ + this.onHeaderChange.fireDirect(this, colIndex, newHeader); + }, + + fireHiddenChange : function(colIndex, hidden){ + this.onHiddenChange.fireDirect(this, colIndex, hidden); + }, + + + getColumnCount : function(){ + return 0; + }, + + + isSortable : function(col){ + return false; + }, + + + isHidden : function(col){ + return false; + }, + + + getSortType : function(col){ + return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none; + }, + + + getRenderer : function(col){ + return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer; + }, + + + getColumnWidth : function(col){ + return 0; + }, + + + getTotalWidth : function(){ + return 0; + }, + + + getColumnHeader : function(col){ + return ''; + } +}; + + +YAHOO.ext.grid.DefaultColumnModel = function(config){ + YAHOO.ext.grid.DefaultColumnModel.superclass.constructor.call(this); + + this.config = config; + + + this.defaultWidth = 100; + + this.defaultSortable = false; +}; +YAHOO.extendX(YAHOO.ext.grid.DefaultColumnModel, YAHOO.ext.grid.AbstractColumnModel, { + + + getColumnCount : function(){ + return this.config.length; + }, + + + isSortable : function(col){ + if(typeof this.config[col].sortable == 'undefined'){ + return this.defaultSortable; + } + return this.config[col].sortable; + }, + + + getSortType : function(col){ + if(!this.dataMap){ + + var map = []; + for(var i = 0, len = this.config.length; i < len; i++){ + map[this.getDataIndex(i)] = i; + } + this.dataMap = map; + } + col = this.dataMap[col]; + if(!this.config[col].sortType){ + return YAHOO.ext.grid.DefaultColumnModel.sortTypes.none; + } + return this.config[col].sortType; + }, + + + setSortType : function(col, fn){ + this.config[col].sortType = fn; + }, + + + + getRenderer : function(col){ + if(!this.config[col].renderer){ + return YAHOO.ext.grid.DefaultColumnModel.defaultRenderer; + } + return this.config[col].renderer; + }, + + + setRenderer : function(col, fn){ + this.config[col].renderer = fn; + }, + + + getColumnWidth : function(col){ + return this.config[col].width || this.defaultWidth; + }, + + + setColumnWidth : function(col, width, suppressEvent){ + this.config[col].width = width; + this.totalWidth = null; + if(!suppressEvent){ + this.onWidthChange.fireDirect(this, col, width); + } + }, + + + getTotalWidth : function(includeHidden){ + if(!this.totalWidth){ + this.totalWidth = 0; + for(var i = 0; i < this.config.length; i++){ + if(includeHidden || !this.isHidden(i)){ + this.totalWidth += this.getColumnWidth(i); + } + } + } + return this.totalWidth; + }, + + + getColumnHeader : function(col){ + return this.config[col].header; + }, + + + setColumnHeader : function(col, header){ + this.config[col].header = header; + this.onHeaderChange.fireDirect(this, col, header); + }, + + getDataIndex : function(col){ + if(typeof this.config[col].dataIndex != 'number'){ + return col; + } + return this.config[col].dataIndex; + }, + + + setDataIndex : function(col, dataIndex){ + this.config[col].dataIndex = dataIndex; + }, + + isCellEditable : function(colIndex, rowIndex){ + return this.config[colIndex].editable || (typeof this.config[colIndex].editable == 'undefined' && this.config[colIndex].editor); + }, + + + getCellEditor : function(colIndex, rowIndex){ + return this.config[colIndex].editor; + }, + + + setEditable : function(col, editable){ + this.config[col].editable = editable; + }, + + + + isHidden : function(colIndex){ + return this.config[colIndex].hidden; + }, + + + + isFixed : function(colIndex){ + return this.config[colIndex].fixed; + }, + + + isResizable : function(colIndex){ + return this.config[colIndex].resizable !== false; + }, + + setHidden : function(colIndex, hidden){ + this.config[colIndex].hidden = hidden; + this.totalWidth = null; + this.fireHiddenChange(colIndex, hidden); + }, + + + setEditor : function(col, editor){ + this.config[col].editor = editor; + } +}); + + +YAHOO.ext.grid.DefaultColumnModel.sortTypes = { + none : function(s) { + return s; + }, + + asUCString : function(s) { + return String(s).toUpperCase(); + }, + + asDate : function(s) { + if(s instanceof Date){ + return s.getTime(); + } + return Date.parse(String(s)); + }, + + asFloat : function(s) { + var val = parseFloat(String(s).replace(/,/g, '')); + if(isNaN(val)) val = 0; + return val; + }, + + asInt : function(s) { + var val = parseInt(String(s).replace(/,/g, '')); + if(isNaN(val)) val = 0; + return val; + } +}; + +YAHOO.ext.grid.DefaultColumnModel.defaultRenderer = function(value){ + if(typeof value == 'string' && value.length < 1){ + return ' '; + } + return value; +} + +YAHOO.ext.grid.AbstractDataModel = function(){ + + this.onCellUpdated = new YAHOO.util.CustomEvent('onCellUpdated'); + + this.onTableDataChanged = new YAHOO.util.CustomEvent('onTableDataChanged'); + + this.onRowsDeleted = new YAHOO.util.CustomEvent('onRowsDeleted'); + + this.onRowsInserted = new YAHOO.util.CustomEvent('onRowsInserted'); + + this.onRowsUpdated = new YAHOO.util.CustomEvent('onRowsUpdated'); + + this.onRowsSorted = new YAHOO.util.CustomEvent('onRowsSorted'); + + this.events = { + + 'cellupdated' : this.onCellUpdated, + + 'datachanged' : this.onTableDataChanged, + + 'rowsdeleted' : this.onRowsDeleted, + + 'rowsinserted' : this.onRowsInserted, + + 'rowsupdated' : this.onRowsUpdated, + + 'rowssorted' : this.onRowsSorted + }; +}; + +YAHOO.ext.grid.AbstractDataModel.prototype = { + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + + fireCellUpdated : function(row, col){ + this.onCellUpdated.fireDirect(this, row, col); + }, + + + fireTableDataChanged : function(){ + this.onTableDataChanged.fireDirect(this); + }, + + + fireRowsDeleted : function(firstRow, lastRow){ + this.onRowsDeleted.fireDirect(this, firstRow, lastRow); + }, + + + fireRowsInserted : function(firstRow, lastRow){ + this.onRowsInserted.fireDirect(this, firstRow, lastRow); + }, + + + fireRowsUpdated : function(firstRow, lastRow){ + this.onRowsUpdated.fireDirect(this, firstRow, lastRow); + }, + + + fireRowsSorted : function(sortColumnIndex, sortDir, noRefresh){ + this.onRowsSorted.fireDirect(this, sortColumnIndex, sortDir, noRefresh); + }, + + + sort : function(sortInfo, columnIndex, direction, suppressEvent){ + + }, + + + getSortState : function(){ + return {column: this.sortColumn, direction: this.sortDir}; + }, + + + getRowCount : function(){ + + }, + + + getTotalRowCount : function(){ + return this.getRowCount(); + }, + + + + getRowId : function(rowIndex){ + + }, + + + getValueAt : function(rowIndex, colIndex){ + + }, + + + setValueAt : function(value, rowIndex, colIndex){ + + }, + + isPaged : function(){ + return false; + } +}; + + +YAHOO.ext.grid.DefaultDataModel = function(data){ + YAHOO.ext.grid.DefaultDataModel.superclass.constructor.call(this); + + this.data = data; +}; +YAHOO.extendX(YAHOO.ext.grid.DefaultDataModel, YAHOO.ext.grid.AbstractDataModel, { + + getRowCount : function(){ + return this.data.length; + }, + + + getRowId : function(rowIndex){ + return this.data[rowIndex][0]; + }, + + + getRow : function(rowIndex){ + return this.data[rowIndex]; + }, + + + getRows : function(indexes){ + var data = this.data; + var r = []; + for(var i = 0; i < indexes.length; i++){ + r.push(data[indexes[i]]); + } + return r; + }, + + + getValueAt : function(rowIndex, colIndex){ + return this.data[rowIndex][colIndex]; + }, + + + setValueAt: function(value, rowIndex, colIndex){ + this.data[rowIndex][colIndex] = value; + this.fireCellUpdated(rowIndex, colIndex); + }, + + + removeRows: function(startIndex, endIndex){ + endIndex = endIndex || startIndex; + this.data.splice(startIndex, endIndex-startIndex+1); + this.fireRowsDeleted(startIndex, endIndex); + }, + + + removeRow: function(index){ + this.data.splice(index, 1); + this.fireRowsDeleted(index, index); + }, + + + removeAll: function(){ + var count = this.getRowCount(); + if(count > 0){ + this.removeRows(0, count-1); + } + }, + + + query: function(spec, returnUnmatched){ + var d = this.data; + var r = []; + for(var i = 0; i < d.length; i++){ + var row = d[i]; + var isMatch = true; + for(var col in spec){ + + if(!isMatch) continue; + var filter = spec[col]; + switch(typeof filter){ + case 'string': + case 'number': + case 'boolean': + if(row[col] != filter){ + isMatch = false; + } + break; + case 'function': + if(!filter(row[col], row)){ + isMatch = false; + } + break; + case 'object': + if(filter instanceof RegExp){ + if(String(row[col]).search(filter) === -1){ + isMatch = false; + } + } + break; + } + + } + if(isMatch && !returnUnmatched){ + r.push(i); + }else if(!isMatch && returnUnmatched){ + r.push(i); + } + } + return r; + }, + + + filter: function(query){ + var matches = this.query(query, true); + var data = this.data; + + + for(var i = 0; i < matches.length; i++){ + data[matches[i]]._deleted = true; + } + for(var i = 0; i < data.length; i++){ + while(data[i] && data[i]._deleted === true){ + this.removeRow(i); + } + } + return matches.length; + }, + + + addRow: function(cellValues){ + this.data.push(cellValues); + var newIndex = this.data.length-1; + this.fireRowsInserted(newIndex, newIndex); + this.applySort(); + return newIndex; + }, + + + addRows: function(rowData){ + this.data = this.data.concat(rowData); + var firstIndex = this.data.length-rowData.length; + this.fireRowsInserted(firstIndex, firstIndex+rowData.length-1); + this.applySort(); + }, + + + insertRow: function(index, cellValues){ + this.data.splice(index, 0, cellValues); + this.fireRowsInserted(index, index); + this.applySort(); + return index; + }, + + + insertRows: function(index, rowData){ + + var args = rowData.concat(); + args.splice(0, 0, index, 0); + this.data.splice.apply(this.data, args); + this.fireRowsInserted(index, index+rowData.length-1); + this.applySort(); + }, + + + applySort: function(suppressEvent){ + if(typeof this.sortColumn != 'undefined'){ + this.sort(this.sortInfo, this.sortColumn, this.sortDir, suppressEvent); + } + }, + + + setDefaultSort: function(sortInfo, columnIndex, direction){ + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + }, + + sort: function(sortInfo, columnIndex, direction, suppressEvent){ + + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + + var dsc = (direction && direction.toUpperCase() == 'DESC'); + var sortType = null; + if(sortInfo != null){ + if(typeof sortInfo == 'function'){ + sortType = sortInfo; + }else if(typeof sortInfo == 'object'){ + sortType = sortInfo.getSortType(columnIndex);; + } + } + var fn = function(cells, cells2){ + var v1 = sortType ? sortType(cells[columnIndex], cells) : cells[columnIndex]; + var v2 = sortType ? sortType(cells2[columnIndex], cells2) : cells2[columnIndex]; + if(v1 < v2) + return dsc ? +1 : -1; + if(v1 > v2) + return dsc ? -1 : +1; + return 0; + }; + this.data.sort(fn); + if(!suppressEvent){ + this.fireRowsSorted(columnIndex, direction); + } + }, + + + each: function(fn, scope){ + var d = this.data; + for(var i = 0, len = d.length; i < len; i++){ + if(fn.call(scope || window, d[i], i) === false) break; + } + } +}); + + +YAHOO.ext.grid.DefaultDataModel.sortTypes = YAHOO.ext.grid.DefaultColumnModel.sortTypes; + +YAHOO.ext.grid.LoadableDataModel = function(dataType){ + YAHOO.ext.grid.LoadableDataModel.superclass.constructor.call(this, []); + + + this.onLoad = new YAHOO.util.CustomEvent('load'); + + this.onLoadException = new YAHOO.util.CustomEvent('loadException'); + + this.events['load'] = this.onLoad; + + this.events['beforeload'] = new YAHOO.util.CustomEvent('beforeload'); + + this.events['loadexception'] = this.onLoadException; + + + this.dataType = dataType; + + this.preprocessors = []; + + this.postprocessors = []; + + + + this.loadedPage = 1; + + this.remoteSort = false; + + this.pageSize = 0; + + this.pageUrl = null; + + this.baseParams = {}; + + this.paramMap = {'page':'page', 'pageSize':'pageSize', 'sortColumn':'sortColumn', 'sortDir':'sortDir'}; + +}; +YAHOO.extendX(YAHOO.ext.grid.LoadableDataModel, YAHOO.ext.grid.DefaultDataModel, { + + + setLoadedPage: function(pageNum, userCallback){ + this.loadedPage = pageNum; + if(typeof userCallback == 'function'){ + userCallback(); + } + }, + + + isPaged: function(){ + return this.pageSize > 0; + }, + + + getTotalRowCount: function(){ + return this.totalCount || this.getRowCount(); + }, + + + getPageSize: function(){ + return this.pageSize; + }, + + + getTotalPages: function(){ + if(this.getPageSize() == 0 || this.getTotalRowCount() == 0){ + return 1; + } + return Math.ceil(this.getTotalRowCount()/this.getPageSize()); + }, + + + initPaging: function(url, pageSize, baseParams){ + this.pageUrl = url; + this.pageSize = pageSize; + this.remoteSort = true; + if(baseParams) this.baseParams = baseParams; + }, + + + createParams: function(pageNum, sortColumn, sortDir){ + var params = {}, map = this.paramMap; + for(var key in this.baseParams){ + if(typeof this.baseParams[key] != 'function'){ + params[key] = this.baseParams[key]; + } + } + params[map['page']] = pageNum; + params[map['pageSize']] = this.getPageSize(); + params[map['sortColumn']] = (typeof sortColumn == 'undefined' ? '' : sortColumn); + params[map['sortDir']] = sortDir || ''; + return params; + }, + + + loadPage: function(pageNum, callback, keepExisting){ + var sort = this.getSortState(); + var params = this.createParams(pageNum, sort.column, sort.direction); + this.load(this.pageUrl, params, this.setLoadedPage.createDelegate(this, [pageNum, callback]), + keepExisting ? (pageNum-1) * this.pageSize : null); + }, + + + applySort: function(suppressEvent){ + if(!this.remoteSort){ + YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this, arguments); + }else if(!suppressEvent){ + var sort = this.getSortState(); + if(sort.column){ + this.fireRowsSorted(sort.column, sort.direction, true); + } + } + }, + + + resetPaging: function(){ + this.loadedPage = 1; + }, + + + sort: function(sortInfo, columnIndex, direction, suppressEvent){ + if(!this.remoteSort){ + YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this, arguments); + }else{ + this.sortInfo = sortInfo; + this.sortColumn = columnIndex; + this.sortDir = direction; + var params = this.createParams(this.loadedPage, columnIndex, direction); + this.load(this.pageUrl, params, this.fireRowsSorted.createDelegate(this, [columnIndex, direction, true])); + } + }, + + + load: function(url, params, callback, insertIndex){ + this.fireEvent('beforeload', this); + if(params && typeof params != 'string'){ + var buf = []; + for(var key in params){ + if(typeof params[key] != 'function'){ + buf.push(encodeURIComponent(key), '=', encodeURIComponent(params[key]), '&'); + } + } + delete buf[buf.length-1]; + params = buf.join(''); + } + var cb = { + success: this.processResponse, + failure: this.processException, + scope: this, + argument: {callback: callback, insertIndex: insertIndex} + }; + var method = params ? 'POST' : 'GET'; + YAHOO.util.Connect.asyncRequest(method, url, cb, params); + }, + + + processResponse: function(response){ + var cb = response.argument.callback; + var keepExisting = (typeof response.argument.insertIndex == 'number'); + var insertIndex = response.argument.insertIndex; + switch(this.dataType){ + case YAHOO.ext.grid.LoadableDataModel.XML: + this.loadData(response.responseXML, cb, keepExisting, insertIndex); + break; + case YAHOO.ext.grid.LoadableDataModel.JSON: + var rtext = response.responseText; + try { + + while(rtext.substring(0,1) == " ") { + rtext = rtext.substring(1, rtext.length); + } + + if(rtext.indexOf("{") < 0) { + throw "Invalid JSON response"; + } + + + if(rtext.indexOf("{}") === 0) { + this.loadData({}, response.argument.callback); + return; + } + + + + var jsonObjRaw = eval("(" + rtext + ")"); + if(!jsonObjRaw) { + throw "Error evaling JSON response"; + } + this.loadData(jsonObjRaw, cb, keepExisting, insertIndex); + } catch(e) { + this.fireLoadException(e, response); + if(typeof callback == 'function'){ + callback(this, false); + } + } + break; + case YAHOO.ext.grid.LoadableDataModel.TEXT: + this.loadData(response.responseText, cb, keepExisting, insertIndex); + break; + }; + }, + + + processException: function(response){ + this.fireLoadException(null, response); + if(typeof response.argument.callback == 'function'){ + response.argument.callback(this, false); + } + }, + + fireLoadException: function(e, responseObj){ + this.onLoadException.fireDirect(this, e, responseObj); + }, + + fireLoadEvent: function(){ + this.fireEvent('load', this.loadedPage, this.getTotalPages()); + }, + + + addPreprocessor: function(columnIndex, fn){ + this.preprocessors[columnIndex] = fn; + }, + + + getPreprocessor: function(columnIndex){ + return this.preprocessors[columnIndex]; + }, + + + removePreprocessor: function(columnIndex){ + this.preprocessors[columnIndex] = null; + }, + + + addPostprocessor: function(columnIndex, fn){ + this.postprocessors[columnIndex] = fn; + }, + + + getPostprocessor: function(columnIndex){ + return this.postprocessors[columnIndex]; + }, + + + removePostprocessor: function(columnIndex){ + this.postprocessors[columnIndex] = null; + }, + + loadData: function(data, callback, keepExisting, insertIndex){ + + } +}); + +YAHOO.ext.grid.LoadableDataModel.XML = 'xml'; +YAHOO.ext.grid.LoadableDataModel.JSON = 'json'; +YAHOO.ext.grid.LoadableDataModel.TEXT = 'text'; + + + + + + + +YAHOO.ext.grid.XMLDataModel = function(schema, xml){ + YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.XML); + + this.schema = schema; + this.xml = xml; + if(xml){ + this.loadData(xml); + } + this.idSeed = 0; +}; +YAHOO.extendX(YAHOO.ext.grid.XMLDataModel, YAHOO.ext.grid.LoadableDataModel, { + + getDocument: function(){ + return this.xml; + }, + + + loadData: function(doc, callback, keepExisting, insertIndex){ + this.xml = doc; + var idField = this.schema.id; + var fields = this.schema.fields; + if(this.schema.totalTag){ + this.totalCount = null; + var totalNode = doc.getElementsByTagName(this.schema.totalTag); + if(totalNode && totalNode.item(0) && totalNode.item(0).firstChild) { + var v = parseInt(totalNode.item(0).firstChild.nodeValue, 10); + if(!isNaN(v)){ + this.totalCount = v; + } + } + } + var rowData = []; + var nodes = doc.getElementsByTagName(this.schema.tagName); + if(nodes && nodes.length > 0) { + for(var i = 0; i < nodes.length; i++) { + var node = nodes.item(i); + var colData = []; + colData.node = node; + colData.id = this.getNamedValue(node, idField, String(++this.idSeed)); + for(var j = 0; j < fields.length; j++) { + var val = this.getNamedValue(node, fields[j], ""); + if(this.preprocessors[j]){ + val = this.preprocessors[j](val); + } + colData.push(val); + } + rowData.push(colData); + } + } + if(keepExisting !== true){ + YAHOO.ext.grid.XMLDataModel.superclass.removeAll.call(this); + } + if(typeof insertIndex != 'number'){ + insertIndex = this.getRowCount(); + } + YAHOO.ext.grid.XMLDataModel.superclass.insertRows.call(this, insertIndex, rowData); + if(typeof callback == 'function'){ + callback(this, true); + } + this.fireLoadEvent(); + }, + + + addRow: function(id, cellValues){ + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = id || ++this.idSeed; + cellValues.node = node; + return YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this, cellValues); + }, + + + insertRow: function(index, id, cellValues){ + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = id || ++this.idSeed; + cellValues.node = node; + return YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues); + }, + + + removeRow: function(index){ + var node = this.data[index].node; + node.parentNode.removeChild(node); + YAHOO.ext.grid.XMLDataModel.superclass.removeRow.call(this, index, index); + }, + + getNode: function(rowIndex){ + return this.data[rowIndex].node; + }, + + + createNode: function(xmlDoc, id, colData){ + var template = this.data[0].node; + var newNode = template.cloneNode(true); + var fields = this.schema.fields; + for(var i = 0, len = fields.length; i < len; i++){ + var nodeValue = colData[i]; + if(this.postprocessors[i]){ + nodeValue = this.postprocessors[i](nodeValue); + } + this.setNamedValue(newNode, fields[i], nodeValue); + } + if(id){ + this.setNamedValue(newNode, this.schema.idField, id); + } + template.parentNode.appendChild(newNode); + return newNode; + }, + + + getNamedValue: function(node, name, defaultValue){ + if(!node || !name){ + return defaultValue; + } + var nodeValue = defaultValue; + var attrNode = node.attributes.getNamedItem(name); + if(attrNode) { + nodeValue = attrNode.value; + } else { + var childNode = node.getElementsByTagName(name); + if(childNode && childNode.item(0) && childNode.item(0).firstChild) { + nodeValue = childNode.item(0).firstChild.nodeValue; + }else{ + + var index = name.indexOf(':'); + if(index > 0){ + return this.getNamedValue(node, name.substr(index+1), defaultValue); + } + } + } + return nodeValue; + }, + + + setNamedValue: function(node, name, value){ + if(!node || !name){ + return; + } + var attrNode = node.attributes.getNamedItem(name); + if(attrNode) { + attrNode.value = value; + return; + } + var childNode = node.getElementsByTagName(name); + if(childNode && childNode.item(0) && childNode.item(0).firstChild) { + childNode.item(0).firstChild.nodeValue = value; + }else{ + + var index = name.indexOf(':'); + if(index > 0){ + this.setNamedValue(node, name.substr(index+1), value); + } + } + }, + + + setValueAt: function(value, rowIndex, colIndex){ + var node = this.data[rowIndex].node; + if(node){ + var nodeValue = value; + if(this.postprocessors[colIndex]){ + nodeValue = this.postprocessors[colIndex](value); + } + this.setNamedValue(node, this.schema.fields[colIndex], nodeValue); + } + YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this, value, rowIndex, colIndex); + }, + + + getRowId: function(rowIndex){ + return this.data[rowIndex].id; + }, + + addRows : function(rowData){ + for(var j = 0, len = rowData.length; j < len; j++){ + var cellValues = rowData[j]; + var id = ++this.idSeed; + var node = this.createNode(this.xml, id, cellValues); + cellValues.node=node; + cellValues.id = cellValues.id || id; + YAHOO.ext.grid.XMLDataModel.superclass.addRow.call(this,cellValues); + } + }, + + insertRows : function(index, rowData){ + + rowData = rowData.slice(0).reverse(); + for(var j = 0, len = rowData.length; j < len; j++){ + var cellValues = rowData[j]; + var id = ++this.idSeed; + var node = this.createNode(this.xml, id, cellValues); + cellValues.id = cellValues.id || id; + cellValues.node = node; + YAHOO.ext.grid.XMLDataModel.superclass.insertRow.call(this, index, cellValues); + } + } +}); + + +YAHOO.ext.grid.JSONDataModel = function(schema){ + YAHOO.ext.grid.JSONDataModel.superclass.constructor.call(this, YAHOO.ext.grid.LoadableDataModel.JSON); + + this.schema = schema; +}; +YAHOO.extendX(YAHOO.ext.grid.JSONDataModel, YAHOO.ext.grid.LoadableDataModel, { + + loadData : function(data, callback, keepExisting){ + var idField = this.schema.id; + var fields = this.schema.fields; + if(this.schema.totalProperty){ + var v = parseInt(eval('data.' + this.schema.totalProperty), 10); + if(!isNaN(v)){ + this.totalCount = v; + } + } + var rowData = []; + try{ + var root = eval('data.' + this.schema.root); + for(var i = 0; i < root.length; i++){ + var node = root[i]; + var colData = []; + colData.node = node; + colData.id = (typeof node[idField] != 'undefined' && node[idField] !== '' ? node[idField] : String(i)); + for(var j = 0; j < fields.length; j++) { + var val = node[fields[j]]; + if(typeof val == 'undefined'){ + val = ''; + } + if(this.preprocessors[j]){ + val = this.preprocessors[j](val); + } + colData.push(val); + } + rowData.push(colData); + } + if(keepExisting !== true){ + this.removeAll(); + } + this.addRows(rowData); + if(typeof callback == 'function'){ + callback(this, true); + } + this.fireLoadEvent(); + }catch(e){ + this.fireLoadException(e, null); + if(typeof callback == 'function'){ + callback(this, false); + } + } + }, + + + getRowId : function(rowIndex){ + return this.data[rowIndex].id; + } +}); + +YAHOO.ext.grid.DefaultSelectionModel = function(){ + this.selectedRows = []; + this.selectedRowIds = []; + this.lastSelectedRow = null; + + this.onRowSelect = new YAHOO.util.CustomEvent('SelectionTable.rowSelected'); + this.onSelectionChange = new YAHOO.util.CustomEvent('SelectionTable.selectionChanged'); + + this.events = { + + 'selectionchange' : this.onSelectionChange, + + 'rowselect' : this.onRowSelect + }; + + this.locked = false; +}; + +YAHOO.ext.grid.DefaultSelectionModel.prototype = { + + init : function(grid){ + this.grid = grid; + this.initEvents(); + }, + + + lock : function(){ + this.locked = true; + }, + + + unlock : function(){ + this.locked = false; + }, + + + isLocked : function(){ + return this.locked; + }, + + + initEvents : function(){ + if(this.grid.trackMouseOver){ + this.grid.addListener("mouseover", this.handleOver, this, true); + this.grid.addListener("mouseout", this.handleOut, this, true); + } + this.grid.addListener("rowclick", this.rowClick, this, true); + this.grid.addListener("keydown", this.keyDown, this, true); + }, + + fireEvent : YAHOO.ext.util.Observable.prototype.fireEvent, + on : YAHOO.ext.util.Observable.prototype.on, + addListener : YAHOO.ext.util.Observable.prototype.addListener, + delayedListener : YAHOO.ext.util.Observable.prototype.delayedListener, + removeListener : YAHOO.ext.util.Observable.prototype.removeListener, + purgeListeners : YAHOO.ext.util.Observable.prototype.purgeListeners, + + + syncSelectionsToIds : function(){ + if(this.getCount() > 0){ + var ids = this.selectedRowIds.concat(); + this.clearSelections(); + this.selectRowsById(ids, true); + } + }, + + + selectRowsById : function(id, keepExisting){ + var rows = this.grid.getRowsById(id); + if (!(rows instanceof Array)){ + this.selectRow(rows, keepExisting); + return; + } + this.selectRows(rows, keepExisting); + }, + + + getCount : function(){ + return this.selectedRows.length; + }, + + + selectFirstRow : function(){ + for(var j = 0; j < this.grid.rows.length; j++){ + if(this.isSelectable(this.grid.rows[j])){ + this.focusRow(this.grid.rows[j]); + this.setRowState(this.grid.rows[j], true); + return; + } + } + }, + + + selectNext : function(keepExisting){ + if(this.lastSelectedRow){ + for(var j = (this.lastSelectedRow.rowIndex+1); j < this.grid.rows.length; j++){ + var row = this.grid.rows[j]; + if(this.isSelectable(row)){ + this.focusRow(row); + this.setRowState(row, true, keepExisting); + return; + } + } + } + }, + + + selectPrevious : function(keepExisting){ + if(this.lastSelectedRow){ + for(var j = (this.lastSelectedRow.rowIndex-1); j >= 0; j--){ + var row = this.grid.rows[j]; + if(this.isSelectable(row)){ + this.focusRow(row); + this.setRowState(row, true, keepExisting); + return; + } + } + } + }, + + + getSelectedRows : function(){ + return this.selectedRows; + }, + + + getSelectedRowIds : function(){ + return this.selectedRowIds; + }, + + + clearSelections : function(){ + if(this.isLocked()) return; + var oldSelections = this.selectedRows.concat(); + for(var j = 0; j < oldSelections.length; j++){ + this.setRowState(oldSelections[j], false); + } + this.selectedRows = []; + this.selectedRowIds = []; + }, + + + + selectAll : function(){ + if(this.isLocked()) return; + this.selectedRows = []; + this.selectedRowIds = []; + for(var j = 0, len = this.grid.rows.length; j < len; j++){ + this.setRowState(this.grid.rows[j], true, true); + } + }, + + + hasSelection : function(){ + return this.selectedRows.length > 0; + }, + + + isSelected : function(row){ + return row && (row.selected === true || row.getAttribute('selected') == 'true'); + }, + + + isSelectable : function(row){ + return row && row.getAttribute('selectable') != 'false'; + }, + + + rowClick : function(grid, rowIndex, e){ + if(this.isLocked()) return; + var row = grid.getRow(rowIndex); + if(this.isSelectable(row)){ + if(e.shiftKey && this.lastSelectedRow){ + var lastIndex = this.lastSelectedRow.rowIndex; + this.selectRange(this.lastSelectedRow, row, e.ctrlKey); + this.lastSelectedRow = this.grid.el.dom.rows[lastIndex]; + }else{ + this.focusRow(row); + var rowState = e.ctrlKey ? !this.isSelected(row) : true; + this.setRowState(row, rowState, e.hasModifier()); + } + } + }, + + + focusRow : function(row){ + this.grid.view.focusRow(row); + }, + + + selectRow : function(row, keepExisting){ + this.setRowState(this.getRow(row), true, keepExisting); + }, + + + selectRows : function(rows, keepExisting){ + if(!keepExisting){ + this.clearSelections(); + } + for(var i = 0; i < rows.length; i++){ + this.selectRow(rows[i], true); + } + }, + + + deselectRow : function(row){ + this.setRowState(this.getRow(row), false); + }, + + + getRow : function(row){ + if(typeof row == 'number'){ + row = this.grid.rows[row]; + } + return row; + }, + + + selectRange : function(startRow, endRow, keepExisting){ + startRow = this.getRow(startRow); + endRow = this.getRow(endRow); + this.setRangeState(startRow, endRow, true, keepExisting); + }, + + + deselectRange : function(startRow, endRow){ + startRow = this.getRow(startRow); + endRow = this.getRow(endRow); + this.setRangeState(startRow, endRow, false, true); + }, + + + setRowStateFromChild : function(childEl, selected, keepExisting){ + var row = this.grid.getRowFromChild(childEl); + this.setRowState(row, selected, keepExisting); + }, + + + setRangeState : function(startRow, endRow, selected, keepExisting){ + if(this.isLocked()) return; + if(!keepExisting){ + this.clearSelections(); + } + var curRow = startRow; + while(curRow.rowIndex != endRow.rowIndex){ + this.setRowState(curRow, selected, true); + curRow = (startRow.rowIndex < endRow.rowIndex ? + this.grid.getRowAfter(curRow) : this.grid.getRowBefore(curRow)) + } + this.setRowState(endRow, selected, true); + }, + + + setRowState : function(row, selected, keepExisting){ + if(this.isLocked()) return; + if(this.isSelectable(row)){ + if(selected){ + if(!keepExisting){ + this.clearSelections(); + } + this.setRowClass(row, 'selected'); + row.selected = true; + this.selectedRows.push(row); + this.selectedRowIds.push(this.grid.dataModel.getRowId(row.rowIndex)); + this.lastSelectedRow = row; + }else{ + this.setRowClass(row, ''); + row.selected = false; + this._removeSelected(row); + } + this.fireEvent('rowselect', this, row, selected); + this.fireEvent('selectionchange', this, this.selectedRows, this.selectedRowIds); + } + }, + + + handleOver : function(e){ + var row = this.grid.getRowFromChild(e.getTarget()); + if(this.isSelectable(row) && !this.isSelected(row)){ + this.setRowClass(row, 'over'); + } + }, + + + handleOut : function(e){ + var row = this.grid.getRowFromChild(e.getTarget()); + if(this.isSelectable(row) && !this.isSelected(row)){ + this.setRowClass(row, ''); + } + }, + + + keyDown : function(e){ + if(e.browserEvent.keyCode == e.DOWN){ + this.selectNext(e.shiftKey); + e.preventDefault(); + }else if(e.browserEvent.keyCode == e.UP){ + this.selectPrevious(e.shiftKey); + e.preventDefault(); + } + }, + + + setRowClass : function(row, cssClass){ + if(this.isSelectable(row)){ + if(cssClass == 'selected'){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-over'); + YAHOO.util.Dom.addClass(row, 'ygrid-row-selected'); + }else if(cssClass == 'over'){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected'); + YAHOO.util.Dom.addClass(row, 'ygrid-row-over'); + }else if(cssClass == ''){ + YAHOO.util.Dom.removeClass(row, 'ygrid-row-selected'); + YAHOO.util.Dom.removeClass(row, 'ygrid-row-over'); + } + } + }, + + + _removeSelected : function(row){ + var sr = this.selectedRows; + for (var i = 0; i < sr.length; i++) { + if (sr[i] === row){ + this.selectedRows.splice(i, 1); + this.selectedRowIds.splice(i, 1); + return; + } + } + } +}; + + +YAHOO.ext.grid.SingleSelectionModel = function(){ + YAHOO.ext.grid.SingleSelectionModel.superclass.constructor.call(this); +}; + +YAHOO.extendX(YAHOO.ext.grid.SingleSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + + +YAHOO.ext.grid.SingleSelectionModel.prototype.setRowState = function(row, selected){ + YAHOO.ext.grid.SingleSelectionModel.superclass.setRowState.call(this, row, selected, false); +}; + +YAHOO.ext.grid.DisableSelectionModel = function(){ + YAHOO.ext.grid.DisableSelectionModel.superclass.constructor.call(this); +}; + +YAHOO.extendX(YAHOO.ext.grid.DisableSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.DisableSelectionModel.prototype.initEvents = function(){ +}; + + +YAHOO.ext.grid.EditorSelectionModel = function(){ + YAHOO.ext.grid.EditorSelectionModel.superclass.constructor.call(this); + + this.clicksToActivateCell = 1; + this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate'); +}; + +YAHOO.extendX(YAHOO.ext.grid.EditorSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.EditorSelectionModel.prototype.disableArrowNavigation = false; +YAHOO.ext.grid.EditorSelectionModel.prototype.controlForArrowNavigation = false; + + +YAHOO.ext.grid.EditorSelectionModel.prototype.initEvents = function(){ + this.grid.addListener("cellclick", this.onCellClick, this, true); + this.grid.addListener("celldblclick", this.onCellDblClick, this, true); + this.grid.addListener("keydown", this.keyDown, this, true); +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.onCellClick = function(grid, rowIndex, colIndex){ + if(this.clicksToActivateCell == 1){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.activate(row, cell); + } + } +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.activate = function(row, cell){ + this.fireEvent('cellactivate', this, row, cell); + this.grid.doEdit(row, cell); +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){ + if(this.clicksToActivateCell == 2){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.activate(row, cell); + } + } +}; + + +YAHOO.ext.grid.EditorSelectionModel.prototype.setRowState = function(row, selected){ + YAHOO.ext.grid.EditorSelectionModel.superclass.setRowState.call(this, row, false, false); +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.focusRow = function(row, selected){ +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellAfter = function(cell, spanRows){ + var g = this.grid; + var next = g.getCellAfter(cell); + while(next && !g.colModel.isCellEditable(next.columnIndex)){ + next = g.getCellAfter(next); + } + if(!next && spanRows){ + var row = g.getRowAfter(g.getRowFromChild(cell)); + if(row){ + next = g.getFirstCell(row); + if(!g.colModel.isCellEditable(next.columnIndex)){ + next = this.getEditorCellAfter(next); + } + } + } + return next; +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.getEditorCellBefore = function(cell, spanRows){ + var g = this.grid; + var prev = g.getCellBefore(cell); + while(prev && !g.colModel.isCellEditable(prev.columnIndex)){ + prev = g.getCellBefore(prev); + } + if(!prev && spanRows){ + var row = g.getRowBefore(g.getRowFromChild(cell)); + if(row){ + prev = g.getLastCell(row); + if(!g.colModel.isCellEditable(prev.columnIndex)){ + prev = this.getEditorCellBefore(prev); + } + } + } + return prev; +}; + +YAHOO.ext.grid.EditorSelectionModel.prototype.allowArrowNav = function(e){ + return (!this.disableArrowNavigation && (!this.controlForArrowNavigation || e.ctrlKey)); +} + +YAHOO.ext.grid.EditorSelectionModel.prototype.keyDown = function(e){ + var g = this.grid, cm = g.colModel, cell = g.getEditingCell(); + if(!cell) return; + var newCell; + switch(e.browserEvent.keyCode){ + case e.TAB: + if(e.shiftKey){ + newCell = this.getEditorCellBefore(cell, true); + }else{ + newCell = this.getEditorCellAfter(cell, true); + } + e.preventDefault(); + break; + case e.DOWN: + if(this.allowArrowNav(e)){ + var next = g.getRowAfter(g.getRowFromChild(cell)); + if(next){ + newCell = next.childNodes[cell.columnIndex]; + } + } + break; + case e.UP: + if(this.allowArrowNav(e)){ + var prev = g.getRowBefore(g.getRowFromChild(cell)); + if(prev){ + newCell = prev.childNodes[cell.columnIndex]; + } + } + break; + case e.RETURN: + if(e.shiftKey){ + var prev = g.getRowBefore(g.getRowFromChild(cell)); + if(prev){ + newCell = prev.childNodes[cell.columnIndex]; + } + }else{ + var next = g.getRowAfter(g.getRowFromChild(cell)); + if(next){ + newCell = next.childNodes[cell.columnIndex]; + } + } + break; + case e.RIGHT: + if(this.allowArrowNav(e)){ + newCell = this.getEditorCellAfter(cell); + } + break; + case e.LEFT: + if(this.allowArrowNav(e)){ + newCell = this.getEditorCellBefore(cell); + } + break; + }; + if(newCell){ + this.activate(g.getRowFromChild(newCell), newCell); + e.stopEvent(); + } +}; + + +YAHOO.ext.grid.EditorAndSelectionModel = function(){ + YAHOO.ext.grid.EditorAndSelectionModel.superclass.constructor.call(this); + this.events['cellactivate'] = new YAHOO.util.CustomEvent('cellactivate'); +}; + +YAHOO.extendX(YAHOO.ext.grid.EditorAndSelectionModel, YAHOO.ext.grid.DefaultSelectionModel); + +YAHOO.ext.grid.EditorAndSelectionModel.prototype.initEvents = function(){ + YAHOO.ext.grid.EditorAndSelectionModel.superclass.initEvents.call(this); + this.grid.addListener("celldblclick", this.onCellDblClick, this, true); +}; + +YAHOO.ext.grid.EditorAndSelectionModel.prototype.onCellDblClick = function(grid, rowIndex, colIndex){ + var row = this.grid.getRow(rowIndex); + var cell = row.childNodes[colIndex]; + if(cell){ + this.fireEvent('cellactivate', this, row, cell); + this.grid.doEdit(row, cell); + } +}; + +YAHOO.ext.grid.CellEditor = function(element){ + this.colIndex = null; + this.rowIndex = null; + this.grid = null; + this.editing = false; + this.originalValue = null; + this.element = getEl(element, true); + this.element.addClass('ygrid-editor'); + this.element.dom.tabIndex = 1; + this.initialized = false; + this.callback = null; +}; + +YAHOO.ext.grid.CellEditor.prototype = { + init : function(grid, bodyElement, callback){ + + + + if(this.initialized) return; + this.initialized = true; + this.callback = callback; + this.grid = grid; + bodyElement.appendChild(this.element.dom); + this.initEvents(); + }, + + initEvents : function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.element.mon('keydown', stopOnEnter, this, true); + this.element.on('blur', this.stopEditing, this, true); + }, + + startEditing : function(value, row, cell){ + this.originalValue = value; + this.rowIndex = row.rowIndex; + this.colIndex = cell.columnIndex; + this.cell = cell; + this.setValue(value); + var cellbox = getEl(cell, true).getBox(); + this.fitToCell(cellbox); + this.editing = true; + this.show(); + }, + + stopEditing : function(focusCell){ + if(this.editing){ + this.editing = false; + var newValue = this.getValue(); + this.hide(); + + if(this.originalValue != newValue){ + this.callback(newValue, this.rowIndex, this.colIndex); + } + } + }, + + setValue : function(value){ + this.element.dom.value = value; + }, + + getValue : function(){ + return this.element.dom.value; + }, + + fitToCell : function(box){ + this.element.setBox(box, true); + }, + + show : function(){ + this.element.show(); + this.element.focus(); + }, + + hide : function(){ + try{ + this.element.dom.blur(); + }catch(e){} + this.element.hide(); + } +}; + +YAHOO.ext.grid.CheckboxEditor = function(){ + var div = document.createElement('span'); + div.className = 'ygrid-editor ygrid-checkbox-editor'; + var cb = document.createElement('input'); + cb.type = 'checkbox'; + cb.setAttribute('autocomplete', 'off'); + div.appendChild(cb); + document.body.appendChild(div); + YAHOO.ext.grid.CheckboxEditor.superclass.constructor.call(this, div); + div.tabIndex = ''; + cb.tabIndex = 1; + this.cb = getEl(cb, true); +}; + +YAHOO.extendX(YAHOO.ext.grid.CheckboxEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.CheckboxEditor.prototype.fitToCell = function(box){ + this.element.setBox(box, true); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.setValue = function(value){ + this.cb.dom.checked = (value === true || value === 'true' || value === 1 || value === '1'); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.getValue = function(){ + return this.cb.dom.checked; +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.show = function(){ + this.element.show(); + this.cb.focus(); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.initEvents = function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.cb.mon('keydown', stopOnEnter, this, true); + this.cb.on('blur', this.stopEditing, this, true); +}; + +YAHOO.ext.grid.CheckboxEditor.prototype.hide = function(){ + try{ + this.cb.dom.blur(); + }catch(e){} + this.element.hide(); +}; + +YAHOO.ext.grid.DateEditor = function(config){ + var div = document.createElement('span'); + div.className = 'ygrid-editor ygrid-editor-container'; + + var element = document.createElement('input'); + element.type = 'text'; + element.tabIndex = 1; + element.setAttribute('autocomplete', 'off'); + div.appendChild(element); + + var pick = document.createElement('span'); + pick.className = 'pick-button'; + div.appendChild(pick); + + document.body.appendChild(div); + + this.div = getEl(div, true); + this.element = getEl(element, true); + this.pick = getEl(pick, true); + + this.colIndex = null; + this.rowIndex = null; + this.grid = null; + this.editing = false; + this.originalValue = null; + this.initialized = false; + this.callback = null; + + this.cal = null; + this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true); + + YAHOO.ext.util.Config.apply(this, config); + if(typeof this.minValue == 'string') this.minValue = this.parseDate(this.minValue); + if(typeof this.maxValue == 'string') this.maxValue = this.parseDate(this.maxValue); + this.ddMatch = /ddnone/; + if(this.disabledDates){ + var dd = this.disabledDates; + var re = "(?:"; + for(var i = 0; i < dd.length; i++){ + re += dd[i]; + if(i != dd.length-1) re += "|"; + } + this.ddMatch = new RegExp(re + ")"); + } +}; + +YAHOO.ext.grid.DateEditor.prototype = { + init : function(grid, bodyElement, callback){ + if(this.initialized) return; + + this.initialized = true; + this.callback = callback; + this.grid = grid; + bodyElement.appendChild(this.div.dom); + this.initEvents(); + }, + + initEvents : function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + } + this.element.mon('keydown', stopOnEnter, this, true); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); + this.pick.on('click', this.showCalendar, this, true); + }, + + startEditing : function(value, row, cell){ + this.originalValue = value; + this.rowIndex = row.rowIndex; + this.colIndex = cell.columnIndex; + this.cell = cell; + this.setValue(value); + this.validate(); + var cellbox = getEl(cell, true).getBox(); + this.div.setBox(cellbox, true); + this.element.setWidth(cellbox.width-this.pick.getWidth()); + this.editing = true; + YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler); + this.show(); + }, + + stopEditing : function(focusCell){ + if(this.editing){ + YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler); + this.editing = false; + var newValue = this.getValue(); + this.hide(); + + if(this.originalValue != newValue){ + this.callback(newValue, this.rowIndex, this.colIndex); + } + } + }, + + setValue : function(value){ + this.element.dom.value = this.formatDate(value); + this.validate(); + }, + + getValue : function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + var value = this.element.dom.value; + if(value.length < 1){ + return value; + } else{ + return this.parseDate(value); + } + } + }, + + show : function() { + this.div.show(); + this.element.focus(); + this.validate(); + }, + + hide : function(){ + try{ + this.element.dom.blur(); + }catch(e){} + this.div.hide(); + }, + + validate : function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + value = this.parseDate(value); + if(!value){ + dom.title = this.invalidText.replace('%0', dom.value).replace('%1', this.format); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var time = value.getTime(); + if(this.minValue && time < this.minValue.getTime()){ + dom.title = this.minText.replace('%0', this.formatDate(this.minValue)); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.maxValue && time > this.maxValue.getTime()){ + dom.title = this.maxText.replace('%0', this.formatDate(this.maxValue)); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.disabledDays){ + var day = value.getDay(); + for(var i = 0; i < this.disabledDays.length; i++) { + if(day === this.disabledDays[i]){ + dom.title = this.disabledDaysText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + } + var fvalue = this.formatDate(value); + if(this.ddMatch.test(fvalue)){ + dom.title = this.disabledDatesText.replace('%0', fvalue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }, + + handleMouseDown : function(e){ + var t = e.getTarget(); + var dom = this.div.dom; + if(t != dom && !YAHOO.util.Dom.isAncestor(dom, t)){ + this.stopEditing(); + } + }, + + showCalendar : function(value){ + if(this.cal == null){ + this.cal = new YAHOO.ext.DatePicker(this.div.dom.parentNode.parentNode); + } + this.cal.minDate = this.minValue; + this.cal.maxDate = this.maxValue; + this.cal.disabledDatesRE = this.ddMatch; + this.cal.disabledDatesText = this.disabledDatesText; + this.cal.disabledDays = this.disabledDays; + this.cal.disabledDaysText = this.disabledDaysText; + this.cal.format = this.format; + if(this.minValue){ + this.cal.minText = this.minText.replace('%0', this.formatDate(this.minValue)); + } + if(this.maxValue){ + this.cal.maxText = this.maxText.replace('%0', this.formatDate(this.maxValue)); + } + var r = this.div.getRegion(); + this.cal.show(r.left, r.bottom, this.getValue(), this.setValue.createDelegate(this)); + }, + + parseDate : function(value){ + if(!value || value instanceof Date) return value; + return Date.parseDate(value, this.format); + }, + + formatDate : function(date){ + if(!date || !(date instanceof Date)) return date; + return date.format(this.format); + } +}; + +YAHOO.ext.grid.DateEditor.prototype.format = 'm/d/y'; +YAHOO.ext.grid.DateEditor.prototype.disabledDays = null; +YAHOO.ext.grid.DateEditor.prototype.disabledDaysText = ''; +YAHOO.ext.grid.DateEditor.prototype.disabledDates = null; +YAHOO.ext.grid.DateEditor.prototype.disabledDatesText = ''; +YAHOO.ext.grid.DateEditor.prototype.allowBlank = true; +YAHOO.ext.grid.DateEditor.prototype.minValue = null; +YAHOO.ext.grid.DateEditor.prototype.maxValue = null; +YAHOO.ext.grid.DateEditor.prototype.minText = 'The date in this field must be after %0'; +YAHOO.ext.grid.DateEditor.prototype.maxText = 'The date in this field must be before %0'; +YAHOO.ext.grid.DateEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.DateEditor.prototype.invalidText = '%0 is not a valid date - it must be in the format %1'; +YAHOO.ext.grid.DateEditor.prototype.validationDelay = 200; +YAHOO.ext.grid.DateEditor.prototype.validator = function(){return true;}; + +YAHOO.ext.grid.NumberEditor = function(config){ + var element = document.createElement('input'); + element.type = 'text'; + element.className = 'ygrid-editor ygrid-num-editor'; + element.setAttribute('autocomplete', 'off'); + document.body.appendChild(element); + YAHOO.ext.grid.NumberEditor.superclass.constructor.call(this, element); + YAHOO.ext.util.Config.apply(this, config); +}; +YAHOO.extendX(YAHOO.ext.grid.NumberEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.NumberEditor.prototype.initEvents = function(){ + var stopOnEnter = function(e){ + if(e.browserEvent.keyCode == e.RETURN){ + this.stopEditing(true); + }else if(e.browserEvent.keyCode == e.ESC){ + this.setValue(this.originalValue); + this.stopEditing(true); + } + }; + + var allowed = "0123456789"; + if(this.allowDecimals){ + allowed += this.decimalSeparator; + } + if(this.allowNegative){ + allowed += '-'; + } + var keyPress = function(e){ + var c = e.getCharCode(); + if(c != e.BACKSPACE && allowed.indexOf(String.fromCharCode(c)) === -1){ + e.stopEvent(); + } + }; + this.element.mon('keydown', stopOnEnter, this, true); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); + this.element.mon('keypress', keyPress, this, true); + this.element.on('blur', this.stopEditing, this, true); +}; + +YAHOO.ext.grid.NumberEditor.prototype.validate = function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + if(value.search(/\d+/) === -1){ + dom.title = this.nanText.replace('%0', value); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var num = this.parseValue(value); + if(num < this.minValue){ + dom.title = this.minText.replace('%0', this.minValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(num > this.maxValue){ + dom.title = this.maxText.replace('%0', this.maxValue); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; +}; + +YAHOO.ext.grid.NumberEditor.prototype.show = function(){ + this.element.dom.title = ''; + YAHOO.ext.grid.NumberEditor.superclass.show.call(this); + if(this.selectOnFocus){ + try{ + this.element.dom.select(); + }catch(e){} + } + this.validate(this.element.dom.value); +}; + +YAHOO.ext.grid.NumberEditor.prototype.getValue = function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + var value = this.element.dom.value; + if(value.length < 1){ + return value; + } else{ + return this.fixPrecision(this.parseValue(value)); + } + } +}; +YAHOO.ext.grid.NumberEditor.prototype.parseValue = function(value){ + return parseFloat(new String(value).replace(this.decimalSeparator, '.')); +}; + +YAHOO.ext.grid.NumberEditor.prototype.fixPrecision = function(value){ + if(!this.allowDecimals || this.decimalPrecision == -1 || isNaN(value) || value == 0 || !value){ + return value; + } + + + + + + + var scale = Math.pow(10, this.decimalPrecision+1); + var fixed = this.decimalPrecisionFcn(value * scale); + fixed = this.decimalPrecisionFcn(fixed/10); + return fixed / (scale/10); +}; + +YAHOO.ext.grid.NumberEditor.prototype.allowBlank = true; +YAHOO.ext.grid.NumberEditor.prototype.allowDecimals = true; +YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator = '.'; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision = 2; +YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn = Math.floor; +YAHOO.ext.grid.NumberEditor.prototype.allowNegative = true; +YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus = true; +YAHOO.ext.grid.NumberEditor.prototype.minValue = Number.NEGATIVE_INFINITY; +YAHOO.ext.grid.NumberEditor.prototype.maxValue = Number.MAX_VALUE; +YAHOO.ext.grid.NumberEditor.prototype.minText = 'The minimum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.maxText = 'The maximum value for this field is %0'; +YAHOO.ext.grid.NumberEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.NumberEditor.prototype.nanText = '%0 is not a valid number'; +YAHOO.ext.grid.NumberEditor.prototype.validationDelay = 100; +YAHOO.ext.grid.NumberEditor.prototype.validator = function(){return true;}; +YAHOO.ext.DatePicker = function(id, parentElement){ + this.id = id; + this.selectedDate = new Date(); + this.visibleDate = new Date(); + this.element = null; + this.shadow = null; + this.callback = null; + this.buildControl(parentElement || document.body); + this.mouseDownHandler = YAHOO.ext.EventManager.wrap(this.handleMouseDown, this, true); + this.keyDownHandler = YAHOO.ext.EventManager.wrap(this.handleKeyDown, this, true); + this.wheelHandler = YAHOO.ext.EventManager.wrap(this.handleMouseWheel, this, true); +}; + +YAHOO.ext.DatePicker.prototype = { + show : function(x, y, value, callback){ + this.hide(); + this.selectedDate = value; + this.visibleDate = value; + this.callback = callback; + this.refresh(); + this.element.show(); + this.element.setXY(this.constrainToViewport ? this.constrainXY(x, y) : [x, y]); + this.shadow.show(); + this.shadow.setRegion(this.element.getRegion()); + this.element.dom.tabIndex = 1; + this.element.focus(); + YAHOO.util.Event.on(document, "mousedown", this.mouseDownHandler); + YAHOO.util.Event.on(document, "keydown", this.keyDownHandler); + YAHOO.util.Event.on(document, "mousewheel", this.wheelHandler); + YAHOO.util.Event.on(document, "DOMMouseScroll", this.wheelHandler); + }, + + constrainXY : function(x, y){ + var w = YAHOO.util.Dom.getViewportWidth(); + var h = YAHOO.util.Dom.getViewportHeight(); + var size = this.element.getSize(); + return [ + Math.min(w-size.width, x), + Math.min(h-size.height, y) + ]; + }, + + hide : function(){ + this.shadow.hide(); + this.element.hide(); + YAHOO.util.Event.removeListener(document, "mousedown", this.mouseDownHandler); + YAHOO.util.Event.removeListener(document, "keydown", this.keyDownHandler); + YAHOO.util.Event.removeListener(document, "mousewheel", this.wheelHandler); + YAHOO.util.Event.removeListener(document, "DOMMouseScroll", this.wheelHandler); + }, + + setSelectedDate : function(date){ + this.selectedDate = date; + }, + + getSelectedDate : function(){ + return this.selectedDate; + }, + + showPrevMonth : function(){ + this.visibleDate = this.getPrevMonth(this.visibleDate); + this.refresh(); + }, + + showNextMonth : function(){ + this.visibleDate = this.getNextMonth(this.visibleDate); + this.refresh(); + }, + + showPrevYear : function(){ + var d = this.visibleDate; + this.visibleDate = new Date(d.getFullYear()-1, d.getMonth(), d.getDate()); + this.refresh(); + }, + + showNextYear : function(){ + var d = this.visibleDate; + this.visibleDate = new Date(d.getFullYear()+1, d.getMonth(), d.getDate()); + this.refresh(); + }, + + handleMouseDown : function(e){ + var target = e.getTarget(); + if(target != this.element.dom && !YAHOO.util.Dom.isAncestor(this.element.dom, target)){ + this.hide(); + } + }, + + handleKeyDown : function(e){ + switch(e.browserEvent.keyCode){ + case e.LEFT: + this.showPrevMonth(); + e.stopEvent(); + break; + case e.RIGHT: + this.showNextMonth(); + e.stopEvent(); + break; + case e.DOWN: + this.showPrevYear(); + e.stopEvent(); + break; + case e.UP: + this.showNextYear(); + e.stopEvent(); + break; + } + }, + + handleMouseWheel : function(e){ + var delta = e.getWheelDelta(); + if(delta > 0){ + this.showPrevMonth(); + e.stopEvent(); + } else if(delta < 0){ + this.showNextMonth(); + e.stopEvent(); + } + }, + + handleClick : function(e){ + var d = this.visibleDate; + var t = e.getTarget(); + if(t && t.className){ + switch(t.className){ + case 'active': + this.handleSelection(new Date(d.getFullYear(), d.getMonth(), parseInt(t.innerHTML))); + break; + case 'prevday': + var p = this.getPrevMonth(d); + this.handleSelection(new Date(p.getFullYear(), p.getMonth(), parseInt(t.innerHTML))); + break; + case 'nextday': + var n = this.getNextMonth(d); + this.handleSelection(new Date(n.getFullYear(), n.getMonth(), parseInt(t.innerHTML))); + break; + case 'ypopcal-today': + this.handleSelection(new Date()); + break; + case 'next-month': + this.showNextMonth(); + break; + case 'prev-month': + this.showPrevMonth(); + break; + } + } + e.stopEvent(); + }, + + selectToday : function(){ + this.handleSelection(new Date()); + }, + + handleSelection: function(date){ + this.selectedDate = date; + this.callback(date); + this.hide(); + }, + + getPrevMonth : function(d){ + var m = d.getMonth();var y = d.getFullYear(); + return (m == 0 ? new Date(--y, 11, 1) : new Date(y, --m, 1)); + }, + + getNextMonth : function(d){ + var m = d.getMonth();var y = d.getFullYear(); + return (m == 11 ? new Date(++y, 0, 1) : new Date(y, ++m, 1)); + }, + + getDaysInMonth : function(m, y){ + return (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) ? 31 : (m == 4 || m == 6 || m == 9 || m == 11) ? 30 : this.isLeapYear(y) ? 29 : 28; + }, + + isLeapYear : function(y){ + return (((y % 4) == 0) && ((y % 100) != 0) || ((y % 400) == 0)); + }, + + clearTime : function(date){ + if(date){ + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + } + return date; + }, + + refresh : function(){ + var d = this.visibleDate; + this.buildInnerCal(d); + this.calHead.update(this.monthNames[d.getMonth()] + ' ' + d.getFullYear()); + if(this.element.isVisible()){ + this.shadow.setRegion(this.element.getRegion()); + } + } +}; + + +YAHOO.ext.DatePicker.prototype.buildControl = function(parentElement){ + var c = document.createElement('div'); + c.style.position = 'absolute'; + c.style.visibility = 'hidden'; + document.body.appendChild(c); + var html = '' + + ''; + c.innerHTML = html; + this.shadow = getEl(c.childNodes[0], true); + this.shadow.enableDisplayMode(); + this.element = getEl(c.childNodes[1], true); + this.element.enableDisplayMode(); + document.body.appendChild(this.shadow.dom); + document.body.appendChild(this.element.dom); + document.body.removeChild(c); + this.element.on("selectstart", function(){return false;}); + var tbody = this.element.dom.getElementsByTagName('tbody')[1]; + this.cells = tbody.getElementsByTagName('td'); + this.calHead = this.element.getChildrenByClassName('ypopcal-month', 'td')[0]; + this.element.mon('mousedown', this.handleClick, this, true); +}; + +YAHOO.ext.DatePicker.prototype.buildInnerCal = function(dateVal){ + var days = this.getDaysInMonth(dateVal.getMonth() + 1, dateVal.getFullYear()); + var firstOfMonth = new Date(dateVal.getFullYear(), dateVal.getMonth(), 1); + var startingPos = firstOfMonth.getDay(); + if(startingPos == 0) startingPos = 7; + var pm = this.getPrevMonth(dateVal); + var prevStart = this.getDaysInMonth(pm.getMonth()+1, pm.getFullYear())-startingPos; + var cells = this.cells; + days += startingPos; + + + var day = 86400000; + var date = this.clearTime(new Date(pm.getFullYear(), pm.getMonth(), prevStart)); + var today = this.clearTime(new Date()).getTime(); + var sel = this.selectedDate ? this.clearTime(this.selectedDate).getTime() : today + 1; + var min = this.minDate ? this.clearTime(this.minDate).getTime() : Number.NEGATIVE_INFINITY; + var max = this.maxDate ? this.clearTime(this.maxDate).getTime() : Number.POSITIVE_INFINITY; + var ddMatch = this.disabledDatesRE; + var ddText = this.disabledDatesText; + var ddays = this.disabledDays; + var ddaysText = this.disabledDaysText; + var format = this.format; + + var setCellClass = function(cal, cell, d){ + cell.title = ''; + var t = d.getTime(); + if(t == today){ + cell.className += ' today'; + cell.title = cal.todayText; + } + if(t == sel){ + cell.className += ' selected'; + } + + if(t < min) { + cell.className = ' ypopcal-disabled'; + cell.title = cal.minText; + return; + } + if(t > max) { + cell.className = ' ypopcal-disabled'; + cell.title = cal.maxText; + return; + } + if(ddays){ + var day = d.getDay(); + for(var i = 0; i < ddays.length; i++) { + if(day === ddays[i]){ + cell.title = ddaysText; + cell.className = ' ypopcal-disabled'; + return; + } + } + } + if(ddMatch && format){ + var fvalue = d.format(format); + if(ddMatch.test(fvalue)){ + cell.title = ddText.replace('%0', fvalue); + cell.className = ' ypopcal-disabled'; + return; + } + } + }; + + var i = 0; + for(; i < startingPos; i++) { + cells[i].innerHTML = (++prevStart); + date.setDate(date.getDate()+1); + cells[i].className = 'prevday'; + setCellClass(this, cells[i], date); + } + for(; i < days; i++){ + intDay = i - startingPos + 1; + cells[i].innerHTML = (intDay); + date.setDate(date.getDate()+1); + cells[i].className = 'active'; + setCellClass(this, cells[i], date); + } + var extraDays = 0; + for(; i < 42; i++) { + cells[i].innerHTML = (++extraDays); + date.setDate(date.getDate()+1); + cells[i].className = 'nextday'; + setCellClass(this, cells[i], date); + } +}; + +YAHOO.ext.DatePicker.prototype.todayText = "Today"; +YAHOO.ext.DatePicker.prototype.minDate = null; +YAHOO.ext.DatePicker.prototype.maxDate = null; +YAHOO.ext.DatePicker.prototype.minText = "This date is before the minimum date"; +YAHOO.ext.DatePicker.prototype.maxText = "This date is after the maximum date"; +YAHOO.ext.DatePicker.prototype.format = 'm/d/y'; +YAHOO.ext.DatePicker.prototype.disabledDays = null; +YAHOO.ext.DatePicker.prototype.disabledDaysText = ''; +YAHOO.ext.DatePicker.prototype.disabledDatesRE = null; +YAHOO.ext.DatePicker.prototype.disabledDatesText = ''; +YAHOO.ext.DatePicker.prototype.constrainToViewport = true; + + +YAHOO.ext.DatePicker.prototype.monthNames = Date.monthNames; + +YAHOO.ext.DatePicker.prototype.dayNames = Date.dayNames; + +YAHOO.ext.grid.SelectEditor = function(element){ + element.hideFocus = true; + YAHOO.ext.grid.SelectEditor.superclass.constructor.call(this, element); + this.element.swallowEvent('click'); +}; +YAHOO.extendX(YAHOO.ext.grid.SelectEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.SelectEditor.prototype.fitToCell = function(box){ + if(YAHOO.ext.util.Browser.isGecko){ + box.height -= 3; + } + this.element.setBox(box, true); +}; + +YAHOO.ext.grid.TextEditor = function(config){ + var element = document.createElement('input'); + element.type = 'text'; + element.className = 'ygrid-editor ygrid-text-editor'; + element.setAttribute('autocomplete', 'off'); + document.body.appendChild(element); + YAHOO.ext.grid.TextEditor.superclass.constructor.call(this, element); + YAHOO.ext.util.Config.apply(this, config); +}; +YAHOO.extendX(YAHOO.ext.grid.TextEditor, YAHOO.ext.grid.CellEditor); + +YAHOO.ext.grid.TextEditor.prototype.validate = function(){ + var dom = this.element.dom; + var value = dom.value; + if(value.length < 1){ + if(this.allowBlank){ + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; + }else{ + dom.title = this.blankText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + } + if(value.length < this.minLength){ + dom.title = this.minText.replace('%0', this.minLength); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(value.length > this.maxLength){ + dom.title = this.maxText.replace('%0', this.maxLength); + this.element.addClass('ygrid-editor-invalid'); + return false; + } + var msg = this.validator(value); + if(msg !== true){ + dom.title = msg; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + if(this.regex && !this.regex.test(value)){ + dom.title = this.regexText; + this.element.addClass('ygrid-editor-invalid'); + return false; + } + dom.title = ''; + this.element.removeClass('ygrid-editor-invalid'); + return true; +}; + +YAHOO.ext.grid.TextEditor.prototype.initEvents = function(){ + YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this); + var vtask = new YAHOO.ext.util.DelayedTask(this.validate, this); + this.element.mon('keyup', vtask.delay.createDelegate(vtask, [this.validationDelay])); +}; + +YAHOO.ext.grid.TextEditor.prototype.show = function(){ + this.element.dom.title = ''; + YAHOO.ext.grid.TextEditor.superclass.show.call(this); + this.element.focus(); + if(this.selectOnFocus){ + try{ + this.element.dom.select(); + }catch(e){} + } + this.validate(this.element.dom.value); +}; + +YAHOO.ext.grid.TextEditor.prototype.getValue = function(){ + if(!this.validate()){ + return this.originalValue; + }else{ + return this.element.dom.value; + } +}; + +YAHOO.ext.grid.TextEditor.prototype.allowBlank = true; +YAHOO.ext.grid.TextEditor.prototype.minLength = 0; +YAHOO.ext.grid.TextEditor.prototype.maxLength = Number.MAX_VALUE; +YAHOO.ext.grid.TextEditor.prototype.minText = 'The minimum length for this field is %0'; +YAHOO.ext.grid.TextEditor.prototype.maxText = 'The maximum length for this field is %0'; +YAHOO.ext.grid.TextEditor.prototype.selectOnFocus = true; +YAHOO.ext.grid.TextEditor.prototype.blankText = 'This field cannot be blank'; +YAHOO.ext.grid.TextEditor.prototype.validator = function(){return true;}; +YAHOO.ext.grid.TextEditor.prototype.validationDelay = 200; +YAHOO.ext.grid.TextEditor.prototype.regex = null; +YAHOO.ext.grid.TextEditor.prototype.regexText = ''; + +YAHOO.ext.LayoutManager = function(container){ + YAHOO.ext.LayoutManager.superclass.constructor.call(this); + this.el = getEl(container, true); + this.id = this.el.id; + this.el.addClass('ylayout-container'); + + this.monitorWindowResize = true; + this.regions = {}; + this.events = { + + 'layout' : new YAHOO.util.CustomEvent(), + + 'regionresized' : new YAHOO.util.CustomEvent(), + + 'regioncollapsed' : new YAHOO.util.CustomEvent(), + + 'regionexpanded' : new YAHOO.util.CustomEvent() + }; + this.updating = false; + YAHOO.ext.EventManager.onWindowResize(this.onWindowResize, this, true); +}; + +YAHOO.extendX(YAHOO.ext.LayoutManager, YAHOO.ext.util.Observable, { + + isUpdating : function(){ + return this.updating; + }, + + + beginUpdate : function(){ + this.updating = true; + }, + + + endUpdate : function(noLayout){ + this.updating = false; + if(!noLayout){ + this.layout(); + } + }, + + layout: function(){ + + }, + + onRegionResized : function(region, newSize){ + this.fireEvent('regionresized', region, newSize); + this.layout(); + }, + + onRegionCollapsed : function(region){ + this.fireEvent('regioncollapsed', region); + }, + + onRegionExpanded : function(region){ + this.fireEvent('regionexpanded', region); + }, + + + getViewSize : function(){ + var size; + if(this.el.dom != document.body){ + this.el.beginMeasure(); + size = this.el.getSize(); + this.el.endMeasure(); + }else{ + size = {width: YAHOO.util.Dom.getViewportWidth(), height: YAHOO.util.Dom.getViewportHeight()}; + } + size.width -= this.el.getBorderWidth('lr')-this.el.getPadding('lr'); + size.height -= this.el.getBorderWidth('tb')-this.el.getPadding('tb'); + return size; + }, + + + getEl : function(){ + return this.el; + }, + + + getRegion : function(target){ + return this.regions[target]; + }, + + onWindowResize : function(){ + if(this.monitorWindowResize){ + this.layout(); + } + } +}); + +YAHOO.ext.LayoutRegion = function(mgr, config, pos){ + this.mgr = mgr; + this.position = pos; + var dh = YAHOO.ext.DomHelper; + + this.el = dh.append(mgr.el.dom, {tag: 'div', cls: 'ylayout-panel ylayout-panel-' + this.position}, true); + + this.titleEl = dh.append(this.el.dom, {tag: 'div', unselectable: 'on', cls: 'yunselectable ylayout-panel-hd ylayout-title-'+this.position, children:[ + {tag: 'span', cls: 'yunselectable ylayout-panel-hd-text', unselectable: 'on', html: ' '}, + {tag: 'div', cls: 'yunselectable ylayout-panel-hd-tools', unselectable: 'on'} + ]}, true); + this.titleEl.enableDisplayMode(); + + this.titleTextEl = this.titleEl.dom.firstChild; + this.tools = getEl(this.titleEl.dom.childNodes[1], true); + this.closeBtn = this.createTool(this.tools.dom, 'ylayout-close'); + this.closeBtn.enableDisplayMode(); + this.closeBtn.on('click', this.closeClicked, this, true); + this.closeBtn.hide(); + + this.bodyEl = dh.append(this.el.dom, {tag: 'div', cls: 'ylayout-panel-body'}, true); + this.events = { + + 'invalidated' : new YAHOO.util.CustomEvent('invalidated'), + + 'visibilitychange' : new YAHOO.util.CustomEvent('visibilitychange'), + + 'paneladded' : new YAHOO.util.CustomEvent('paneladded'), + + 'panelremoved' : new YAHOO.util.CustomEvent('panelremoved'), + + 'collapsed' : new YAHOO.util.CustomEvent('collapsed'), + + 'expanded' : new YAHOO.util.CustomEvent('expanded'), + + 'panelactivated' : new YAHOO.util.CustomEvent('panelactivated'), + + 'resized' : new YAHOO.util.CustomEvent('resized') + }; + + this.panels = new YAHOO.ext.util.MixedCollection(); + this.panels.getKey = this.getPanelId.createDelegate(this); + this.box = null; + this.visible = false; + this.collapsed = false; + this.hide(); + this.on('paneladded', this.validateVisibility, this, true); + this.on('panelremoved', this.validateVisibility, this, true); + this.activePanel = null; + + this.applyConfig(config); + + +}; + +YAHOO.extendX(YAHOO.ext.LayoutRegion, YAHOO.ext.util.Observable, { + getPanelId : function(p){ + return p.getId(); + }, + + applyConfig : function(config){ + if(config.collapsible && this.position != 'center' && !this.collapsedEl){ + var dh = YAHOO.ext.DomHelper; + this.collapseBtn = this.createTool(this.tools.dom, 'ylayout-collapse-'+this.position); + this.collapseBtn.mon('click', this.collapse, this, true); + + this.collapsedEl = dh.append(this.mgr.el.dom, {tag: 'div', cls: 'ylayout-collapsed ylayout-collapsed-'+this.position, children:[ + {tag: 'div', cls: 'ylayout-collapsed-tools'} + ]}, true); + if(config.floatable !== false){ + this.collapsedEl.addClassOnOver('ylayout-collapsed-over'); + this.collapsedEl.mon('click', this.collapseClick, this, true); + } + this.expandBtn = this.createTool(this.collapsedEl.dom.firstChild, 'ylayout-expand-'+this.position); + this.expandBtn.mon('click', this.expand, this, true); + } + if(this.collapseBtn){ + this.collapseBtn.setVisible(config.collapsible == true); + } + this.cmargins = config.cmargins || this.cmargins || + (this.position == 'west' || this.position == 'east' ? + {top: 0, left: 2, right:2, bottom: 0} : + {top: 2, left: 0, right:0, bottom: 2}); + this.margins = config.margins || this.margins || {top: 0, left: 0, right:0, bottom: 0}; + this.bottomTabs = config.tabPosition != 'top'; + this.autoScroll = config.autoScroll || false; + if(this.autoScroll){ + this.bodyEl.setStyle('overflow', 'auto'); + }else{ + this.bodyEl.setStyle('overflow', 'hidden'); + } + if((!config.titlebar && !config.title) || config.titlebar === false){ + this.titleEl.hide(); + }else{ + this.titleEl.show(); + if(config.title){ + this.titleTextEl.innerHTML = config.title; + } + } + this.duration = config.duration || .30; + this.slideDuration = config.slideDuration || .45; + this.config = config; + if(config.collapsed){ + this.collapse(true); + } + }, + + + resizeTo : function(newSize){ + switch(this.position){ + case 'east': + case 'west': + this.el.setWidth(newSize); + this.fireEvent('resized', this, newSize); + break; + case 'north': + case 'south': + this.el.setHeight(newSize); + this.fireEvent('resized', this, newSize); + break; + } + }, + + getBox : function(){ + var b; + if(!this.collapsed){ + b = this.el.getBox(false, true); + }else{ + b = this.collapsedEl.getBox(false, true); + } + return b; + }, + + getMargins : function(){ + return this.collapsed ? this.cmargins : this.margins; + }, + + highlight : function(){ + this.el.addClass('ylayout-panel-dragover'); + }, + + unhighlight : function(){ + this.el.removeClass('ylayout-panel-dragover'); + }, + + updateBox : function(box){ + this.box = box; + if(!this.collapsed){ + this.el.dom.style.left = box.x + 'px'; + this.el.dom.style.top = box.y + 'px'; + this.el.setSize(box.width, box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setHeight(bodyHeight); + this.bodyEl.setWidth(bodyWidth); + var tabHeight = bodyHeight; + if(this.tabs){ + tabHeight = this.tabs.syncHeight(bodyHeight); + if(YAHOO.ext.util.Browser.isIE) this.tabs.el.repaint(); + } + this.panelSize = {width: bodyWidth, height: tabHeight}; + if(this.activePanel){ + this.activePanel.setSize(bodyWidth, tabHeight); + } + }else{ + this.collapsedEl.dom.style.left = box.x + 'px'; + this.collapsedEl.dom.style.top = box.y + 'px'; + this.collapsedEl.setSize(box.width, box.height); + } + if(this.tabs){ + this.tabs.autoSizeTabs(); + } + }, + + + getEl : function(){ + return this.el; + }, + + + hide : function(){ + if(!this.collapsed){ + this.el.dom.style.left = '-2000px'; + this.el.hide(); + }else{ + this.collapsedEl.dom.style.left = '-2000px'; + this.collapsedEl.hide(); + } + this.visible = false; + this.fireEvent('visibilitychange', this, false); + }, + + + show : function(){ + if(!this.collapsed){ + this.el.show(); + }else{ + this.collapsedEl.show(); + } + this.visible = true; + this.fireEvent('visibilitychange', this, true); + }, + + + isVisible : function(){ + return this.visible; + }, + + closeClicked : function(){ + if(this.activePanel){ + this.remove(this.activePanel); + } + }, + + collapseClick : function(e){ + if(this.isSlid){ + e.stopPropagation(); + this.slideIn(); + }else{ + e.stopPropagation(); + this.slideOut(); + } + }, + + + collapse : function(skipAnim){ + if(this.collapsed) return; + this.collapsed = true; + if(this.split){ + this.split.el.hide(); + } + if(this.config.animate && skipAnim !== true){ + this.animateCollapse(); + }else{ + this.el.setLocation(-20000,-20000); + this.el.hide(); + this.collapsedEl.show(); + this.fireEvent('collapsed', this); + } + this.fireEvent('invalidated', this); + }, + + animateCollapse : function(){ + + }, + + + expand : function(e, skipAnim){ + if(e) e.stopPropagation(); + if(!this.collapsed) return; + if(this.isSlid){ + this.slideIn(this.expand.createDelegate(this)); + return; + } + this.collapsed = false; + this.el.show(); + if(this.config.animate && skipAnim !== true){ + this.animateExpand(); + }else{ + if(this.split){ + this.split.el.show(); + } + this.collapsedEl.setLocation(-2000,-2000); + this.collapsedEl.hide(); + this.fireEvent('invalidated', this); + this.fireEvent('expanded', this); + } + }, + + animateExpand : function(){ + + }, + + initTabs : function(){ + this.bodyEl.setStyle('overflow', 'hidden'); + var ts = new YAHOO.ext.TabPanel(this.bodyEl.dom, this.bottomTabs); + this.tabs = ts; + ts.resizeTabs = this.config.resizeTabs === true; + ts.minTabWidth = this.config.minTabWidth || 40; + ts.maxTabWidth = this.config.maxTabWidth || 250; + ts.preferredTabWidth = this.config.preferredTabWidth || 150; + ts.monitorResize = false; + ts.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden'); + this.panels.each(this.initPanelAsTab, this); + }, + + initPanelAsTab : function(panel){ + var ti = this.tabs.addTab(panel.getEl().id, panel.getTitle(), null, + this.config.closeOnTab && panel.isClosable()); + ti.on('activate', function(){ + this.setActivePanel(panel); + }, this, true); + if(this.config.closeOnTab){ + ti.on('beforeclose', function(t, e){ + e.cancel = true; + this.remove(panel); + }, this, true); + } + return ti; + }, + + updatePanelTitle : function(panel, title){ + if(this.activePanel == panel){ + this.updateTitle(title); + } + if(this.tabs){ + this.tabs.getTab(panel.getEl().id).setText(title); + } + }, + + updateTitle : function(title){ + if(this.titleTextEl && !this.config.title){ + this.titleTextEl.innerHTML = (typeof title != 'undefined' && title.length > 0 ? title : " "); + } + }, + + setActivePanel : function(panel){ + panel = this.getPanel(panel); + if(this.activePanel && this.activePanel != panel){ + this.activePanel.setActiveState(false); + } + this.activePanel = panel; + panel.setActiveState(true); + if(this.panelSize){ + panel.setSize(this.panelSize.width, this.panelSize.height); + } + this.closeBtn.setVisible(!this.config.closeOnTab && !this.isSlid && panel.isClosable()); + this.updateTitle(panel.getTitle()); + this.fireEvent('panelactivated', this, panel); + + }, + + + showPanel : function(panel){ + if(panel = this.getPanel(panel)){ + if(this.tabs){ + this.tabs.activate(panel.getEl().id); + }else{ + this.setActivePanel(panel); + } + } + return panel; + }, + + + getActivePanel : function(){ + return this.activePanel; + }, + + validateVisibility : function(){ + if(this.panels.getCount() < 1){ + this.updateTitle(' '); + this.closeBtn.hide(); + this.hide(); + }else{ + if(!this.isVisible()){ + this.show(); + } + } + }, + + + add : function(panel){ + if(arguments.length > 1){ + for(var i = 0, len = arguments.length; i < len; i++) { + this.add(arguments[i]); + } + return null; + } + panel.setRegion(this); + this.panels.add(panel); + if(this.panels.getCount() == 1 && !this.config.alwaysShowTabs){ + this.bodyEl.dom.appendChild(panel.getEl().dom); + this.setActivePanel(panel); + this.fireEvent('paneladded', this, panel); + return panel; + } + if(!this.tabs){ + this.initTabs(); + }else{ + this.initPanelAsTab(panel); + } + this.tabs.activate(panel.getEl().id); + this.fireEvent('paneladded', this, panel); + return panel; + }, + + + hasPanel : function(panel){ + if(typeof panel == 'object'){ + panel = panel.getId(); + } + return this.getPanel(panel) ? true : false; + }, + + + hidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.hideTab(panel.getEl().id); + } + }, + + + unhidePanel : function(panel){ + if(this.tabs && (panel = this.getPanel(panel))){ + this.tabs.unhideTab(panel.getEl().id); + } + }, + + + + + + + + remove : function(panel, preservePanel){ + panel = this.getPanel(panel); + if(!panel){ + return null; + } + preservePanel = (typeof preservePanel != 'undefined' ? preservePanel : this.config.preservePanels === true); + var panelId = panel.getId(); + this.panels.removeKey(panelId); + if(preservePanel){ + document.body.appendChild(panel.getEl().dom); + } + if(this.tabs){ + this.tabs.removeTab(panel.getEl().id); + }else if (!preservePanel){ + this.bodyEl.dom.removeChild(panel.getEl().dom); + } + if(this.panels.getCount() == 1 && this.tabs && !this.config.alwaysShowTabs){ + var p = this.panels.first(); + var tempEl = document.createElement('span'); + tempEl.appendChild(p.getEl().dom); + this.bodyEl.update(''); + this.bodyEl.dom.appendChild(p.getEl().dom); + tempEl = null; + this.updateTitle(p.getTitle()); + this.tabs = null; + this.bodyEl.setStyle('overflow', this.config.autoScroll ? 'auto' : 'hidden'); + this.setActivePanel(p); + } + panel.setRegion(null); + if(this.activePanel == panel){ + this.activePanel = null; + } + if(this.config.autoDestroy !== false && preservePanel !== true){ + try{panel.destroy();}catch(e){} + } + this.fireEvent('panelremoved', this, panel); + return panel; + }, + + + getTabs : function(){ + return this.tabs; + }, + + + getPanel : function(id){ + if(typeof id == 'object'){ + return id; + } + return this.panels.get(id); + }, + + + getPosition: function(){ + return this.position; + }, + + createTool : function(parentEl, className){ + var btn = YAHOO.ext.DomHelper.append(parentEl, {tag: 'div', cls: 'ylayout-tools-button', + children: [{tag: 'div', cls: 'ylayout-tools-button-inner ' + className, html: ' '}]}, true); + btn.on('mouseover', btn.addClass.createDelegate(btn, ['ylayout-tools-button-over'])); + btn.on('mouseout', btn.removeClass.createDelegate(btn, ['ylayout-tools-button-over'])); + return btn; + } +}); + +YAHOO.ext.SplitLayoutRegion = function(mgr, config, pos, cursor){ + this.cursor = cursor; + YAHOO.ext.SplitLayoutRegion.superclass.constructor.call(this, mgr, config, pos); + if(config.split){ + this.hide(); + } +}; + +YAHOO.extendX(YAHOO.ext.SplitLayoutRegion, YAHOO.ext.LayoutRegion, { + applyConfig : function(config){ + YAHOO.ext.SplitLayoutRegion.superclass.applyConfig.call(this, config); + if(config.split){ + if(!this.split){ + var splitEl = YAHOO.ext.DomHelper.append(this.mgr.el.dom, + {tag: 'div', id: this.el.id + '-split', cls: 'ylayout-split ylayout-split-'+this.position, html: ' '}); + + this.split = new YAHOO.ext.SplitBar(splitEl, this.el); + this.split.onMoved.subscribe(this.onSplitMove, this, true); + this.split.useShim = config.useShim === true; + YAHOO.util.Dom.setStyle([this.split.el.dom, this.split.proxy], 'cursor', this.cursor); + this.split.getMaximumSize = this.getMaxSize.createDelegate(this); + } + if(typeof config.minSize != 'undefined'){ + this.split.minSize = config.minSize; + } + if(typeof config.maxSize != 'undefined'){ + this.split.maxSize = config.maxSize; + } + } + }, + + getMaxSize : function(){ + var cmax = this.config.maxSize || 10000; + var center = this.mgr.getRegion('center'); + return Math.min(cmax, (this.el.getWidth()+center.getEl().getWidth())-center.getMinWidth()); + }, + + onSplitMove : function(split, newSize){ + this.fireEvent('resized', this, newSize); + }, + + + getSplitBar : function(){ + return this.split; + }, + + hide : function(){ + if(this.split){ + this.split.el.setLocation(-2000,-2000); + this.split.el.hide(); + } + YAHOO.ext.SplitLayoutRegion.superclass.hide.call(this); + }, + + show : function(){ + if(this.split){ + this.split.el.show(); + } + YAHOO.ext.SplitLayoutRegion.superclass.show.call(this); + }, + + beforeSlide: function(){ + if(YAHOO.ext.util.Browser.isGecko){ + this.bodyEl.clip(); + if(this.tabs) this.tabs.bodyEl.clip(); + if(this.activePanel){ + this.activePanel.getEl().clip(); + + if(this.activePanel.beforeSlide){ + this.activePanel.beforeSlide(); + } + } + } + }, + + afterSlide : function(){ + if(YAHOO.ext.util.Browser.isGecko){ + this.bodyEl.unclip(); + if(this.tabs) this.tabs.bodyEl.unclip(); + if(this.activePanel){ + this.activePanel.getEl().unclip(); + if(this.activePanel.afterSlide){ + this.activePanel.afterSlide(); + } + } + } + }, + + slideOut : function(){ + if(!this.slideEl){ + this.slideEl = new YAHOO.ext.Actor( + YAHOO.ext.DomHelper.append(this.mgr.el.dom, {tag: 'div', cls:'ylayout-slider'})); + if(this.config.autoHide !== false){ + var slideInTask = new YAHOO.ext.util.DelayedTask(this.slideIn, this); + this.slideEl.mon('mouseout', function(e){ + var to = e.getRelatedTarget(); + if(to && to != this.slideEl.dom && !YAHOO.util.Dom.isAncestor(this.slideEl.dom, to)){ + slideInTask.delay(500); + } + }, this, true); + this.slideEl.mon('mouseover', function(e){ + slideInTask.cancel(); + }, this, true); + } + } + var sl = this.slideEl, c = this.collapsedEl, cm = this.cmargins; + this.isSlid = true; + this.snapshot = { + 'left': this.el.getLeft(true), + 'top': this.el.getTop(true), + 'colbtn': this.collapseBtn.isVisible(), + 'closebtn': this.closeBtn.isVisible() + }; + this.collapseBtn.hide(); + this.closeBtn.hide(); + this.el.show(); + this.el.setLeftTop(0,0); + sl.startCapture(true); + var size; + switch(this.position){ + case 'west': + sl.setLeft(c.getRight(true)); + sl.setTop(c.getTop(true)); + size = this.el.getWidth(); + break; + case 'east': + sl.setRight(this.mgr.getViewSize().width-c.getLeft(true)); + sl.setTop(c.getTop(true)); + size = this.el.getWidth(); + break; + case 'north': + sl.setLeft(c.getLeft(true)); + sl.setTop(c.getBottom(true)); + size = this.el.getHeight(); + break; + case 'south': + sl.setLeft(c.getLeft(true)); + sl.setBottom(this.mgr.getViewSize().height-c.getTop(true)); + size = this.el.getHeight(); + break; + } + sl.dom.appendChild(this.el.dom); + YAHOO.util.Event.on(document.body, 'click', this.slideInIf, this, true); + sl.setSize(this.el.getWidth(), this.el.getHeight()); + this.beforeSlide(); + if(this.activePanel){ + this.activePanel.setSize(this.bodyEl.getWidth(), this.bodyEl.getHeight()); + } + sl.slideShow(this.getAnchor(), size, this.slideDuration, null, false); + sl.play(function(){ + this.afterSlide(); + }.createDelegate(this)); + }, + + slideInIf : function(e){ + var t = YAHOO.util.Event.getTarget(e); + if(!YAHOO.util.Dom.isAncestor(this.el.dom, t)){ + this.slideIn(); + } + }, + + slideIn : function(callback){ + if(this.isSlid && !this.slideEl.playlist.isPlaying()){ + YAHOO.util.Event.removeListener(document.body, 'click', this.slideInIf, this, true); + this.slideEl.startCapture(true); + this.slideEl.slideHide(this.getAnchor(), this.slideDuration, null); + this.beforeSlide(); + this.slideEl.play(function(){ + this.isSlid = false; + this.el.setPositioning(this.snapshot); + this.collapseBtn.setVisible(this.snapshot.colbtn); + this.closeBtn.setVisible(this.snapshot.closebtn); + this.afterSlide(); + this.mgr.el.dom.appendChild(this.el.dom); + if(typeof callback == 'function'){ + callback(); + } + }.createDelegate(this)); + } + }, + + animateExpand : function(){ + var em = this.margins, cm = this.cmargins; + var c = this.collapsedEl, el = this.el; + var direction, distance; + switch(this.position){ + case 'west': + direction = 'right'; + el.setLeft(-(el.getWidth() + (em.right+em.left))); + el.setTop(c.getTop(true)-cm.top+em.top); + distance = el.getWidth() + (em.right+em.left); + break; + case 'east': + direction = 'left'; + el.setLeft(this.mgr.getViewSize().width + em.left); + el.setTop(c.getTop(true)-cm.top+em.top); + distance = el.getWidth() + (em.right+em.left); + break; + case 'north': + direction = 'down'; + el.setLeft(em.left); + el.setTop(-(el.getHeight() + (em.top+em.bottom))); + distance = el.getHeight() + (em.top+em.bottom); + break; + case 'south': + direction = 'up'; + el.setLeft(em.left); + el.setTop(this.mgr.getViewSize().height + em.top); + distance = el.getHeight() + (em.top+em.bottom); + break; + } + this.beforeSlide(); + el.setStyle('z-index', '100'); + el.show(); + c.setLocation(-2000,-2000); + c.hide(); + el.move(direction, distance, true, this.duration, function(){ + this.afterSlide(); + el.setStyle('z-index', ''); + if(this.split){ + this.split.el.show(); + } + this.fireEvent('invalidated', this); + this.fireEvent('expanded', this); + }.createDelegate(this), this.config.easing || YAHOO.util.Easing.easeOut); + }, + + animateCollapse : function(){ + var em = this.margins, cm = this.cmargins; + var c = this.collapsedEl, el = this.el; + var direction, distance; + switch(this.position){ + case 'west': + direction = 'left'; + distance = el.getWidth() + (em.right+em.left); + break; + case 'east': + direction = 'right'; + distance = el.getWidth() + (em.right+em.left); + break; + case 'north': + direction = 'up'; + distance = el.getHeight() + (em.top+em.bottom); + break; + case 'south': + direction = 'down'; + distance = el.getHeight() + (em.top+em.bottom); + break; + } + this.el.setStyle('z-index', '100'); + this.beforeSlide(); + this.el.move(direction, distance, true, this.duration, function(){ + this.afterSlide(); + this.el.setStyle('z-index', ''); + this.el.setLocation(-20000,-20000); + this.el.hide(); + this.collapsedEl.show(); + this.fireEvent('collapsed', this); + }.createDelegate(this), YAHOO.util.Easing.easeIn); + }, + + getAnchor : function(){ + switch(this.position){ + case 'west': + return 'left'; + case 'east': + return 'right'; + case 'north': + return 'top'; + case 'south': + return 'bottom'; + } + } +}); + +YAHOO.ext.BorderLayout = function(container, config){ + YAHOO.ext.BorderLayout.superclass.constructor.call(this, container); + this.factory = config.factory || YAHOO.ext.BorderLayout.RegionFactory; + + this.hideOnLayout = config.hideOnLayout || false; + for(var i = 0, len = this.factory.validRegions.length; i < len; i++) { + var target = this.factory.validRegions[i]; + if(config[target]){ + this.addRegion(target, config[target]); + } + } + +}; + +YAHOO.extendX(YAHOO.ext.BorderLayout, YAHOO.ext.LayoutManager, { + + addRegion : function(target, config){ + if(!this.regions[target]){ + var r = this.factory.create(target, this, config); + this.regions[target] = r; + r.on('visibilitychange', this.layout, this, true); + r.on('paneladded', this.layout, this, true); + r.on('panelremoved', this.layout, this, true); + r.on('invalidated', this.layout, this, true); + r.on('resized', this.onRegionResized, this, true); + r.on('collapsed', this.onRegionCollapsed, this, true); + r.on('expanded', this.onRegionExpanded, this, true); + } + return this.regions[target]; + }, + + + layout : function(){ + if(this.updating) return; + + + var size = this.getViewSize(); + var w = size.width, h = size.height; + var centerW = w, centerH = h, centerY = 0, centerX = 0; + var x = 0, y = 0; + + var rs = this.regions; + var n = rs['north'], s = rs['south'], west = rs['west'], e = rs['east'], c = rs['center']; + if(this.hideOnLayout){ + c.el.setStyle('display', 'none'); + } + if(n && n.isVisible()){ + var b = n.getBox(); + var m = n.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + b.y = m.top; + centerY = b.height + b.y + m.bottom; + centerH -= centerY; + n.updateBox(this.safeBox(b)); + } + if(s && s.isVisible()){ + var b = s.getBox(); + var m = s.getMargins(); + b.width = w - (m.left+m.right); + b.x = m.left; + var totalHeight = (b.height + m.top + m.bottom); + b.y = h - totalHeight + m.top; + centerH -= totalHeight; + s.updateBox(this.safeBox(b)); + } + if(west && west.isVisible()){ + var b = west.getBox(); + var m = west.getMargins(); + b.height = centerH - (m.top+m.bottom); + b.x = m.left; + b.y = centerY + m.top; + var totalWidth = (b.width + m.left + m.right); + centerX += totalWidth; + centerW -= totalWidth; + west.updateBox(this.safeBox(b)); + } + if(e && e.isVisible()){ + var b = e.getBox(); + var m = e.getMargins(); + b.height = centerH - (m.top+m.bottom); + var totalWidth = (b.width + m.left + m.right); + b.x = w - totalWidth + m.left; + b.y = centerY + m.top; + centerW -= totalWidth; + e.updateBox(this.safeBox(b)); + } + if(c){ + var m = c.getMargins(); + var centerBox = { + x: centerX + m.left, + y: centerY + m.top, + width: centerW - (m.left+m.right), + height: centerH - (m.top+m.bottom) + }; + if(this.hideOnLayout){ + c.el.setStyle('display', 'block'); + } + c.updateBox(this.safeBox(centerBox)); + } + this.el.repaint(); + this.fireEvent('layout', this); + + + }, + + safeBox : function(box){ + box.width = Math.max(0, box.width); + box.height = Math.max(0, box.height); + return box; + }, + + + add : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].add(panel); + }, + + + remove : function(target, panel){ + target = target.toLowerCase(); + return this.regions[target].remove(panel); + }, + + + findPanel : function(panelId){ + var rs = this.regions; + for(var target in rs){ + if(typeof rs[target] != 'function'){ + var p = rs[target].getPanel(panelId); + if(p){ + return p; + } + } + } + return null; + }, + + + showPanel : function(panelId) { + var rs = this.regions; + for(var target in rs){ + var r = rs[target]; + if(typeof r != 'function'){ + if(r.hasPanel(panelId)){ + return r.showPanel(panelId); + } + } + } + return null; + }, + + + restoreState : function(provider){ + if(!provider){ + provider = YAHOO.ext.state.Manager; + } + var sm = new YAHOO.ext.LayoutStateManager(); + sm.init(this, provider); + } +}); + +YAHOO.ext.BorderLayout.RegionFactory = {}; +YAHOO.ext.BorderLayout.RegionFactory.validRegions = ['north','south','east','west','center']; +YAHOO.ext.BorderLayout.RegionFactory.create = function(target, mgr, config){ + target = target.toLowerCase(); + switch(target){ + case 'north': + return new YAHOO.ext.NorthLayoutRegion(mgr, config); + case 'south': + return new YAHOO.ext.SouthLayoutRegion(mgr, config); + case 'east': + return new YAHOO.ext.EastLayoutRegion(mgr, config); + case 'west': + return new YAHOO.ext.WestLayoutRegion(mgr, config); + case 'center': + return new YAHOO.ext.CenterLayoutRegion(mgr, config); + } + throw 'Layout region "'+target+'" not supported.'; +}; + +YAHOO.ext.CenterLayoutRegion = function(mgr, config){ + YAHOO.ext.CenterLayoutRegion.superclass.constructor.call(this, mgr, config, 'center'); + this.visible = true; + this.minWidth = config.minWidth || 20; + this.minHeight = config.minHeight || 20; +}; + +YAHOO.extendX(YAHOO.ext.CenterLayoutRegion, YAHOO.ext.LayoutRegion, { + hide : function(){ + + }, + + show : function(){ + + }, + + getMinWidth: function(){ + return this.minWidth; + }, + + getMinHeight: function(){ + return this.minHeight; + } +}); + + +YAHOO.ext.NorthLayoutRegion = function(mgr, config){ + YAHOO.ext.NorthLayoutRegion.superclass.constructor.call(this, mgr, config, 'north', 'n-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.TOP; + this.split.orientation = YAHOO.ext.SplitBar.VERTICAL; + this.split.el.addClass('ylayout-split-v'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setHeight(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.NorthLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.height += this.split.el.getHeight(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + box.height -= this.split.el.getHeight(); + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y+box.height); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.el.setWidth(box.width); + var bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setWidth(bodyWidth); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(bodyWidth, this.panelSize.height); + } + } + YAHOO.ext.NorthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.SouthLayoutRegion = function(mgr, config){ + YAHOO.ext.SouthLayoutRegion.superclass.constructor.call(this, mgr, config, 'south', 's-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.BOTTOM; + this.split.orientation = YAHOO.ext.SplitBar.VERTICAL; + this.split.el.addClass('ylayout-split-v'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setHeight(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.SouthLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sh = this.split.el.getHeight(); + box.height += sh; + box.y -= sh; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sh = this.split.el.getHeight(); + box.height -= sh; + box.y += sh; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y-sh); + this.split.el.setWidth(box.width); + } + if(this.collapsed){ + this.el.setWidth(box.width); + var bodyWidth = box.width - this.el.getBorderWidth('rl'); + this.bodyEl.setWidth(bodyWidth); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(bodyWidth, this.panelSize.height); + } + } + YAHOO.ext.SouthLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.EastLayoutRegion = function(mgr, config){ + YAHOO.ext.EastLayoutRegion.superclass.constructor.call(this, mgr, config, 'east', 'e-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.RIGHT; + this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL; + this.split.el.addClass('ylayout-split-h'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setWidth(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.EastLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + var sw = this.split.el.getWidth(); + box.width += sw; + box.x -= sw; + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + box.x += sw; + } + if(this.collapsed){ + this.el.setHeight(box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + this.bodyEl.setHeight(bodyHeight); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(this.panelSize.width, bodyHeight); + } + } + YAHOO.ext.EastLayoutRegion.superclass.updateBox.call(this, box); + } +}); + +YAHOO.ext.WestLayoutRegion = function(mgr, config){ + YAHOO.ext.WestLayoutRegion.superclass.constructor.call(this, mgr, config, 'west', 'w-resize'); + if(this.split){ + this.split.placement = YAHOO.ext.SplitBar.LEFT; + this.split.orientation = YAHOO.ext.SplitBar.HORIZONTAL; + this.split.el.addClass('ylayout-split-h'); + } + if(typeof config.initialSize != 'undefined'){ + this.el.setWidth(config.initialSize); + } +}; +YAHOO.extendX(YAHOO.ext.WestLayoutRegion, YAHOO.ext.SplitLayoutRegion, { + getBox : function(){ + if(this.collapsed){ + return this.collapsedEl.getBox(); + } + var box = this.el.getBox(); + if(this.split){ + box.width += this.split.el.getWidth(); + } + return box; + }, + + updateBox : function(box){ + if(this.split && !this.collapsed){ + var sw = this.split.el.getWidth(); + box.width -= sw; + this.split.el.setLeft(box.x+box.width); + this.split.el.setTop(box.y); + this.split.el.setHeight(box.height); + } + if(this.collapsed){ + this.el.setHeight(box.height); + var bodyHeight = this.config.titlebar ? box.height - (this.titleEl.getHeight()||0) : box.height; + bodyHeight -= this.el.getBorderWidth('tb'); + this.bodyEl.setHeight(bodyHeight); + if(this.activePanel && this.panelSize){ + this.activePanel.setSize(this.panelSize.width, bodyHeight); + } + } + YAHOO.ext.WestLayoutRegion.superclass.updateBox.call(this, box); + } +}); + + +YAHOO.ext.ContentPanel = function(el, config, content){ + YAHOO.ext.ContentPanel.superclass.constructor.call(this); + this.el = getEl(el, true); + if(!this.el && config && config.autoCreate){ + if(typeof config.autoCreate == 'object'){ + if(!config.autoCreate.id){ + config.autoCreate.id = el; + } + this.el = YAHOO.ext.DomHelper.append(document.body, + config.autoCreate, true); + }else{ + this.el = YAHOO.ext.DomHelper.append(document.body, + {tag: 'div', cls: 'ylayout-inactive-content', id: el}, true); + } + } + this.closable = false; + this.loaded = false; + this.active = false; + if(typeof config == 'string'){ + this.title = config; + }else{ + YAHOO.ext.util.Config.apply(this, config); + } + if(this.resizeEl){ + this.resizeEl = getEl(this.resizeEl, true); + }else{ + this.resizeEl = this.el; + } + this.events = { + + 'activate' : new YAHOO.util.CustomEvent('activate'), + + 'deactivate' : new YAHOO.util.CustomEvent('deactivate') + }; + if(content){ + this.setContent(content); + } +}; + +YAHOO.extendX(YAHOO.ext.ContentPanel, YAHOO.ext.util.Observable, { + setRegion : function(region){ + this.region = region; + if(region){ + this.el.replaceClass('ylayout-inactive-content', 'ylayout-active-content'); + }else{ + this.el.replaceClass('ylayout-active-content', 'ylayout-inactive-content'); + } + }, + + + getToolbar : function(){ + return this.toolbar; + }, + + setActiveState : function(active){ + this.active = active; + if(!active){ + this.fireEvent('deactivate', this); + }else{ + this.fireEvent('activate', this); + } + }, + + + setContent : function(content, loadScripts){ + this.el.update(content, loadScripts); + }, + + + getUpdateManager : function(){ + return this.el.getUpdateManager(); + }, + + + setUrl : function(url, params, loadOnce){ + if(this.refreshDelegate){ + this.removeListener('activate', this.refreshDelegate); + } + this.refreshDelegate = this._handleRefresh.createDelegate(this, [url, params, loadOnce]); + this.on('activate', this._handleRefresh.createDelegate(this, [url, params, loadOnce])); + return this.el.getUpdateManager(); + }, + + _handleRefresh : function(url, params, loadOnce){ + if(!loadOnce || !this.loaded){ + var updater = this.el.getUpdateManager(); + updater.update(url, params, this._setLoaded.createDelegate(this)); + } + }, + + _setLoaded : function(){ + this.loaded = true; + }, + + + getId : function(){ + return this.el.id; + }, + + + getEl : function(){ + return this.el; + }, + + adjustForComponents : function(width, height){ + if(this.toolbar){ + height -= this.toolbar.getEl().getHeight(); + } + return {'width': width, 'height': height}; + }, + + setSize : function(width, height){ + if(this.fitToFrame){ + var size = this.adjustForComponents(width, height); + this.resizeEl.setSize(size.width, size.height); + } + }, + + + getTitle : function(){ + return this.title; + }, + + + setTitle : function(title){ + this.title = title; + if(this.region){ + this.region.updatePanelTitle(this, title); + } + }, + + + isClosable : function(){ + return this.closable; + }, + + beforeSlide : function(){ + this.el.clip(); + this.resizeEl.clip(); + }, + + afterSlide : function(){ + this.el.unclip(); + this.resizeEl.unclip(); + }, + + + destroy : function(){ + this.el.removeAllListeners(); + var tempEl = document.createElement('span'); + tempEl.appendChild(this.el.dom); + tempEl.innerHTML = ''; + this.el = null; + } +}); + + +YAHOO.ext.GridPanel = function(grid, config){ + this.wrapper = YAHOO.ext.DomHelper.append(document.body, + {tag: 'div', cls: 'ylayout-grid-wrapper ylayout-inactive-content'}, true); + this.wrapper.dom.appendChild(grid.container.dom); + YAHOO.ext.GridPanel.superclass.constructor.call(this, this.wrapper, config); + if(this.toolbar){ + this.toolbar.el.insertBefore(this.wrapper.dom.firstChild); + } + grid.monitorWindowResize = false; + grid.autoHeight = false; + grid.autoWidth = false; + this.grid = grid; + this.grid.container.replaceClass('ylayout-inactive-content', 'ylayout-component-panel'); +}; + +YAHOO.extendX(YAHOO.ext.GridPanel, YAHOO.ext.ContentPanel, { + getId : function(){ + return this.grid.id; + }, + + + getGrid : function(){ + return this.grid; + }, + + setSize : function(width, height){ + var grid = this.grid; + var size = this.adjustForComponents(width, height); + grid.container.setSize(size.width, size.height); + grid.autoSize(); + }, + + beforeSlide : function(){ + this.grid.getView().wrapEl.clip(); + }, + + afterSlide : function(){ + this.grid.getView().wrapEl.unclip(); + }, + + destroy : function(){ + this.grid.getView().unplugDataModel(this.grid.getDataModel()); + this.grid.container.removeAllListeners(); + YAHOO.ext.GridPanel.superclass.destroy.call(this); + } +}); + + + +YAHOO.ext.NestedLayoutPanel = function(layout, config){ + YAHOO.ext.NestedLayoutPanel.superclass.constructor.call(this, layout.getEl(), config); + layout.monitorWindowResize = false; + this.layout = layout; + this.layout.getEl().addClass('ylayout-nested-layout'); +}; + +YAHOO.extendX(YAHOO.ext.NestedLayoutPanel, YAHOO.ext.ContentPanel, { + setSize : function(width, height){ + var size = this.adjustForComponents(width, height); + this.layout.getEl().setSize(size.width, size.height); + this.layout.layout(); + }, + + + getLayout : function(){ + return this.layout; + } +}); + +YAHOO.ext.LayoutStateManager = function(layout){ + + this.state = { + north: {}, + south: {}, + east: {}, + west: {} + }; +}; + +YAHOO.ext.LayoutStateManager.prototype = { + init : function(layout, provider){ + this.provider = provider; + var state = provider.get(layout.id+'-layout-state'); + if(state){ + var wasUpdating = layout.isUpdating(); + if(!wasUpdating){ + layout.beginUpdate(); + } + for(var key in state){ + if(typeof state[key] != 'function'){ + var rstate = state[key]; + var r = layout.getRegion(key); + if(r && rstate){ + if(rstate.size){ + r.resizeTo(rstate.size); + } + if(rstate.collapsed == true){ + r.collapse(true); + }else{ + r.expand(null, true); + } + } + } + } + if(!wasUpdating){ + layout.endUpdate(); + } + this.state = state; + } + this.layout = layout; + layout.on('regionresized', this.onRegionResized, this, true); + layout.on('regioncollapsed', this.onRegionCollapsed, this, true); + layout.on('regionexpanded', this.onRegionExpanded, this, true); + }, + + storeState : function(){ + this.provider.set(this.layout.id+'-layout-state', this.state); + }, + + onRegionResized : function(region, newSize){ + this.state[region.getPosition()].size = newSize; + this.storeState(); + }, + + onRegionCollapsed : function(region){ + this.state[region.getPosition()].collapsed = true; + this.storeState(); + }, + + onRegionExpanded : function(region){ + this.state[region.getPosition()].collapsed = false; + this.storeState(); + } +}; + +YAHOO.ext.BasicDialog = function(el, config){ + el = getEl(el, true); + this.el = el; + this.el.setDisplayed(true); + this.el.hide = this.hideAction; + this.id = this.el.id; + this.el.addClass('ydlg'); + this.shadowOffset = 3; + this.minHeight = 80; + this.minWidth = 200; + this.minButtonWidth = 75; + this.defaultButton = null; + + YAHOO.ext.util.Config.apply(this, config); + + this.proxy = el.createProxy('ydlg-proxy'); + this.proxy.hide = this.hideAction; + this.proxy.setOpacity(.5); + this.proxy.hide(); + + if(config.width){ + el.setWidth(config.width); + } + if(config.height){ + el.setHeight(config.height); + } + this.size = el.getSize(); + if(typeof config.x != 'undefined' && typeof config.y != 'undefined'){ + this.xy = [config.x,config.y]; + }else{ + this.xy = el.getCenterXY(true); + } + + var cn = el.dom.childNodes; + for(var i = 0, len = cn.length; i < len; i++) { + var node = cn[i]; + if(node && node.nodeType == 1){ + if(YAHOO.util.Dom.hasClass(node, 'ydlg-hd')){ + this.header = getEl(node, true); + }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-bd')){ + this.body = getEl(node, true); + }else if(YAHOO.util.Dom.hasClass(node, 'ydlg-ft')){ + + this.footer = getEl(node, true); + } + } + } + + var dh = YAHOO.ext.DomHelper; + if(!this.header){ + + this.header = dh.append(el.dom, {tag: 'div', cls:'ydlg-hd'}, true); + } + if(!this.body){ + + this.body = dh.append(el.dom, {tag: 'div', cls:'ydlg-bd'}, true); + } + + var hl = dh.insertBefore(this.header.dom, {tag: 'div', cls:'ydlg-hd-left'}); + var hr = dh.append(hl, {tag: 'div', cls:'ydlg-hd-right'}); + hr.appendChild(this.header.dom); + + + this.bwrap = dh.insertBefore(this.body.dom, {tag: 'div', cls:'ydlg-dlg-body'}, true); + this.bwrap.dom.appendChild(this.body.dom); + if(this.footer) this.bwrap.dom.appendChild(this.footer.dom); + + if(this.autoScroll !== false && !this.autoTabs){ + this.body.setStyle('overflow', 'auto'); + } + if(this.closable !== false){ + this.el.addClass('ydlg-closable'); + this.close = dh.append(el.dom, {tag: 'div', cls:'ydlg-close'}, true); + this.close.mon('click', function(){ + this.hide(); + }, this, true); + } + if(this.resizable !== false){ + this.el.addClass('ydlg-resizable'); + this.resizer = new YAHOO.ext.Resizable(el, { + minWidth: this.minWidth || 80, + minHeight:this.minHeight || 80, + handles: 'all', + pinned: true + }); + this.resizer.on('beforeresize', this.beforeResize, this, true); + this.resizer.delayedListener('resize', this.onResize, this, true); + } + if(this.draggable !== false){ + el.addClass('ydlg-draggable'); + if (!this.proxyDrag) { + var dd = new YAHOO.util.DD(el.dom.id, 'WindowDrag'); + } + else { + var dd = new YAHOO.util.DDProxy(el.dom.id, 'WindowDrag', {dragElId: this.proxy.id}); + } + dd.setHandleElId(this.header.id); + dd.endDrag = this.endMove.createDelegate(this); + dd.startDrag = this.startMove.createDelegate(this); + dd.onDrag = this.onDrag.createDelegate(this); + this.dd = dd; + } + if(this.modal){ + this.mask = dh.append(document.body, {tag: 'div', cls:'ydlg-mask'}, true); + this.mask.enableDisplayMode('block'); + this.mask.hide(); + } + if(this.shadow){ + this.shadow = el.createProxy({tag: 'div', cls:'ydlg-shadow'}); + this.shadow.setOpacity(.3); + this.shadow.setVisibilityMode(YAHOO.ext.Element.VISIBILITY); + this.shadow.setDisplayed('block'); + this.shadow.hide = this.hideAction; + this.shadow.hide(); + }else{ + this.shadowOffset = 0; + } + if(this.shim){ + this.shim = this.el.createShim(); + this.shim.hide = this.hideAction; + this.shim.hide(); + } + if(this.autoTabs){ + var tabEls = YAHOO.util.Dom.getElementsByClassName('ydlg-tab', 'div', el.dom); + if(tabEls.length > 0){ + this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top'); + this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom'); + for(var i = 0, len = tabEls.length; i < len; i++) { + var tabEl = tabEls[i]; + this.tabs.addTab(YAHOO.util.Dom.generateId(tabEl), tabEl.title); + tabEl.title = ''; + } + this.tabs.activate(tabEls[0].id); + } + } + this.syncBodyHeight(); + this.events = { + + 'keydown' : new YAHOO.util.CustomEvent('keydown'), + + 'move' : new YAHOO.util.CustomEvent('move'), + + 'resize' : new YAHOO.util.CustomEvent('resize'), + + 'beforehide' : new YAHOO.util.CustomEvent('beforehide'), + + 'hide' : new YAHOO.util.CustomEvent('hide'), + + 'beforeshow' : new YAHOO.util.CustomEvent('beforeshow'), + + 'show' : new YAHOO.util.CustomEvent('show') + }; + el.mon('keydown', this.onKeyDown, this, true); + el.mon("mousedown", this.toFront, this, true); + + YAHOO.ext.EventManager.onWindowResize(this.adjustViewport, this, true); + this.el.hide(); + YAHOO.ext.DialogManager.register(this); +}; + +YAHOO.extendX(YAHOO.ext.BasicDialog, YAHOO.ext.util.Observable, { + beforeResize : function(){ + this.resizer.minHeight = Math.max(this.minHeight, this.getHeaderFooterHeight(true)+40); + }, + + onResize : function(){ + this.refreshSize(); + this.syncBodyHeight(); + this.adjustAssets(); + this.fireEvent('resize', this, this.size.width, this.size.height); + }, + + onKeyDown : function(e){ + this.fireEvent('keydown', this, e); + }, + + + resizeTo : function(width, height){ + this.el.setSize(width, height); + this.size = {width: width, height: height}; + this.syncBodyHeight(); + if(this.fixedcenter){ + this.center(); + } + if(this.isVisible()){ + this.constrainXY(); + this.adjustAssets(); + } + return this; + }, + + + addKeyListener : function(key, fn, scope){ + var keyCode, shift, ctrl, alt; + if(typeof key == 'object'){ + keyCode = key['key']; + shift = key['shift']; + ctrl = key['ctrl']; + alt = key['alt']; + }else{ + keyCode = key; + } + var handler = function(dlg, e){ + if((!shift || e.shiftKey) && (!ctrl || e.ctrlKey) && (!alt || e.altKey)){ + var k = e.getKey(); + if(keyCode instanceof Array){ + for(var i = 0, len = keyCode.length; i < len; i++){ + if(keyCode[i] == k){ + fn.call(scope || window, dlg, k, e); + return; + } + } + }else{ + if(k == keyCode){ + fn.call(scope || window, dlg, k, e); + } + } + } + }; + this.on('keydown', handler); + return this; + }, + + + getTabs : function(){ + if(!this.tabs){ + this.body.addClass(this.tabPosition == 'bottom' ? 'ytabs-bottom' : 'ytabs-top'); + this.tabs = new YAHOO.ext.TabPanel(this.body.dom, this.tabPosition == 'bottom'); + } + return this.tabs; + }, + + + addButton : function(config, handler, scope){ + var dh = YAHOO.ext.DomHelper; + if(!this.footer){ + this.footer = dh.append(this.bwrap.dom, {tag: 'div', cls:'ydlg-ft'}, true); + } + var btn; + if(typeof config == 'string'){ + if(!this.buttonTemplate){ + + this.buttonTemplate = new YAHOO.ext.DomHelper.Template('
         {0} 
        '); + } + var btn = this.buttonTemplate.append(this.footer.dom, [config], true); + var tbl = getEl(btn.dom.firstChild, true); + if(this.minButtonWidth){ + + if(tbl.getWidth() < this.minButtonWidth){ + tbl.setWidth(this.minButtonWidth); + } + + } + }else{ + btn = dh.append(this.footer.dom, config, true); + } + var bo = new YAHOO.ext.BasicDialog.Button(btn, handler, scope); + this.syncBodyHeight(); + if(!this.buttons){ + this.buttons = []; + } + this.buttons.push(bo); + return bo; + }, + + + setDefaultButton : function(btn){ + this.defaultButton = btn; + return this; + }, + + getHeaderFooterHeight : function(safe){ + var height = 0; + if(this.header){ + height += this.header.getHeight(); + } + if(this.footer){ + var fm = this.footer.getMargins(); + height += (this.footer.getHeight()+fm.top+fm.bottom); + } + height += this.bwrap.getPadding('tb')+this.bwrap.getBorderWidth('tb'); + return height; + }, + + syncBodyHeight : function(){ + var height = this.size.height - this.getHeaderFooterHeight(false); + var bm = this.body.getMargins(); + this.body.setHeight(height-(bm.top+bm.bottom)); + if(this.tabs){ + this.tabs.syncHeight(); + } + this.bwrap.setHeight(this.size.height-this.header.getHeight()); + + this.body.setWidth(this.el.getWidth(true)-this.bwrap.getBorderWidth('lr')-this.bwrap.getPadding('lr')); + }, + + + restoreState : function(){ + var box = YAHOO.ext.state.Manager.get(this.el.id + '-state'); + if(box && box.width){ + this.xy = [box.x, box.y]; + this.size = box; + this.el.setLocation(box.x, box.y); + this.resizer.resizeTo(box.width, box.height); + this.adjustViewport(); + }else{ + this.resizer.resizeTo(this.size.width, this.size.height); + this.adjustViewport(); + } + return this; + }, + + beforeShow : function(){ + if(this.fixedcenter) { + this.xy = this.el.getCenterXY(true); + } + if(this.modal){ + YAHOO.util.Dom.addClass(document.body, 'masked'); + this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + this.mask.show(); + } + this.constrainXY(); + }, + + + show : function(animateTarget){ + if (this.fireEvent('beforeshow', this) === false) + return; + + this.animateTarget = animateTarget || this.animateTarget; + if(!this.el.isVisible()){ + this.beforeShow(); + if(this.animateTarget){ + var b = getEl(this.animateTarget, true).getBox(); + this.proxy.show(); + this.proxy.setSize(b.width, b.height); + this.proxy.setLocation(b.x, b.y); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height, + true, .35, this.showEl.createDelegate(this)); + }else{ + this.showEl(); + } + } + return this; + }, + + showEl : function(){ + this.proxy.hide(); + this.el.setXY(this.xy); + this.el.show(); + this.adjustAssets(true); + this.toFront(); + if(this.defaultButton){ + this.defaultButton.focus(); + } + this.fireEvent('show', this); + }, + + constrainXY : function(){ + if(this.contraintoviewport !== false){ + if(!this.viewSize){ + this.viewSize = [YAHOO.util.Dom.getViewportWidth(), YAHOO.util.Dom.getViewportHeight()]; + } + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + var vw = this.viewSize[0], vh = this.viewSize[1]; + + var moved = false; + + if(x + w > vw){ + x = vw - w; + moved = true; + } + if(y + h > vh){ + y = vh - h; + moved = true; + } + + if(x < 0){ + x = 0; + moved = true; + } + if(y < 0){ + y = 0; + moved = true; + } + if(moved){ + + this.xy = [x, y]; + if(this.isVisible()){ + this.el.setLocation(x, y); + this.adjustAssets(); + } + } + } + }, + + onDrag : function(){ + if(!this.proxyDrag){ + this.xy = this.el.getXY(); + this.adjustAssets(); + } + }, + + adjustAssets : function(doShow){ + var x = this.xy[0], y = this.xy[1]; + var w = this.size.width, h = this.size.height; + if(doShow === true){ + if(this.shadow){ + this.shadow.show(); + } + if(this.shim){ + this.shim.show(); + } + } + if(this.shadow && this.shadow.isVisible()){ + this.shadow.setBounds(x + this.shadowOffset, y + this.shadowOffset, w, h); + } + if(this.shim && this.shim.isVisible()){ + this.shim.setBounds(x, y, w, h); + } + }, + + + adjustViewport : function(w, h){ + if(!w || !h){ + w = YAHOO.util.Dom.getViewportWidth(); + h = YAHOO.util.Dom.getViewportHeight(); + } + + this.viewSize = [w, h]; + if(this.modal && this.mask.isVisible()){ + this.mask.setSize(w, h); + this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(), YAHOO.util.Dom.getDocumentHeight()); + } + if(this.isVisible()){ + this.constrainXY(); + } + }, + + + destroy : function(removeEl){ + YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport, this); + if(this.tabs){ + this.tabs.destroy(removeEl); + } + if(removeEl === true){ + this.el.update(''); + this.el.remove(); + } + YAHOO.ext.DialogManager.unregister(this); + }, + + startMove : function(){ + if(this.proxyDrag){ + this.proxy.show(); + } + if(this.constraintoviewport !== false){ + this.dd.constrainTo(document.body, {right: this.shadowOffset, bottom: this.shadowOffset}); + } + }, + + endMove : function(){ + if(!this.proxyDrag){ + YAHOO.util.DD.prototype.endDrag.apply(this.dd, arguments); + }else{ + YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd, arguments); + this.proxy.hide(); + } + this.refreshSize(); + this.adjustAssets(); + this.fireEvent('move', this, this.xy[0], this.xy[1]) + }, + + + toFront : function(){ + YAHOO.ext.DialogManager.bringToFront(this); + return this; + }, + + + toBack : function(){ + YAHOO.ext.DialogManager.sendToBack(this); + return this; + }, + + + center : function(){ + this.moveTo(this.el.getCenterXY(true)); + return this; + }, + + + moveTo : function(x, y){ + this.xy = [x,y]; + if(this.isVisible()){ + this.el.setXY(this.xy); + this.adjustAssets(); + } + return this; + }, + + + isVisible : function(){ + return this.el.isVisible(); + }, + + + hide : function(callback){ + if (this.fireEvent('beforehide', this) === false) + return; + + if(this.shadow){ + this.shadow.hide(); + } + if(this.animateTarget){ + var b = getEl(this.animateTarget, true).getBox(); + this.proxy.show(); + this.proxy.setBounds(this.xy[0], this.xy[1], this.size.width, this.size.height); + this.el.hide(); + this.proxy.setBounds(b.x, b.y, b.width, b.height, true, .35, + this.hideEl.createDelegate(this, [callback])); + }else{ + this.el.hide(); + this.hideEl(callback); + } + return this; + }, + + hideEl : function(callback){ + this.proxy.hide(); + if(this.modal){ + this.mask.hide(); + YAHOO.util.Dom.removeClass(document.body, 'masked'); + } + this.fireEvent('hide', this); + if(typeof callback == 'function'){ + callback(); + } + }, + + hideAction : function(){ + this.setLeft('-10000px'); + this.setTop('-10000px'); + this.setStyle('visibility', 'hidden'); + }, + + refreshSize : function(){ + this.size = this.el.getSize(); + this.xy = this.el.getXY(); + YAHOO.ext.state.Manager.set(this.el.id + '-state', this.el.getBox()); + }, + + setZIndex : function(index){ + if(this.modal){ + this.mask.setStyle('z-index', index); + } + if(this.shadow){ + this.shadow.setStyle('z-index', ++index); + } + if(this.shim){ + this.shim.setStyle('z-index', ++index); + } + this.el.setStyle('z-index', ++index); + if(this.proxy){ + this.proxy.setStyle('z-index', ++index); + } + if(this.resizer){ + this.resizer.proxy.setStyle('z-index', ++index); + } + + this.lastZIndex = index; + }, + + + getEl : function(){ + return this.el; + } +}); + + +YAHOO.ext.DialogManager = function(){ + var list = {}; + var accessList = []; + var front = null; + + var sortDialogs = function(d1, d2){ + return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1; + }; + + var orderDialogs = function(){ + accessList.sort(sortDialogs); + var seed = YAHOO.ext.DialogManager.zseed; + for(var i = 0, len = accessList.length; i < len; i++){ + if(accessList[i]){ + accessList[i].setZIndex(seed + (i*10)); + } + } + }; + + return { + + zseed : 10000, + + + register : function(dlg){ + list[dlg.id] = dlg; + accessList.push(dlg); + }, + + unregister : function(dlg){ + delete list[dlg.id]; + if(!accessList.indexOf){ + for(var i = 0, len = accessList.length; i < len; i++){ + accessList.splice(i, 1); + return; + } + }else{ + var i = accessList.indexOf(dlg); + if(i != -1){ + accessList.splice(i, 1); + } + } + }, + + + get : function(id){ + return typeof id == 'object' ? id : list[id]; + }, + + + bringToFront : function(dlg){ + dlg = this.get(dlg); + if(dlg != front){ + front = dlg; + dlg._lastAccess = new Date().getTime(); + orderDialogs(); + } + return dlg; + }, + + + sendToBack : function(dlg){ + dlg = this.get(dlg); + dlg._lastAccess = -(new Date().getTime()); + orderDialogs(); + return dlg; + } + }; +}(); + + +YAHOO.ext.LayoutDialog = function(el, config){ + config.autoTabs = false; + YAHOO.ext.LayoutDialog.superclass.constructor.call(this, el, config); + this.body.setStyle({overflow:'hidden', position:'relative'}); + this.layout = new YAHOO.ext.BorderLayout(this.body.dom, config); + this.layout.monitorWindowResize = false; +}; +YAHOO.extendX(YAHOO.ext.LayoutDialog, YAHOO.ext.BasicDialog, { + + endUpdate : function(){ + this.layout.endUpdate(); + }, + + beginUpdate : function(){ + this.layout.beginUpdate(); + }, + + getLayout : function(){ + return this.layout; + }, + syncBodyHeight : function(){ + YAHOO.ext.LayoutDialog.superclass.syncBodyHeight.call(this); + if(this.layout)this.layout.layout(); + } +}); + + +YAHOO.ext.BasicDialog.Button = function(el, handler, scope){ + this.el = el; + this.el.addClass('ydlg-button'); + this.el.mon('click', this.onClick, this, true); + this.el.on('mouseover', this.onMouseOver, this, true); + this.el.on('mouseout', this.onMouseOut, this, true); + this.el.on('mousedown', this.onMouseDown, this, true); + this.el.on('mouseup', this.onMouseUp, this, true); + this.handler = handler; + this.scope = scope; + this.disabled = false; +}; + +YAHOO.ext.BasicDialog.Button.prototype = { + + getEl : function(){ + return this.el; + }, + + + setHandler : function(handler, scope){ + this.handler = handler; + this.scope = scope; + }, + + + setText : function(text){ + this.el.dom.firstChild.firstChild.firstChild.childNodes[1].innerHTML = text; + }, + + + show: function(){ + this.el.setStyle('display', ''); + }, + + + hide: function(){ + this.el.setStyle('display', 'none'); + }, + + + setVisible: function(visible){ + if(visible) { + this.show(); + }else{ + this.hide(); + } + }, + + + focus : function(){ + this.el.focus(); + }, + + + disable : function(){ + this.el.addClass('ydlg-button-disabled'); + this.disabled = true; + }, + + + enable : function(){ + this.el.removeClass('ydlg-button-disabled'); + this.disabled = false; + }, + + onClick : function(e){ + e.preventDefault(); + if(!this.disabled){ + this.handler.call(this.scope || window); + } + }, + onMouseOver : function(){ + if(!this.disabled){ + this.el.addClass('ydlg-button-over'); + } + }, + onMouseOut : function(){ + this.el.removeClass('ydlg-button-over'); + }, + onMouseDown : function(){ + if(!this.disabled){ + this.el.addClass('ydlg-button-click'); + } + }, + onMouseUp : function(){ + this.el.removeClass('ydlg-button-click'); + } +}; + +YAHOO.ext.View = function(container, tpl, dataModel, config){ + this.el = getEl(container, true); + this.nodes = this.el.dom.childNodes; + if(typeof tpl == 'string'){ + tpl = new YAHOO.ext.Template(tpl); + } + tpl.compile(); + + this.tpl = tpl; + this.setDataModel(dataModel); + var CE = YAHOO.util.CustomEvent; + + this.events = { + + 'click' : new CE('click'), + + 'dblclick' : new CE('dblclick'), + + 'contextmenu' : new CE('contextmenu'), + + 'selectionchange' : new CE('selectionchange') + }; + this.el.mon("click", this.onClick, this, true); + this.el.mon("dblclick", this.onDblClick, this, true); + this.el.mon("contextmenu", this.onContextMenu, this, true); + + + this.selectedClass = 'ydataview-selected'; + + this.selections = []; + this.lastSelection = null; + + + this.jsonRoot = null; + YAHOO.ext.util.Config.apply(this, config); + if(this.renderUpdates || this.jsonRoot){ + var um = this.el.getUpdateManager(); + um.setRenderer(this); + } +}; + +YAHOO.extendX(YAHOO.ext.View, YAHOO.ext.util.Observable, { + + getEl : function(){ + return this.el; + }, + + render : function(el, response){ + this.clearSelections(); + this.el.update(''); + var o; + try{ + o = YAHOO.ext.util.JSON.decode(response.responseText); + if(this.jsonRoot){ + o = eval('o.' + this.jsonRoot); + } + }catch(e){} + if(o && o.length){ + this.html = []; + for(var i = 0, len = o.length; i < len; i++) { + this.renderEach(o[i]); + } + this.el.update(this.html.join('')); + this.html = null; + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + } + }, + + + refresh : function(){ + this.clearSelections(); + this.el.update(''); + this.html = []; + this.dataModel.each(this.renderEach, this); + this.el.update(this.html.join('')); + this.html = null; + this.nodes = this.el.dom.childNodes; + this.updateIndexes(0); + }, + + + prepareData : function(data, index){ + return data; + }, + + renderEach : function(data){ + this.html[this.html.length] = this.tpl.applyTemplate(this.prepareData(data)); + }, + + + refreshNode : function(index){ + this.refreshNodes(index, index); + }, + + refreshNodes : function(dm, startIndex, endIndex){ + this.clearSelections(); + var dm = this.dataModel; + var ns = this.nodes; + for(var i = startIndex; i <= endIndex; i++){ + var d = this.prepareData(dm.getRow(i), i); + if(i < ns.length-1){ + var old = ns[i]; + this.tpl.insertBefore(old, d); + this.el.dom.removeChild(old); + }else{ + this.tpl.append(this.el.dom, d); + } + } + this.updateIndexes(startIndex, endIndex); + }, + + deleteNodes : function(dm, startIndex, endIndex){ + this.clearSelections(); + if(startIndex == 0 && endIndex >= this.nodes.length-1){ + this.el.update(''); + }else{ + var el = this.el.dom; + for(var i = startIndex; i <= endIndex; i++){ + el.removeChild(this.nodes[startIndex]); + } + this.updateIndexes(startIndex); + } + }, + + insertNodes : function(dm, startIndex, endIndex){ + if(this.nodes.length == 0){ + this.refresh(); + }else{ + this.clearSelections(); + var t = this.tpl; + var before = this.nodes[startIndex]; + var dm = this.dataModel; + if(before){ + for(var i = startIndex; i <= endIndex; i++){ + t.insertBefore(before, this.prepareData(dm.getRow(i), i)); + } + }else{ + var el = this.el.dom; + for(var i = startIndex; i <= endIndex; i++){ + t.append(el, this.prepareData(dm.getRow(i), i)); + } + } + this.updateIndexes(startIndex); + } + }, + + updateIndexes : function(dm, startIndex, endIndex){ + var ns = this.nodes; + startIndex = startIndex || 0; + endIndex = endIndex || ns.length-1; + for(var i = startIndex; i <= endIndex; i++){ + ns[i].nodeIndex = i; + } + }, + + + setDataModel : function(dm){ + if(!dm) return; + this.unplugDataModel(this.dataModel); + this.dataModel = dm; + dm.on('cellupdated', this.refreshNode, this, true); + dm.on('datachanged', this.refresh, this, true); + dm.on('rowsdeleted', this.deleteNodes, this, true); + dm.on('rowsinserted', this.insertNodes, this, true); + dm.on('rowsupdated', this.refreshNodes, this, true); + dm.on('rowssorted', this.refresh, this, true); + this.refresh(); + }, + + + unplugDataModel : function(dm){ + if(!dm) return; + dm.removeListener('cellupdated', this.refreshNode, this); + dm.removeListener('datachanged', this.refresh, this); + dm.removeListener('rowsdeleted', this.deleteNodes, this); + dm.removeListener('rowsinserted', this.insertNodes, this); + dm.removeListener('rowsupdated', this.refreshNodes, this); + dm.removeListener('rowssorted', this.refresh, this); + this.dataModel = null; + }, + + + findItemFromChild : function(node){ + var el = this.el.dom; + if(!node || node.parentNode == el){ + return node; + } + var p = node.parentNode; + while(p && p != el){ + if(p.parentNode == el){ + return p; + } + p = p.parentNode; + } + return null; + }, + + + onClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + var index = this.indexOf(item); + this.onItemClick(item, index, e); + this.fireEvent('click', this, index, item, e); + }else{ + this.clearSelections(); + } + }, + + + onContextMenu : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent('contextmenu', this, this.indexOf(item), item, e); + } + }, + + + onDblClick : function(e){ + var item = this.findItemFromChild(e.getTarget()); + if(item){ + this.fireEvent('dblclick', this, this.indexOf(item), item, e); + } + }, + + onItemClick : function(item, index, e){ + if(this.multiSelect || this.singleSelect){ + if(this.multiSelect && e.shiftKey && this.lastSelection){ + this.select(this.getNodes(this.indexOf(this.lastSelection), index), false); + }else{ + this.select(item, this.multiSelect && e.ctrlKey); + this.lastSelection = item; + } + } + }, + + + getSelectionCount : function(){ + return this.selections.length; + }, + + + getSelectedNodes : function(){ + return this.selections; + }, + + + getSelectedIndexes : function(){ + var indexes = []; + for(var i = 0, len = this.selections.length; i < len; i++) { + indexes.push(this.selections[i].nodeIndex); + } + return indexes; + }, + + + clearSelections : function(suppressEvent){ + if(this.multiSelect || this.singleSelect){ + YAHOO.util.Dom.removeClass(this.selections, this.selectedClass); + this.selections = []; + if(!suppressEvent){ + this.fireEvent('selectionchange', this, this.selections); + } + } + }, + + + select : function(nodeInfo, keepExisting, suppressEvent){ + if(!keepExisting){ + this.clearSelections(true); + } + if(nodeInfo instanceof Array){ + for(var i = 0, len = nodeInfo.length; i < len; i++) { + this.select(nodeInfo[i], true, true); + } + }else{ + var node = this.getNode(nodeInfo); + if(node){ + YAHOO.util.Dom.addClass(node, this.selectedClass); + this.selections.push(node); + } + } + if(!suppressEvent){ + this.fireEvent('selectionchange', this, this.selections); + } + }, + + + getNode : function(nodeInfo){ + if(typeof nodeInfo == 'object'){ + return nodeInfo; + }else if(typeof nodeInfo == 'string'){ + return document.getElementById(nodeInfo); + }else if(typeof nodeInfo == 'number'){ + return this.nodes[nodeInfo]; + } + return null; + }, + + + getNodes : function(start, end){ + var ns = this.nodes; + startIndex = startIndex || 0; + endIndex = typeof endIndex == 'undefined' ? ns.length-1 : endIndex; + var nodes = []; + for(var i = start; i <= end; i++) { + nodes.push(ns[i]); + } + return nodes; + }, + + + indexOf : function(node){ + node = this.getNode(node); + if(typeof node.nodeIndex == 'number'){ + return node.nodeIndex; + } + var ns = this.nodes; + for(var i = 0, len = ns.length; i < len; i++) { + if(ns[i] == node){ + return i; + } + } + return -1; + } +}); + + +YAHOO.ext.JsonView = function(container, tpl, config){ + var cfg = config || {}; + cfg.renderUpdates = true; + YAHOO.ext.JsonView.superclass.constructor.call(this, container, tpl, null, cfg); +}; +YAHOO.extendX(YAHOO.ext.JsonView, YAHOO.ext.View, { + + load : function(){ + var um = this.el.getUpdateManager(); + um.update.apply(um, arguments); + } +}); diff --git a/www/extras/yui-ext/yui-ext-nogrid.js b/www/extras/yui-ext/yui-ext-nogrid.js new file mode 100644 index 000000000..b6652f504 --- /dev/null +++ b/www/extras/yui-ext/yui-ext-nogrid.js @@ -0,0 +1,496 @@ +/* + * YUI Extensions 0.33 RC2 + * Copyright(c) 2006, Jack Slocum. + */ + + +YAHOO.namespace('ext');YAHOO.namespace('ext.util');YAHOO.namespace('ext.grid');YAHOO.ext.Strict=(document.compatMode=='CSS1Compat');YAHOO.ext.SSL_SECURE_URL='javascript:false';window.undefined=undefined;Function.prototype.createCallback=function(){var args=arguments;var method=this;return function(){return method.apply(window,args);};};Function.prototype.createDelegate=function(obj,args,appendArgs){var method=this;return function(){var callargs=args||arguments;if(appendArgs===true){callArgs=Array.prototype.slice.call(arguments,0);callargs=callArgs.concat(args);}else if(typeof appendArgs=='number'){callargs=Array.prototype.slice.call(arguments,0);var applyArgs=[appendArgs,0].concat(args);Array.prototype.splice.apply(callargs,applyArgs);} +return method.apply(obj||window,callargs);};};Function.prototype.defer=function(millis,obj,args,appendArgs){return setTimeout(this.createDelegate(obj,args,appendArgs),millis);};Function.prototype.createSequence=function(fcn,scope){if(typeof fcn!='function'){return this;} +var method=this;return function(){var retval=method.apply(this||window,arguments);fcn.apply(scope||this||window,arguments);return retval;};};Function.prototype.createInterceptor=function(fcn,scope){if(typeof fcn!='function'){return this;} +var method=this;return function(){fcn.target=this;fcn.method=method;if(fcn.apply(scope||this||window,arguments)===false){return;} +return method.apply(this||window,arguments);;};};YAHOO.ext.util.Browser=new function(){var ua=navigator.userAgent.toLowerCase();this.isOpera=(ua.indexOf('opera')>-1);this.isSafari=(ua.indexOf('webkit')>-1);this.isIE=(window.ActiveXObject);this.isIE7=(ua.indexOf('msie 7')>-1);this.isGecko=!this.isSafari&&(ua.indexOf('gecko')>-1);if(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1){this.isWindows=true;}else if(ua.indexOf("macintosh")!=-1){this.isMac=true;}}();YAHOO.print=function(arg1,arg2,etc){if(!YAHOO.ext._console){var cs=YAHOO.ext.DomHelper.insertBefore(document.body.firstChild,{tag:'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;'+'background:white;position:absolute;right:5px;top:5px;'+'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'},true);new YAHOO.ext.Resizable(cs,{transparent:true,handles:'all',pinned:true,adjustments:[0,0],wrap:true,draggable:(YAHOO.util.DD?true:false)});cs.on('dblclick',cs.hide);YAHOO.ext._console=cs;} +var msg='';for(var i=0,len=arguments.length;i';} +YAHOO.ext._console.dom.innerHTML=msg+YAHOO.ext._console.dom.innerHTML;YAHOO.ext._console.dom.scrollTop=0;YAHOO.ext._console.show();};YAHOO.printf=function(format,arg1,arg2,etc){var args=Array.prototype.slice.call(arguments,1);YAHOO.print(format.replace(/\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g,function(m,a1,a2,a3){if(m.chatAt=='{'){return m.slice(1,-1);} +var rpl=args[a1];if(a3){var f=eval(a3);rpl=f(rpl);} +return rpl?rpl:'';}));} +YAHOO.util.CustomEvent.prototype.fireDirect=function(){var len=this.subscribers.length;for(var i=0;i';} +return b;} +var createDom=function(o,parentNode){var el=d.createElement(o.tag);var useSet=el.setAttribute?true:false;for(var attr in o){if(attr=='tag'||attr=='children'||attr=='html'||attr=='style'||typeof o[attr]=='function')continue;if(attr=='cls'){el.className=o['cls'];}else{if(useSet)el.setAttribute(attr,o[attr]);else el[attr]=o[attr];}} +YAHOO.ext.DomHelper.applyStyles(el,o.style);if(o.children){for(var i=0,len=o.children.length;i'+html+'';node=tempTableEl.firstChild.firstChild.firstChild;}else{tempTableEl.innerHTML=''+html+'
        ';node=tempTableEl.firstChild.firstChild.firstChild.firstChild;} +if(where=='beforebegin'){el.parentNode.insertBefore(node,el);return node;}else if(where=='afterbegin'){el.insertBefore(node,el.firstChild);return node;}else if(where=='beforeend'){el.appendChild(node);return node;}else if(where=='afterend'){el.parentNode.insertBefore(node,el.nextSibling);return node;}} +this.insertHtml=function(where,el,html){where=where.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=='table'||tag=='tbody'||tag=='tr'){return insertIntoTable(tag,where,el,html);} +switch(where){case'beforebegin':el.insertAdjacentHTML(where,html);return el.previousSibling;case'afterbegin':el.insertAdjacentHTML(where,html);return el.firstChild;case'beforeend':el.insertAdjacentHTML(where,html);return el.lastChild;case'afterend':el.insertAdjacentHTML(where,html);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';} +var range=el.ownerDocument.createRange();var frag;switch(where){case'beforebegin':range.setStartBefore(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el);return el.previousSibling;case'afterbegin':if(el.firstChild){range.setStartBefore(el.firstChild);}else{range.selectNodeContents(el);range.collapse(true);} +frag=range.createContextualFragment(html);el.insertBefore(frag,el.firstChild);return el.firstChild;case'beforeend':if(el.lastChild){range.setStartAfter(el.lastChild);}else{range.selectNodeContents(el);range.collapse(false);} +frag=range.createContextualFragment(html);el.appendChild(frag);return el.lastChild;case'afterend':range.setStartAfter(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el.nextSibling);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';};this.insertBefore=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el);}else{var html=createHtml(o);newNode=this.insertHtml('beforeBegin',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.insertAfter=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el.nextSibling);}else{var html=createHtml(o);newNode=this.insertHtml('afterEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.append=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.appendChild(newNode);}else{var html=createHtml(o);newNode=this.insertHtml('beforeEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.overwrite=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML=createHtml(o);return returnElement?YAHOO.ext.Element.get(el.firstChild,true):el.firstChild;};this.createTemplate=function(o){var html=createHtml(o);return new YAHOO.ext.DomHelper.Template(html);};}();YAHOO.ext.DomHelper.Template=function(html){this.html=html;this.re=/\{(\w+)\}/g;};YAHOO.ext.DomHelper.Template.prototype={applyTemplate:function(values){if(this.compiled){return this.compiled(values);} +var empty='';var fn=function(match,index){if(typeof values[index]!='undefined'){return values[index];}else{return empty;}} +return this.html.replace(this.re,fn);},compile:function(){var html=this.html;var re=/\{(\w+)\}/g;var body=[];body.push("this.compiled = function(values){ return [");var result;var lastMatchEnd=0;while((result=re.exec(html))!=null){body.push("'",html.substring(lastMatchEnd,result.index),"', ");body.push("values['",html.substring(result.index+1,re.lastIndex-1),"'], ");lastMatchEnd=re.lastIndex;} +body.push("'",html.substr(lastMatchEnd),"'].join('');};");eval(body.join(''));},insertBefore:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeBegin',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},insertAfter:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('afterEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},append:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},overwrite:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML='';var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;}};YAHOO.ext.Template=YAHOO.ext.DomHelper.Template; + +YAHOO.ext.Element=function(element,forceNew){var dom=YAHOO.util.Dom.get(element);if(!dom){return null;} +if(!forceNew&&YAHOO.ext.Element.cache[dom.id]){return YAHOO.ext.Element.cache[dom.id];} +this.dom=dom;this.id=this.dom.id;this.visibilityMode=YAHOO.ext.Element.VISIBILITY;this.originalDisplay=YAHOO.util.Dom.getStyle(this.dom,'display')||'';if(this.autoDisplayMode){if(this.originalDisplay=='none'){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);}} +if(this.originalDisplay=='none'){this.originalDisplay='';} +this.defaultUnit='px';} +YAHOO.ext.Element.prototype={setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this;},enableDisplayMode:function(display){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);if(typeof display!='undefined')this.originalDisplay=display;return this;},animate:function(args,duration,onComplete,easing,animType){this.anim(args,duration,onComplete,easing,animType);return this;},anim:function(args,duration,onComplete,easing,animType){animType=animType||YAHOO.util.Anim;var anim=new animType(this.dom,args,duration||.35,easing||YAHOO.util.Easing.easeBoth);if(onComplete){if(!(onComplete instanceof Array)){anim.onComplete.subscribe(onComplete,this,true);}else{for(var i=0;icontainerBottom){c.scrollTop=childBottom-c.clientHeight;} +if(restorePos){c.setStyle('position',cp);} +return this;},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=='function'){onComplete();}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=='function')onComplete();}.createDelegate(this),easing);}}.createDelegate(this),0);return this;},isVisible:function(deep){var vis=YAHOO.util.Dom.getStyle(this.dom,'visibility')!='hidden'&&YAHOO.util.Dom.getStyle(this.dom,'display')!='none';if(!deep||!vis){return vis;} +var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'visibility')=='hidden'||YAHOO.util.Dom.getStyle(p,'display')=='none'){return false;} +p=p.parentNode;} +return true;},select:function(selector,unique){return YAHOO.ext.Element.select('#'+this.dom.id+' '+selector,unique);},initDD:function(group,config,overrides){var dd=new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDProxy:function(group,config,overrides){var dd=new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDTarget:function(group,config,overrides){var dd=new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},setVisible:function(visible,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}else{this.setOpacity(visible?0:1);YAHOO.util.Dom.setStyle(this.dom,'visibility','visible');if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(true);} +var args={opacity:{from:(visible?0:1),to:(visible?1:0)}};var anim=new YAHOO.util.Anim(this.dom,args,duration||.35,easing||(visible?YAHOO.util.Easing.easeIn:YAHOO.util.Easing.easeOut));anim.onComplete.subscribe((function(){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}).createDelegate(this));if(onComplete){anim.onComplete.subscribe(onComplete);} +anim.animate();} +return this;},isDisplayed:function(){return YAHOO.util.Dom.getStyle(this.dom,'display')!='none';},toggle:function(animate,duration,onComplete,easing){this.setVisible(!this.isVisible(),animate,duration,onComplete,easing);return this;},setDisplayed:function(value){if(typeof value=='boolean'){value=value?this.originalDisplay:'none';} +YAHOO.util.Dom.setStyle(this.dom,'display',value);return this;},focus:function(){try{this.dom.focus();}catch(e){} +return this;},addClass:function(className){YAHOO.util.Dom.addClass(this.dom,className);return this;},radioClass:function(className){var siblings=this.dom.parentNode.childNodes;for(var i=0;ithis.getWidth()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setHeight:function(height,animate,duration,onComplete,easing){height=this.adjustHeight(height);if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'height',this.addUnits(height));}else{this.anim({height:{to:height}},duration,onComplete,easing||(height>this.getHeight()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setSize:function(width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({width:{to:width},height:{to:height}},duration,onComplete,easing);} +return this;},setBounds:function(x,y,width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);this.setLocation(x,y);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({points:{to:[x,y]},width:{to:width},height:{to:height}},duration,onComplete,easing,YAHOO.util.Motion);} +return this;},setRegion:function(region,animate,duration,onComplete,easing){this.setBounds(region.left,region.top,region.right-region.left,region.bottom-region.top,animate,duration,onComplete,easing);return this;},addListener:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addHandler:function(eventName,stopPropagation,handler,scope,override){var fn=YAHOO.ext.Element.createStopHandler(stopPropagation,handler,scope||this,true);YAHOO.util.Event.addListener(this.dom,eventName,fn);return this;},on:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addManagedListener:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},mon:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},removeListener:function(eventName,handler,scope){YAHOO.util.Event.removeListener(this.dom,eventName,handler,scope||this);return this;},removeAllListeners:function(){YAHOO.util.Event.purgeElement(this.dom);return this;},setOpacity:function(opacity,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'opacity',opacity);}else{this.anim({opacity:{to:opacity}},duration,onComplete,easing);} +return this;},getLeft:function(local){if(!local){return this.getX();}else{return parseInt(this.getStyle('left'),10)||0;}},getRight:function(local){if(!local){return this.getX()+this.getWidth();}else{return(this.getLeft(true)+this.getWidth())||0;}},getTop:function(local){if(!local){return this.getY();}else{return parseInt(this.getStyle('top'),10)||0;}},getBottom:function(local){if(!local){return this.getY()+this.getHeight();}else{return(this.getTop(true)+this.getHeight())||0;}},setAbsolutePositioned:function(zIndex){this.setStyle('position','absolute');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},setRelativePositioned:function(zIndex){this.setStyle('position','relative');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},clearPositioning:function(){this.setStyle('position','');this.setStyle('left','');this.setStyle('right','');this.setStyle('top','');this.setStyle('bottom','');return this;},getPositioning:function(){return{'position':this.getStyle('position'),'left':this.getStyle('left'),'right':this.getStyle('right'),'top':this.getStyle('top'),'bottom':this.getStyle('bottom')};},getBorderWidth:function(side){return this.addStyles(side,YAHOO.ext.Element.borders);},getPadding:function(side){return this.addStyles(side,YAHOO.ext.Element.paddings);},setPositioning:function(positionCfg){if(positionCfg.position)this.setStyle('position',positionCfg.position);if(positionCfg.left)this.setLeft(positionCfg.left);if(positionCfg.right)this.setRight(positionCfg.right);if(positionCfg.top)this.setTop(positionCfg.top);if(positionCfg.bottom)this.setBottom(positionCfg.bottom);return this;},setLeftTop:function(left,top){this.dom.style.left=this.addUnits(left);this.dom.style.top=this.addUnits(top);return this;},move:function(direction,distance,animate,duration,onComplete,easing){var xy=this.getXY();direction=direction.toLowerCase();switch(direction){case'l':case'left':this.moveTo(xy[0]-distance,xy[1],animate,duration,onComplete,easing);break;case'r':case'right':this.moveTo(xy[0]+distance,xy[1],animate,duration,onComplete,easing);break;case't':case'top':case'up':this.moveTo(xy[0],xy[1]-distance,animate,duration,onComplete,easing);break;case'b':case'bottom':case'down':this.moveTo(xy[0],xy[1]+distance,animate,duration,onComplete,easing);break;} +return this;},clip:function(){if(!this.isClipped){this.isClipped=true;this.originalClip={'o':this.getStyle('overflow'),'x':this.getStyle('overflow-x'),'y':this.getStyle('overflow-y')};this.setStyle('overflow','hidden');this.setStyle('overflow-x','hidden');this.setStyle('overflow-y','hidden');} +return this;},unclip:function(){if(this.isClipped){this.isClipped=false;var o=this.originalClip;if(o.o){this.setStyle('overflow',o.o);} +if(o.x){this.setStyle('overflow-x',o.x);} +if(o.y){this.setStyle('overflow-y',o.y);}} +return this;},alignTo:function(element,position,offsets,animate,duration,onComplete,easing){var otherEl=getEl(element);if(!otherEl){return this;} +offsets=offsets||[0,0];var r=otherEl.getRegion();position=position.toLowerCase();switch(position){case'bl':this.moveTo(r.left+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'br':this.moveTo(r.right+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'tl':this.moveTo(r.left+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;case'tr':this.moveTo(r.right+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;} +return this;},clearOpacity:function(){if(window.ActiveXObject){this.dom.style.filter='';}else{this.dom.style.opacity='';this.dom.style['-moz-opacity']='';this.dom.style['-khtml-opacity']='';} +return this;},hide:function(animate,duration,onComplete,easing){this.setVisible(false,animate,duration,onComplete,easing);return this;},show:function(animate,duration,onComplete,easing){this.setVisible(true,animate,duration,onComplete,easing);return this;},addUnits:function(size){if(size===''||size=='auto'||typeof size=='undefined'){return size;} +if(typeof size=='number'||!YAHOO.ext.Element.unitPattern.test(size)){return size+this.defaultUnit;} +return size;},beginMeasure:function(){var el=this.dom;if(el.offsetWidth||el.offsetHeight){return this;} +var changed=[];var p=this.dom;while((!el.offsetWidth&&!el.offsetHeight)&&p&&p.tagName&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'display')=='none'){changed.push({el:p,visibility:YAHOO.util.Dom.getStyle(p,'visibility')});p.style.visibility='hidden';p.style.display='block';} +p=p.parentNode;} +this._measureChanged=changed;return this;},endMeasure:function(){var changed=this._measureChanged;if(changed){for(var i=0,len=changed.length;i';YAHOO.util.Event.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:)((\n|\r|.)*?)(?:<\/script>)/img;var srcRe=/\ssrc=[\'\"](.*)[\'\"]/i;var match;while(match=re.exec(html)){var srcMatch=match[0].match(srcRe);if(srcMatch&&srcMatch[1]){var s0=document.createElement("script");s0.src=srcMatch[1];hd.appendChild(s0);}else if(match[1]){eval(match[1]);}} +var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);} +if(typeof callback=='function'){callback();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img,'');return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new YAHOO.ext.UpdateManager(this);} +return this.updateManager;},unselectable:function(){this.dom.unselectable='on';this.swallowEvent('selectstart',true);this.applyStyles('-moz-user-select:none;-khtml-user-select:none;');return this;},getCenterXY:function(offsetScroll){var centerX=Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2);var centerY=Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2);if(!offsetScroll){return[centerX,centerY];}else{var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft||0;var scrollY=document.documentElement.scrollTop||document.body.scrollTop||0;return[centerX+scrollX,centerY+scrollY];}},center:function(centerIn){if(!centerIn){this.setXY(this.getCenterXY(true));}else{var box=YAHOO.ext.Element.get(centerIn).getBox();this.setXY([box.x+(box.width/2)-(this.getWidth()/2),box.y+(box.height/2)-(this.getHeight()/2)]);} +return this;},getChildrenByTagName:function(tagName){var children=this.dom.getElementsByTagName(tagName);var len=children.length;var ce=new Array(len);for(var i=0;i');YAHOO.util.Event.on('ie-deferred-loader','readystatechange',function(){if(this.readyState=='complete'){fireDocReady();}});}else if(YAHOO.ext.util.Browser.isSafari){docReadyProcId=setInterval(function(){var rs=document.readyState;if(rs=='loaded'||rs=='complete'){fireDocReady();}},10);} +YAHOO.util.Event.on(window,'load',fireDocReady);};this.wrap=function(fn,scope,override){var wrappedFn=function(e){YAHOO.ext.EventObject.setEvent(e);fn.call(override?scope||window:window,YAHOO.ext.EventObject,scope);};return wrappedFn;};this.addListener=function(element,eventName,fn,scope,override){var wrappedFn=this.wrap(fn,scope,override);YAHOO.util.Event.addListener(element,eventName,wrappedFn);return wrappedFn;};this.removeListener=function(element,eventName,wrappedFn){return YAHOO.util.Event.removeListener(element,eventName,wrappedFn);};this.on=this.addListener;this.onDocumentReady=function(fn,scope,override){if(!docReadyEvent){initDocReady();} +docReadyEvent.subscribe(fn,scope,override);} +this.onWindowResize=function(fn,scope,override){if(!resizeEvent){resizeEvent=new YAHOO.util.CustomEvent('windowresize');resizeTask=new YAHOO.ext.util.DelayedTask(function(){resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight());});YAHOO.util.Event.on(window,'resize',function(){resizeTask.delay(50);});} +resizeEvent.subscribe(fn,scope,override);},this.removeResizeListener=function(fn,scope){if(resizeEvent){resizeEvent.unsubscribe(fn,scope);}}};YAHOO.ext.EventObject=new function(){this.browserEvent=null;this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;this.BACKSPACE=8;this.TAB=9;this.RETURN=13;this.ESC=27;this.SPACE=32;this.PAGEUP=33;this.PAGEDOWN=34;this.END=35;this.HOME=36;this.LEFT=37;this.UP=38;this.RIGHT=39;this.DOWN=40;this.DELETE=46;this.F5=116;this.setEvent=function(e){this.browserEvent=e;if(e){this.button=e.button;this.shiftKey=e.shiftKey;this.ctrlKey=e.ctrlKey;this.altKey=e.altKey;}else{this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;}};this.stopEvent=function(){if(this.browserEvent){YAHOO.util.Event.stopEvent(this.browserEvent);}};this.preventDefault=function(){if(this.browserEvent){YAHOO.util.Event.preventDefault(this.browserEvent);}};this.isNavKeyPress=function(){return(this.browserEvent.keyCode&&this.browserEvent.keyCode>=33&&this.browserEvent.keyCode<=40);};this.stopPropagation=function(){if(this.browserEvent){YAHOO.util.Event.stopPropagation(this.browserEvent);}};this.getCharCode=function(){if(this.browserEvent){return YAHOO.util.Event.getCharCode(this.browserEvent);} +return null;};this.getKey=function(){if(this.browserEvent){return this.browserEvent.charCode||this.browserEvent.keyCode;} +return null;};this.getPageX=function(){if(this.browserEvent){return YAHOO.util.Event.getPageX(this.browserEvent);} +return null;};this.getPageY=function(){if(this.browserEvent){return YAHOO.util.Event.getPageY(this.browserEvent);} +return null;};this.getTime=function(){if(this.browserEvent){return YAHOO.util.Event.getTime(this.browserEvent);} +return null;};this.getXY=function(){if(this.browserEvent){return YAHOO.util.Event.getXY(this.browserEvent);} +return[];};this.getTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getTarget(this.browserEvent);} +return null;};this.findTarget=function(className,tagName){if(tagName)tagName=tagName.toLowerCase();if(this.browserEvent){function isMatch(el){if(!el){return false;} +if(className&&!YAHOO.util.Dom.hasClass(el,className)){return false;} +if(tagName&&el.tagName.toLowerCase()!=tagName){return false;} +return true;};var t=this.getTarget();if(!t||isMatch(t)){return t;} +var p=t.parentNode;var b=document.body;while(p&&p!=b){if(isMatch(p)){return p;} +p=p.parentNode;}} +return null;};this.getRelatedTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getRelatedTarget(this.browserEvent);} +return null;};this.getWheelDelta=function(){var e=this.browserEvent;var delta=0;if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera)delta=-delta;}else if(e.detail){delta=-e.detail/3;} +return delta;};this.hasModifier=function(){return this.ctrlKey||this.altKey||this.shiftKey;};}(); + +YAHOO.ext.UpdateManager=function(el,forceNew){el=YAHOO.ext.Element.get(el);if(!forceNew&&el.updateManager){return el.updateManager;} +this.el=el;this.defaultUrl=null;this.beforeUpdate=new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate');this.onUpdate=new YAHOO.util.CustomEvent('UpdateManager.onUpdate');this.onFailure=new YAHOO.util.CustomEvent('UpdateManager.onFailure');this.events={'beforeupdate':this.beforeUpdate,'update':this.onUpdate,'failure':this.onFailure};this.sslBlankUrl=YAHOO.ext.UpdateManager.defaults.sslBlankUrl;this.disableCaching=YAHOO.ext.UpdateManager.defaults.disableCaching;this.indicatorText=YAHOO.ext.UpdateManager.defaults.indicatorText;this.showLoadIndicator=YAHOO.ext.UpdateManager.defaults.showLoadIndicator;this.timeout=YAHOO.ext.UpdateManager.defaults.timeout;this.loadScripts=YAHOO.ext.UpdateManager.defaults.loadScripts;this.transaction=null;this.autoRefreshProcId=null;this.refreshDelegate=this.refresh.createDelegate(this);this.updateDelegate=this.update.createDelegate(this);this.formUpdateDelegate=this.formUpdate.createDelegate(this);this.successDelegate=this.processSuccess.createDelegate(this);this.failureDelegate=this.processFailure.createDelegate(this);this.renderer=new YAHOO.ext.UpdateManager.BasicRenderer();};YAHOO.ext.UpdateManager.prototype={fireEvent:YAHOO.ext.util.Observable.prototype.fireEvent,on:YAHOO.ext.util.Observable.prototype.on,addListener:YAHOO.ext.util.Observable.prototype.addListener,delayedListener:YAHOO.ext.util.Observable.prototype.delayedListener,removeListener:YAHOO.ext.util.Observable.prototype.removeListener,purgeListeners:YAHOO.ext.util.Observable.prototype.purgeListeners,getEl:function(){return this.el;},update:function(url,params,callback,discardUrl){if(this.beforeUpdate.fireDirect(this.el,url,params)!==false){if(typeof url=='object'){var cfg=url;url=cfg.url;params=params||cfg.params;callback=callback||cfg.callback;discardUrl=discardUrl||cfg.discardUrl;if(callback&&cfg.scope){callback=callback.createDelegate(cfg.scope);} +if(typeof cfg.nocache!='undefined'){this.disableCaching=cfg.nocache};if(typeof cfg.text!='undefined'){this.indicatorText=cfg.text};if(typeof cfg.scripts!='undefined'){this.loadScripts=cfg.scripts};if(typeof cfg.timeout!='undefined'){this.timeout=cfg.timeout};} +this.showLoading();if(!discardUrl){this.defaultUrl=url;} +if(typeof url=='function'){url=url();} +if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':null,'callback':callback,'params':params}};var method=params?'POST':'GET';if(method=='GET'){url=this.prepareUrl(url);} +this.transaction=YAHOO.util.Connect.asyncRequest(method,url,callback,params);}},formUpdate:function(form,url,reset,callback){if(this.beforeUpdate.fireDirect(this.el,form,url)!==false){this.showLoading();formEl=YAHOO.util.Dom.get(form);if(typeof url=='function'){url=url();} +url=url||formEl.action;var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':form,'callback':callback,'reset':reset}};var isUpload=false;var enctype=formEl.getAttribute('enctype');if(enctype&&enctype.toLowerCase()=='multipart/form-data'){isUpload=true;} +YAHOO.util.Connect.setForm(form,isUpload,this.sslBlankUrl);this.transaction=YAHOO.util.Connect.asyncRequest('POST',url,callback);}},refresh:function(callback){if(this.defaultUrl==null){return;} +this.update(this.defaultUrl,null,callback,true);},startAutoRefresh:function(interval,url,params,callback,refreshNow){if(refreshNow){this.update(url||this.defaultUrl,params,callback,true);} +if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);} +this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[url||this.defaultUrl,params,callback,true]),interval*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);}},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText);}},prepareUrl:function(url){if(this.disableCaching){var append='_dc='+(new Date().getTime());if(url.indexOf('?')!==-1){url+='&'+append;}else{url+='?'+append;}} +return url;},processSuccess:function(response){this.transaction=null;if(response.argument.form&&response.argument.reset){try{response.argument.form.reset();}catch(e){}} +if(this.loadScripts){this.renderer.render(this.el,response,this,this.updateComplete.createDelegate(this,[response]));}else{this.renderer.render(this.el,response,this);this.updateComplete(response);}},updateComplete:function(response){this.fireEvent('update',this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,true);}},processFailure:function(response){this.transaction=null;this.onFailure.fireDirect(this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,false);}},setRenderer:function(renderer){this.renderer=renderer;},getRenderer:function(){return this.renderer;},setDefaultUrl:function(defaultUrl){this.defaultUrl=defaultUrl;},abort:function(){if(this.transaction){YAHOO.util.Connect.abort(this.transaction);}},isUpdating:function(){if(this.transaction){return YAHOO.util.Connect.isCallInProgress(this.transaction);} +return false;}};YAHOO.ext.UpdateManager.defaults={timeout:30,loadScripts:false,sslBlankUrl:(YAHOO.ext.SSL_SECURE_URL||'javascript:false'),disableCaching:false,showLoadIndicator:true,indicatorText:'
        Loading...
        '};YAHOO.ext.UpdateManager.updateElement=function(el,url,params,options){var um=getEl(el,true).getUpdateManager();YAHOO.ext.util.Config.apply(um,options);um.update(url,params,options.callback);} +YAHOO.ext.UpdateManager.update=YAHOO.ext.UpdateManager.updateElement;YAHOO.ext.UpdateManager.BasicRenderer=function(){};YAHOO.ext.UpdateManager.BasicRenderer.prototype={render:function(el,response,updateManager,callback){el.update(response.responseText,updateManager.loadScripts,callback);}}; + +YAHOO.ext.TabPanel=function(container,config){this.el=getEl(container,true);this.tabPosition='top';this.currentTabWidth=0;this.minTabWidth=40;this.maxTabWidth=250;this.preferredTabWidth=175;this.resizeTabs=false;this.monitorResize=true;if(config){if(typeof config=='boolean'){this.tabPosition=config?'bottom':'top';}else{YAHOO.ext.util.Config.apply(this,config);}} +if(this.tabPosition=='bottom'){this.bodyEl=getEl(this.createBody(this.el.dom));this.el.addClass('ytabs-bottom');} +this.stripWrap=getEl(this.createStrip(this.el.dom),true);this.stripEl=getEl(this.createStripList(this.stripWrap.dom),true);this.stripBody=getEl(this.stripWrap.dom.firstChild.firstChild,true);if(this.tabPosition!='bottom'){this.bodyEl=getEl(this.createBody(this.el.dom));this.el.addClass('ytabs-top');} +this.items=[];this.bodyEl.setStyle('position','relative');if(!this.items.indexOf){this.items.indexOf=function(o){for(var i=0,len=this.length;i1){var newTab=this.getNextAvailable(index);if(newTab)newTab.activate();} +tab.purgeListeners();this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);} +items.splice(index,1);delete this.items[tab.id];this.autoSizeTabs();},getNextAvailable:function(start){var items=this.items;var index=start;while(index=0){var item=items[--index];if(item&&!item.isHidden()){return item;}} +return null;},disableTab:function(id){var tab=this.items[id];if(tab&&this.active!=tab){tab.disable();}},enableTab:function(id){var tab=this.items[id];tab.enable();},activate:function(id){var tab=this.items[id];if(tab==this.active){return tab;} +var e={};this.fireEvent('beforetabchange',this,e,tab);if(e.cancel!==true&&!tab.disabled){if(this.active){this.active.hide();} +this.active=this.items[id];this.active.show();this.onTabChange.fireDirect(this,this.active);} +return tab;},getActiveTab:function(){return this.active;},syncHeight:function(targetHeight){var height=(targetHeight||this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb');var bm=this.bodyEl.getMargins();var newHeight=height-(this.stripWrap.getHeight())-(bm.top+bm.bottom);this.bodyEl.setHeight(newHeight);return newHeight;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var count=this.items.length;var vcount=count-this.hiddenCount;if(!this.resizeTabs||count<1||vcount<1||this.updating)return;var w=Math.max(this.el.getWidth()-this.cpad,10);var availWidth=Math.floor(w/vcount);var b=this.stripBody;if(b.getWidth()>w){var tabs=this.items;this.setTabWidth(Math.max(availWidth,this.minTabWidth));if(availWidth
        ';return strip.firstChild.firstChild.firstChild.firstChild;};YAHOO.ext.TabPanel.prototype.createBody=function(container){var body=document.createElement('div');YAHOO.util.Dom.generateId(body,'tab-body');YAHOO.util.Dom.addClass(body,'yui-ext-tabbody');container.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createItemBody=function(bodyEl,id){var body=YAHOO.util.Dom.get(id);if(!body){body=document.createElement('div');body.id=id;} +YAHOO.util.Dom.addClass(body,'yui-ext-tabitembody');bodyEl.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createStripElements=function(stripEl,text,closable){var td=document.createElement('td');stripEl.appendChild(td);if(closable){td.className="ytab-closable";if(!this.closeTpl){this.closeTpl=new YAHOO.ext.Template(''+'{text}'+'
         
        ');} +var el=this.closeTpl.overwrite(td,{'text':text});var close=el.getElementsByTagName('div')[0];var inner=el.getElementsByTagName('em')[0];return{'el':el,'close':close,'inner':inner};}else{if(!this.tabTpl){this.tabTpl=new YAHOO.ext.Template(''+'{text}');} +var el=this.tabTpl.overwrite(td,{'text':text});var inner=el.getElementsByTagName('em')[0];return{'el':el,'inner':inner};}}; + +YAHOO.ext.Actor=function(element,animator,selfCapture){this.el=YAHOO.ext.Element.get(element,true);YAHOO.ext.Actor.superclass.constructor.call(this,element,true);this.onCapture=new YAHOO.util.CustomEvent('Actor.onCapture');if(animator){animator.addActor(this);} +this.capturing=selfCapture;this.playlist=selfCapture?new YAHOO.ext.Animator.AnimSequence():null;};YAHOO.extendX(YAHOO.ext.Actor,YAHOO.ext.Element);YAHOO.ext.Actor.prototype.capture=function(action){if(this.playlist!=null){this.playlist.add(action);} +this.onCapture.fireDirect(this,action);return action;};YAHOO.ext.Actor.overrideAnimation=function(method,animParam,onParam){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);if(args[animParam]===true){return this.capture(new YAHOO.ext.Actor.AsyncAction(this,method,args,onParam));}else{return this.capture(new YAHOO.ext.Actor.Action(this,method,args));}};} +YAHOO.ext.Actor.overrideBasic=function(method){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.Action(this,method,args));};} +YAHOO.ext.Actor.prototype.setVisibilityMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode);YAHOO.ext.Actor.prototype.enableDisplayMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode);YAHOO.ext.Actor.prototype.focus=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus);YAHOO.ext.Actor.prototype.addClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass);YAHOO.ext.Actor.prototype.removeClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass);YAHOO.ext.Actor.prototype.replaceClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass);YAHOO.ext.Actor.prototype.setStyle=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle);YAHOO.ext.Actor.prototype.setLeft=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft);YAHOO.ext.Actor.prototype.setTop=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop);YAHOO.ext.Actor.prototype.setAbsolutePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned);YAHOO.ext.Actor.prototype.setRelativePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned);YAHOO.ext.Actor.prototype.clearPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning);YAHOO.ext.Actor.prototype.setPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning);YAHOO.ext.Actor.prototype.clip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip);YAHOO.ext.Actor.prototype.unclip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip);YAHOO.ext.Actor.prototype.clearOpacity=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity);YAHOO.ext.Actor.prototype.update=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update);YAHOO.ext.Actor.prototype.remove=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove);YAHOO.ext.Actor.prototype.fitToParent=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent);YAHOO.ext.Actor.prototype.appendChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild);YAHOO.ext.Actor.prototype.createChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild);YAHOO.ext.Actor.prototype.appendTo=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo);YAHOO.ext.Actor.prototype.insertBefore=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore);YAHOO.ext.Actor.prototype.insertAfter=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter);YAHOO.ext.Actor.prototype.wrap=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap);YAHOO.ext.Actor.prototype.replace=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace);YAHOO.ext.Actor.prototype.insertHtml=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml);YAHOO.ext.Actor.prototype.set=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set);YAHOO.ext.Actor.prototype.load=function(){if(!this.capturing){return YAHOO.ext.Actor.superclass.load.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.load,args,2));};YAHOO.ext.Actor.prototype.animate=function(args,duration,onComplete,easing,animType){if(!this.capturing){return YAHOO.ext.Actor.superclass.animate.apply(this,arguments);} +return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.animate,[args,duration,onComplete,easing,animType],2));};YAHOO.ext.Actor.prototype.setVisible=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible,1,3);YAHOO.ext.Actor.prototype.toggle=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle,0,2);YAHOO.ext.Actor.prototype.setXY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY,1,3);YAHOO.ext.Actor.prototype.setLocation=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation,2,4);YAHOO.ext.Actor.prototype.setWidth=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth,1,3);YAHOO.ext.Actor.prototype.setHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight,1,3);YAHOO.ext.Actor.prototype.setSize=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize,2,4);YAHOO.ext.Actor.prototype.setBounds=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds,4,6);YAHOO.ext.Actor.prototype.setOpacity=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity,1,3);YAHOO.ext.Actor.prototype.moveTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo,2,4);YAHOO.ext.Actor.prototype.move=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move,2,4);YAHOO.ext.Actor.prototype.alignTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo,3,5);YAHOO.ext.Actor.prototype.hide=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide,0,2);YAHOO.ext.Actor.prototype.show=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show,0,2);YAHOO.ext.Actor.prototype.setBox=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox,2,4);YAHOO.ext.Actor.prototype.autoHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight,0,2);YAHOO.ext.Actor.prototype.setX=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX,1,3);YAHOO.ext.Actor.prototype.setY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY,1,3);YAHOO.ext.Actor.prototype.startCapture=function(){this.capturing=true;this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.stopCapture=function(){this.capturing=false;};YAHOO.ext.Actor.prototype.clear=function(){this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.play=function(oncomplete){this.capturing=false;if(this.playlist){this.playlist.play(oncomplete);}};YAHOO.ext.Actor.prototype.addCall=function(fcn,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.Action(scope,fcn,args||[]));}};YAHOO.ext.Actor.prototype.addAsyncCall=function(fcn,callbackIndex,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.AsyncAction(scope,fcn,args||[],callbackIndex));}},YAHOO.ext.Actor.prototype.pause=function(seconds){this.capture(new YAHOO.ext.Actor.PauseAction(seconds));};YAHOO.ext.Actor.prototype.shake=function(){this.move('left',20,true,.05);this.move('right',40,true,.05);this.move('left',40,true,.05);this.move('right',20,true,.05);};YAHOO.ext.Actor.prototype.bounce=function(){this.move('up',20,true,.05);this.move('down',40,true,.05);this.move('up',40,true,.05);this.move('down',20,true,.05);};YAHOO.ext.Actor.prototype.blindShow=function(anchor,newSize,duration,easing){var size=newSize||this.getSize();this.clip();this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +this.unclip();return size;};YAHOO.ext.Actor.prototype.blindHide=function(anchor,duration,easing){var size=this.getSize();this.clip();anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.animate({width:{to:1},points:{by:[this.getWidth(),0]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;case'b':case'bottom':this.animate({height:{to:1},points:{by:[0,this.getHeight()]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;} +return size;};YAHOO.ext.Actor.prototype.slideShow=function(anchor,newSize,duration,easing,clearPositioning){var size=newSize||this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindShow(anchor,newSize,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'r':case'right':this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +if(clearPositioning!==false){this.addCall(child.setPositioning,[pos],child);} +this.unclip();return size;};YAHOO.ext.Actor.prototype.slideHide=function(anchor,duration,easing){var size=this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindHide(anchor,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;} +this.addCall(child.setPositioning,[pos],child);return size;};YAHOO.ext.Actor.prototype.squish=function(duration){var size=this.getSize();this.clip();this.setSize(1,1,true,duration||.5);this.setVisible(false);return size;};YAHOO.ext.Actor.prototype.appear=function(duration){this.setVisible(true,true,duration);};YAHOO.ext.Actor.prototype.fade=function(duration){this.setVisible(false,true,duration);};YAHOO.ext.Actor.prototype.switchOff=function(duration){this.clip();this.setVisible(false,true,.1);this.clearOpacity();this.setVisible(true);this.animate({height:{to:1},points:{by:[0,this.getHeight()/2]}},duration||.5,null,YAHOO.util.Easing.easeOut,YAHOO.util.Motion);this.setVisible(false);};YAHOO.ext.Actor.prototype.highlight=function(color,fromColor,duration,attribute){attribute=attribute||'background-color';var original=this.getStyle(attribute);fromColor=fromColor||((original&&original!=''&&original!='transparent')?original:'#FFFFFF');var cfg={};cfg[attribute]={to:color,from:fromColor};this.setVisible(true);this.animate(cfg,duration||.5,null,YAHOO.util.Easing.bounceOut,YAHOO.util.ColorAnim);this.setStyle(attribute,original);};YAHOO.ext.Actor.prototype.pulsate=function(count,duration){count=count||3;for(var i=0;i0){animFn.defer((duration/2)*1000,this);}else{if(typeof callback=='function'){callback();}}} +animFn.call(this);} +this.addAsyncCall(frameFn,0,null,this);};YAHOO.ext.Actor.Action=function(actor,method,args){this.actor=actor;this.method=method;this.args=args;} +YAHOO.ext.Actor.Action.prototype={play:function(onComplete){this.method.apply(this.actor||window,this.args);onComplete();}};YAHOO.ext.Actor.AsyncAction=function(actor,method,args,onIndex){YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this,actor,method,args);this.onIndex=onIndex;this.originalCallback=this.args[onIndex];} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction,YAHOO.ext.Actor.Action);YAHOO.ext.Actor.AsyncAction.prototype.play=function(onComplete){var callbackArg=this.originalCallback?this.originalCallback.createSequence(onComplete):onComplete;this.args[this.onIndex]=callbackArg;this.method.apply(this.actor,this.args);};YAHOO.ext.Actor.PauseAction=function(seconds){this.seconds=seconds;};YAHOO.ext.Actor.PauseAction.prototype={play:function(onComplete){setTimeout(onComplete,this.seconds*1000);}}; + +YAHOO.ext.Animator=function(){this.actors=[];this.playlist=new YAHOO.ext.Animator.AnimSequence();this.captureDelegate=this.capture.createDelegate(this);this.playDelegate=this.play.createDelegate(this);this.syncing=false;this.stopping=false;this.playing=false;for(var i=0;i=this.sequences.length&&this.onComplete){this.onComplete();}},stop:function(){for(var i=0;i0){if(m>(inc/2)){newValue=value+(inc-m);}else{newValue=value-m;}} +return Math.max(min,newValue);},resizeElement:function(){var box=this.proxy.getBox();this.el.setBox(box,false,this.animate,this.duration,null,this.easing);this.updateChildSize();this.proxy.hide();return box;},constrain:function(v,diff,m,mx){if(v-diffmx){diff=mx-v;} +return diff;},onMouseMove:function(e){if(this.enabled){try{var curSize=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=curSize.width,h=curSize.height;var ow=w,oh=h;var mw=this.minWidth,mh=this.minHeight;var mxw=this.maxWidth,mxh=this.maxHeight;var wi=this.widthIncrement;var hi=this.heightIncrement;var eventXY=e.getXY();var diffX=-(this.startPoint[0]-Math.max(this.minX,eventXY[0]));var diffY=-(this.startPoint[1]-Math.max(this.minY,eventXY[1]));var pos=this.activeHandle.position;switch(pos){case'east':w+=diffX;w=Math.min(Math.max(mw,w),mxw);break;case'south':h+=diffY;h=Math.min(Math.max(mh,h),mxh);break;case'southeast':w+=diffX;h+=diffY;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case'north':diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'west':diffX=this.constrain(w,diffX,mw,mxw);x+=diffX;w-=diffX;break;case'northeast':w+=diffX;w=Math.min(Math.max(mw,w),mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'northwest':diffX=this.constrain(w,diffX,mw,mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;x+=diffX;w-=diffX;break;case'southwest':diffX=this.constrain(w,diffX,mw,mxw);h+=diffY;h=Math.min(Math.max(mh,h),mxh);x+=diffX;w-=diffX;break;} +var sw=this.snap(w,wi,mw);var sh=this.snap(h,hi,mh);if(sw!=w||sh!=h){switch(pos){case'northeast':y-=sh-h;break;case'north':y-=sh-h;break;case'southwest':x-=sw-w;break;case'west':x-=sw-w;break;case'northwest':x-=sw-w;y-=sh-h;break;} +w=sw;h=sh;} +if(this.preserveRatio){switch(pos){case'southeast':case'east':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);break;case'south':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'northeast':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'north':var tw=w;w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);x+=(tw-w)/2;break;case'southwest':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);var tw=w;w=ow*(h/oh);x+=tw-w;break;case'west':var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);y+=(th-h)/2;var tw=w;w=ow*(h/oh);x+=tw-w;break;case'northwest':var tw=w;var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);y+=th-h;x+=tw-w;break;}} +this.proxy.setBounds(x,y,w,h);if(this.dynamic){this.resizeElement();}}catch(e){}}},handleOver:function(){if(this.enabled){this.el.addClass('yresizable-over');}},handleOut:function(){if(!this.resizing){this.el.removeClass('yresizable-over');}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;}});YAHOO.ext.Resizable.positions={n:'north',s:'south',e:'east',w:'west',se:'southeast',sw:'southwest',nw:'northwest',ne:'northeast'};YAHOO.ext.Resizable.Handle=function(rz,pos,disableTrackOver,transparent){if(!this.tpl){var tpl=YAHOO.ext.DomHelper.createTemplate({tag:'div',cls:'yresizable-handle yresizable-handle-{0}',html:' '});tpl.compile();YAHOO.ext.Resizable.Handle.prototype.tpl=tpl;} +this.position=pos;this.rz=rz;this.el=this.tpl.append(rz.el.dom,[this.position],true);this.el.unselectable();if(transparent){this.el.setOpacity(0);} +this.el.mon('mousedown',this.onMouseDown,this,true);if(!disableTrackOver){this.el.mon('mouseover',this.onMouseOver,this,true);this.el.mon('mouseout',this.onMouseOut,this,true);}};YAHOO.ext.Resizable.Handle.prototype={afterResize:function(rz){},onMouseDown:function(e){this.rz.onMouseDown(this,e);},onMouseOver:function(e){this.rz.handleOver(this,e);},onMouseOut:function(e){this.rz.handleOut(this,e);}}; + +if(YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr.clickTimeThresh=350;} +YAHOO.ext.SplitBar=function(dragElement,resizingElement,orientation,placement){this.el=YAHOO.ext.Element.get(dragElement,true);this.el.dom.unselectable='on';this.resizingEl=YAHOO.ext.Element.get(resizingElement,true);this.orientation=orientation||YAHOO.ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.onMoved=new YAHOO.util.CustomEvent("SplitBarMoved",this);this.animate=false;this.useShim=false;this.shim=null;this.proxy=YAHOO.ext.SplitBar.createProxy(this.orientation);this.dd=new YAHOO.util.DDProxy(this.el.dom.id,"SplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.placement=placement||(this.el.getX()>this.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; + +YAHOO.ext.LayoutManager=function(container){YAHOO.ext.LayoutManager.superclass.constructor.call(this);this.el=getEl(container,true);this.id=this.el.id;this.el.addClass('ylayout-container');this.monitorWindowResize=true;this.regions={};this.events={'layout':new YAHOO.util.CustomEvent(),'regionresized':new YAHOO.util.CustomEvent(),'regioncollapsed':new YAHOO.util.CustomEvent(),'regionexpanded':new YAHOO.util.CustomEvent()};this.updating=false;YAHOO.ext.EventManager.onWindowResize(this.onWindowResize,this,true);};YAHOO.extendX(YAHOO.ext.LayoutManager,YAHOO.ext.util.Observable,{isUpdating:function(){return this.updating;},beginUpdate:function(){this.updating=true;},endUpdate:function(noLayout){this.updating=false;if(!noLayout){this.layout();}},layout:function(){},onRegionResized:function(region,newSize){this.fireEvent('regionresized',region,newSize);this.layout();},onRegionCollapsed:function(region){this.fireEvent('regioncollapsed',region);},onRegionExpanded:function(region){this.fireEvent('regionexpanded',region);},getViewSize:function(){var size;if(this.el.dom!=document.body){this.el.beginMeasure();size=this.el.getSize();this.el.endMeasure();}else{size={width:YAHOO.util.Dom.getViewportWidth(),height:YAHOO.util.Dom.getViewportHeight()};} +size.width-=this.el.getBorderWidth('lr')-this.el.getPadding('lr');size.height-=this.el.getBorderWidth('tb')-this.el.getPadding('tb');return size;},getEl:function(){return this.el;},getRegion:function(target){return this.regions[target];},onWindowResize:function(){if(this.monitorWindowResize){this.layout();}}}); + +YAHOO.ext.LayoutRegion=function(mgr,config,pos){this.mgr=mgr;this.position=pos;var dh=YAHOO.ext.DomHelper;this.el=dh.append(mgr.el.dom,{tag:'div',cls:'ylayout-panel ylayout-panel-'+this.position},true);this.titleEl=dh.append(this.el.dom,{tag:'div',unselectable:'on',cls:'yunselectable ylayout-panel-hd ylayout-title-'+this.position,children:[{tag:'span',cls:'yunselectable ylayout-panel-hd-text',unselectable:'on',html:' '},{tag:'div',cls:'yunselectable ylayout-panel-hd-tools',unselectable:'on'}]},true);this.titleEl.enableDisplayMode();this.titleTextEl=this.titleEl.dom.firstChild;this.tools=getEl(this.titleEl.dom.childNodes[1],true);this.closeBtn=this.createTool(this.tools.dom,'ylayout-close');this.closeBtn.enableDisplayMode();this.closeBtn.on('click',this.closeClicked,this,true);this.closeBtn.hide();this.bodyEl=dh.append(this.el.dom,{tag:'div',cls:'ylayout-panel-body'},true);this.events={'invalidated':new YAHOO.util.CustomEvent('invalidated'),'visibilitychange':new YAHOO.util.CustomEvent('visibilitychange'),'paneladded':new YAHOO.util.CustomEvent('paneladded'),'panelremoved':new YAHOO.util.CustomEvent('panelremoved'),'collapsed':new YAHOO.util.CustomEvent('collapsed'),'expanded':new YAHOO.util.CustomEvent('expanded'),'panelactivated':new YAHOO.util.CustomEvent('panelactivated'),'resized':new YAHOO.util.CustomEvent('resized')};this.panels=new YAHOO.ext.util.MixedCollection();this.panels.getKey=this.getPanelId.createDelegate(this);this.box=null;this.visible=false;this.collapsed=false;this.hide();this.on('paneladded',this.validateVisibility,this,true);this.on('panelremoved',this.validateVisibility,this,true);this.activePanel=null;this.applyConfig(config);};YAHOO.extendX(YAHOO.ext.LayoutRegion,YAHOO.ext.util.Observable,{getPanelId:function(p){return p.getId();},applyConfig:function(config){if(config.collapsible&&this.position!='center'&&!this.collapsedEl){var dh=YAHOO.ext.DomHelper;this.collapseBtn=this.createTool(this.tools.dom,'ylayout-collapse-'+this.position);this.collapseBtn.mon('click',this.collapse,this,true);this.collapsedEl=dh.append(this.mgr.el.dom,{tag:'div',cls:'ylayout-collapsed ylayout-collapsed-'+this.position,children:[{tag:'div',cls:'ylayout-collapsed-tools'}]},true);if(config.floatable!==false){this.collapsedEl.addClassOnOver('ylayout-collapsed-over');this.collapsedEl.mon('click',this.collapseClick,this,true);} +this.expandBtn=this.createTool(this.collapsedEl.dom.firstChild,'ylayout-expand-'+this.position);this.expandBtn.mon('click',this.expand,this,true);} +if(this.collapseBtn){this.collapseBtn.setVisible(config.collapsible==true);} +this.cmargins=config.cmargins||this.cmargins||(this.position=='west'||this.position=='east'?{top:0,left:2,right:2,bottom:0}:{top:2,left:0,right:0,bottom:2});this.margins=config.margins||this.margins||{top:0,left:0,right:0,bottom:0};this.bottomTabs=config.tabPosition!='top';this.autoScroll=config.autoScroll||false;if(this.autoScroll){this.bodyEl.setStyle('overflow','auto');}else{this.bodyEl.setStyle('overflow','hidden');} +if((!config.titlebar&&!config.title)||config.titlebar===false){this.titleEl.hide();}else{this.titleEl.show();if(config.title){this.titleTextEl.innerHTML=config.title;}} +this.duration=config.duration||.30;this.slideDuration=config.slideDuration||.45;this.config=config;if(config.collapsed){this.collapse(true);}},resizeTo:function(newSize){switch(this.position){case'east':case'west':this.el.setWidth(newSize);this.fireEvent('resized',this,newSize);break;case'north':case'south':this.el.setHeight(newSize);this.fireEvent('resized',this,newSize);break;}},getBox:function(){var b;if(!this.collapsed){b=this.el.getBox(false,true);}else{b=this.collapsedEl.getBox(false,true);} +return b;},getMargins:function(){return this.collapsed?this.cmargins:this.margins;},highlight:function(){this.el.addClass('ylayout-panel-dragover');},unhighlight:function(){this.el.removeClass('ylayout-panel-dragover');},updateBox:function(box){this.box=box;if(!this.collapsed){this.el.dom.style.left=box.x+'px';this.el.dom.style.top=box.y+'px';this.el.setSize(box.width,box.height);var bodyHeight=this.config.titlebar?box.height-(this.titleEl.getHeight()||0):box.height;bodyHeight-=this.el.getBorderWidth('tb');bodyWidth=box.width-this.el.getBorderWidth('rl');this.bodyEl.setHeight(bodyHeight);this.bodyEl.setWidth(bodyWidth);var tabHeight=bodyHeight;if(this.tabs){tabHeight=this.tabs.syncHeight(bodyHeight);if(YAHOO.ext.util.Browser.isIE)this.tabs.el.repaint();} +this.panelSize={width:bodyWidth,height:tabHeight};if(this.activePanel){this.activePanel.setSize(bodyWidth,tabHeight);}}else{this.collapsedEl.dom.style.left=box.x+'px';this.collapsedEl.dom.style.top=box.y+'px';this.collapsedEl.setSize(box.width,box.height);} +if(this.tabs){this.tabs.autoSizeTabs();}},getEl:function(){return this.el;},hide:function(){if(!this.collapsed){this.el.dom.style.left='-2000px';this.el.hide();}else{this.collapsedEl.dom.style.left='-2000px';this.collapsedEl.hide();} +this.visible=false;this.fireEvent('visibilitychange',this,false);},show:function(){if(!this.collapsed){this.el.show();}else{this.collapsedEl.show();} +this.visible=true;this.fireEvent('visibilitychange',this,true);},isVisible:function(){return this.visible;},closeClicked:function(){if(this.activePanel){this.remove(this.activePanel);}},collapseClick:function(e){if(this.isSlid){e.stopPropagation();this.slideIn();}else{e.stopPropagation();this.slideOut();}},collapse:function(skipAnim){if(this.collapsed)return;this.collapsed=true;if(this.split){this.split.el.hide();} +if(this.config.animate&&skipAnim!==true){this.animateCollapse();}else{this.el.setLocation(-20000,-20000);this.el.hide();this.collapsedEl.show();this.fireEvent('collapsed',this);} +this.fireEvent('invalidated',this);},animateCollapse:function(){},expand:function(e,skipAnim){if(e)e.stopPropagation();if(!this.collapsed)return;if(this.isSlid){this.slideIn(this.expand.createDelegate(this));return;} +this.collapsed=false;this.el.show();if(this.config.animate&&skipAnim!==true){this.animateExpand();}else{if(this.split){this.split.el.show();} +this.collapsedEl.setLocation(-2000,-2000);this.collapsedEl.hide();this.fireEvent('invalidated',this);this.fireEvent('expanded',this);}},animateExpand:function(){},initTabs:function(){this.bodyEl.setStyle('overflow','hidden');var ts=new YAHOO.ext.TabPanel(this.bodyEl.dom,this.bottomTabs);this.tabs=ts;ts.resizeTabs=this.config.resizeTabs===true;ts.minTabWidth=this.config.minTabWidth||40;ts.maxTabWidth=this.config.maxTabWidth||250;ts.preferredTabWidth=this.config.preferredTabWidth||150;ts.monitorResize=false;ts.bodyEl.setStyle('overflow',this.config.autoScroll?'auto':'hidden');this.panels.each(this.initPanelAsTab,this);},initPanelAsTab:function(panel){var ti=this.tabs.addTab(panel.getEl().id,panel.getTitle(),null,this.config.closeOnTab&&panel.isClosable());ti.on('activate',function(){this.setActivePanel(panel);},this,true);if(this.config.closeOnTab){ti.on('beforeclose',function(t,e){e.cancel=true;this.remove(panel);},this,true);} +return ti;},updatePanelTitle:function(panel,title){if(this.activePanel==panel){this.updateTitle(title);} +if(this.tabs){this.tabs.getTab(panel.getEl().id).setText(title);}},updateTitle:function(title){if(this.titleTextEl&&!this.config.title){this.titleTextEl.innerHTML=(typeof title!='undefined'&&title.length>0?title:" ");}},setActivePanel:function(panel){panel=this.getPanel(panel);if(this.activePanel&&this.activePanel!=panel){this.activePanel.setActiveState(false);} +this.activePanel=panel;panel.setActiveState(true);if(this.panelSize){panel.setSize(this.panelSize.width,this.panelSize.height);} +this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&panel.isClosable());this.updateTitle(panel.getTitle());this.fireEvent('panelactivated',this,panel);},showPanel:function(panel){if(panel=this.getPanel(panel)){if(this.tabs){this.tabs.activate(panel.getEl().id);}else{this.setActivePanel(panel);}} +return panel;},getActivePanel:function(){return this.activePanel;},validateVisibility:function(){if(this.panels.getCount()<1){this.updateTitle(' ');this.closeBtn.hide();this.hide();}else{if(!this.isVisible()){this.show();}}},add:function(panel){if(arguments.length>1){for(var i=0,len=arguments.length;i0){this.body.addClass(this.tabPosition=='bottom'?'ytabs-bottom':'ytabs-top');this.tabs=new YAHOO.ext.TabPanel(this.body.dom,this.tabPosition=='bottom');for(var i=0,len=tabEls.length;i
         {0} 
        ');} +var btn=this.buttonTemplate.append(this.footer.dom,[config],true);var tbl=getEl(btn.dom.firstChild,true);if(this.minButtonWidth){if(tbl.getWidth()vw){x=vw-w;moved=true;} +if(y+h>vh){y=vh-h;moved=true;} +if(x<0){x=0;moved=true;} +if(y<0){y=0;moved=true;} +if(moved){this.xy=[x,y];if(this.isVisible()){this.el.setLocation(x,y);this.adjustAssets();}}}},onDrag:function(){if(!this.proxyDrag){this.xy=this.el.getXY();this.adjustAssets();}},adjustAssets:function(doShow){var x=this.xy[0],y=this.xy[1];var w=this.size.width,h=this.size.height;if(doShow===true){if(this.shadow){this.shadow.show();} +if(this.shim){this.shim.show();}} +if(this.shadow&&this.shadow.isVisible()){this.shadow.setBounds(x+this.shadowOffset,y+this.shadowOffset,w,h);} +if(this.shim&&this.shim.isVisible()){this.shim.setBounds(x,y,w,h);}},adjustViewport:function(w,h){if(!w||!h){w=YAHOO.util.Dom.getViewportWidth();h=YAHOO.util.Dom.getViewportHeight();} +this.viewSize=[w,h];if(this.modal&&this.mask.isVisible()){this.mask.setSize(w,h);this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(),YAHOO.util.Dom.getDocumentHeight());} +if(this.isVisible()){this.constrainXY();}},destroy:function(removeEl){YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport,this);if(this.tabs){this.tabs.destroy(removeEl);} +if(removeEl===true){this.el.update('');this.el.remove();} +YAHOO.ext.DialogManager.unregister(this);},startMove:function(){if(this.proxyDrag){this.proxy.show();} +if(this.constraintoviewport!==false){this.dd.constrainTo(document.body,{right:this.shadowOffset,bottom:this.shadowOffset});}},endMove:function(){if(!this.proxyDrag){YAHOO.util.DD.prototype.endDrag.apply(this.dd,arguments);}else{YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd,arguments);this.proxy.hide();} +this.refreshSize();this.adjustAssets();this.fireEvent('move',this,this.xy[0],this.xy[1])},toFront:function(){YAHOO.ext.DialogManager.bringToFront(this);return this;},toBack:function(){YAHOO.ext.DialogManager.sendToBack(this);return this;},center:function(){this.moveTo(this.el.getCenterXY(true));return this;},moveTo:function(x,y){this.xy=[x,y];if(this.isVisible()){this.el.setXY(this.xy);this.adjustAssets();} +return this;},isVisible:function(){return this.el.isVisible();},hide:function(callback){if(this.fireEvent('beforehide',this)===false) +return;if(this.shadow){this.shadow.hide();} +if(this.animateTarget){var b=getEl(this.animateTarget,true).getBox();this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height);this.el.hide();this.proxy.setBounds(b.x,b.y,b.width,b.height,true,.35,this.hideEl.createDelegate(this,[callback]));}else{this.el.hide();this.hideEl(callback);} +return this;},hideEl:function(callback){this.proxy.hide();if(this.modal){this.mask.hide();YAHOO.util.Dom.removeClass(document.body,'masked');} +this.fireEvent('hide',this);if(typeof callback=='function'){callback();}},hideAction:function(){this.setLeft('-10000px');this.setTop('-10000px');this.setStyle('visibility','hidden');},refreshSize:function(){this.size=this.el.getSize();this.xy=this.el.getXY();YAHOO.ext.state.Manager.set(this.el.id+'-state',this.el.getBox());},setZIndex:function(index){if(this.modal){this.mask.setStyle('z-index',index);} +if(this.shadow){this.shadow.setStyle('z-index',++index);} +if(this.shim){this.shim.setStyle('z-index',++index);} +this.el.setStyle('z-index',++index);if(this.proxy){this.proxy.setStyle('z-index',++index);} +if(this.resizer){this.resizer.proxy.setStyle('z-index',++index);} +this.lastZIndex=index;},getEl:function(){return this.el;}});YAHOO.ext.DialogManager=function(){var list={};var accessList=[];var front=null;var sortDialogs=function(d1,d2){return(!d1._lastAccess||d1._lastAccess=this.nodes.length-1){this.el.update('');}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){el.removeChild(this.nodes[startIndex]);} +this.updateIndexes(startIndex);}},insertNodes:function(dm,startIndex,endIndex){if(this.nodes.length==0){this.refresh();}else{this.clearSelections();var t=this.tpl;var before=this.nodes[startIndex];var dm=this.dataModel;if(before){for(var i=startIndex;i<=endIndex;i++){t.insertBefore(before,this.prepareData(dm.getRow(i),i));}}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){t.append(el,this.prepareData(dm.getRow(i),i));}} +this.updateIndexes(startIndex);}},updateIndexes:function(dm,startIndex,endIndex){var ns=this.nodes;startIndex=startIndex||0;endIndex=endIndex||ns.length-1;for(var i=startIndex;i<=endIndex;i++){ns[i].nodeIndex=i;}},setDataModel:function(dm){if(!dm)return;this.unplugDataModel(this.dataModel);this.dataModel=dm;dm.on('cellupdated',this.refreshNode,this,true);dm.on('datachanged',this.refresh,this,true);dm.on('rowsdeleted',this.deleteNodes,this,true);dm.on('rowsinserted',this.insertNodes,this,true);dm.on('rowsupdated',this.refreshNodes,this,true);dm.on('rowssorted',this.refresh,this,true);this.refresh();},unplugDataModel:function(dm){if(!dm)return;dm.removeListener('cellupdated',this.refreshNode,this);dm.removeListener('datachanged',this.refresh,this);dm.removeListener('rowsdeleted',this.deleteNodes,this);dm.removeListener('rowsinserted',this.insertNodes,this);dm.removeListener('rowsupdated',this.refreshNodes,this);dm.removeListener('rowssorted',this.refresh,this);this.dataModel=null;},findItemFromChild:function(node){var el=this.el.dom;if(!node||node.parentNode==el){return node;} +var p=node.parentNode;while(p&&p!=el){if(p.parentNode==el){return p;} +p=p.parentNode;} +return null;},onClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){var index=this.indexOf(item);this.onItemClick(item,index,e);this.fireEvent('click',this,index,item,e);}else{this.clearSelections();}},onContextMenu:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('contextmenu',this,this.indexOf(item),item,e);}},onDblClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('dblclick',this,this.indexOf(item),item,e);}},onItemClick:function(item,index,e){if(this.multiSelect||this.singleSelect){if(this.multiSelect&&e.shiftKey&&this.lastSelection){this.select(this.getNodes(this.indexOf(this.lastSelection),index),false);}else{this.select(item,this.multiSelect&&e.ctrlKey);this.lastSelection=item;}}},getSelectionCount:function(){return this.selections.length;},getSelectedNodes:function(){return this.selections;},getSelectedIndexes:function(){var indexes=[];for(var i=0,len=this.selections.length;i-1);this.isSafari=(ua.indexOf('webkit')>-1);this.isIE=(window.ActiveXObject);this.isIE7=(ua.indexOf('msie 7')>-1);this.isGecko=!this.isSafari&&(ua.indexOf('gecko')>-1);if(ua.indexOf("windows")!=-1||ua.indexOf("win32")!=-1){this.isWindows=true;}else if(ua.indexOf("macintosh")!=-1){this.isMac=true;}}();YAHOO.print=function(arg1,arg2,etc){if(!YAHOO.ext._console){var cs=YAHOO.ext.DomHelper.insertBefore(document.body.firstChild,{tag:'div',style:'width:250px;height:350px;overflow:auto;border:3px solid #c3daf9;'+'background:white;position:absolute;right:5px;top:5px;'+'font:normal 8pt arial,verdana,helvetica;z-index:50000;padding:5px;'},true);new YAHOO.ext.Resizable(cs,{transparent:true,handles:'all',pinned:true,adjustments:[0,0],wrap:true,draggable:(YAHOO.util.DD?true:false)});cs.on('dblclick',cs.hide);YAHOO.ext._console=cs;} +var msg='';for(var i=0,len=arguments.length;i';} +YAHOO.ext._console.dom.innerHTML=msg+YAHOO.ext._console.dom.innerHTML;YAHOO.ext._console.dom.scrollTop=0;YAHOO.ext._console.show();};YAHOO.printf=function(format,arg1,arg2,etc){var args=Array.prototype.slice.call(arguments,1);YAHOO.print(format.replace(/\{\{[^{}]*\}\}|\{(\d+)(,\s*([\w.]+))?\}/g,function(m,a1,a2,a3){if(m.chatAt=='{'){return m.slice(1,-1);} +var rpl=args[a1];if(a3){var f=eval(a3);rpl=f(rpl);} +return rpl?rpl:'';}));} +YAHOO.util.CustomEvent.prototype.fireDirect=function(){var len=this.subscribers.length;for(var i=0;i1||objs instanceof Array){var args=arguments.length>1?arguments:objs;for(var i=0,len=args.length;i=this.items.length){return this.add(o,key);} +this.items.splice(index,0,o);if(typeof key!='undefined'&&key!=null){this.items[key]=o;this.keys.splice(index,0,key);} +this.fireEvent('add',index,o,key);return o;},remove:function(o){var index=this.indexOf(o);this.items.splice(index,1);if(typeof this.keys[index]!='undefined'){var key=this.keys[index];this.keys.splice(index,1);delete this.items[key];} +this.fireEvent('remove',o);return o;},removeAt:function(index){this.items.splice(index,1);var key=this.keys[index];if(typeof key!='undefined'){this.keys.splice(index,1);delete this.items[key];} +this.fireEvent('remove',o,key);},removeKey:function(key){var o=this.items[key];var index=this.indexOf(o);this.items.splice(index,1);this.keys.splice(index,1);delete this.items[key];this.fireEvent('remove',o,key);},getCount:function(){return this.items.length;},indexOf:function(o){if(!this.items.indexOf){for(var i=0,len=this.items.length;i-1){property=convert(property);} +return property;};this.getRules=function(refreshCache){if(rules==null||refreshCache){rules={};var ds=document.styleSheets;for(var i=0,len=ds.length;i=0;--j){rules[ssRules[j].selectorText]=ssRules[j];}}catch(e){}}} +return rules;};this.getRule=function(selector,refreshCache){var rs=this.getRules(refreshCache);if(!(selector instanceof Array)){return rs[selector];} +for(var i=0;i');} +return results;},show:function(){alert(this.toString());}}; + +YAHOO.ext.DomHelper=new function(){var d=document;var tempTableEl=null;this.useDom=false;var emptyTags=/^(?:base|basefont|br|frame|hr|img|input|isindex|link|meta|nextid|range|spacer|wbr|audioscope|area|param|keygen|col|limittext|spot|tab|over|right|left|choose|atop|of)$/i;this.applyStyles=function(el,styles){if(styles){var D=YAHOO.util.Dom;if(typeof styles=="string"){var re=/\s?([a-z\-]*)\:([^;]*);?/gi;var matches;while((matches=re.exec(styles))!=null){D.setStyle(el,matches[1],matches[2]);}}else if(typeof styles=="object"){for(var style in styles){D.setStyle(el,style,styles[style]);}}else if(typeof styles=="function"){YAHOO.ext.DomHelper.applyStyles(el,styles.call());}}};var createHtml=function(o){var b='';b+='<'+o.tag;for(var attr in o){if(attr=='tag'||attr=='children'||attr=='html'||typeof o[attr]=='function')continue;if(attr=='style'){var s=o['style'];if(typeof s=='function'){s=s.call();} +if(typeof s=='string'){b+=' style="'+s+'"';}else if(typeof s=='object'){b+=' style="';for(var key in s){if(typeof s[key]!='function'){b+=key+':'+s[key]+';';}} +b+='"';}}else{if(attr=='cls'){b+=' class="'+o['cls']+'"';}else if(attr=='htmlFor'){b+=' for="'+o['htmlFor']+'"';}else{b+=' '+attr+'="'+o[attr]+'"';}}} +if(emptyTags.test(o.tag)){b+=' />';}else{b+='>';if(o.children){for(var i=0,len=o.children.length;i';} +return b;} +var createDom=function(o,parentNode){var el=d.createElement(o.tag);var useSet=el.setAttribute?true:false;for(var attr in o){if(attr=='tag'||attr=='children'||attr=='html'||attr=='style'||typeof o[attr]=='function')continue;if(attr=='cls'){el.className=o['cls'];}else{if(useSet)el.setAttribute(attr,o[attr]);else el[attr]=o[attr];}} +YAHOO.ext.DomHelper.applyStyles(el,o.style);if(o.children){for(var i=0,len=o.children.length;i'+html+'';node=tempTableEl.firstChild.firstChild.firstChild;}else{tempTableEl.innerHTML=''+html+'
        ';node=tempTableEl.firstChild.firstChild.firstChild.firstChild;} +if(where=='beforebegin'){el.parentNode.insertBefore(node,el);return node;}else if(where=='afterbegin'){el.insertBefore(node,el.firstChild);return node;}else if(where=='beforeend'){el.appendChild(node);return node;}else if(where=='afterend'){el.parentNode.insertBefore(node,el.nextSibling);return node;}} +this.insertHtml=function(where,el,html){where=where.toLowerCase();if(el.insertAdjacentHTML){var tag=el.tagName.toLowerCase();if(tag=='table'||tag=='tbody'||tag=='tr'){return insertIntoTable(tag,where,el,html);} +switch(where){case'beforebegin':el.insertAdjacentHTML(where,html);return el.previousSibling;case'afterbegin':el.insertAdjacentHTML(where,html);return el.firstChild;case'beforeend':el.insertAdjacentHTML(where,html);return el.lastChild;case'afterend':el.insertAdjacentHTML(where,html);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';} +var range=el.ownerDocument.createRange();var frag;switch(where){case'beforebegin':range.setStartBefore(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el);return el.previousSibling;case'afterbegin':if(el.firstChild){range.setStartBefore(el.firstChild);}else{range.selectNodeContents(el);range.collapse(true);} +frag=range.createContextualFragment(html);el.insertBefore(frag,el.firstChild);return el.firstChild;case'beforeend':if(el.lastChild){range.setStartAfter(el.lastChild);}else{range.selectNodeContents(el);range.collapse(false);} +frag=range.createContextualFragment(html);el.appendChild(frag);return el.lastChild;case'afterend':range.setStartAfter(el);frag=range.createContextualFragment(html);el.parentNode.insertBefore(frag,el.nextSibling);return el.nextSibling;} +throw'Illegal insertion point -> "'+where+'"';};this.insertBefore=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el);}else{var html=createHtml(o);newNode=this.insertHtml('beforeBegin',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.insertAfter=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.parentNode.insertBefore(newNode,el.nextSibling);}else{var html=createHtml(o);newNode=this.insertHtml('afterEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.append=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);var newNode;if(this.useDom){newNode=createDom(o,null);el.appendChild(newNode);}else{var html=createHtml(o);newNode=this.insertHtml('beforeEnd',el,html);} +return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;};this.overwrite=function(el,o,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML=createHtml(o);return returnElement?YAHOO.ext.Element.get(el.firstChild,true):el.firstChild;};this.createTemplate=function(o){var html=createHtml(o);return new YAHOO.ext.DomHelper.Template(html);};}();YAHOO.ext.DomHelper.Template=function(html){this.html=html;this.re=/\{(\w+)\}/g;};YAHOO.ext.DomHelper.Template.prototype={applyTemplate:function(values){if(this.compiled){return this.compiled(values);} +var empty='';var fn=function(match,index){if(typeof values[index]!='undefined'){return values[index];}else{return empty;}} +return this.html.replace(this.re,fn);},compile:function(){var html=this.html;var re=/\{(\w+)\}/g;var body=[];body.push("this.compiled = function(values){ return [");var result;var lastMatchEnd=0;while((result=re.exec(html))!=null){body.push("'",html.substring(lastMatchEnd,result.index),"', ");body.push("values['",html.substring(result.index+1,re.lastIndex-1),"'], ");lastMatchEnd=re.lastIndex;} +body.push("'",html.substr(lastMatchEnd),"'].join('');};");eval(body.join(''));},insertBefore:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeBegin',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},insertAfter:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('afterEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},append:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;},overwrite:function(el,values,returnElement){el=YAHOO.util.Dom.get(el);el.innerHTML='';var newNode=YAHOO.ext.DomHelper.insertHtml('beforeEnd',el,this.applyTemplate(values));return returnElement?YAHOO.ext.Element.get(newNode,true):newNode;}};YAHOO.ext.Template=YAHOO.ext.DomHelper.Template; + +YAHOO.ext.Element=function(element,forceNew){var dom=YAHOO.util.Dom.get(element);if(!dom){return null;} +if(!forceNew&&YAHOO.ext.Element.cache[dom.id]){return YAHOO.ext.Element.cache[dom.id];} +this.dom=dom;this.id=this.dom.id;this.visibilityMode=YAHOO.ext.Element.VISIBILITY;this.originalDisplay=YAHOO.util.Dom.getStyle(this.dom,'display')||'';if(this.autoDisplayMode){if(this.originalDisplay=='none'){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);}} +if(this.originalDisplay=='none'){this.originalDisplay='';} +this.defaultUnit='px';} +YAHOO.ext.Element.prototype={setVisibilityMode:function(visMode){this.visibilityMode=visMode;return this;},enableDisplayMode:function(display){this.setVisibilityMode(YAHOO.ext.Element.DISPLAY);if(typeof display!='undefined')this.originalDisplay=display;return this;},animate:function(args,duration,onComplete,easing,animType){this.anim(args,duration,onComplete,easing,animType);return this;},anim:function(args,duration,onComplete,easing,animType){animType=animType||YAHOO.util.Anim;var anim=new animType(this.dom,args,duration||.35,easing||YAHOO.util.Easing.easeBoth);if(onComplete){if(!(onComplete instanceof Array)){anim.onComplete.subscribe(onComplete,this,true);}else{for(var i=0;icontainerBottom){c.scrollTop=childBottom-c.clientHeight;} +if(restorePos){c.setStyle('position',cp);} +return this;},autoHeight:function(animate,duration,onComplete,easing){var oldHeight=this.getHeight();this.clip();this.setHeight(1);setTimeout(function(){var height=parseInt(this.dom.scrollHeight,10);if(!animate){this.setHeight(height);this.unclip();if(typeof onComplete=='function'){onComplete();}}else{this.setHeight(oldHeight);this.setHeight(height,animate,duration,function(){this.unclip();if(typeof onComplete=='function')onComplete();}.createDelegate(this),easing);}}.createDelegate(this),0);return this;},isVisible:function(deep){var vis=YAHOO.util.Dom.getStyle(this.dom,'visibility')!='hidden'&&YAHOO.util.Dom.getStyle(this.dom,'display')!='none';if(!deep||!vis){return vis;} +var p=this.dom.parentNode;while(p&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'visibility')=='hidden'||YAHOO.util.Dom.getStyle(p,'display')=='none'){return false;} +p=p.parentNode;} +return true;},select:function(selector,unique){return YAHOO.ext.Element.select('#'+this.dom.id+' '+selector,unique);},initDD:function(group,config,overrides){var dd=new YAHOO.util.DD(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDProxy:function(group,config,overrides){var dd=new YAHOO.util.DDProxy(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},initDDTarget:function(group,config,overrides){var dd=new YAHOO.util.DDTarget(YAHOO.util.Dom.generateId(this.dom),group,config);return YAHOO.ext.util.Config.apply(dd,overrides);},setVisible:function(visible,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}else{this.setOpacity(visible?0:1);YAHOO.util.Dom.setStyle(this.dom,'visibility','visible');if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(true);} +var args={opacity:{from:(visible?0:1),to:(visible?1:0)}};var anim=new YAHOO.util.Anim(this.dom,args,duration||.35,easing||(visible?YAHOO.util.Easing.easeIn:YAHOO.util.Easing.easeOut));anim.onComplete.subscribe((function(){if(this.visibilityMode==YAHOO.ext.Element.DISPLAY){this.setDisplayed(visible);}else{YAHOO.util.Dom.setStyle(this.dom,'visibility',visible?'visible':'hidden');}}).createDelegate(this));if(onComplete){anim.onComplete.subscribe(onComplete);} +anim.animate();} +return this;},isDisplayed:function(){return YAHOO.util.Dom.getStyle(this.dom,'display')!='none';},toggle:function(animate,duration,onComplete,easing){this.setVisible(!this.isVisible(),animate,duration,onComplete,easing);return this;},setDisplayed:function(value){if(typeof value=='boolean'){value=value?this.originalDisplay:'none';} +YAHOO.util.Dom.setStyle(this.dom,'display',value);return this;},focus:function(){try{this.dom.focus();}catch(e){} +return this;},addClass:function(className){YAHOO.util.Dom.addClass(this.dom,className);return this;},radioClass:function(className){var siblings=this.dom.parentNode.childNodes;for(var i=0;ithis.getWidth()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setHeight:function(height,animate,duration,onComplete,easing){height=this.adjustHeight(height);if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'height',this.addUnits(height));}else{this.anim({height:{to:height}},duration,onComplete,easing||(height>this.getHeight()?YAHOO.util.Easing.easeOut:YAHOO.util.Easing.easeIn));} +return this;},setSize:function(width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({width:{to:width},height:{to:height}},duration,onComplete,easing);} +return this;},setBounds:function(x,y,width,height,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){this.setWidth(width);this.setHeight(height);this.setLocation(x,y);}else{width=this.adjustWidth(width);height=this.adjustHeight(height);this.anim({points:{to:[x,y]},width:{to:width},height:{to:height}},duration,onComplete,easing,YAHOO.util.Motion);} +return this;},setRegion:function(region,animate,duration,onComplete,easing){this.setBounds(region.left,region.top,region.right-region.left,region.bottom-region.top,animate,duration,onComplete,easing);return this;},addListener:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addHandler:function(eventName,stopPropagation,handler,scope,override){var fn=YAHOO.ext.Element.createStopHandler(stopPropagation,handler,scope||this,true);YAHOO.util.Event.addListener(this.dom,eventName,fn);return this;},on:function(eventName,handler,scope,override){YAHOO.util.Event.addListener(this.dom,eventName,handler,scope||this,true);return this;},addManagedListener:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},mon:function(eventName,fn,scope,override){return YAHOO.ext.EventManager.on(this.dom,eventName,fn,scope||this,true);},removeListener:function(eventName,handler,scope){YAHOO.util.Event.removeListener(this.dom,eventName,handler,scope||this);return this;},removeAllListeners:function(){YAHOO.util.Event.purgeElement(this.dom);return this;},setOpacity:function(opacity,animate,duration,onComplete,easing){if(!animate||!YAHOO.util.Anim){YAHOO.util.Dom.setStyle(this.dom,'opacity',opacity);}else{this.anim({opacity:{to:opacity}},duration,onComplete,easing);} +return this;},getLeft:function(local){if(!local){return this.getX();}else{return parseInt(this.getStyle('left'),10)||0;}},getRight:function(local){if(!local){return this.getX()+this.getWidth();}else{return(this.getLeft(true)+this.getWidth())||0;}},getTop:function(local){if(!local){return this.getY();}else{return parseInt(this.getStyle('top'),10)||0;}},getBottom:function(local){if(!local){return this.getY()+this.getHeight();}else{return(this.getTop(true)+this.getHeight())||0;}},setAbsolutePositioned:function(zIndex){this.setStyle('position','absolute');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},setRelativePositioned:function(zIndex){this.setStyle('position','relative');if(zIndex){this.setStyle('z-index',zIndex);} +return this;},clearPositioning:function(){this.setStyle('position','');this.setStyle('left','');this.setStyle('right','');this.setStyle('top','');this.setStyle('bottom','');return this;},getPositioning:function(){return{'position':this.getStyle('position'),'left':this.getStyle('left'),'right':this.getStyle('right'),'top':this.getStyle('top'),'bottom':this.getStyle('bottom')};},getBorderWidth:function(side){return this.addStyles(side,YAHOO.ext.Element.borders);},getPadding:function(side){return this.addStyles(side,YAHOO.ext.Element.paddings);},setPositioning:function(positionCfg){if(positionCfg.position)this.setStyle('position',positionCfg.position);if(positionCfg.left)this.setLeft(positionCfg.left);if(positionCfg.right)this.setRight(positionCfg.right);if(positionCfg.top)this.setTop(positionCfg.top);if(positionCfg.bottom)this.setBottom(positionCfg.bottom);return this;},setLeftTop:function(left,top){this.dom.style.left=this.addUnits(left);this.dom.style.top=this.addUnits(top);return this;},move:function(direction,distance,animate,duration,onComplete,easing){var xy=this.getXY();direction=direction.toLowerCase();switch(direction){case'l':case'left':this.moveTo(xy[0]-distance,xy[1],animate,duration,onComplete,easing);break;case'r':case'right':this.moveTo(xy[0]+distance,xy[1],animate,duration,onComplete,easing);break;case't':case'top':case'up':this.moveTo(xy[0],xy[1]-distance,animate,duration,onComplete,easing);break;case'b':case'bottom':case'down':this.moveTo(xy[0],xy[1]+distance,animate,duration,onComplete,easing);break;} +return this;},clip:function(){if(!this.isClipped){this.isClipped=true;this.originalClip={'o':this.getStyle('overflow'),'x':this.getStyle('overflow-x'),'y':this.getStyle('overflow-y')};this.setStyle('overflow','hidden');this.setStyle('overflow-x','hidden');this.setStyle('overflow-y','hidden');} +return this;},unclip:function(){if(this.isClipped){this.isClipped=false;var o=this.originalClip;if(o.o){this.setStyle('overflow',o.o);} +if(o.x){this.setStyle('overflow-x',o.x);} +if(o.y){this.setStyle('overflow-y',o.y);}} +return this;},alignTo:function(element,position,offsets,animate,duration,onComplete,easing){var otherEl=getEl(element);if(!otherEl){return this;} +offsets=offsets||[0,0];var r=otherEl.getRegion();position=position.toLowerCase();switch(position){case'bl':this.moveTo(r.left+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'br':this.moveTo(r.right+offsets[0],r.bottom+offsets[1],animate,duration,onComplete,easing);break;case'tl':this.moveTo(r.left+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;case'tr':this.moveTo(r.right+offsets[0],r.top+offsets[1],animate,duration,onComplete,easing);break;} +return this;},clearOpacity:function(){if(window.ActiveXObject){this.dom.style.filter='';}else{this.dom.style.opacity='';this.dom.style['-moz-opacity']='';this.dom.style['-khtml-opacity']='';} +return this;},hide:function(animate,duration,onComplete,easing){this.setVisible(false,animate,duration,onComplete,easing);return this;},show:function(animate,duration,onComplete,easing){this.setVisible(true,animate,duration,onComplete,easing);return this;},addUnits:function(size){if(size===''||size=='auto'||typeof size=='undefined'){return size;} +if(typeof size=='number'||!YAHOO.ext.Element.unitPattern.test(size)){return size+this.defaultUnit;} +return size;},beginMeasure:function(){var el=this.dom;if(el.offsetWidth||el.offsetHeight){return this;} +var changed=[];var p=this.dom;while((!el.offsetWidth&&!el.offsetHeight)&&p&&p.tagName&&p.tagName.toLowerCase()!='body'){if(YAHOO.util.Dom.getStyle(p,'display')=='none'){changed.push({el:p,visibility:YAHOO.util.Dom.getStyle(p,'visibility')});p.style.visibility='hidden';p.style.display='block';} +p=p.parentNode;} +this._measureChanged=changed;return this;},endMeasure:function(){var changed=this._measureChanged;if(changed){for(var i=0,len=changed.length;i';YAHOO.util.Event.onAvailable(id,function(){var hd=document.getElementsByTagName("head")[0];var re=/(?:)((\n|\r|.)*?)(?:<\/script>)/img;var srcRe=/\ssrc=[\'\"](.*)[\'\"]/i;var match;while(match=re.exec(html)){var srcMatch=match[0].match(srcRe);if(srcMatch&&srcMatch[1]){var s0=document.createElement("script");s0.src=srcMatch[1];hd.appendChild(s0);}else if(match[1]){eval(match[1]);}} +var el=document.getElementById(id);if(el){el.parentNode.removeChild(el);} +if(typeof callback=='function'){callback();}});dom.innerHTML=html.replace(/(?:)((\n|\r|.)*?)(?:<\/script>)/img,'');return this;},load:function(){var um=this.getUpdateManager();um.update.apply(um,arguments);return this;},getUpdateManager:function(){if(!this.updateManager){this.updateManager=new YAHOO.ext.UpdateManager(this);} +return this.updateManager;},unselectable:function(){this.dom.unselectable='on';this.swallowEvent('selectstart',true);this.applyStyles('-moz-user-select:none;-khtml-user-select:none;');return this;},getCenterXY:function(offsetScroll){var centerX=Math.round((YAHOO.util.Dom.getViewportWidth()-this.getWidth())/2);var centerY=Math.round((YAHOO.util.Dom.getViewportHeight()-this.getHeight())/2);if(!offsetScroll){return[centerX,centerY];}else{var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft||0;var scrollY=document.documentElement.scrollTop||document.body.scrollTop||0;return[centerX+scrollX,centerY+scrollY];}},center:function(centerIn){if(!centerIn){this.setXY(this.getCenterXY(true));}else{var box=YAHOO.ext.Element.get(centerIn).getBox();this.setXY([box.x+(box.width/2)-(this.getWidth()/2),box.y+(box.height/2)-(this.getHeight()/2)]);} +return this;},getChildrenByTagName:function(tagName){var children=this.dom.getElementsByTagName(tagName);var len=children.length;var ce=new Array(len);for(var i=0;i');YAHOO.util.Event.on('ie-deferred-loader','readystatechange',function(){if(this.readyState=='complete'){fireDocReady();}});}else if(YAHOO.ext.util.Browser.isSafari){docReadyProcId=setInterval(function(){var rs=document.readyState;if(rs=='loaded'||rs=='complete'){fireDocReady();}},10);} +YAHOO.util.Event.on(window,'load',fireDocReady);};this.wrap=function(fn,scope,override){var wrappedFn=function(e){YAHOO.ext.EventObject.setEvent(e);fn.call(override?scope||window:window,YAHOO.ext.EventObject,scope);};return wrappedFn;};this.addListener=function(element,eventName,fn,scope,override){var wrappedFn=this.wrap(fn,scope,override);YAHOO.util.Event.addListener(element,eventName,wrappedFn);return wrappedFn;};this.removeListener=function(element,eventName,wrappedFn){return YAHOO.util.Event.removeListener(element,eventName,wrappedFn);};this.on=this.addListener;this.onDocumentReady=function(fn,scope,override){if(!docReadyEvent){initDocReady();} +docReadyEvent.subscribe(fn,scope,override);} +this.onWindowResize=function(fn,scope,override){if(!resizeEvent){resizeEvent=new YAHOO.util.CustomEvent('windowresize');resizeTask=new YAHOO.ext.util.DelayedTask(function(){resizeEvent.fireDirect(YAHOO.util.Dom.getViewportWidth(),YAHOO.util.Dom.getViewportHeight());});YAHOO.util.Event.on(window,'resize',function(){resizeTask.delay(50);});} +resizeEvent.subscribe(fn,scope,override);},this.removeResizeListener=function(fn,scope){if(resizeEvent){resizeEvent.unsubscribe(fn,scope);}}};YAHOO.ext.EventObject=new function(){this.browserEvent=null;this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;this.BACKSPACE=8;this.TAB=9;this.RETURN=13;this.ESC=27;this.SPACE=32;this.PAGEUP=33;this.PAGEDOWN=34;this.END=35;this.HOME=36;this.LEFT=37;this.UP=38;this.RIGHT=39;this.DOWN=40;this.DELETE=46;this.F5=116;this.setEvent=function(e){this.browserEvent=e;if(e){this.button=e.button;this.shiftKey=e.shiftKey;this.ctrlKey=e.ctrlKey;this.altKey=e.altKey;}else{this.button=-1;this.shiftKey=false;this.ctrlKey=false;this.altKey=false;}};this.stopEvent=function(){if(this.browserEvent){YAHOO.util.Event.stopEvent(this.browserEvent);}};this.preventDefault=function(){if(this.browserEvent){YAHOO.util.Event.preventDefault(this.browserEvent);}};this.isNavKeyPress=function(){return(this.browserEvent.keyCode&&this.browserEvent.keyCode>=33&&this.browserEvent.keyCode<=40);};this.stopPropagation=function(){if(this.browserEvent){YAHOO.util.Event.stopPropagation(this.browserEvent);}};this.getCharCode=function(){if(this.browserEvent){return YAHOO.util.Event.getCharCode(this.browserEvent);} +return null;};this.getKey=function(){if(this.browserEvent){return this.browserEvent.charCode||this.browserEvent.keyCode;} +return null;};this.getPageX=function(){if(this.browserEvent){return YAHOO.util.Event.getPageX(this.browserEvent);} +return null;};this.getPageY=function(){if(this.browserEvent){return YAHOO.util.Event.getPageY(this.browserEvent);} +return null;};this.getTime=function(){if(this.browserEvent){return YAHOO.util.Event.getTime(this.browserEvent);} +return null;};this.getXY=function(){if(this.browserEvent){return YAHOO.util.Event.getXY(this.browserEvent);} +return[];};this.getTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getTarget(this.browserEvent);} +return null;};this.findTarget=function(className,tagName){if(tagName)tagName=tagName.toLowerCase();if(this.browserEvent){function isMatch(el){if(!el){return false;} +if(className&&!YAHOO.util.Dom.hasClass(el,className)){return false;} +if(tagName&&el.tagName.toLowerCase()!=tagName){return false;} +return true;};var t=this.getTarget();if(!t||isMatch(t)){return t;} +var p=t.parentNode;var b=document.body;while(p&&p!=b){if(isMatch(p)){return p;} +p=p.parentNode;}} +return null;};this.getRelatedTarget=function(){if(this.browserEvent){return YAHOO.util.Event.getRelatedTarget(this.browserEvent);} +return null;};this.getWheelDelta=function(){var e=this.browserEvent;var delta=0;if(e.wheelDelta){delta=e.wheelDelta/120;if(window.opera)delta=-delta;}else if(e.detail){delta=-e.detail/3;} +return delta;};this.hasModifier=function(){return this.ctrlKey||this.altKey||this.shiftKey;};}(); + +YAHOO.ext.UpdateManager=function(el,forceNew){el=YAHOO.ext.Element.get(el);if(!forceNew&&el.updateManager){return el.updateManager;} +this.el=el;this.defaultUrl=null;this.beforeUpdate=new YAHOO.util.CustomEvent('UpdateManager.beforeUpdate');this.onUpdate=new YAHOO.util.CustomEvent('UpdateManager.onUpdate');this.onFailure=new YAHOO.util.CustomEvent('UpdateManager.onFailure');this.events={'beforeupdate':this.beforeUpdate,'update':this.onUpdate,'failure':this.onFailure};this.sslBlankUrl=YAHOO.ext.UpdateManager.defaults.sslBlankUrl;this.disableCaching=YAHOO.ext.UpdateManager.defaults.disableCaching;this.indicatorText=YAHOO.ext.UpdateManager.defaults.indicatorText;this.showLoadIndicator=YAHOO.ext.UpdateManager.defaults.showLoadIndicator;this.timeout=YAHOO.ext.UpdateManager.defaults.timeout;this.loadScripts=YAHOO.ext.UpdateManager.defaults.loadScripts;this.transaction=null;this.autoRefreshProcId=null;this.refreshDelegate=this.refresh.createDelegate(this);this.updateDelegate=this.update.createDelegate(this);this.formUpdateDelegate=this.formUpdate.createDelegate(this);this.successDelegate=this.processSuccess.createDelegate(this);this.failureDelegate=this.processFailure.createDelegate(this);this.renderer=new YAHOO.ext.UpdateManager.BasicRenderer();};YAHOO.ext.UpdateManager.prototype={fireEvent:YAHOO.ext.util.Observable.prototype.fireEvent,on:YAHOO.ext.util.Observable.prototype.on,addListener:YAHOO.ext.util.Observable.prototype.addListener,delayedListener:YAHOO.ext.util.Observable.prototype.delayedListener,removeListener:YAHOO.ext.util.Observable.prototype.removeListener,purgeListeners:YAHOO.ext.util.Observable.prototype.purgeListeners,getEl:function(){return this.el;},update:function(url,params,callback,discardUrl){if(this.beforeUpdate.fireDirect(this.el,url,params)!==false){if(typeof url=='object'){var cfg=url;url=cfg.url;params=params||cfg.params;callback=callback||cfg.callback;discardUrl=discardUrl||cfg.discardUrl;if(callback&&cfg.scope){callback=callback.createDelegate(cfg.scope);} +if(typeof cfg.nocache!='undefined'){this.disableCaching=cfg.nocache};if(typeof cfg.text!='undefined'){this.indicatorText=cfg.text};if(typeof cfg.scripts!='undefined'){this.loadScripts=cfg.scripts};if(typeof cfg.timeout!='undefined'){this.timeout=cfg.timeout};} +this.showLoading();if(!discardUrl){this.defaultUrl=url;} +if(typeof url=='function'){url=url();} +if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':null,'callback':callback,'params':params}};var method=params?'POST':'GET';if(method=='GET'){url=this.prepareUrl(url);} +this.transaction=YAHOO.util.Connect.asyncRequest(method,url,callback,params);}},formUpdate:function(form,url,reset,callback){if(this.beforeUpdate.fireDirect(this.el,form,url)!==false){this.showLoading();formEl=YAHOO.util.Dom.get(form);if(typeof url=='function'){url=url();} +url=url||formEl.action;var callback={success:this.successDelegate,failure:this.failureDelegate,timeout:(this.timeout*1000),argument:{'url':url,'form':form,'callback':callback,'reset':reset}};var isUpload=false;var enctype=formEl.getAttribute('enctype');if(enctype&&enctype.toLowerCase()=='multipart/form-data'){isUpload=true;} +YAHOO.util.Connect.setForm(form,isUpload,this.sslBlankUrl);this.transaction=YAHOO.util.Connect.asyncRequest('POST',url,callback);}},refresh:function(callback){if(this.defaultUrl==null){return;} +this.update(this.defaultUrl,null,callback,true);},startAutoRefresh:function(interval,url,params,callback,refreshNow){if(refreshNow){this.update(url||this.defaultUrl,params,callback,true);} +if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);} +this.autoRefreshProcId=setInterval(this.update.createDelegate(this,[url||this.defaultUrl,params,callback,true]),interval*1000);},stopAutoRefresh:function(){if(this.autoRefreshProcId){clearInterval(this.autoRefreshProcId);}},showLoading:function(){if(this.showLoadIndicator){this.el.update(this.indicatorText);}},prepareUrl:function(url){if(this.disableCaching){var append='_dc='+(new Date().getTime());if(url.indexOf('?')!==-1){url+='&'+append;}else{url+='?'+append;}} +return url;},processSuccess:function(response){this.transaction=null;if(response.argument.form&&response.argument.reset){try{response.argument.form.reset();}catch(e){}} +if(this.loadScripts){this.renderer.render(this.el,response,this,this.updateComplete.createDelegate(this,[response]));}else{this.renderer.render(this.el,response,this);this.updateComplete(response);}},updateComplete:function(response){this.fireEvent('update',this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,true);}},processFailure:function(response){this.transaction=null;this.onFailure.fireDirect(this.el,response);if(typeof response.argument.callback=='function'){response.argument.callback(this.el,false);}},setRenderer:function(renderer){this.renderer=renderer;},getRenderer:function(){return this.renderer;},setDefaultUrl:function(defaultUrl){this.defaultUrl=defaultUrl;},abort:function(){if(this.transaction){YAHOO.util.Connect.abort(this.transaction);}},isUpdating:function(){if(this.transaction){return YAHOO.util.Connect.isCallInProgress(this.transaction);} +return false;}};YAHOO.ext.UpdateManager.defaults={timeout:30,loadScripts:false,sslBlankUrl:(YAHOO.ext.SSL_SECURE_URL||'javascript:false'),disableCaching:false,showLoadIndicator:true,indicatorText:'
        Loading...
        '};YAHOO.ext.UpdateManager.updateElement=function(el,url,params,options){var um=getEl(el,true).getUpdateManager();YAHOO.ext.util.Config.apply(um,options);um.update(url,params,options.callback);} +YAHOO.ext.UpdateManager.update=YAHOO.ext.UpdateManager.updateElement;YAHOO.ext.UpdateManager.BasicRenderer=function(){};YAHOO.ext.UpdateManager.BasicRenderer.prototype={render:function(el,response,updateManager,callback){el.update(response.responseText,updateManager.loadScripts,callback);}}; + +Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(format){if(Date.formatFunctions[format]==null){Date.createNewFormat(format);} +var func=Date.formatFunctions[format];return this[func]();};Date.prototype.format=Date.prototype.dateFormat;Date.createNewFormat=function(format){var funcName="format"+Date.formatFunctions.count++;Date.formatFunctions[format]=funcName;var code="Date.prototype."+funcName+" = function(){return ";var special=false;var ch='';for(var i=0;i 0) {" +var regex="";var special=false;var ch='';for(var i=0;i 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n" ++"{return new Date(y, m, d, h, i);}\n" ++"else if (y > 0 && m >= 0 && d > 0 && h >= 0)\n" ++"{return new Date(y, m, d, h);}\n" ++"else if (y > 0 && m >= 0 && d > 0)\n" ++"{return new Date(y, m, d);}\n" ++"else if (y > 0 && m >= 0)\n" ++"{return new Date(y, m);}\n" ++"else if (y > 0)\n" ++"{return new Date(y);}\n" ++"}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(character,currentGroup){switch(character){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:0,c:null,s:"(?:\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+currentGroup+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+currentGroup+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+currentGroup+"], 10);\n" ++"y = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+currentGroup+"] == 'am') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+currentGroup+"] == 'AM') {\n" ++"if (h == 12) { h = 0; }\n" ++"} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+currentGroup+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(character)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+") ++String.leftPad(Math.floor(this.getTimezoneOffset()/60),2,"0") ++String.leftPad(this.getTimezoneOffset()%60,2,"0");};Date.prototype.getDayOfYear=function(){var num=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var i=0;i1){var newTab=this.getNextAvailable(index);if(newTab)newTab.activate();} +tab.purgeListeners();this.stripEl.dom.removeChild(tab.pnode.dom);if(tab.bodyEl.dom.parentNode==this.bodyEl.dom){this.bodyEl.dom.removeChild(tab.bodyEl.dom);} +items.splice(index,1);delete this.items[tab.id];this.autoSizeTabs();},getNextAvailable:function(start){var items=this.items;var index=start;while(index=0){var item=items[--index];if(item&&!item.isHidden()){return item;}} +return null;},disableTab:function(id){var tab=this.items[id];if(tab&&this.active!=tab){tab.disable();}},enableTab:function(id){var tab=this.items[id];tab.enable();},activate:function(id){var tab=this.items[id];if(tab==this.active){return tab;} +var e={};this.fireEvent('beforetabchange',this,e,tab);if(e.cancel!==true&&!tab.disabled){if(this.active){this.active.hide();} +this.active=this.items[id];this.active.show();this.onTabChange.fireDirect(this,this.active);} +return tab;},getActiveTab:function(){return this.active;},syncHeight:function(targetHeight){var height=(targetHeight||this.el.getHeight())-this.el.getBorderWidth('tb')-this.el.getPadding('tb');var bm=this.bodyEl.getMargins();var newHeight=height-(this.stripWrap.getHeight())-(bm.top+bm.bottom);this.bodyEl.setHeight(newHeight);return newHeight;},onResize:function(){if(this.monitorResize){this.autoSizeTabs();}},beginUpdate:function(){this.updating=true;},endUpdate:function(){this.updating=false;this.autoSizeTabs();},autoSizeTabs:function(){var count=this.items.length;var vcount=count-this.hiddenCount;if(!this.resizeTabs||count<1||vcount<1||this.updating)return;var w=Math.max(this.el.getWidth()-this.cpad,10);var availWidth=Math.floor(w/vcount);var b=this.stripBody;if(b.getWidth()>w){var tabs=this.items;this.setTabWidth(Math.max(availWidth,this.minTabWidth));if(availWidth
        ';return strip.firstChild.firstChild.firstChild.firstChild;};YAHOO.ext.TabPanel.prototype.createBody=function(container){var body=document.createElement('div');YAHOO.util.Dom.generateId(body,'tab-body');YAHOO.util.Dom.addClass(body,'yui-ext-tabbody');container.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createItemBody=function(bodyEl,id){var body=YAHOO.util.Dom.get(id);if(!body){body=document.createElement('div');body.id=id;} +YAHOO.util.Dom.addClass(body,'yui-ext-tabitembody');bodyEl.appendChild(body);return body;};YAHOO.ext.TabPanel.prototype.createStripElements=function(stripEl,text,closable){var td=document.createElement('td');stripEl.appendChild(td);if(closable){td.className="ytab-closable";if(!this.closeTpl){this.closeTpl=new YAHOO.ext.Template(''+'{text}'+'
         
        ');} +var el=this.closeTpl.overwrite(td,{'text':text});var close=el.getElementsByTagName('div')[0];var inner=el.getElementsByTagName('em')[0];return{'el':el,'close':close,'inner':inner};}else{if(!this.tabTpl){this.tabTpl=new YAHOO.ext.Template(''+'{text}');} +var el=this.tabTpl.overwrite(td,{'text':text});var inner=el.getElementsByTagName('em')[0];return{'el':el,'inner':inner};}}; + +YAHOO.ext.Actor=function(element,animator,selfCapture){this.el=YAHOO.ext.Element.get(element,true);YAHOO.ext.Actor.superclass.constructor.call(this,element,true);this.onCapture=new YAHOO.util.CustomEvent('Actor.onCapture');if(animator){animator.addActor(this);} +this.capturing=selfCapture;this.playlist=selfCapture?new YAHOO.ext.Animator.AnimSequence():null;};YAHOO.extendX(YAHOO.ext.Actor,YAHOO.ext.Element);YAHOO.ext.Actor.prototype.capture=function(action){if(this.playlist!=null){this.playlist.add(action);} +this.onCapture.fireDirect(this,action);return action;};YAHOO.ext.Actor.overrideAnimation=function(method,animParam,onParam){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);if(args[animParam]===true){return this.capture(new YAHOO.ext.Actor.AsyncAction(this,method,args,onParam));}else{return this.capture(new YAHOO.ext.Actor.Action(this,method,args));}};} +YAHOO.ext.Actor.overrideBasic=function(method){return function(){if(!this.capturing){return method.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.Action(this,method,args));};} +YAHOO.ext.Actor.prototype.setVisibilityMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setVisibilityMode);YAHOO.ext.Actor.prototype.enableDisplayMode=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.enableDisplayMode);YAHOO.ext.Actor.prototype.focus=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.focus);YAHOO.ext.Actor.prototype.addClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.addClass);YAHOO.ext.Actor.prototype.removeClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.removeClass);YAHOO.ext.Actor.prototype.replaceClass=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replaceClass);YAHOO.ext.Actor.prototype.setStyle=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setStyle);YAHOO.ext.Actor.prototype.setLeft=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setLeft);YAHOO.ext.Actor.prototype.setTop=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setTop);YAHOO.ext.Actor.prototype.setAbsolutePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setAbsolutePositioned);YAHOO.ext.Actor.prototype.setRelativePositioned=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setRelativePositioned);YAHOO.ext.Actor.prototype.clearPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearPositioning);YAHOO.ext.Actor.prototype.setPositioning=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.setPositioning);YAHOO.ext.Actor.prototype.clip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clip);YAHOO.ext.Actor.prototype.unclip=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.unclip);YAHOO.ext.Actor.prototype.clearOpacity=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.clearOpacity);YAHOO.ext.Actor.prototype.update=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.update);YAHOO.ext.Actor.prototype.remove=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.remove);YAHOO.ext.Actor.prototype.fitToParent=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.fitToParent);YAHOO.ext.Actor.prototype.appendChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendChild);YAHOO.ext.Actor.prototype.createChild=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.createChild);YAHOO.ext.Actor.prototype.appendTo=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.appendTo);YAHOO.ext.Actor.prototype.insertBefore=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertBefore);YAHOO.ext.Actor.prototype.insertAfter=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertAfter);YAHOO.ext.Actor.prototype.wrap=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.wrap);YAHOO.ext.Actor.prototype.replace=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.replace);YAHOO.ext.Actor.prototype.insertHtml=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.insertHtml);YAHOO.ext.Actor.prototype.set=YAHOO.ext.Actor.overrideBasic(YAHOO.ext.Actor.superclass.set);YAHOO.ext.Actor.prototype.load=function(){if(!this.capturing){return YAHOO.ext.Actor.superclass.load.apply(this,arguments);} +var args=Array.prototype.slice.call(arguments,0);return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.load,args,2));};YAHOO.ext.Actor.prototype.animate=function(args,duration,onComplete,easing,animType){if(!this.capturing){return YAHOO.ext.Actor.superclass.animate.apply(this,arguments);} +return this.capture(new YAHOO.ext.Actor.AsyncAction(this,YAHOO.ext.Actor.superclass.animate,[args,duration,onComplete,easing,animType],2));};YAHOO.ext.Actor.prototype.setVisible=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setVisible,1,3);YAHOO.ext.Actor.prototype.toggle=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.toggle,0,2);YAHOO.ext.Actor.prototype.setXY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setXY,1,3);YAHOO.ext.Actor.prototype.setLocation=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setLocation,2,4);YAHOO.ext.Actor.prototype.setWidth=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setWidth,1,3);YAHOO.ext.Actor.prototype.setHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setHeight,1,3);YAHOO.ext.Actor.prototype.setSize=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setSize,2,4);YAHOO.ext.Actor.prototype.setBounds=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBounds,4,6);YAHOO.ext.Actor.prototype.setOpacity=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setOpacity,1,3);YAHOO.ext.Actor.prototype.moveTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.moveTo,2,4);YAHOO.ext.Actor.prototype.move=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.move,2,4);YAHOO.ext.Actor.prototype.alignTo=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.alignTo,3,5);YAHOO.ext.Actor.prototype.hide=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.hide,0,2);YAHOO.ext.Actor.prototype.show=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.show,0,2);YAHOO.ext.Actor.prototype.setBox=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setBox,2,4);YAHOO.ext.Actor.prototype.autoHeight=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.autoHeight,0,2);YAHOO.ext.Actor.prototype.setX=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setX,1,3);YAHOO.ext.Actor.prototype.setY=YAHOO.ext.Actor.overrideAnimation(YAHOO.ext.Actor.superclass.setY,1,3);YAHOO.ext.Actor.prototype.startCapture=function(){this.capturing=true;this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.stopCapture=function(){this.capturing=false;};YAHOO.ext.Actor.prototype.clear=function(){this.playlist=new YAHOO.ext.Animator.AnimSequence();};YAHOO.ext.Actor.prototype.play=function(oncomplete){this.capturing=false;if(this.playlist){this.playlist.play(oncomplete);}};YAHOO.ext.Actor.prototype.addCall=function(fcn,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.Action(scope,fcn,args||[]));}};YAHOO.ext.Actor.prototype.addAsyncCall=function(fcn,callbackIndex,args,scope){if(!this.capturing){fcn.apply(scope||this,args||[]);}else{this.capture(new YAHOO.ext.Actor.AsyncAction(scope,fcn,args||[],callbackIndex));}},YAHOO.ext.Actor.prototype.pause=function(seconds){this.capture(new YAHOO.ext.Actor.PauseAction(seconds));};YAHOO.ext.Actor.prototype.shake=function(){this.move('left',20,true,.05);this.move('right',40,true,.05);this.move('left',40,true,.05);this.move('right',20,true,.05);};YAHOO.ext.Actor.prototype.bounce=function(){this.move('up',20,true,.05);this.move('down',40,true,.05);this.move('up',40,true,.05);this.move('down',20,true,.05);};YAHOO.ext.Actor.prototype.blindShow=function(anchor,newSize,duration,easing){var size=newSize||this.getSize();this.clip();this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +this.unclip();return size;};YAHOO.ext.Actor.prototype.blindHide=function(anchor,duration,easing){var size=this.getSize();this.clip();anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.animate({width:{to:1},points:{by:[this.getWidth(),0]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;case'b':case'bottom':this.animate({height:{to:1},points:{by:[0,this.getHeight()]}},duration||.5,null,YAHOO.util.Easing.easeIn,YAHOO.util.Motion);this.setVisible(false);break;} +return size;};YAHOO.ext.Actor.prototype.slideShow=function(anchor,newSize,duration,easing,clearPositioning){var size=newSize||this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindShow(anchor,newSize,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);this.setVisible(true);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'r':case'right':this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.setWidth(1);this.setWidth(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setHeight(1);this.setHeight(newSize,true,duration||.5,null,easing||YAHOO.util.Easing.easeOut);break;} +if(clearPositioning!==false){this.addCall(child.setPositioning,[pos],child);} +this.unclip();return size;};YAHOO.ext.Actor.prototype.slideHide=function(anchor,duration,easing){var size=this.getSize();this.clip();var firstChild=this.dom.firstChild;if(!firstChild||(firstChild.nodeName&&"#TEXT"==firstChild.nodeName.toUpperCase())){this.blindHide(anchor,duration,easing);return;} +var child=YAHOO.ext.Element.get(firstChild,true);var pos=child.getPositioning();this.addCall(child.setAbsolutePositioned,null,child);anchor=anchor.toLowerCase();switch(anchor){case't':case'top':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom','0px'],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'l':case'left':this.addCall(child.setStyle,['left',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['right','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'r':case'right':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['bottom',''],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['top','0px'],child);this.setSize(1,size.height,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;case'b':case'bottom':this.addCall(child.setStyle,['right',''],child);this.addCall(child.setStyle,['top','0px'],child);this.addCall(child.setStyle,['left','0px'],child);this.addCall(child.setStyle,['bottom',''],child);this.setSize(size.width,1,true,duration||.5,null,easing||YAHOO.util.Easing.easeIn);this.setVisible(false);break;} +this.addCall(child.setPositioning,[pos],child);return size;};YAHOO.ext.Actor.prototype.squish=function(duration){var size=this.getSize();this.clip();this.setSize(1,1,true,duration||.5);this.setVisible(false);return size;};YAHOO.ext.Actor.prototype.appear=function(duration){this.setVisible(true,true,duration);};YAHOO.ext.Actor.prototype.fade=function(duration){this.setVisible(false,true,duration);};YAHOO.ext.Actor.prototype.switchOff=function(duration){this.clip();this.setVisible(false,true,.1);this.clearOpacity();this.setVisible(true);this.animate({height:{to:1},points:{by:[0,this.getHeight()/2]}},duration||.5,null,YAHOO.util.Easing.easeOut,YAHOO.util.Motion);this.setVisible(false);};YAHOO.ext.Actor.prototype.highlight=function(color,fromColor,duration,attribute){attribute=attribute||'background-color';var original=this.getStyle(attribute);fromColor=fromColor||((original&&original!=''&&original!='transparent')?original:'#FFFFFF');var cfg={};cfg[attribute]={to:color,from:fromColor};this.setVisible(true);this.animate(cfg,duration||.5,null,YAHOO.util.Easing.bounceOut,YAHOO.util.ColorAnim);this.setStyle(attribute,original);};YAHOO.ext.Actor.prototype.pulsate=function(count,duration){count=count||3;for(var i=0;i0){animFn.defer((duration/2)*1000,this);}else{if(typeof callback=='function'){callback();}}} +animFn.call(this);} +this.addAsyncCall(frameFn,0,null,this);};YAHOO.ext.Actor.Action=function(actor,method,args){this.actor=actor;this.method=method;this.args=args;} +YAHOO.ext.Actor.Action.prototype={play:function(onComplete){this.method.apply(this.actor||window,this.args);onComplete();}};YAHOO.ext.Actor.AsyncAction=function(actor,method,args,onIndex){YAHOO.ext.Actor.AsyncAction.superclass.constructor.call(this,actor,method,args);this.onIndex=onIndex;this.originalCallback=this.args[onIndex];} +YAHOO.extendX(YAHOO.ext.Actor.AsyncAction,YAHOO.ext.Actor.Action);YAHOO.ext.Actor.AsyncAction.prototype.play=function(onComplete){var callbackArg=this.originalCallback?this.originalCallback.createSequence(onComplete):onComplete;this.args[this.onIndex]=callbackArg;this.method.apply(this.actor,this.args);};YAHOO.ext.Actor.PauseAction=function(seconds){this.seconds=seconds;};YAHOO.ext.Actor.PauseAction.prototype={play:function(onComplete){setTimeout(onComplete,this.seconds*1000);}}; + +YAHOO.ext.Animator=function(){this.actors=[];this.playlist=new YAHOO.ext.Animator.AnimSequence();this.captureDelegate=this.capture.createDelegate(this);this.playDelegate=this.play.createDelegate(this);this.syncing=false;this.stopping=false;this.playing=false;for(var i=0;i=this.sequences.length&&this.onComplete){this.onComplete();}},stop:function(){for(var i=0;i0){if(m>(inc/2)){newValue=value+(inc-m);}else{newValue=value-m;}} +return Math.max(min,newValue);},resizeElement:function(){var box=this.proxy.getBox();this.el.setBox(box,false,this.animate,this.duration,null,this.easing);this.updateChildSize();this.proxy.hide();return box;},constrain:function(v,diff,m,mx){if(v-diffmx){diff=mx-v;} +return diff;},onMouseMove:function(e){if(this.enabled){try{var curSize=this.curSize||this.startBox;var x=this.startBox.x,y=this.startBox.y;var ox=x,oy=y;var w=curSize.width,h=curSize.height;var ow=w,oh=h;var mw=this.minWidth,mh=this.minHeight;var mxw=this.maxWidth,mxh=this.maxHeight;var wi=this.widthIncrement;var hi=this.heightIncrement;var eventXY=e.getXY();var diffX=-(this.startPoint[0]-Math.max(this.minX,eventXY[0]));var diffY=-(this.startPoint[1]-Math.max(this.minY,eventXY[1]));var pos=this.activeHandle.position;switch(pos){case'east':w+=diffX;w=Math.min(Math.max(mw,w),mxw);break;case'south':h+=diffY;h=Math.min(Math.max(mh,h),mxh);break;case'southeast':w+=diffX;h+=diffY;w=Math.min(Math.max(mw,w),mxw);h=Math.min(Math.max(mh,h),mxh);break;case'north':diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'west':diffX=this.constrain(w,diffX,mw,mxw);x+=diffX;w-=diffX;break;case'northeast':w+=diffX;w=Math.min(Math.max(mw,w),mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;break;case'northwest':diffX=this.constrain(w,diffX,mw,mxw);diffY=this.constrain(h,diffY,mh,mxh);y+=diffY;h-=diffY;x+=diffX;w-=diffX;break;case'southwest':diffX=this.constrain(w,diffX,mw,mxw);h+=diffY;h=Math.min(Math.max(mh,h),mxh);x+=diffX;w-=diffX;break;} +var sw=this.snap(w,wi,mw);var sh=this.snap(h,hi,mh);if(sw!=w||sh!=h){switch(pos){case'northeast':y-=sh-h;break;case'north':y-=sh-h;break;case'southwest':x-=sw-w;break;case'west':x-=sw-w;break;case'northwest':x-=sw-w;y-=sh-h;break;} +w=sw;h=sh;} +if(this.preserveRatio){switch(pos){case'southeast':case'east':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);break;case'south':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'northeast':w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);break;case'north':var tw=w;w=ow*(h/oh);w=Math.min(Math.max(mw,w),mxw);h=oh*(w/ow);x+=(tw-w)/2;break;case'southwest':h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);var tw=w;w=ow*(h/oh);x+=tw-w;break;case'west':var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);y+=(th-h)/2;var tw=w;w=ow*(h/oh);x+=tw-w;break;case'northwest':var tw=w;var th=h;h=oh*(w/ow);h=Math.min(Math.max(mh,h),mxh);w=ow*(h/oh);y+=th-h;x+=tw-w;break;}} +this.proxy.setBounds(x,y,w,h);if(this.dynamic){this.resizeElement();}}catch(e){}}},handleOver:function(){if(this.enabled){this.el.addClass('yresizable-over');}},handleOut:function(){if(!this.resizing){this.el.removeClass('yresizable-over');}},getEl:function(){return this.el;},getResizeChild:function(){return this.resizeChild;}});YAHOO.ext.Resizable.positions={n:'north',s:'south',e:'east',w:'west',se:'southeast',sw:'southwest',nw:'northwest',ne:'northeast'};YAHOO.ext.Resizable.Handle=function(rz,pos,disableTrackOver,transparent){if(!this.tpl){var tpl=YAHOO.ext.DomHelper.createTemplate({tag:'div',cls:'yresizable-handle yresizable-handle-{0}',html:' '});tpl.compile();YAHOO.ext.Resizable.Handle.prototype.tpl=tpl;} +this.position=pos;this.rz=rz;this.el=this.tpl.append(rz.el.dom,[this.position],true);this.el.unselectable();if(transparent){this.el.setOpacity(0);} +this.el.mon('mousedown',this.onMouseDown,this,true);if(!disableTrackOver){this.el.mon('mouseover',this.onMouseOver,this,true);this.el.mon('mouseout',this.onMouseOut,this,true);}};YAHOO.ext.Resizable.Handle.prototype={afterResize:function(rz){},onMouseDown:function(e){this.rz.onMouseDown(this,e);},onMouseOver:function(e){this.rz.handleOver(this,e);},onMouseOut:function(e){this.rz.handleOut(this,e);}}; + +if(YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr.clickTimeThresh=350;} +YAHOO.ext.SplitBar=function(dragElement,resizingElement,orientation,placement){this.el=YAHOO.ext.Element.get(dragElement,true);this.el.dom.unselectable='on';this.resizingEl=YAHOO.ext.Element.get(resizingElement,true);this.orientation=orientation||YAHOO.ext.SplitBar.HORIZONTAL;this.minSize=0;this.maxSize=2000;this.onMoved=new YAHOO.util.CustomEvent("SplitBarMoved",this);this.animate=false;this.useShim=false;this.shim=null;this.proxy=YAHOO.ext.SplitBar.createProxy(this.orientation);this.dd=new YAHOO.util.DDProxy(this.el.dom.id,"SplitBars",{dragElId:this.proxy.id});this.dd.b4StartDrag=this.onStartProxyDrag.createDelegate(this);this.dd.endDrag=this.onEndProxyDrag.createDelegate(this);this.dragSpecs={};this.adapter=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.adapter.init(this);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.placement=placement||(this.el.getX()>this.resizingEl.getX()?YAHOO.ext.SplitBar.LEFT:YAHOO.ext.SplitBar.RIGHT);this.el.setStyle('cursor','e-resize');}else{this.placement=placement||(this.el.getY()>this.resizingEl.getY()?YAHOO.ext.SplitBar.TOP:YAHOO.ext.SplitBar.BOTTOM);this.el.setStyle('cursor','n-resize');} +this.events={'resize':this.onMoved,'moved':this.onMoved,'beforeresize':new YAHOO.util.CustomEvent('beforeresize')}} +YAHOO.extendX(YAHOO.ext.SplitBar,YAHOO.ext.util.Observable,{onStartProxyDrag:function(x,y){this.fireEvent('beforeresize',this);if(this.useShim){if(!this.shim){this.shim=YAHOO.ext.SplitBar.createShim();} +this.shim.setVisible(true);} +YAHOO.util.Dom.setStyle(this.proxy,'display','block');var size=this.adapter.getElementSize(this);this.activeMinSize=this.getMinimumSize();;this.activeMaxSize=this.getMaximumSize();;var c1=size-this.activeMinSize;var c2=Math.max(this.activeMaxSize-size,0);if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){this.dd.resetConstraints();this.dd.setXConstraint(this.placement==YAHOO.ext.SplitBar.LEFT?c1:c2,this.placement==YAHOO.ext.SplitBar.LEFT?c2:c1);this.dd.setYConstraint(0,0);}else{this.dd.resetConstraints();this.dd.setXConstraint(0,0);this.dd.setYConstraint(this.placement==YAHOO.ext.SplitBar.TOP?c1:c2,this.placement==YAHOO.ext.SplitBar.TOP?c2:c1);} +this.dragSpecs.startSize=size;this.dragSpecs.startPoint=[x,y];YAHOO.util.DDProxy.prototype.b4StartDrag.call(this.dd,x,y);},onEndProxyDrag:function(e){YAHOO.util.Dom.setStyle(this.proxy,'display','none');var endPoint=YAHOO.util.Event.getXY(e);if(this.useShim){this.shim.setVisible(false);} +var newSize;if(this.orientation==YAHOO.ext.SplitBar.HORIZONTAL){newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.LEFT?endPoint[0]-this.dragSpecs.startPoint[0]:this.dragSpecs.startPoint[0]-endPoint[0]);}else{newSize=this.dragSpecs.startSize+ +(this.placement==YAHOO.ext.SplitBar.TOP?endPoint[1]-this.dragSpecs.startPoint[1]:this.dragSpecs.startPoint[1]-endPoint[1]);} +newSize=Math.min(Math.max(newSize,this.activeMinSize),this.activeMaxSize);if(newSize!=this.dragSpecs.startSize){this.adapter.setElementSize(this,newSize);this.onMoved.fireDirect(this,newSize);}},getAdapter:function(){return this.adapter;},setAdapter:function(adapter){this.adapter=adapter;this.adapter.init(this);},getMinimumSize:function(){return this.minSize;},setMinimumSize:function(minSize){this.minSize=minSize;},getMaximumSize:function(){return this.maxSize;},setMaximumSize:function(maxSize){this.maxSize=maxSize;},setCurrentSize:function(size){var oldAnimate=this.animate;this.animate=false;this.adapter.setElementSize(this,size);this.animate=oldAnimate;}});YAHOO.ext.SplitBar.createShim=function(){var shim=document.createElement('div');shim.unselectable='on';YAHOO.util.Dom.generateId(shim,'split-shim');YAHOO.util.Dom.setStyle(shim,'width','100%');YAHOO.util.Dom.setStyle(shim,'height','100%');YAHOO.util.Dom.setStyle(shim,'position','absolute');YAHOO.util.Dom.setStyle(shim,'background','white');YAHOO.util.Dom.setStyle(shim,'z-index',11000);window.document.body.appendChild(shim);var shimEl=YAHOO.ext.Element.get(shim);shimEl.setOpacity(.01);shimEl.setXY([0,0]);return shimEl;};YAHOO.ext.SplitBar.createProxy=function(orientation){var proxy=document.createElement('div');proxy.unselectable='on';YAHOO.util.Dom.generateId(proxy,'split-proxy');YAHOO.util.Dom.setStyle(proxy,'position','absolute');YAHOO.util.Dom.setStyle(proxy,'visibility','hidden');YAHOO.util.Dom.setStyle(proxy,'z-index',11001);YAHOO.util.Dom.setStyle(proxy,'background-color',"#aaa");if(orientation==YAHOO.ext.SplitBar.HORIZONTAL){YAHOO.util.Dom.setStyle(proxy,'cursor','e-resize');}else{YAHOO.util.Dom.setStyle(proxy,'cursor','n-resize');} +YAHOO.util.Dom.setStyle(proxy,'line-height','0px');YAHOO.util.Dom.setStyle(proxy,'font-size','0px');window.document.body.appendChild(proxy);return proxy;};YAHOO.ext.SplitBar.BasicLayoutAdapter=function(){};YAHOO.ext.SplitBar.BasicLayoutAdapter.prototype={init:function(s){},getElementSize:function(s){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){return s.resizingEl.getWidth();}else{return s.resizingEl.getHeight();}},setElementSize:function(s,newSize,onComplete){if(s.orientation==YAHOO.ext.SplitBar.HORIZONTAL){if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setWidth(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setWidth(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}else{if(!YAHOO.util.Anim||!s.animate){s.resizingEl.setHeight(newSize);if(onComplete){onComplete(s,newSize);}}else{s.resizingEl.setHeight(newSize,true,.1,onComplete,YAHOO.util.Easing.easeOut);}}}};YAHOO.ext.SplitBar.AbsoluteLayoutAdapter=function(container){this.basic=new YAHOO.ext.SplitBar.BasicLayoutAdapter();this.container=getEl(container);} +YAHOO.ext.SplitBar.AbsoluteLayoutAdapter.prototype={init:function(s){this.basic.init(s);},getElementSize:function(s){return this.basic.getElementSize(s);},setElementSize:function(s,newSize,onComplete){this.basic.setElementSize(s,newSize,this.moveSplitter.createDelegate(this,[s]));},moveSplitter:function(s){var yes=YAHOO.ext.SplitBar;switch(s.placement){case yes.LEFT:s.el.setX(s.resizingEl.getRight());break;case yes.RIGHT:s.el.setStyle('right',(this.container.getWidth()-s.resizingEl.getLeft())+'px');break;case yes.TOP:s.el.setY(s.resizingEl.getBottom());break;case yes.BOTTOM:s.el.setY(s.resizingEl.getTop()-s.el.getHeight());break;}}};YAHOO.ext.SplitBar.VERTICAL=1;YAHOO.ext.SplitBar.HORIZONTAL=2;YAHOO.ext.SplitBar.LEFT=1;YAHOO.ext.SplitBar.RIGHT=2;YAHOO.ext.SplitBar.TOP=3;YAHOO.ext.SplitBar.BOTTOM=4; + +YAHOO.ext.grid.Grid=function(container,dataModel,colModel,selectionModel){this.container=YAHOO.ext.Element.get(container);this.container.update('');this.container.setStyle('overflow','hidden');this.id=this.container.id;this.rows=[];this.rowCount=0;this.fieldId=null;this.dataModel=dataModel;this.colModel=colModel;this.selModel=selectionModel;this.activeEditor=null;this.editingCell=null;this.minColumnWidth=25;this.autoSizeColumns=false;this.autoSizeHeaders=false;this.monitorWindowResize=true;this.maxRowsToMeasure=0;this.trackMouseOver=false;this.enableDragDrop=false;this.stripeRows=true;this.autoHeight=false;this.autoWidth=false;this.allowTextSelectionPattern=/INPUT|TEXTAREA|SELECT/i;this.setValueDelegate=this.setCellValue.createDelegate(this);var CE=YAHOO.util.CustomEvent;this.events={'click':new CE('click'),'dblclick':new CE('dblclick'),'mousedown':new CE('mousedown'),'mouseup':new CE('mouseup'),'mouseover':new CE('mouseover'),'mouseout':new CE('mouseout'),'keypress':new CE('keypress'),'keydown':new CE('keydown'),'cellclick':new CE('cellclick'),'celldblclick':new CE('celldblclick'),'rowclick':new CE('rowclick'),'rowdblclick':new CE('rowdblclick'),'headerclick':new CE('headerclick'),'rowcontextmenu':new CE('rowcontextmenu'),'headercontextmenu':new CE('headercontextmenu'),'beforeedit':new CE('beforeedit'),'afteredit':new CE('afteredit'),'bodyscroll':new CE('bodyscroll'),'columnresize':new CE('columnresize'),'startdrag':new CE('startdrag'),'enddrag':new CE('enddrag'),'dragdrop':new CE('dragdrop'),'dragover':new CE('dragover'),'dragenter':new CE('dragenter'),'dragout':new CE('dragout')};};YAHOO.ext.grid.Grid.prototype={render:function(){if((!this.container.dom.offsetHeight||this.container.dom.offsetHeight<20)||this.container.getStyle('height')=='auto'){this.autoHeight=true;} +if((!this.container.dom.offsetWidth||this.container.dom.offsetWidth<20)){this.autoWidth=true;} +if(!this.view){if(this.dataModel.isPaged()){this.view=new YAHOO.ext.grid.PagedGridView();}else{this.view=new YAHOO.ext.grid.GridView();}} +this.view.init(this);this.el=getEl(this.view.render(),true);var c=this.container;c.mon("click",this.onClick,this,true);c.mon("dblclick",this.onDblClick,this,true);c.mon("contextmenu",this.onContextMenu,this,true);c.mon("selectstart",this.cancelTextSelection,this,true);c.mon("mousedown",this.cancelTextSelection,this,true);c.mon("mousedown",this.onMouseDown,this,true);c.mon("mouseup",this.onMouseUp,this,true);if(this.trackMouseOver){this.el.mon("mouseover",this.onMouseOver,this,true);this.el.mon("mouseout",this.onMouseOut,this,true);} +c.mon("keypress",this.onKeyPress,this,true);c.mon("keydown",this.onKeyDown,this,true);this.init();},setDataModel:function(dm,rerender){this.view.unplugDataModel(this.dataModel);this.dataModel=dm;this.view.plugDataModel(dm);if(rerender){dm.fireEvent('datachanged');}},init:function(){this.rows=this.el.dom.rows;if(!this.disableSelection){if(!this.selModel){this.selModel=new YAHOO.ext.grid.DefaultSelectionModel(this);} +this.selModel.init(this);this.selModel.onSelectionChange.subscribe(this.updateField,this,true);}else{this.selModel=new YAHOO.ext.grid.DisableSelectionModel(this);this.selModel.init(this);} +if(this.enableDragDrop){this.dd=new YAHOO.ext.grid.GridDD(this,this.container.dom);}},onMouseDown:function(e){this.fireEvent('mousedown',e);},onMouseUp:function(e){this.fireEvent('mouseup',e);},onMouseOver:function(e){this.fireEvent('mouseover',e);},onMouseOut:function(e){this.fireEvent('mouseout',e);},onKeyPress:function(e){this.fireEvent('keypress',e);},onKeyDown:function(e){this.fireEvent('keydown',e);},fireEvent:YAHOO.ext.util.Observable.prototype.fireEvent,on:YAHOO.ext.util.Observable.prototype.on,addListener:YAHOO.ext.util.Observable.prototype.addListener,delayedListener:YAHOO.ext.util.Observable.prototype.delayedListener,removeListener:YAHOO.ext.util.Observable.prototype.removeListener,purgeListeners:YAHOO.ext.util.Observable.prototype.purgeListeners,onClick:function(e){this.fireEvent('click',e);var target=e.getTarget();var row=this.getRowFromChild(target);var cell=this.getCellFromChild(target);var header=this.getHeaderFromChild(target);if(row){this.fireEvent('rowclick',this,row.rowIndex,e);} +if(cell){this.fireEvent('cellclick',this,row.rowIndex,cell.columnIndex,e);} +if(header){this.fireEvent('headerclick',this,header.columnIndex,e);}},onContextMenu:function(e){var target=e.getTarget();var row=this.getRowFromChild(target);var header=this.getHeaderFromChild(target);if(row){this.fireEvent('rowcontextmenu',this,row.rowIndex,e);} +if(header){this.fireEvent('headercontextmenu',this,header.columnIndex,e);} +e.preventDefault();},onDblClick:function(e){this.fireEvent('dblclick',e);var target=e.getTarget();var row=this.getRowFromChild(target);var cell=this.getCellFromChild(target);if(row){this.fireEvent('rowdblclick',this,row.rowIndex,e);} +if(cell){this.fireEvent('celldblclick',this,row.rowIndex,cell.columnIndex,e);}},startEditing:function(rowIndex,colIndex){var row=this.rows[rowIndex];var cell=row.childNodes[colIndex];this.stopEditing();setTimeout(this.doEdit.createDelegate(this,[row,cell]),10);},stopEditing:function(){if(this.activeEditor){this.activeEditor.stopEditing();}},doEdit:function(row,cell){if(!row||!cell)return;var cm=this.colModel;var dm=this.dataModel;var colIndex=cell.columnIndex;var rowIndex=row.rowIndex;if(cm.isCellEditable(colIndex,rowIndex)){var ed=cm.getCellEditor(colIndex,rowIndex);if(ed){if(this.activeEditor){this.activeEditor.stopEditing();} +this.fireEvent('beforeedit',this,rowIndex,colIndex);this.activeEditor=ed;this.editingCell=cell;this.view.ensureVisible(row,true);try{cell.focus();}catch(e){} +ed.init(this,this.el.dom.parentNode,this.setValueDelegate);var value=dm.getValueAt(rowIndex,cm.getDataIndex(colIndex));setTimeout(ed.startEditing.createDelegate(ed,[value,row,cell]),1);}}},setCellValue:function(value,rowIndex,colIndex){this.dataModel.setValueAt(value,rowIndex,this.colModel.getDataIndex(colIndex));this.fireEvent('afteredit',this,rowIndex,colIndex);},cancelTextSelection:function(e){var target=e.getTarget();if(target&&target!=this.el.dom.parentNode&&!this.allowTextSelectionPattern.test(target.tagName)){e.preventDefault();}},autoSize:function(){this.view.updateWrapHeight();this.view.adjustForScroll();},scrollTo:function(row){if(typeof row=='number'){row=this.rows[row];} +this.view.ensureVisible(row,true);},getEditingCell:function(){return this.editingCell;},bindToField:function(fieldId){this.fieldId=fieldId;this.readField();},updateField:function(){if(this.fieldId){var field=YAHOO.util.Dom.get(this.fieldId);field.value=this.getSelectedRowIds().join(',');}},readField:function(){if(this.fieldId){var field=YAHOO.util.Dom.get(this.fieldId);var values=field.value.split(',');var rows=this.getRowsById(values);this.selModel.selectRows(rows,false);}},getRow:function(index){return this.rows[index];},getRowsById:function(id){var dm=this.dataModel;if(!(id instanceof Array)){for(var i=0;i=pos&&x=this.grid.dataModel.getRowCount()){return null;} +return[colIndex,rowIndex];} +return null;},_adjustForScroll:function(){this.forceScrollUpdate();if(this.scrollbarMode==YAHOO.ext.grid.GridView.SCROLLBARS_OVERLAP){var adjustment=0;if(this.wrap.clientWidth&&this.wrap.clientWidth!==0){adjustment=this.wrap.offsetWidth-this.wrap.clientWidth;} +this.hwrap.setWidth(this.wrap.offsetWidth-adjustment);}else{this.hwrap.setWidth(this.wrap.offsetWidth);} +this.bwrap.setWidth(Math.max(this.grid.colModel.getTotalWidth(),this.wrap.clientWidth));},focusRow:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;try{row.childNodes.item(0).hideFocus=true;row.childNodes.item(0).focus();}catch(e){} +this.ensureVisible(row);this.wrap.scrollLeft=left;this.handleScroll();this.lastFocusedRow=row;},ensureVisible:function(row,disableDelay){if(!disableDelay){this.ensureVisibleTask.delay(50,this._ensureVisible,this,[row]);}else{this._ensureVisible(row);}},_ensureVisible:function(row){if(typeof row=='number'){row=this.getBodyTable().childNodes[row];} +if(!row)return;var left=this.wrap.scrollLeft;var rowTop=parseInt(row.offsetTop,10);var rowBottom=rowTop+row.offsetHeight;var clientTop=parseInt(this.wrap.scrollTop,10);var clientBottom=clientTop+this.wrap.clientHeight;if(rowTopclientBottom){this.wrap.scrollTop=rowBottom-this.wrap.clientHeight;} +this.wrap.scrollLeft=left;this.handleScroll();},updateColumns:function(){this.grid.stopEditing();var colModel=this.grid.colModel;var hcols=this.headers;var colCount=colModel.getColumnCount();var pos=0;var totalWidth=colModel.getTotalWidth();for(var i=0;i'+'{1}'+''+''}]});htemplate.compile();for(var i=0;i0){this.removeRows(0,count-1);}},query:function(spec,returnUnmatched){var d=this.data;var r=[];for(var i=0;iv2) +return dsc?-1:+1;return 0;};this.data.sort(fn);if(!suppressEvent){this.fireRowsSorted(columnIndex,direction);}},each:function(fn,scope){var d=this.data;for(var i=0,len=d.length;i0;},getTotalRowCount:function(){return this.totalCount||this.getRowCount();},getPageSize:function(){return this.pageSize;},getTotalPages:function(){if(this.getPageSize()==0||this.getTotalRowCount()==0){return 1;} +return Math.ceil(this.getTotalRowCount()/this.getPageSize());},initPaging:function(url,pageSize,baseParams){this.pageUrl=url;this.pageSize=pageSize;this.remoteSort=true;if(baseParams)this.baseParams=baseParams;},createParams:function(pageNum,sortColumn,sortDir){var params={},map=this.paramMap;for(var key in this.baseParams){if(typeof this.baseParams[key]!='function'){params[key]=this.baseParams[key];}} +params[map['page']]=pageNum;params[map['pageSize']]=this.getPageSize();params[map['sortColumn']]=(typeof sortColumn=='undefined'?'':sortColumn);params[map['sortDir']]=sortDir||'';return params;},loadPage:function(pageNum,callback,keepExisting){var sort=this.getSortState();var params=this.createParams(pageNum,sort.column,sort.direction);this.load(this.pageUrl,params,this.setLoadedPage.createDelegate(this,[pageNum,callback]),keepExisting?(pageNum-1)*this.pageSize:null);},applySort:function(suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.applySort.apply(this,arguments);}else if(!suppressEvent){var sort=this.getSortState();if(sort.column){this.fireRowsSorted(sort.column,sort.direction,true);}}},resetPaging:function(){this.loadedPage=1;},sort:function(sortInfo,columnIndex,direction,suppressEvent){if(!this.remoteSort){YAHOO.ext.grid.LoadableDataModel.superclass.sort.apply(this,arguments);}else{this.sortInfo=sortInfo;this.sortColumn=columnIndex;this.sortDir=direction;var params=this.createParams(this.loadedPage,columnIndex,direction);this.load(this.pageUrl,params,this.fireRowsSorted.createDelegate(this,[columnIndex,direction,true]));}},load:function(url,params,callback,insertIndex){this.fireEvent('beforeload',this);if(params&&typeof params!='string'){var buf=[];for(var key in params){if(typeof params[key]!='function'){buf.push(encodeURIComponent(key),'=',encodeURIComponent(params[key]),'&');}} +delete buf[buf.length-1];params=buf.join('');} +var cb={success:this.processResponse,failure:this.processException,scope:this,argument:{callback:callback,insertIndex:insertIndex}};var method=params?'POST':'GET';YAHOO.util.Connect.asyncRequest(method,url,cb,params);},processResponse:function(response){var cb=response.argument.callback;var keepExisting=(typeof response.argument.insertIndex=='number');var insertIndex=response.argument.insertIndex;switch(this.dataType){case YAHOO.ext.grid.LoadableDataModel.XML:this.loadData(response.responseXML,cb,keepExisting,insertIndex);break;case YAHOO.ext.grid.LoadableDataModel.JSON:var rtext=response.responseText;try{while(rtext.substring(0,1)==" "){rtext=rtext.substring(1,rtext.length);} +if(rtext.indexOf("{")<0){throw"Invalid JSON response";} +if(rtext.indexOf("{}")===0){this.loadData({},response.argument.callback);return;} +var jsonObjRaw=eval("("+rtext+")");if(!jsonObjRaw){throw"Error evaling JSON response";} +this.loadData(jsonObjRaw,cb,keepExisting,insertIndex);}catch(e){this.fireLoadException(e,response);if(typeof callback=='function'){callback(this,false);}} +break;case YAHOO.ext.grid.LoadableDataModel.TEXT:this.loadData(response.responseText,cb,keepExisting,insertIndex);break;};},processException:function(response){this.fireLoadException(null,response);if(typeof response.argument.callback=='function'){response.argument.callback(this,false);}},fireLoadException:function(e,responseObj){this.onLoadException.fireDirect(this,e,responseObj);},fireLoadEvent:function(){this.fireEvent('load',this.loadedPage,this.getTotalPages());},addPreprocessor:function(columnIndex,fn){this.preprocessors[columnIndex]=fn;},getPreprocessor:function(columnIndex){return this.preprocessors[columnIndex];},removePreprocessor:function(columnIndex){this.preprocessors[columnIndex]=null;},addPostprocessor:function(columnIndex,fn){this.postprocessors[columnIndex]=fn;},getPostprocessor:function(columnIndex){return this.postprocessors[columnIndex];},removePostprocessor:function(columnIndex){this.postprocessors[columnIndex]=null;},loadData:function(data,callback,keepExisting,insertIndex){}});YAHOO.ext.grid.LoadableDataModel.XML='xml';YAHOO.ext.grid.LoadableDataModel.JSON='json';YAHOO.ext.grid.LoadableDataModel.TEXT='text'; + +YAHOO.ext.grid.XMLDataModel=function(schema,xml){YAHOO.ext.grid.XMLDataModel.superclass.constructor.call(this,YAHOO.ext.grid.LoadableDataModel.XML);this.schema=schema;this.xml=xml;if(xml){this.loadData(xml);} +this.idSeed=0;};YAHOO.extendX(YAHOO.ext.grid.XMLDataModel,YAHOO.ext.grid.LoadableDataModel,{getDocument:function(){return this.xml;},loadData:function(doc,callback,keepExisting,insertIndex){this.xml=doc;var idField=this.schema.id;var fields=this.schema.fields;if(this.schema.totalTag){this.totalCount=null;var totalNode=doc.getElementsByTagName(this.schema.totalTag);if(totalNode&&totalNode.item(0)&&totalNode.item(0).firstChild){var v=parseInt(totalNode.item(0).firstChild.nodeValue,10);if(!isNaN(v)){this.totalCount=v;}}} +var rowData=[];var nodes=doc.getElementsByTagName(this.schema.tagName);if(nodes&&nodes.length>0){for(var i=0;i0){return this.getNamedValue(node,name.substr(index+1),defaultValue);}}} +return nodeValue;},setNamedValue:function(node,name,value){if(!node||!name){return;} +var attrNode=node.attributes.getNamedItem(name);if(attrNode){attrNode.value=value;return;} +var childNode=node.getElementsByTagName(name);if(childNode&&childNode.item(0)&&childNode.item(0).firstChild){childNode.item(0).firstChild.nodeValue=value;}else{var index=name.indexOf(':');if(index>0){this.setNamedValue(node,name.substr(index+1),value);}}},setValueAt:function(value,rowIndex,colIndex){var node=this.data[rowIndex].node;if(node){var nodeValue=value;if(this.postprocessors[colIndex]){nodeValue=this.postprocessors[colIndex](value);} +this.setNamedValue(node,this.schema.fields[colIndex],nodeValue);} +YAHOO.ext.grid.XMLDataModel.superclass.setValueAt.call(this,value,rowIndex,colIndex);},getRowId:function(rowIndex){return this.data[rowIndex].id;},addRows:function(rowData){for(var j=0,len=rowData.length;j0){var ids=this.selectedRowIds.concat();this.clearSelections();this.selectRowsById(ids,true);}},selectRowsById:function(id,keepExisting){var rows=this.grid.getRowsById(id);if(!(rows instanceof Array)){this.selectRow(rows,keepExisting);return;} +this.selectRows(rows,keepExisting);},getCount:function(){return this.selectedRows.length;},selectFirstRow:function(){for(var j=0;j=0;j--){var row=this.grid.rows[j];if(this.isSelectable(row)){this.focusRow(row);this.setRowState(row,true,keepExisting);return;}}}},getSelectedRows:function(){return this.selectedRows;},getSelectedRowIds:function(){return this.selectedRowIds;},clearSelections:function(){if(this.isLocked())return;var oldSelections=this.selectedRows.concat();for(var j=0;j0;},isSelected:function(row){return row&&(row.selected===true||row.getAttribute('selected')=='true');},isSelectable:function(row){return row&&row.getAttribute('selectable')!='false';},rowClick:function(grid,rowIndex,e){if(this.isLocked())return;var row=grid.getRow(rowIndex);if(this.isSelectable(row)){if(e.shiftKey&&this.lastSelectedRow){var lastIndex=this.lastSelectedRow.rowIndex;this.selectRange(this.lastSelectedRow,row,e.ctrlKey);this.lastSelectedRow=this.grid.el.dom.rows[lastIndex];}else{this.focusRow(row);var rowState=e.ctrlKey?!this.isSelected(row):true;this.setRowState(row,rowState,e.hasModifier());}}},focusRow:function(row){this.grid.view.focusRow(row);},selectRow:function(row,keepExisting){this.setRowState(this.getRow(row),true,keepExisting);},selectRows:function(rows,keepExisting){if(!keepExisting){this.clearSelections();} +for(var i=0;ithis.maxValue.getTime()){dom.title=this.maxText.replace('%0',this.formatDate(this.maxValue));this.element.addClass('ygrid-editor-invalid');return false;} +if(this.disabledDays){var day=value.getDay();for(var i=0;ithis.maxValue){dom.title=this.maxText.replace('%0',this.maxValue);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.NumberEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.NumberEditor.superclass.show.call(this);if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.NumberEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{var value=this.element.dom.value;if(value.length<1){return value;}else{return this.fixPrecision(this.parseValue(value));}}};YAHOO.ext.grid.NumberEditor.prototype.parseValue=function(value){return parseFloat(new String(value).replace(this.decimalSeparator,'.'));};YAHOO.ext.grid.NumberEditor.prototype.fixPrecision=function(value){if(!this.allowDecimals||this.decimalPrecision==-1||isNaN(value)||value==0||!value){return value;} +var scale=Math.pow(10,this.decimalPrecision+1);var fixed=this.decimalPrecisionFcn(value*scale);fixed=this.decimalPrecisionFcn(fixed/10);return fixed/(scale/10);};YAHOO.ext.grid.NumberEditor.prototype.allowBlank=true;YAHOO.ext.grid.NumberEditor.prototype.allowDecimals=true;YAHOO.ext.grid.NumberEditor.prototype.decimalSeparator='.';YAHOO.ext.grid.NumberEditor.prototype.decimalPrecision=2;YAHOO.ext.grid.NumberEditor.prototype.decimalPrecisionFcn=Math.floor;YAHOO.ext.grid.NumberEditor.prototype.allowNegative=true;YAHOO.ext.grid.NumberEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.NumberEditor.prototype.minValue=Number.NEGATIVE_INFINITY;YAHOO.ext.grid.NumberEditor.prototype.maxValue=Number.MAX_VALUE;YAHOO.ext.grid.NumberEditor.prototype.minText='The minimum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.maxText='The maximum value for this field is %0';YAHOO.ext.grid.NumberEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.NumberEditor.prototype.nanText='%0 is not a valid number';YAHOO.ext.grid.NumberEditor.prototype.validationDelay=100;YAHOO.ext.grid.NumberEditor.prototype.validator=function(){return true;}; + +YAHOO.ext.DatePicker=function(id,parentElement){this.id=id;this.selectedDate=new Date();this.visibleDate=new Date();this.element=null;this.shadow=null;this.callback=null;this.buildControl(parentElement||document.body);this.mouseDownHandler=YAHOO.ext.EventManager.wrap(this.handleMouseDown,this,true);this.keyDownHandler=YAHOO.ext.EventManager.wrap(this.handleKeyDown,this,true);this.wheelHandler=YAHOO.ext.EventManager.wrap(this.handleMouseWheel,this,true);};YAHOO.ext.DatePicker.prototype={show:function(x,y,value,callback){this.hide();this.selectedDate=value;this.visibleDate=value;this.callback=callback;this.refresh();this.element.show();this.element.setXY(this.constrainToViewport?this.constrainXY(x,y):[x,y]);this.shadow.show();this.shadow.setRegion(this.element.getRegion());this.element.dom.tabIndex=1;this.element.focus();YAHOO.util.Event.on(document,"mousedown",this.mouseDownHandler);YAHOO.util.Event.on(document,"keydown",this.keyDownHandler);YAHOO.util.Event.on(document,"mousewheel",this.wheelHandler);YAHOO.util.Event.on(document,"DOMMouseScroll",this.wheelHandler);},constrainXY:function(x,y){var w=YAHOO.util.Dom.getViewportWidth();var h=YAHOO.util.Dom.getViewportHeight();var size=this.element.getSize();return[Math.min(w-size.width,x),Math.min(h-size.height,y)];},hide:function(){this.shadow.hide();this.element.hide();YAHOO.util.Event.removeListener(document,"mousedown",this.mouseDownHandler);YAHOO.util.Event.removeListener(document,"keydown",this.keyDownHandler);YAHOO.util.Event.removeListener(document,"mousewheel",this.wheelHandler);YAHOO.util.Event.removeListener(document,"DOMMouseScroll",this.wheelHandler);},setSelectedDate:function(date){this.selectedDate=date;},getSelectedDate:function(){return this.selectedDate;},showPrevMonth:function(){this.visibleDate=this.getPrevMonth(this.visibleDate);this.refresh();},showNextMonth:function(){this.visibleDate=this.getNextMonth(this.visibleDate);this.refresh();},showPrevYear:function(){var d=this.visibleDate;this.visibleDate=new Date(d.getFullYear()-1,d.getMonth(),d.getDate());this.refresh();},showNextYear:function(){var d=this.visibleDate;this.visibleDate=new Date(d.getFullYear()+1,d.getMonth(),d.getDate());this.refresh();},handleMouseDown:function(e){var target=e.getTarget();if(target!=this.element.dom&&!YAHOO.util.Dom.isAncestor(this.element.dom,target)){this.hide();}},handleKeyDown:function(e){switch(e.browserEvent.keyCode){case e.LEFT:this.showPrevMonth();e.stopEvent();break;case e.RIGHT:this.showNextMonth();e.stopEvent();break;case e.DOWN:this.showPrevYear();e.stopEvent();break;case e.UP:this.showNextYear();e.stopEvent();break;}},handleMouseWheel:function(e){var delta=e.getWheelDelta();if(delta>0){this.showPrevMonth();e.stopEvent();}else if(delta<0){this.showNextMonth();e.stopEvent();}},handleClick:function(e){var d=this.visibleDate;var t=e.getTarget();if(t&&t.className){switch(t.className){case'active':this.handleSelection(new Date(d.getFullYear(),d.getMonth(),parseInt(t.innerHTML)));break;case'prevday':var p=this.getPrevMonth(d);this.handleSelection(new Date(p.getFullYear(),p.getMonth(),parseInt(t.innerHTML)));break;case'nextday':var n=this.getNextMonth(d);this.handleSelection(new Date(n.getFullYear(),n.getMonth(),parseInt(t.innerHTML)));break;case'ypopcal-today':this.handleSelection(new Date());break;case'next-month':this.showNextMonth();break;case'prev-month':this.showPrevMonth();break;}} +e.stopEvent();},selectToday:function(){this.handleSelection(new Date());},handleSelection:function(date){this.selectedDate=date;this.callback(date);this.hide();},getPrevMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==0?new Date(--y,11,1):new Date(y,--m,1));},getNextMonth:function(d){var m=d.getMonth();var y=d.getFullYear();return(m==11?new Date(++y,0,1):new Date(y,++m,1));},getDaysInMonth:function(m,y){return(m==1||m==3||m==5||m==7||m==8||m==10||m==12)?31:(m==4||m==6||m==9||m==11)?30:this.isLeapYear(y)?29:28;},isLeapYear:function(y){return(((y%4)==0)&&((y%100)!=0)||((y%400)==0));},clearTime:function(date){if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0);} +return date;},refresh:function(){var d=this.visibleDate;this.buildInnerCal(d);this.calHead.update(this.monthNames[d.getMonth()]+' '+d.getFullYear());if(this.element.isVisible()){this.shadow.setRegion(this.element.getRegion());}}};YAHOO.ext.DatePicker.prototype.buildControl=function(parentElement){var c=document.createElement('div');c.style.position='absolute';c.style.visibility='hidden';document.body.appendChild(c);var html=''+'';c.innerHTML=html;this.shadow=getEl(c.childNodes[0],true);this.shadow.enableDisplayMode();this.element=getEl(c.childNodes[1],true);this.element.enableDisplayMode();document.body.appendChild(this.shadow.dom);document.body.appendChild(this.element.dom);document.body.removeChild(c);this.element.on("selectstart",function(){return false;});var tbody=this.element.dom.getElementsByTagName('tbody')[1];this.cells=tbody.getElementsByTagName('td');this.calHead=this.element.getChildrenByClassName('ypopcal-month','td')[0];this.element.mon('mousedown',this.handleClick,this,true);};YAHOO.ext.DatePicker.prototype.buildInnerCal=function(dateVal){var days=this.getDaysInMonth(dateVal.getMonth()+1,dateVal.getFullYear());var firstOfMonth=new Date(dateVal.getFullYear(),dateVal.getMonth(),1);var startingPos=firstOfMonth.getDay();if(startingPos==0)startingPos=7;var pm=this.getPrevMonth(dateVal);var prevStart=this.getDaysInMonth(pm.getMonth()+1,pm.getFullYear())-startingPos;var cells=this.cells;days+=startingPos;var day=86400000;var date=this.clearTime(new Date(pm.getFullYear(),pm.getMonth(),prevStart));var today=this.clearTime(new Date()).getTime();var sel=this.selectedDate?this.clearTime(this.selectedDate).getTime():today+1;var min=this.minDate?this.clearTime(this.minDate).getTime():Number.NEGATIVE_INFINITY;var max=this.maxDate?this.clearTime(this.maxDate).getTime():Number.POSITIVE_INFINITY;var ddMatch=this.disabledDatesRE;var ddText=this.disabledDatesText;var ddays=this.disabledDays;var ddaysText=this.disabledDaysText;var format=this.format;var setCellClass=function(cal,cell,d){cell.title='';var t=d.getTime();if(t==today){cell.className+=' today';cell.title=cal.todayText;} +if(t==sel){cell.className+=' selected';} +if(tmax){cell.className=' ypopcal-disabled';cell.title=cal.maxText;return;} +if(ddays){var day=d.getDay();for(var i=0;ithis.maxLength){dom.title=this.maxText.replace('%0',this.maxLength);this.element.addClass('ygrid-editor-invalid');return false;} +var msg=this.validator(value);if(msg!==true){dom.title=msg;this.element.addClass('ygrid-editor-invalid');return false;} +if(this.regex&&!this.regex.test(value)){dom.title=this.regexText;this.element.addClass('ygrid-editor-invalid');return false;} +dom.title='';this.element.removeClass('ygrid-editor-invalid');return true;};YAHOO.ext.grid.TextEditor.prototype.initEvents=function(){YAHOO.ext.grid.TextEditor.superclass.initEvents.call(this);var vtask=new YAHOO.ext.util.DelayedTask(this.validate,this);this.element.mon('keyup',vtask.delay.createDelegate(vtask,[this.validationDelay]));};YAHOO.ext.grid.TextEditor.prototype.show=function(){this.element.dom.title='';YAHOO.ext.grid.TextEditor.superclass.show.call(this);this.element.focus();if(this.selectOnFocus){try{this.element.dom.select();}catch(e){}} +this.validate(this.element.dom.value);};YAHOO.ext.grid.TextEditor.prototype.getValue=function(){if(!this.validate()){return this.originalValue;}else{return this.element.dom.value;}};YAHOO.ext.grid.TextEditor.prototype.allowBlank=true;YAHOO.ext.grid.TextEditor.prototype.minLength=0;YAHOO.ext.grid.TextEditor.prototype.maxLength=Number.MAX_VALUE;YAHOO.ext.grid.TextEditor.prototype.minText='The minimum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.maxText='The maximum length for this field is %0';YAHOO.ext.grid.TextEditor.prototype.selectOnFocus=true;YAHOO.ext.grid.TextEditor.prototype.blankText='This field cannot be blank';YAHOO.ext.grid.TextEditor.prototype.validator=function(){return true;};YAHOO.ext.grid.TextEditor.prototype.validationDelay=200;YAHOO.ext.grid.TextEditor.prototype.regex=null;YAHOO.ext.grid.TextEditor.prototype.regexText=''; + +YAHOO.ext.LayoutManager=function(container){YAHOO.ext.LayoutManager.superclass.constructor.call(this);this.el=getEl(container,true);this.id=this.el.id;this.el.addClass('ylayout-container');this.monitorWindowResize=true;this.regions={};this.events={'layout':new YAHOO.util.CustomEvent(),'regionresized':new YAHOO.util.CustomEvent(),'regioncollapsed':new YAHOO.util.CustomEvent(),'regionexpanded':new YAHOO.util.CustomEvent()};this.updating=false;YAHOO.ext.EventManager.onWindowResize(this.onWindowResize,this,true);};YAHOO.extendX(YAHOO.ext.LayoutManager,YAHOO.ext.util.Observable,{isUpdating:function(){return this.updating;},beginUpdate:function(){this.updating=true;},endUpdate:function(noLayout){this.updating=false;if(!noLayout){this.layout();}},layout:function(){},onRegionResized:function(region,newSize){this.fireEvent('regionresized',region,newSize);this.layout();},onRegionCollapsed:function(region){this.fireEvent('regioncollapsed',region);},onRegionExpanded:function(region){this.fireEvent('regionexpanded',region);},getViewSize:function(){var size;if(this.el.dom!=document.body){this.el.beginMeasure();size=this.el.getSize();this.el.endMeasure();}else{size={width:YAHOO.util.Dom.getViewportWidth(),height:YAHOO.util.Dom.getViewportHeight()};} +size.width-=this.el.getBorderWidth('lr')-this.el.getPadding('lr');size.height-=this.el.getBorderWidth('tb')-this.el.getPadding('tb');return size;},getEl:function(){return this.el;},getRegion:function(target){return this.regions[target];},onWindowResize:function(){if(this.monitorWindowResize){this.layout();}}}); + +YAHOO.ext.LayoutRegion=function(mgr,config,pos){this.mgr=mgr;this.position=pos;var dh=YAHOO.ext.DomHelper;this.el=dh.append(mgr.el.dom,{tag:'div',cls:'ylayout-panel ylayout-panel-'+this.position},true);this.titleEl=dh.append(this.el.dom,{tag:'div',unselectable:'on',cls:'yunselectable ylayout-panel-hd ylayout-title-'+this.position,children:[{tag:'span',cls:'yunselectable ylayout-panel-hd-text',unselectable:'on',html:' '},{tag:'div',cls:'yunselectable ylayout-panel-hd-tools',unselectable:'on'}]},true);this.titleEl.enableDisplayMode();this.titleTextEl=this.titleEl.dom.firstChild;this.tools=getEl(this.titleEl.dom.childNodes[1],true);this.closeBtn=this.createTool(this.tools.dom,'ylayout-close');this.closeBtn.enableDisplayMode();this.closeBtn.on('click',this.closeClicked,this,true);this.closeBtn.hide();this.bodyEl=dh.append(this.el.dom,{tag:'div',cls:'ylayout-panel-body'},true);this.events={'invalidated':new YAHOO.util.CustomEvent('invalidated'),'visibilitychange':new YAHOO.util.CustomEvent('visibilitychange'),'paneladded':new YAHOO.util.CustomEvent('paneladded'),'panelremoved':new YAHOO.util.CustomEvent('panelremoved'),'collapsed':new YAHOO.util.CustomEvent('collapsed'),'expanded':new YAHOO.util.CustomEvent('expanded'),'panelactivated':new YAHOO.util.CustomEvent('panelactivated'),'resized':new YAHOO.util.CustomEvent('resized')};this.panels=new YAHOO.ext.util.MixedCollection();this.panels.getKey=this.getPanelId.createDelegate(this);this.box=null;this.visible=false;this.collapsed=false;this.hide();this.on('paneladded',this.validateVisibility,this,true);this.on('panelremoved',this.validateVisibility,this,true);this.activePanel=null;this.applyConfig(config);};YAHOO.extendX(YAHOO.ext.LayoutRegion,YAHOO.ext.util.Observable,{getPanelId:function(p){return p.getId();},applyConfig:function(config){if(config.collapsible&&this.position!='center'&&!this.collapsedEl){var dh=YAHOO.ext.DomHelper;this.collapseBtn=this.createTool(this.tools.dom,'ylayout-collapse-'+this.position);this.collapseBtn.mon('click',this.collapse,this,true);this.collapsedEl=dh.append(this.mgr.el.dom,{tag:'div',cls:'ylayout-collapsed ylayout-collapsed-'+this.position,children:[{tag:'div',cls:'ylayout-collapsed-tools'}]},true);if(config.floatable!==false){this.collapsedEl.addClassOnOver('ylayout-collapsed-over');this.collapsedEl.mon('click',this.collapseClick,this,true);} +this.expandBtn=this.createTool(this.collapsedEl.dom.firstChild,'ylayout-expand-'+this.position);this.expandBtn.mon('click',this.expand,this,true);} +if(this.collapseBtn){this.collapseBtn.setVisible(config.collapsible==true);} +this.cmargins=config.cmargins||this.cmargins||(this.position=='west'||this.position=='east'?{top:0,left:2,right:2,bottom:0}:{top:2,left:0,right:0,bottom:2});this.margins=config.margins||this.margins||{top:0,left:0,right:0,bottom:0};this.bottomTabs=config.tabPosition!='top';this.autoScroll=config.autoScroll||false;if(this.autoScroll){this.bodyEl.setStyle('overflow','auto');}else{this.bodyEl.setStyle('overflow','hidden');} +if((!config.titlebar&&!config.title)||config.titlebar===false){this.titleEl.hide();}else{this.titleEl.show();if(config.title){this.titleTextEl.innerHTML=config.title;}} +this.duration=config.duration||.30;this.slideDuration=config.slideDuration||.45;this.config=config;if(config.collapsed){this.collapse(true);}},resizeTo:function(newSize){switch(this.position){case'east':case'west':this.el.setWidth(newSize);this.fireEvent('resized',this,newSize);break;case'north':case'south':this.el.setHeight(newSize);this.fireEvent('resized',this,newSize);break;}},getBox:function(){var b;if(!this.collapsed){b=this.el.getBox(false,true);}else{b=this.collapsedEl.getBox(false,true);} +return b;},getMargins:function(){return this.collapsed?this.cmargins:this.margins;},highlight:function(){this.el.addClass('ylayout-panel-dragover');},unhighlight:function(){this.el.removeClass('ylayout-panel-dragover');},updateBox:function(box){this.box=box;if(!this.collapsed){this.el.dom.style.left=box.x+'px';this.el.dom.style.top=box.y+'px';this.el.setSize(box.width,box.height);var bodyHeight=this.config.titlebar?box.height-(this.titleEl.getHeight()||0):box.height;bodyHeight-=this.el.getBorderWidth('tb');bodyWidth=box.width-this.el.getBorderWidth('rl');this.bodyEl.setHeight(bodyHeight);this.bodyEl.setWidth(bodyWidth);var tabHeight=bodyHeight;if(this.tabs){tabHeight=this.tabs.syncHeight(bodyHeight);if(YAHOO.ext.util.Browser.isIE)this.tabs.el.repaint();} +this.panelSize={width:bodyWidth,height:tabHeight};if(this.activePanel){this.activePanel.setSize(bodyWidth,tabHeight);}}else{this.collapsedEl.dom.style.left=box.x+'px';this.collapsedEl.dom.style.top=box.y+'px';this.collapsedEl.setSize(box.width,box.height);} +if(this.tabs){this.tabs.autoSizeTabs();}},getEl:function(){return this.el;},hide:function(){if(!this.collapsed){this.el.dom.style.left='-2000px';this.el.hide();}else{this.collapsedEl.dom.style.left='-2000px';this.collapsedEl.hide();} +this.visible=false;this.fireEvent('visibilitychange',this,false);},show:function(){if(!this.collapsed){this.el.show();}else{this.collapsedEl.show();} +this.visible=true;this.fireEvent('visibilitychange',this,true);},isVisible:function(){return this.visible;},closeClicked:function(){if(this.activePanel){this.remove(this.activePanel);}},collapseClick:function(e){if(this.isSlid){e.stopPropagation();this.slideIn();}else{e.stopPropagation();this.slideOut();}},collapse:function(skipAnim){if(this.collapsed)return;this.collapsed=true;if(this.split){this.split.el.hide();} +if(this.config.animate&&skipAnim!==true){this.animateCollapse();}else{this.el.setLocation(-20000,-20000);this.el.hide();this.collapsedEl.show();this.fireEvent('collapsed',this);} +this.fireEvent('invalidated',this);},animateCollapse:function(){},expand:function(e,skipAnim){if(e)e.stopPropagation();if(!this.collapsed)return;if(this.isSlid){this.slideIn(this.expand.createDelegate(this));return;} +this.collapsed=false;this.el.show();if(this.config.animate&&skipAnim!==true){this.animateExpand();}else{if(this.split){this.split.el.show();} +this.collapsedEl.setLocation(-2000,-2000);this.collapsedEl.hide();this.fireEvent('invalidated',this);this.fireEvent('expanded',this);}},animateExpand:function(){},initTabs:function(){this.bodyEl.setStyle('overflow','hidden');var ts=new YAHOO.ext.TabPanel(this.bodyEl.dom,this.bottomTabs);this.tabs=ts;ts.resizeTabs=this.config.resizeTabs===true;ts.minTabWidth=this.config.minTabWidth||40;ts.maxTabWidth=this.config.maxTabWidth||250;ts.preferredTabWidth=this.config.preferredTabWidth||150;ts.monitorResize=false;ts.bodyEl.setStyle('overflow',this.config.autoScroll?'auto':'hidden');this.panels.each(this.initPanelAsTab,this);},initPanelAsTab:function(panel){var ti=this.tabs.addTab(panel.getEl().id,panel.getTitle(),null,this.config.closeOnTab&&panel.isClosable());ti.on('activate',function(){this.setActivePanel(panel);},this,true);if(this.config.closeOnTab){ti.on('beforeclose',function(t,e){e.cancel=true;this.remove(panel);},this,true);} +return ti;},updatePanelTitle:function(panel,title){if(this.activePanel==panel){this.updateTitle(title);} +if(this.tabs){this.tabs.getTab(panel.getEl().id).setText(title);}},updateTitle:function(title){if(this.titleTextEl&&!this.config.title){this.titleTextEl.innerHTML=(typeof title!='undefined'&&title.length>0?title:" ");}},setActivePanel:function(panel){panel=this.getPanel(panel);if(this.activePanel&&this.activePanel!=panel){this.activePanel.setActiveState(false);} +this.activePanel=panel;panel.setActiveState(true);if(this.panelSize){panel.setSize(this.panelSize.width,this.panelSize.height);} +this.closeBtn.setVisible(!this.config.closeOnTab&&!this.isSlid&&panel.isClosable());this.updateTitle(panel.getTitle());this.fireEvent('panelactivated',this,panel);},showPanel:function(panel){if(panel=this.getPanel(panel)){if(this.tabs){this.tabs.activate(panel.getEl().id);}else{this.setActivePanel(panel);}} +return panel;},getActivePanel:function(){return this.activePanel;},validateVisibility:function(){if(this.panels.getCount()<1){this.updateTitle(' ');this.closeBtn.hide();this.hide();}else{if(!this.isVisible()){this.show();}}},add:function(panel){if(arguments.length>1){for(var i=0,len=arguments.length;i0){this.body.addClass(this.tabPosition=='bottom'?'ytabs-bottom':'ytabs-top');this.tabs=new YAHOO.ext.TabPanel(this.body.dom,this.tabPosition=='bottom');for(var i=0,len=tabEls.length;i
         {0} 
        ');} +var btn=this.buttonTemplate.append(this.footer.dom,[config],true);var tbl=getEl(btn.dom.firstChild,true);if(this.minButtonWidth){if(tbl.getWidth()vw){x=vw-w;moved=true;} +if(y+h>vh){y=vh-h;moved=true;} +if(x<0){x=0;moved=true;} +if(y<0){y=0;moved=true;} +if(moved){this.xy=[x,y];if(this.isVisible()){this.el.setLocation(x,y);this.adjustAssets();}}}},onDrag:function(){if(!this.proxyDrag){this.xy=this.el.getXY();this.adjustAssets();}},adjustAssets:function(doShow){var x=this.xy[0],y=this.xy[1];var w=this.size.width,h=this.size.height;if(doShow===true){if(this.shadow){this.shadow.show();} +if(this.shim){this.shim.show();}} +if(this.shadow&&this.shadow.isVisible()){this.shadow.setBounds(x+this.shadowOffset,y+this.shadowOffset,w,h);} +if(this.shim&&this.shim.isVisible()){this.shim.setBounds(x,y,w,h);}},adjustViewport:function(w,h){if(!w||!h){w=YAHOO.util.Dom.getViewportWidth();h=YAHOO.util.Dom.getViewportHeight();} +this.viewSize=[w,h];if(this.modal&&this.mask.isVisible()){this.mask.setSize(w,h);this.mask.setSize(YAHOO.util.Dom.getDocumentWidth(),YAHOO.util.Dom.getDocumentHeight());} +if(this.isVisible()){this.constrainXY();}},destroy:function(removeEl){YAHOO.ext.EventManager.removeResizeListener(this.adjustViewport,this);if(this.tabs){this.tabs.destroy(removeEl);} +if(removeEl===true){this.el.update('');this.el.remove();} +YAHOO.ext.DialogManager.unregister(this);},startMove:function(){if(this.proxyDrag){this.proxy.show();} +if(this.constraintoviewport!==false){this.dd.constrainTo(document.body,{right:this.shadowOffset,bottom:this.shadowOffset});}},endMove:function(){if(!this.proxyDrag){YAHOO.util.DD.prototype.endDrag.apply(this.dd,arguments);}else{YAHOO.util.DDProxy.prototype.endDrag.apply(this.dd,arguments);this.proxy.hide();} +this.refreshSize();this.adjustAssets();this.fireEvent('move',this,this.xy[0],this.xy[1])},toFront:function(){YAHOO.ext.DialogManager.bringToFront(this);return this;},toBack:function(){YAHOO.ext.DialogManager.sendToBack(this);return this;},center:function(){this.moveTo(this.el.getCenterXY(true));return this;},moveTo:function(x,y){this.xy=[x,y];if(this.isVisible()){this.el.setXY(this.xy);this.adjustAssets();} +return this;},isVisible:function(){return this.el.isVisible();},hide:function(callback){if(this.fireEvent('beforehide',this)===false) +return;if(this.shadow){this.shadow.hide();} +if(this.animateTarget){var b=getEl(this.animateTarget,true).getBox();this.proxy.show();this.proxy.setBounds(this.xy[0],this.xy[1],this.size.width,this.size.height);this.el.hide();this.proxy.setBounds(b.x,b.y,b.width,b.height,true,.35,this.hideEl.createDelegate(this,[callback]));}else{this.el.hide();this.hideEl(callback);} +return this;},hideEl:function(callback){this.proxy.hide();if(this.modal){this.mask.hide();YAHOO.util.Dom.removeClass(document.body,'masked');} +this.fireEvent('hide',this);if(typeof callback=='function'){callback();}},hideAction:function(){this.setLeft('-10000px');this.setTop('-10000px');this.setStyle('visibility','hidden');},refreshSize:function(){this.size=this.el.getSize();this.xy=this.el.getXY();YAHOO.ext.state.Manager.set(this.el.id+'-state',this.el.getBox());},setZIndex:function(index){if(this.modal){this.mask.setStyle('z-index',index);} +if(this.shadow){this.shadow.setStyle('z-index',++index);} +if(this.shim){this.shim.setStyle('z-index',++index);} +this.el.setStyle('z-index',++index);if(this.proxy){this.proxy.setStyle('z-index',++index);} +if(this.resizer){this.resizer.proxy.setStyle('z-index',++index);} +this.lastZIndex=index;},getEl:function(){return this.el;}});YAHOO.ext.DialogManager=function(){var list={};var accessList=[];var front=null;var sortDialogs=function(d1,d2){return(!d1._lastAccess||d1._lastAccess=this.nodes.length-1){this.el.update('');}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){el.removeChild(this.nodes[startIndex]);} +this.updateIndexes(startIndex);}},insertNodes:function(dm,startIndex,endIndex){if(this.nodes.length==0){this.refresh();}else{this.clearSelections();var t=this.tpl;var before=this.nodes[startIndex];var dm=this.dataModel;if(before){for(var i=startIndex;i<=endIndex;i++){t.insertBefore(before,this.prepareData(dm.getRow(i),i));}}else{var el=this.el.dom;for(var i=startIndex;i<=endIndex;i++){t.append(el,this.prepareData(dm.getRow(i),i));}} +this.updateIndexes(startIndex);}},updateIndexes:function(dm,startIndex,endIndex){var ns=this.nodes;startIndex=startIndex||0;endIndex=endIndex||ns.length-1;for(var i=startIndex;i<=endIndex;i++){ns[i].nodeIndex=i;}},setDataModel:function(dm){if(!dm)return;this.unplugDataModel(this.dataModel);this.dataModel=dm;dm.on('cellupdated',this.refreshNode,this,true);dm.on('datachanged',this.refresh,this,true);dm.on('rowsdeleted',this.deleteNodes,this,true);dm.on('rowsinserted',this.insertNodes,this,true);dm.on('rowsupdated',this.refreshNodes,this,true);dm.on('rowssorted',this.refresh,this,true);this.refresh();},unplugDataModel:function(dm){if(!dm)return;dm.removeListener('cellupdated',this.refreshNode,this);dm.removeListener('datachanged',this.refresh,this);dm.removeListener('rowsdeleted',this.deleteNodes,this);dm.removeListener('rowsinserted',this.insertNodes,this);dm.removeListener('rowsupdated',this.refreshNodes,this);dm.removeListener('rowssorted',this.refresh,this);this.dataModel=null;},findItemFromChild:function(node){var el=this.el.dom;if(!node||node.parentNode==el){return node;} +var p=node.parentNode;while(p&&p!=el){if(p.parentNode==el){return p;} +p=p.parentNode;} +return null;},onClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){var index=this.indexOf(item);this.onItemClick(item,index,e);this.fireEvent('click',this,index,item,e);}else{this.clearSelections();}},onContextMenu:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('contextmenu',this,this.indexOf(item),item,e);}},onDblClick:function(e){var item=this.findItemFromChild(e.getTarget());if(item){this.fireEvent('dblclick',this,this.indexOf(item),item,e);}},onItemClick:function(item,index,e){if(this.multiSelect||this.singleSelect){if(this.multiSelect&&e.shiftKey&&this.lastSelection){this.select(this.getNodes(this.indexOf(this.lastSelection),index),false);}else{this.select(item,this.multiSelect&&e.ctrlKey);this.lastSelection=item;}}},getSelectionCount:function(){return this.selections.length;},getSelectedNodes:function(){return this.selections;},getSelectedIndexes:function(){var indexes=[];for(var i=0,len=this.selections.length;iUsage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. + * @method setRuntimeAttribute + * Should only be needed for subclass use. + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + var logger = {}; + logger.log = function() {YAHOO.log.apply(window, arguments)}; + + logger.log('creating new instance of ' + this); + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { return false; } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 200; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { queue.splice(index, 1); } + + tweenCount -= 1; + if (tweenCount <= 0) { this.stop(); } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { thread = setInterval(this.run, this.delay); } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i].isAnimated()) { + this.unRegister(tween, i); + } + } + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() +{ + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) + { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +/** + * Anim subclass for color transitions. + *

        Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

        + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})();/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

        Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

        Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); diff --git a/www/extras/yui/build/animation/animation-min.js b/www/extras/yui/build/animation/animation-min.js new file mode 100644 index 000000000..353f3a378 --- /dev/null +++ b/www/extras/yui/build/animation/animation-min.js @@ -0,0 +1 @@ +/* Copyright (c) 2006, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txtversion: 0.12.0 */ YAHOO.util.Anim=function(el,attributes,duration,method){if(el){this.init(el,attributes,duration,method);}};YAHOO.util.Anim.prototype={toString:function(){var el=this.getEl();var id=el.id||el.tagName;return("Anim "+id);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(attr,start,end){return this.method(this.currentFrame,start,end-start,this.totalFrames);},setAttribute:function(attr,val,unit){if(this.patterns.noNegatives.test(attr)){val=(val>0)?val:0;}YAHOO.util.Dom.setStyle(this.getEl(),attr,val+unit);},getAttribute:function(attr){var el=this.getEl();var val=YAHOO.util.Dom.getStyle(el,attr);if(val!=='auto'&&!this.patterns.offsetUnit.test(val)){return parseFloat(val);}var a=this.patterns.offsetAttribute.exec(attr)||[];var pos=!!(a[3]);var box=!!(a[2]);if(box||(YAHOO.util.Dom.getStyle(el,'position')=='absolute'&&pos)){val=el['offset'+a[0].charAt(0).toUpperCase()+a[0].substr(1)];}else{val=0;}return val;},getDefaultUnit:function(attr){if(this.patterns.defaultUnit.test(attr)){return'px';}return'';},setRuntimeAttribute:function(attr){var start;var end;var attributes=this.attributes;this.runtimeAttributes[attr]={};var isset=function(prop){return(typeof prop!=='undefined');};if(!isset(attributes[attr]['to'])&&!isset(attributes[attr]['by'])){return false;}start=(isset(attributes[attr]['from']))?attributes[attr]['from']:this.getAttribute(attr);if(isset(attributes[attr]['to'])){end=attributes[attr]['to'];}else if(isset(attributes[attr]['by'])){if(start.constructor==Array){end=[];for(var i=0,len=start.length;i0&&isFinite(tweak)){if(tween.currentFrame+tweak>=frames){tweak=frames-(frame+1);}tween.currentFrame+=tweak;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(points,t){var n=points.length;var tmp=[];for(var i=0;i0&&!(control[0]instanceof Array)){control=[control];}else{var tmp=[];for(i=0,len=control.length;i0){this.runtimeAttributes[attr]=this.runtimeAttributes[attr].concat(control);}this.runtimeAttributes[attr][this.runtimeAttributes[attr].length]=end;}else{superclass.setRuntimeAttribute.call(this,attr);}};var translateValues=function(val,start){var pageXY=Y.Dom.getXY(this.getEl());val=[val[0]-pageXY[0]+start[0],val[1]-pageXY[1]+start[1]];return val;};var isset=function(prop){return(typeof prop!=='undefined');};})();(function(){YAHOO.util.Scroll=function(el,attributes,duration,method){if(el){YAHOO.util.Scroll.superclass.constructor.call(this,el,attributes,duration,method);}};YAHOO.extend(YAHOO.util.Scroll,YAHOO.util.ColorAnim);var Y=YAHOO.util;var superclass=Y.Scroll.superclass;var proto=Y.Scroll.prototype;proto.toString=function(){var el=this.getEl();var id=el.id||el.tagName;return("Scroll "+id);};proto.doMethod=function(attr,start,end){var val=null;if(attr=='scroll'){val=[this.method(this.currentFrame,start[0],end[0]-start[0],this.totalFrames),this.method(this.currentFrame,start[1],end[1]-start[1],this.totalFrames)];}else{val=superclass.doMethod.call(this,attr,start,end);}return val;};proto.getAttribute=function(attr){var val=null;var el=this.getEl();if(attr=='scroll'){val=[el.scrollLeft,el.scrollTop];}else{val=superclass.getAttribute.call(this,attr);}return val;};proto.setAttribute=function(attr,val,unit){var el=this.getEl();if(attr=='scroll'){el.scrollLeft=val[0];el.scrollTop=val[1];}else{superclass.setAttribute.call(this,attr,val,unit);}};})(); \ No newline at end of file diff --git a/www/extras/yui/build/animation/animation.js b/www/extras/yui/build/animation/animation.js new file mode 100644 index 000000000..333f94690 --- /dev/null +++ b/www/extras/yui/build/animation/animation.js @@ -0,0 +1,1272 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ + +/** + * The animation module provides allows effects to be added to HTMLElements. + * @module animation + */ + +/** + * + * Base animation class that provides the interface for building animated effects. + *

        Usage: var myAnim = new YAHOO.util.Anim(el, { width: { from: 10, to: 100 } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Anim + * @namespace YAHOO.util + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + +YAHOO.util.Anim = function(el, attributes, duration, method) { + if (el) { + this.init(el, attributes, duration, method); + } +}; + +YAHOO.util.Anim.prototype = { + /** + * Provides a readable name for the Anim instance. + * @method toString + * @return {String} + */ + toString: function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Anim " + id); + }, + + patterns: { // cached for performance + noNegatives: /width|height|opacity|padding/i, // keep at zero or above + offsetAttribute: /^((width|height)|(top|left))$/, // use offsetValue as default + defaultUnit: /width|height|top$|bottom$|left$|right$/i, // use 'px' by default + offsetUnit: /\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i // IE may return these, so convert these to offset + }, + + /** + * Returns the value computed by the animation's "method". + * @method doMethod + * @param {String} attr The name of the attribute. + * @param {Number} start The value this attribute should start from for this animation. + * @param {Number} end The value this attribute should end at for this animation. + * @return {Number} The Value to be applied to the attribute. + */ + doMethod: function(attr, start, end) { + return this.method(this.currentFrame, start, end - start, this.totalFrames); + }, + + /** + * Applies a value to an attribute. + * @method setAttribute + * @param {String} attr The name of the attribute. + * @param {Number} val The value to be applied to the attribute. + * @param {String} unit The unit ('px', '%', etc.) of the value. + */ + setAttribute: function(attr, val, unit) { + if ( this.patterns.noNegatives.test(attr) ) { + val = (val > 0) ? val : 0; + } + + YAHOO.util.Dom.setStyle(this.getEl(), attr, val + unit); + }, + + /** + * Returns current value of the attribute. + * @method getAttribute + * @param {String} attr The name of the attribute. + * @return {Number} val The current value of the attribute. + */ + getAttribute: function(attr) { + var el = this.getEl(); + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (val !== 'auto' && !this.patterns.offsetUnit.test(val)) { + return parseFloat(val); + } + + var a = this.patterns.offsetAttribute.exec(attr) || []; + var pos = !!( a[3] ); // top or left + var box = !!( a[2] ); // width or height + + // use offsets for width/height and abs pos top/left + if ( box || (YAHOO.util.Dom.getStyle(el, 'position') == 'absolute' && pos) ) { + val = el['offset' + a[0].charAt(0).toUpperCase() + a[0].substr(1)]; + } else { // default to zero for other 'auto' + val = 0; + } + + return val; + }, + + /** + * Returns the unit to use when none is supplied. + * @method getDefaultUnit + * @param {attr} attr The name of the attribute. + * @return {String} The default unit to be used. + */ + getDefaultUnit: function(attr) { + if ( this.patterns.defaultUnit.test(attr) ) { + return 'px'; + } + + return ''; + }, + + /** + * Sets the actual values to be used during the animation. + * @method setRuntimeAttribute + * Should only be needed for subclass use. + * @param {Object} attr The attribute object + * @private + */ + setRuntimeAttribute: function(attr) { + var start; + var end; + var attributes = this.attributes; + + this.runtimeAttributes[attr] = {}; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; + + if ( !isset(attributes[attr]['to']) && !isset(attributes[attr]['by']) ) { + return false; // note return; nothing to animate to + } + + start = ( isset(attributes[attr]['from']) ) ? attributes[attr]['from'] : this.getAttribute(attr); + + // To beats by, per SMIL 2.1 spec + if ( isset(attributes[attr]['to']) ) { + end = attributes[attr]['to']; + } else if ( isset(attributes[attr]['by']) ) { + if (start.constructor == Array) { + end = []; + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + attributes[attr]['by'][i]; + } + } else { + end = start + attributes[attr]['by']; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + + // set units if needed + this.runtimeAttributes[attr].unit = ( isset(attributes[attr].unit) ) ? attributes[attr]['unit'] : this.getDefaultUnit(attr); + }, + + /** + * Constructor for Anim instance. + * @method init + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ + init: function(el, attributes, duration, method) { + /** + * Whether or not the animation is running. + * @property isAnimated + * @private + * @type Boolean + */ + var isAnimated = false; + + /** + * A Date object that is created when the animation begins. + * @property startTime + * @private + * @type Date + */ + var startTime = null; + + /** + * The number of frames this animation was able to execute. + * @property actualFrames + * @private + * @type Int + */ + var actualFrames = 0; + + /** + * The element to be animated. + * @property el + * @private + * @type HTMLElement + */ + el = YAHOO.util.Dom.get(el); + + /** + * The collection of attributes to be animated. + * Each attribute must have at least a "to" or "by" defined in order to animate. + * If "to" is supplied, the animation will end with the attribute at that value. + * If "by" is supplied, the animation will end at that value plus its starting value. + * If both are supplied, "to" is used, and "by" is ignored. + * Optional additional member include "from" (the value the attribute should start animating from, defaults to current value), and "unit" (the units to apply to the values). + * @property attributes + * @type Object + */ + this.attributes = attributes || {}; + + /** + * The length of the animation. Defaults to "1" (second). + * @property duration + * @type Number + */ + this.duration = duration || 1; + + /** + * The method that will provide values to the attribute(s) during the animation. + * Defaults to "YAHOO.util.Easing.easeNone". + * @property method + * @type Function + */ + this.method = method || YAHOO.util.Easing.easeNone; + + /** + * Whether or not the duration should be treated as seconds. + * Defaults to true. + * @property useSeconds + * @type Boolean + */ + this.useSeconds = true; // default to seconds + + /** + * The location of the current animation on the timeline. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property currentFrame + * @type Int + */ + this.currentFrame = 0; + + /** + * The total number of frames to be executed. + * In time-based animations, this is used by AnimMgr to ensure the animation finishes on time. + * @property totalFrames + * @type Int + */ + this.totalFrames = YAHOO.util.AnimMgr.fps; + + + /** + * Returns a reference to the animated element. + * @method getEl + * @return {HTMLElement} + */ + this.getEl = function() { return el; }; + + /** + * Checks whether the element is currently animated. + * @method isAnimated + * @return {Boolean} current value of isAnimated. + */ + this.isAnimated = function() { + return isAnimated; + }; + + /** + * Returns the animation start time. + * @method getStartTime + * @return {Date} current value of startTime. + */ + this.getStartTime = function() { + return startTime; + }; + + this.runtimeAttributes = {}; + + + + /** + * Starts the animation by registering it with the animation manager. + * @method animate + */ + this.animate = function() { + if ( this.isAnimated() ) { return false; } + + this.currentFrame = 0; + + this.totalFrames = ( this.useSeconds ) ? Math.ceil(YAHOO.util.AnimMgr.fps * this.duration) : this.duration; + + YAHOO.util.AnimMgr.registerElement(this); + }; + + /** + * Stops the animation. Normally called by AnimMgr when animation completes. + * @method stop + * @param {Boolean} finish (optional) If true, animation will jump to final frame. + */ + this.stop = function(finish) { + if (finish) { + this.currentFrame = this.totalFrames; + this._onTween.fire(); + } + YAHOO.util.AnimMgr.stop(this); + }; + + var onStart = function() { + this.onStart.fire(); + + this.runtimeAttributes = {}; + for (var attr in this.attributes) { + this.setRuntimeAttribute(attr); + } + + isAnimated = true; + actualFrames = 0; + startTime = new Date(); + }; + + /** + * Feeds the starting and ending values for each animated attribute to doMethod once per frame, then applies the resulting value to the attribute(s). + * @private + */ + + var onTween = function() { + var data = { + duration: new Date() - this.getStartTime(), + currentFrame: this.currentFrame + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', currentFrame: ' + data.currentFrame + ); + }; + + this.onTween.fire(data); + + var runtimeAttributes = this.runtimeAttributes; + + for (var attr in runtimeAttributes) { + this.setAttribute(attr, this.doMethod(attr, runtimeAttributes[attr].start, runtimeAttributes[attr].end), runtimeAttributes[attr].unit); + } + + actualFrames += 1; + }; + + var onComplete = function() { + var actual_duration = (new Date() - startTime) / 1000 ; + + var data = { + duration: actual_duration, + frames: actualFrames, + fps: actualFrames / actual_duration + }; + + data.toString = function() { + return ( + 'duration: ' + data.duration + + ', frames: ' + data.frames + + ', fps: ' + data.fps + ); + }; + + isAnimated = false; + actualFrames = 0; + this.onComplete.fire(data); + }; + + /** + * Custom event that fires after onStart, useful in subclassing + * @private + */ + this._onStart = new YAHOO.util.CustomEvent('_start', this, true); + + /** + * Custom event that fires when animation begins + * Listen via subscribe method (e.g. myAnim.onStart.subscribe(someFunction) + * @event onStart + */ + this.onStart = new YAHOO.util.CustomEvent('start', this); + + /** + * Custom event that fires between each frame + * Listen via subscribe method (e.g. myAnim.onTween.subscribe(someFunction) + * @event onTween + */ + this.onTween = new YAHOO.util.CustomEvent('tween', this); + + /** + * Custom event that fires after onTween + * @private + */ + this._onTween = new YAHOO.util.CustomEvent('_tween', this, true); + + /** + * Custom event that fires when animation ends + * Listen via subscribe method (e.g. myAnim.onComplete.subscribe(someFunction) + * @event onComplete + */ + this.onComplete = new YAHOO.util.CustomEvent('complete', this); + /** + * Custom event that fires after onComplete + * @private + */ + this._onComplete = new YAHOO.util.CustomEvent('_complete', this, true); + + this._onStart.subscribe(onStart); + this._onTween.subscribe(onTween); + this._onComplete.subscribe(onComplete); + } +}; + +/** + * Handles animation queueing and threading. + * Used by Anim and subclasses. + * @class AnimMgr + * @namespace YAHOO.util + */ +YAHOO.util.AnimMgr = new function() { + /** + * Reference to the animation Interval. + * @property thread + * @private + * @type Int + */ + var thread = null; + + /** + * The current queue of registered animation objects. + * @property queue + * @private + * @type Array + */ + var queue = []; + + /** + * The number of active animations. + * @property tweenCount + * @private + * @type Int + */ + var tweenCount = 0; + + /** + * Base frame rate (frames per second). + * Arbitrarily high for better x-browser calibration (slower browsers drop more frames). + * @property fps + * @type Int + * + */ + this.fps = 200; + + /** + * Interval delay in milliseconds, defaults to fastest possible. + * @property delay + * @type Int + * + */ + this.delay = 1; + + /** + * Adds an animation instance to the animation queue. + * All animation instances must be registered in order to animate. + * @method registerElement + * @param {object} tween The Anim instance to be be registered + */ + this.registerElement = function(tween) { + queue[queue.length] = tween; + tweenCount += 1; + tween._onStart.fire(); + this.start(); + }; + + /** + * removes an animation instance from the animation queue. + * All animation instances must be registered in order to animate. + * @method unRegister + * @param {object} tween The Anim instance to be be registered + * @param {Int} index The index of the Anim instance + * @private + */ + this.unRegister = function(tween, index) { + tween._onComplete.fire(); + index = index || getIndex(tween); + if (index != -1) { queue.splice(index, 1); } + + tweenCount -= 1; + if (tweenCount <= 0) { this.stop(); } + }; + + /** + * Starts the animation thread. + * Only one thread can run at a time. + * @method start + */ + this.start = function() { + if (thread === null) { thread = setInterval(this.run, this.delay); } + }; + + /** + * Stops the animation thread or a specific animation instance. + * @method stop + * @param {object} tween A specific Anim instance to stop (optional) + * If no instance given, Manager stops thread and all animations. + */ + this.stop = function(tween) { + if (!tween) { + clearInterval(thread); + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i].isAnimated()) { + this.unRegister(tween, i); + } + } + queue = []; + thread = null; + tweenCount = 0; + } + else { + this.unRegister(tween); + } + }; + + /** + * Called per Interval to handle each animation frame. + * @method run + */ + this.run = function() { + for (var i = 0, len = queue.length; i < len; ++i) { + var tween = queue[i]; + if ( !tween || !tween.isAnimated() ) { continue; } + + if (tween.currentFrame < tween.totalFrames || tween.totalFrames === null) + { + tween.currentFrame += 1; + + if (tween.useSeconds) { + correctFrame(tween); + } + tween._onTween.fire(); + } + else { YAHOO.util.AnimMgr.stop(tween, i); } + } + }; + + var getIndex = function(anim) { + for (var i = 0, len = queue.length; i < len; ++i) { + if (queue[i] == anim) { + return i; // note return; + } + } + return -1; + }; + + /** + * On the fly frame correction to keep animation on time. + * @method correctFrame + * @private + * @param {Object} tween The Anim instance being corrected. + */ + var correctFrame = function(tween) { + var frames = tween.totalFrames; + var frame = tween.currentFrame; + var expected = (tween.currentFrame * tween.duration * 1000 / tween.totalFrames); + var elapsed = (new Date() - tween.getStartTime()); + var tweak = 0; + + if (elapsed < tween.duration * 1000) { // check if falling behind + tweak = Math.round((elapsed / expected - 1) * tween.currentFrame); + } else { // went over duration, so jump to end + tweak = frames - (frame + 1); + } + if (tweak > 0 && isFinite(tweak)) { // adjust if needed + if (tween.currentFrame + tweak >= frames) {// dont go past last frame + tweak = frames - (frame + 1); + } + + tween.currentFrame += tweak; + } + }; +}; +/** + * Used to calculate Bezier splines for any number of control points. + * @class Bezier + * @namespace YAHOO.util + * + */ +YAHOO.util.Bezier = new function() +{ + /** + * Get the current position of the animated element based on t. + * Each point is an array of "x" and "y" values (0 = x, 1 = y) + * At least 2 points are required (start and end). + * First point is start. Last point is end. + * Additional control points are optional. + * @method getPosition + * @param {Array} points An array containing Bezier points + * @param {Number} t A number between 0 and 1 which is the basis for determining current position + * @return {Array} An array containing int x and y member data + */ + this.getPosition = function(points, t) + { + var n = points.length; + var tmp = []; + + for (var i = 0; i < n; ++i){ + tmp[i] = [points[i][0], points[i][1]]; // save input + } + + for (var j = 1; j < n; ++j) { + for (i = 0; i < n - j; ++i) { + tmp[i][0] = (1 - t) * tmp[i][0] + t * tmp[parseInt(i + 1, 10)][0]; + tmp[i][1] = (1 - t) * tmp[i][1] + t * tmp[parseInt(i + 1, 10)][1]; + } + } + + return [ tmp[0][0], tmp[0][1] ]; + + }; +}; +/** + * Anim subclass for color transitions. + *

        Usage: var myAnim = new Y.ColorAnim(el, { backgroundColor: { from: '#FF0000', to: '#FFFFFF' } }, 1, Y.Easing.easeOut); Color values can be specified with either 112233, #112233, + * [255,255,255], or rgb(255,255,255)

        + * @class ColorAnim + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @constructor + * @extends YAHOO.util.Anim + * @param {HTMLElement | String} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.ColorAnim = function(el, attributes, duration, method) { + YAHOO.util.ColorAnim.superclass.constructor.call(this, el, attributes, duration, method); + }; + + YAHOO.extend(YAHOO.util.ColorAnim, YAHOO.util.Anim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.ColorAnim.superclass; + var proto = Y.ColorAnim.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("ColorAnim " + id); + }; + + proto.patterns.color = /color$/i; + proto.patterns.rgb = /^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i; + proto.patterns.hex = /^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i; + proto.patterns.hex3 = /^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i; + proto.patterns.transparent = /^transparent|rgba\(0, 0, 0, 0\)$/; // need rgba for safari + + /** + * Attempts to parse the given string and return a 3-tuple. + * @method parseColor + * @param {String} s The string to parse. + * @return {Array} The 3-tuple of rgb values. + */ + proto.parseColor = function(s) { + if (s.length == 3) { return s; } + + var c = this.patterns.hex.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 16), parseInt(c[2], 16), parseInt(c[3], 16) ]; + } + + c = this.patterns.rgb.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1], 10), parseInt(c[2], 10), parseInt(c[3], 10) ]; + } + + c = this.patterns.hex3.exec(s); + if (c && c.length == 4) { + return [ parseInt(c[1] + c[1], 16), parseInt(c[2] + c[2], 16), parseInt(c[3] + c[3], 16) ]; + } + + return null; + }; + + proto.getAttribute = function(attr) { + var el = this.getEl(); + if ( this.patterns.color.test(attr) ) { + var val = YAHOO.util.Dom.getStyle(el, attr); + + if (this.patterns.transparent.test(val)) { // bgcolor default + var parent = el.parentNode; // try and get from an ancestor + val = Y.Dom.getStyle(parent, attr); + + while (parent && this.patterns.transparent.test(val)) { + parent = parent.parentNode; + val = Y.Dom.getStyle(parent, attr); + if (parent.tagName.toUpperCase() == 'HTML') { + val = '#fff'; + } + } + } + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val; + + if ( this.patterns.color.test(attr) ) { + val = []; + for (var i = 0, len = start.length; i < len; ++i) { + val[i] = superclass.doMethod.call(this, attr, start[i], end[i]); + } + + val = 'rgb('+Math.floor(val[0])+','+Math.floor(val[1])+','+Math.floor(val[2])+')'; + } + else { + val = superclass.doMethod.call(this, attr, start, end); + } + + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + superclass.setRuntimeAttribute.call(this, attr); + + if ( this.patterns.color.test(attr) ) { + var attributes = this.attributes; + var start = this.parseColor(this.runtimeAttributes[attr].start); + var end = this.parseColor(this.runtimeAttributes[attr].end); + // fix colors if going "by" + if ( typeof attributes[attr]['to'] === 'undefined' && typeof attributes[attr]['by'] !== 'undefined' ) { + end = this.parseColor(attributes[attr].by); + + for (var i = 0, len = start.length; i < len; ++i) { + end[i] = start[i] + end[i]; + } + } + + this.runtimeAttributes[attr].start = start; + this.runtimeAttributes[attr].end = end; + } + }; +})();/* +TERMS OF USE - EASING EQUATIONS +Open source under the BSD License. +Copyright 2001 Robert Penner All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/** + * Singleton that determines how an animation proceeds from start to end. + * @class Easing + * @namespace YAHOO.util +*/ + +YAHOO.util.Easing = { + + /** + * Uniform speed between points. + * @method easeNone + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeNone: function (t, b, c, d) { + return c*t/d + b; + }, + + /** + * Begins slowly and accelerates towards end. (quadratic) + * @method easeIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeIn: function (t, b, c, d) { + return c*(t/=d)*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quadratic) + * @method easeOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOut: function (t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quadratic) + * @method easeBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBoth: function (t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + + /** + * Begins slowly and accelerates towards end. (quartic) + * @method easeInStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeInStrong: function (t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + + /** + * Begins quickly and decelerates towards end. (quartic) + * @method easeOutStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeOutStrong: function (t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + + /** + * Begins slowly and decelerates towards end. (quartic) + * @method easeBothStrong + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + easeBothStrong: function (t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + + /** + * Snap in elastic effect. + * @method elasticIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + + elasticIn: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + + /** + * Snap out elastic effect. + * @method elasticOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticOut: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + + /** + * Snap both elastic effect. + * @method elasticBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} p Period (optional) + * @return {Number} The computed value for the current animation frame + */ + elasticBoth: function (t, b, c, d, a, p) { + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (!a || a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + + /** + * Backtracks slightly, then reverses direction and moves to end. + * @method backIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backIn: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + + /** + * Overshoots end, then reverses and comes back to end. + * @method backOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backOut: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + + /** + * Backtracks slightly, then reverses direction, overshoots end, + * then reverses and comes back to end. + * @method backBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @param {Number} s Overshoot (optional) + * @return {Number} The computed value for the current animation frame + */ + backBoth: function (t, b, c, d, s) { + if (typeof s == 'undefined') s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + + /** + * Bounce off of start. + * @method bounceIn + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceIn: function (t, b, c, d) { + return c - YAHOO.util.Easing.bounceOut(d-t, 0, c, d) + b; + }, + + /** + * Bounces off end. + * @method bounceOut + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceOut: function (t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + + /** + * Bounces off start and end. + * @method bounceBoth + * @param {Number} t Time value used to compute current value + * @param {Number} b Starting value + * @param {Number} c Delta between start and end values + * @param {Number} d Total length of animation + * @return {Number} The computed value for the current animation frame + */ + bounceBoth: function (t, b, c, d) { + if (t < d/2) return YAHOO.util.Easing.bounceIn(t*2, 0, c, d) * .5 + b; + return YAHOO.util.Easing.bounceOut(t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}; + +/** + * Anim subclass for moving elements along a path defined by the "points" + * member of "attributes". All "points" are arrays with x, y coordinates. + *

        Usage: var myAnim = new YAHOO.util.Motion(el, { points: { to: [800, 800] } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Motion + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @constructor + * @extends YAHOO.util.Anim + * @param {String | HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.Motion = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Motion.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Motion, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Motion.superclass; + var proto = Y.Motion.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Motion " + id); + }; + + proto.patterns.points = /^points$/i; + + proto.setAttribute = function(attr, val, unit) { + if ( this.patterns.points.test(attr) ) { + unit = unit || 'px'; + superclass.setAttribute.call(this, 'left', val[0], unit); + superclass.setAttribute.call(this, 'top', val[1], unit); + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; + + proto.getAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var val = [ + superclass.getAttribute.call(this, 'left'), + superclass.getAttribute.call(this, 'top') + ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if ( this.patterns.points.test(attr) ) { + var t = this.method(this.currentFrame, 0, 100, this.totalFrames) / 100; + val = Y.Bezier.getPosition(this.runtimeAttributes[attr], t); + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.setRuntimeAttribute = function(attr) { + if ( this.patterns.points.test(attr) ) { + var el = this.getEl(); + var attributes = this.attributes; + var start; + var control = attributes['points']['control'] || []; + var end; + var i, len; + + if (control.length > 0 && !(control[0] instanceof Array) ) { // could be single point or array of points + control = [control]; + } else { // break reference to attributes.points.control + var tmp = []; + for (i = 0, len = control.length; i< len; ++i) { + tmp[i] = control[i]; + } + control = tmp; + } + + if (Y.Dom.getStyle(el, 'position') == 'static') { // default to relative + Y.Dom.setStyle(el, 'position', 'relative'); + } + + if ( isset(attributes['points']['from']) ) { + Y.Dom.setXY(el, attributes['points']['from']); // set position to from point + } + else { Y.Dom.setXY( el, Y.Dom.getXY(el) ); } // set it to current position + + start = this.getAttribute('points'); // get actual top & left + + // TO beats BY, per SMIL 2.1 spec + if ( isset(attributes['points']['to']) ) { + end = translateValues.call(this, attributes['points']['to'], start); + + var pageXY = Y.Dom.getXY(this.getEl()); + for (i = 0, len = control.length; i < len; ++i) { + control[i] = translateValues.call(this, control[i], start); + } + + + } else if ( isset(attributes['points']['by']) ) { + end = [ start[0] + attributes['points']['by'][0], start[1] + attributes['points']['by'][1] ]; + + for (i = 0, len = control.length; i < len; ++i) { + control[i] = [ start[0] + control[i][0], start[1] + control[i][1] ]; + } + } + + this.runtimeAttributes[attr] = [start]; + + if (control.length > 0) { + this.runtimeAttributes[attr] = this.runtimeAttributes[attr].concat(control); + } + + this.runtimeAttributes[attr][this.runtimeAttributes[attr].length] = end; + } + else { + superclass.setRuntimeAttribute.call(this, attr); + } + }; + + var translateValues = function(val, start) { + var pageXY = Y.Dom.getXY(this.getEl()); + val = [ val[0] - pageXY[0] + start[0], val[1] - pageXY[1] + start[1] ]; + + return val; + }; + + var isset = function(prop) { + return (typeof prop !== 'undefined'); + }; +})(); +/** + * Anim subclass for scrolling elements to a position defined by the "scroll" + * member of "attributes". All "scroll" members are arrays with x, y scroll positions. + *

        Usage: var myAnim = new YAHOO.util.Scroll(el, { scroll: { to: [0, 800] } }, 1, YAHOO.util.Easing.easeOut);

        + * @class Scroll + * @namespace YAHOO.util + * @requires YAHOO.util.Anim + * @requires YAHOO.util.AnimMgr + * @requires YAHOO.util.Easing + * @requires YAHOO.util.Bezier + * @requires YAHOO.util.Dom + * @requires YAHOO.util.Event + * @requires YAHOO.util.CustomEvent + * @extends YAHOO.util.Anim + * @constructor + * @param {String or HTMLElement} el Reference to the element that will be animated + * @param {Object} attributes The attribute(s) to be animated. + * Each attribute is an object with at minimum a "to" or "by" member defined. + * Additional optional members are "from" (defaults to current value), "units" (defaults to "px"). + * All attribute names use camelCase. + * @param {Number} duration (optional, defaults to 1 second) Length of animation (frames or seconds), defaults to time-based + * @param {Function} method (optional, defaults to YAHOO.util.Easing.easeNone) Computes the values that are applied to the attributes per frame (generally a YAHOO.util.Easing method) + */ +(function() { + YAHOO.util.Scroll = function(el, attributes, duration, method) { + if (el) { // dont break existing subclasses not using YAHOO.extend + YAHOO.util.Scroll.superclass.constructor.call(this, el, attributes, duration, method); + } + }; + + YAHOO.extend(YAHOO.util.Scroll, YAHOO.util.ColorAnim); + + // shorthand + var Y = YAHOO.util; + var superclass = Y.Scroll.superclass; + var proto = Y.Scroll.prototype; + + proto.toString = function() { + var el = this.getEl(); + var id = el.id || el.tagName; + return ("Scroll " + id); + }; + + proto.doMethod = function(attr, start, end) { + var val = null; + + if (attr == 'scroll') { + val = [ + this.method(this.currentFrame, start[0], end[0] - start[0], this.totalFrames), + this.method(this.currentFrame, start[1], end[1] - start[1], this.totalFrames) + ]; + + } else { + val = superclass.doMethod.call(this, attr, start, end); + } + return val; + }; + + proto.getAttribute = function(attr) { + var val = null; + var el = this.getEl(); + + if (attr == 'scroll') { + val = [ el.scrollLeft, el.scrollTop ]; + } else { + val = superclass.getAttribute.call(this, attr); + } + + return val; + }; + + proto.setAttribute = function(attr, val, unit) { + var el = this.getEl(); + + if (attr == 'scroll') { + el.scrollLeft = val[0]; + el.scrollTop = val[1]; + } else { + superclass.setAttribute.call(this, attr, val, unit); + } + }; +})(); diff --git a/www/extras/yui/build/autocomplete/README b/www/extras/yui/build/autocomplete/README new file mode 100644 index 000000000..4470be23f --- /dev/null +++ b/www/extras/yui/build/autocomplete/README @@ -0,0 +1,59 @@ +AutoComplete Release Notes + +*** version 0.12.0 *** + +* The following constants must be defined as static class properties and are no longer +available as instance properties: + +YAHOO.widget.DataSource.ERROR_DATANULL +YAHOO.widget.DataSource.ERROR_DATAPARSE +YAHOO.widget.DS_XHR.TYPE_JSON +YAHOO.widget.DS_XHR.TYPE_XML +YAHOO.widget.DS_XHR.TYPE_FLAT +YAHOO.widget.DS_XHR.ERROR_DATAXHR + +* The property minQueryLength now supports zero and negative number values for +DS_JSFunction and DS_XHR objects, to enable null or empty string queries and to disable +AutoComplete functionality altogether, respectively. + +* Enabling the alwaysShowContainer feature will no longer send containerExpandEvent or +containerCollapseEvent. + + + +**** version 0.11.3 *** + +* The iFrameSrc property has been deprecated. Implementers no longer need to +specify an https URL to avoid IE security warnings when working with sites over +SSL. + + + +*** version 0.11.0 *** + +* The method getListIds() has been deprecated for getListItems(), which returns +an array of DOM references. + +* All classnames have been prefixed with "yui-ac-". + +* Container elements should no longer have CSS property "display" set to "none". + +* The useIFrame property can now be set after instantiation. + +* On some browsers, the unmatchedItemSelectEvent may not be fired properly when +delimiter characters are defined. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. + + + +*** version 0.10.0 *** + +* Initial release + +* In order to enable the useIFrame property, it should be set in the +constructor. + +* On some browsers, defining delimiter characters while enabling forceSelection +may result in unexpected behavior. diff --git a/www/extras/yui/build/autocomplete/autocomplete-debug.js b/www/extras/yui/build/autocomplete/autocomplete-debug.js new file mode 100644 index 000000000..62fd2b73b --- /dev/null +++ b/www/extras/yui/build/autocomplete/autocomplete-debug.js @@ -0,0 +1,3098 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.txt +version: 0.12.0 +*/ + + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection, json + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
          + *
        • Navigate with up/down arrow keys and/or mouse to pick a selection
        • + *
        • The drop down container can "roll down" or "fly out" via configurable + * animation
        • + *
        • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
        • + *
        + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field + * @param elInput {String} String ID of an input field + * @param elContainer {HTMLElement} DOM element reference of an existing DIV + * @param elContainer {String} String ID of an existing DIV + * @param oDataSource {Object} Instance of YAHOO.widget.DataSource for query/results + * @param oConfigs {Object} (optional) Object literal of configuration params + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid DataSource", "error", this.toString()); + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid input element", "error", this.toString()); + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + YAHOO.log("The container may not display properly if display is set to \"none\" in CSS", "warn", this.toString()); + } + } + else { + YAHOO.log("Could not instantiate AutoComplete due to an invalid container element", "error", this.toString()); + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + YAHOO.log("AutoComplete initialized","info",this.toString()); + } + // Required arguments were not found + else { + YAHOO.log("Could not instantiate AutoComplete due invalid arguments", "error", this.toString()); + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type Object + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlighClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Array} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "ac_hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "ac_ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "ac_bd". + * + * @method setBody + * @param sHeader {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {Object} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Array} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type Array + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + YAHOO.log("The forceSelection feature has been enabled with delimChar defined.","warn", this.toString()); + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + YAHOO.log("Could not initialize the container","warn",this.toString()); + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Array} An array of query result objects from the DataSource. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + YAHOO.log("Could not instantiate XHR DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); + YAHOO.log("XHR DataSource initialized","info",this.toString()); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + YAHOO.log("DataSource is querying URL " + sUri, "info", this.toString()); + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } +//DEBUG +/*YAHOO.log(oResp.responseXML.getElementsByTagName("Result"),'warn'); +for(var foo in oResp) { + YAHOO.log(foo + ": "+oResp[foo],'warn'); +} +YAHOO.log('responseXML.xml: '+oResp.responseXML.xml,'warn');*/ + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", oSelf.toString()); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATAPARSE, "error", oSelf.toString()); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + YAHOO.log(YAHOO.widget.DS_XHR.ERROR_DATAXHR + ": " + oResp.statusText, "error", oSelf.toString()); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + //YAHOO.log("data: " + i + " value:" +j+" = "+dataFieldValue,"debug",this.toString()); + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + //YAHOO.log("Result"+k+" is "+result.attributes.item(0).firstChild.nodeValue,"debug",this.toString()); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + //YAHOO.log(aSchema[m]+" is "+result.attributes.getNamedItem(aSchema[m]).firstChild.nodeValue); + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + //YAHOO.log("Attr value is "+sValue,"debug",this.toString()); + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + //YAHOO.log("Node value is "+sValue,"debug",this.toString()); + } + else { + sValue = ""; + //YAHOO.log("Value not found","debug",this.toString()); + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {String} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + YAHOO.log("Could not instantiate JSFunction DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.dataFunction = oFunction; + this._init(); + YAHOO.log("JS Function DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + YAHOO.log(YAHOO.widget.DataSource.ERROR_DATANULL, "error", this.toString()); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + YAHOO.log("Could not instantiate JSArray DataSource due to invalid arguments", "error", this.toString()); + return; + } + else { + this.data = aData; + this._init(); + YAHOO.log("JS Array DataSource initialized","info",this.toString()); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; diff --git a/www/extras/yui/build/autocomplete/autocomplete-min.js b/www/extras/yui/build/autocomplete/autocomplete-min.js new file mode 100644 index 000000000..05c9d8b99 --- /dev/null +++ b/www/extras/yui/build/autocomplete/autocomplete-min.js @@ -0,0 +1,177 @@ +/* Copyright (c) 2006, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txt version: 0.12.0 */ +YAHOO.widget.AutoComplete=function(elInput,elContainer,oDataSource,oConfigs){if(elInput&&elContainer&&oDataSource){if(oDataSource&&(oDataSource instanceof YAHOO.widget.DataSource)){this.dataSource=oDataSource;} +else{return;} +if(YAHOO.util.Dom.inDocument(elInput)){if(typeof elInput=="string"){this._sName="instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput;this._oTextbox=document.getElementById(elInput);} +else{this._sName=(elInput.id)?"instance"+YAHOO.widget.AutoComplete._nIndex+" "+elInput.id:"instance"+YAHOO.widget.AutoComplete._nIndex;this._oTextbox=elInput;}} +else{return;} +if(YAHOO.util.Dom.inDocument(elContainer)){if(typeof elContainer=="string"){this._oContainer=document.getElementById(elContainer);} +else{this._oContainer=elContainer;} +if(this._oContainer.style.display=="none"){}} +else{return;} +if(typeof oConfigs=="object"){for(var sConfig in oConfigs){if(sConfig){this[sConfig]=oConfigs[sConfig];}}} +this._initContainer();this._initProps();this._initList();this._initContainerHelpers();var oSelf=this;var oTextbox=this._oTextbox;var oContent=this._oContainer._oContent;YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf);YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf);YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf);YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf);YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf);YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf);YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf);YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf);if(oTextbox.form){YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf);} +YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf);this.textboxFocusEvent=new YAHOO.util.CustomEvent("textboxFocus",this);this.textboxKeyEvent=new YAHOO.util.CustomEvent("textboxKey",this);this.dataRequestEvent=new YAHOO.util.CustomEvent("dataRequest",this);this.dataReturnEvent=new YAHOO.util.CustomEvent("dataReturn",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.containerExpandEvent=new YAHOO.util.CustomEvent("containerExpand",this);this.typeAheadEvent=new YAHOO.util.CustomEvent("typeAhead",this);this.itemMouseOverEvent=new YAHOO.util.CustomEvent("itemMouseOver",this);this.itemMouseOutEvent=new YAHOO.util.CustomEvent("itemMouseOut",this);this.itemArrowToEvent=new YAHOO.util.CustomEvent("itemArrowTo",this);this.itemArrowFromEvent=new YAHOO.util.CustomEvent("itemArrowFrom",this);this.itemSelectEvent=new YAHOO.util.CustomEvent("itemSelect",this);this.unmatchedItemSelectEvent=new YAHOO.util.CustomEvent("unmatchedItemSelect",this);this.selectionEnforceEvent=new YAHOO.util.CustomEvent("selectionEnforce",this);this.containerCollapseEvent=new YAHOO.util.CustomEvent("containerCollapse",this);this.textboxBlurEvent=new YAHOO.util.CustomEvent("textboxBlur",this);oTextbox.setAttribute("autocomplete","off");YAHOO.widget.AutoComplete._nIndex++;} +else{}};YAHOO.widget.AutoComplete.prototype.dataSource=null;YAHOO.widget.AutoComplete.prototype.minQueryLength=1;YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed=10;YAHOO.widget.AutoComplete.prototype.queryDelay=0.5;YAHOO.widget.AutoComplete.prototype.highlightClassName="yui-ac-highlight";YAHOO.widget.AutoComplete.prototype.prehighlightClassName=null;YAHOO.widget.AutoComplete.prototype.delimChar=null;YAHOO.widget.AutoComplete.prototype.autoHighlight=true;YAHOO.widget.AutoComplete.prototype.typeAhead=false;YAHOO.widget.AutoComplete.prototype.animHoriz=false;YAHOO.widget.AutoComplete.prototype.animVert=true;YAHOO.widget.AutoComplete.prototype.animSpeed=0.3;YAHOO.widget.AutoComplete.prototype.forceSelection=false;YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete=true;YAHOO.widget.AutoComplete.prototype.alwaysShowContainer=false;YAHOO.widget.AutoComplete.prototype.useIFrame=false;YAHOO.widget.AutoComplete.prototype.useShadow=false;YAHOO.widget.AutoComplete.prototype.toString=function(){return"AutoComplete "+this._sName;};YAHOO.widget.AutoComplete.prototype.isContainerOpen=function(){return this._bContainerOpen;};YAHOO.widget.AutoComplete.prototype.getListItems=function(){return this._aListItems;};YAHOO.widget.AutoComplete.prototype.getListItemData=function(oListItem){if(oListItem._oResultData){return oListItem._oResultData;} +else{return false;}};YAHOO.widget.AutoComplete.prototype.setHeader=function(sHeader){if(sHeader){if(this._oContainer._oContent._oHeader){this._oContainer._oContent._oHeader.innerHTML=sHeader;this._oContainer._oContent._oHeader.style.display="block";}} +else{this._oContainer._oContent._oHeader.innerHTML="";this._oContainer._oContent._oHeader.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setFooter=function(sFooter){if(sFooter){if(this._oContainer._oContent._oFooter){this._oContainer._oContent._oFooter.innerHTML=sFooter;this._oContainer._oContent._oFooter.style.display="block";}} +else{this._oContainer._oContent._oFooter.innerHTML="";this._oContainer._oContent._oFooter.style.display="none";}};YAHOO.widget.AutoComplete.prototype.setBody=function(sBody){if(sBody){if(this._oContainer._oContent._oBody){this._oContainer._oContent._oBody.innerHTML=sBody;this._oContainer._oContent._oBody.style.display="block";this._oContainer._oContent.style.display="block";}} +else{this._oContainer._oContent._oBody.innerHTML="";this._oContainer._oContent.style.display="none";} +this._maxResultsDisplayed=0;};YAHOO.widget.AutoComplete.prototype.formatResult=function(oResultItem,sQuery){var sResult=oResultItem[0];if(sResult){return sResult;} +else{return"";}};YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer=function(oResultItem,sQuery){return true;};YAHOO.widget.AutoComplete.prototype.sendQuery=function(sQuery){this._sendQuery(sQuery);};YAHOO.widget.AutoComplete.prototype.textboxFocusEvent=null;YAHOO.widget.AutoComplete.prototype.textboxKeyEvent=null;YAHOO.widget.AutoComplete.prototype.dataRequestEvent=null;YAHOO.widget.AutoComplete.prototype.dataReturnEvent=null;YAHOO.widget.AutoComplete.prototype.dataErrorEvent=null;YAHOO.widget.AutoComplete.prototype.containerExpandEvent=null;YAHOO.widget.AutoComplete.prototype.typeAheadEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent=null;YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowToEvent=null;YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent=null;YAHOO.widget.AutoComplete.prototype.itemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent=null;YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent=null;YAHOO.widget.AutoComplete.prototype.containerCollapseEvent=null;YAHOO.widget.AutoComplete.prototype.textboxBlurEvent=null;YAHOO.widget.AutoComplete._nIndex=0;YAHOO.widget.AutoComplete.prototype._sName=null;YAHOO.widget.AutoComplete.prototype._oTextbox=null;YAHOO.widget.AutoComplete.prototype._bFocused=true;YAHOO.widget.AutoComplete.prototype._oAnim=null;YAHOO.widget.AutoComplete.prototype._oContainer=null;YAHOO.widget.AutoComplete.prototype._bContainerOpen=false;YAHOO.widget.AutoComplete.prototype._bOverContainer=false;YAHOO.widget.AutoComplete.prototype._aListItems=null;YAHOO.widget.AutoComplete.prototype._nDisplayedItems=0;YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed=0;YAHOO.widget.AutoComplete.prototype._sCurQuery=null;YAHOO.widget.AutoComplete.prototype._sSavedQuery=null;YAHOO.widget.AutoComplete.prototype._oCurItem=null;YAHOO.widget.AutoComplete.prototype._bItemSelected=false;YAHOO.widget.AutoComplete.prototype._nKeyCode=null;YAHOO.widget.AutoComplete.prototype._nDelayID=-1;YAHOO.widget.AutoComplete.prototype._iFrameSrc="javascript:false;";YAHOO.widget.AutoComplete.prototype._queryInterval=null;YAHOO.widget.AutoComplete.prototype._sLastTextboxValue=null;YAHOO.widget.AutoComplete.prototype._initProps=function(){var minQueryLength=this.minQueryLength;if(isNaN(minQueryLength)||(minQueryLength<1)){minQueryLength=1;} +var maxResultsDisplayed=this.maxResultsDisplayed;if(isNaN(this.maxResultsDisplayed)||(this.maxResultsDisplayed<1)){this.maxResultsDisplayed=10;} +var queryDelay=this.queryDelay;if(isNaN(this.queryDelay)||(this.queryDelay<0)){this.queryDelay=0.5;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){if(typeof aDelimChar=="string"){this.delimChar=[aDelimChar];} +else if(aDelimChar.constructor!=Array){this.delimChar=null;}} +var animSpeed=this.animSpeed;if((this.animHoriz||this.animVert)&&YAHOO.util.Anim){if(isNaN(animSpeed)||(animSpeed<0)){animSpeed=0.3;} +if(!this._oAnim){oAnim=new YAHOO.util.Anim(this._oContainer._oContent,{},this.animSpeed);this._oAnim=oAnim;} +else{this._oAnim.duration=animSpeed;}} +if(this.forceSelection&&this.delimChar){}};YAHOO.widget.AutoComplete.prototype._initContainerHelpers=function(){if(this.useShadow&&!this._oContainer._oShadow){var oShadow=document.createElement("div");oShadow.className="yui-ac-shadow";this._oContainer._oShadow=this._oContainer.appendChild(oShadow);} +if(this.useIFrame&&!this._oContainer._oIFrame){var oIFrame=document.createElement("iframe");oIFrame.src=this._iFrameSrc;oIFrame.frameBorder=0;oIFrame.scrolling="no";oIFrame.style.position="absolute";oIFrame.style.width="100%";oIFrame.style.height="100%";oIFrame.tabIndex=-1;this._oContainer._oIFrame=this._oContainer.appendChild(oIFrame);}};YAHOO.widget.AutoComplete.prototype._initContainer=function(){if(!this._oContainer._oContent){var oContent=document.createElement("div");oContent.className="yui-ac-content";oContent.style.display="none";this._oContainer._oContent=this._oContainer.appendChild(oContent);var oHeader=document.createElement("div");oHeader.className="yui-ac-hd";oHeader.style.display="none";this._oContainer._oContent._oHeader=this._oContainer._oContent.appendChild(oHeader);var oBody=document.createElement("div");oBody.className="yui-ac-bd";this._oContainer._oContent._oBody=this._oContainer._oContent.appendChild(oBody);var oFooter=document.createElement("div");oFooter.className="yui-ac-ft";oFooter.style.display="none";this._oContainer._oContent._oFooter=this._oContainer._oContent.appendChild(oFooter);} +else{}};YAHOO.widget.AutoComplete.prototype._initList=function(){this._aListItems=[];while(this._oContainer._oContent._oBody.hasChildNodes()){var oldListItems=this.getListItems();if(oldListItems){for(var oldi=oldListItems.length-1;oldi>=0;i--){oldListItems[oldi]=null;}} +this._oContainer._oContent._oBody.innerHTML="";} +var oList=document.createElement("ul");oList=this._oContainer._oContent._oBody.appendChild(oList);for(var i=0;i=18&&nKeyCode<=20)||(nKeyCode==27)||(nKeyCode>=33&&nKeyCode<=35)||(nKeyCode>=36&&nKeyCode<=38)||(nKeyCode==40)||(nKeyCode>=44&&nKeyCode<=45)){return true;} +return false;};YAHOO.widget.AutoComplete.prototype._sendQuery=function(sQuery){if(this.minQueryLength==-1){this._toggleContainer(false);return;} +var aDelimChar=(this.delimChar)?this.delimChar:null;if(aDelimChar){var nDelimIndex=-1;for(var i=aDelimChar.length-1;i>=0;i--){var nNewIndex=sQuery.lastIndexOf(aDelimChar[i]);if(nNewIndex>nDelimIndex){nDelimIndex=nNewIndex;}} +if(aDelimChar[i]==" "){for(var j=aDelimChar.length-1;j>=0;j--){if(sQuery[nDelimIndex-1]==aDelimChar[j]){nDelimIndex--;break;}}} +if(nDelimIndex>-1){var nQueryStart=nDelimIndex+1;while(sQuery.charAt(nQueryStart)==" "){nQueryStart+=1;} +this._sSavedQuery=sQuery.substring(0,nQueryStart);sQuery=sQuery.substr(nQueryStart);} +else if(sQuery.indexOf(this._sSavedQuery)<0){this._sSavedQuery=null;}} +if(sQuery&&(sQuery.length0)){if(this._nDelayID!=-1){clearTimeout(this._nDelayID);} +this._toggleContainer(false);return;} +sQuery=encodeURIComponent(sQuery);this._nDelayID=-1;this.dataRequestEvent.fire(this,sQuery);this.dataSource.getResults(this._populateList,sQuery,this);};YAHOO.widget.AutoComplete.prototype._populateList=function(sQuery,aResults,oSelf){if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,sQuery);} +if(!oSelf._bFocused||!aResults){return;} +var isOpera=(navigator.userAgent.toLowerCase().indexOf("opera")!=-1);var contentStyle=oSelf._oContainer._oContent.style;contentStyle.width=(!isOpera)?null:"";contentStyle.height=(!isOpera)?null:"";var sCurQuery=decodeURIComponent(sQuery);oSelf._sCurQuery=sCurQuery;oSelf._bItemSelected=false;if(oSelf._maxResultsDisplayed!=oSelf.maxResultsDisplayed){oSelf._initList();} +var nItems=Math.min(aResults.length,oSelf.maxResultsDisplayed);oSelf._nDisplayedItems=nItems;if(nItems>0){oSelf._initContainerHelpers();var aItems=oSelf._aListItems;for(var i=nItems-1;i>=0;i--){var oItemi=aItems[i];var oResultItemi=aResults[i];oItemi.innerHTML=oSelf.formatResult(oResultItemi,sCurQuery);oItemi.style.display="list-item";oItemi._sResultKey=oResultItemi[0];oItemi._oResultData=oResultItemi;} +for(var j=aItems.length-1;j>=nItems;j--){var oItemj=aItems[j];oItemj.innerHTML=null;oItemj.style.display="none";oItemj._sResultKey=null;oItemj._oResultData=null;} +if(oSelf.autoHighlight){var oFirstItem=aItems[0];oSelf._toggleHighlight(oFirstItem,"to");oSelf.itemArrowToEvent.fire(oSelf,oFirstItem);oSelf._typeAhead(oFirstItem,sQuery);} +else{oSelf._oCurItem=null;} +var ok=oSelf.doBeforeExpandContainer(oSelf._oTextbox,oSelf._oContainer,sQuery,aResults);oSelf._toggleContainer(ok);} +else{oSelf._toggleContainer(false);} +oSelf.dataReturnEvent.fire(oSelf,sQuery,aResults);};YAHOO.widget.AutoComplete.prototype._clearSelection=function(){var sValue=this._oTextbox.value;var sChar=(this.delimChar)?this.delimChar[0]:null;var nIndex=(sChar)?sValue.lastIndexOf(sChar,sValue.length-2):-1;if(nIndex>-1){this._oTextbox.value=sValue.substring(0,nIndex);} +else{this._oTextbox.value="";} +this._sSavedQuery=this._oTextbox.value;this.selectionEnforceEvent.fire(this);};YAHOO.widget.AutoComplete.prototype._textMatchesOption=function(){var foundMatch=false;for(var i=this._nDisplayedItems-1;i>=0;i--){var oItem=this._aListItems[i];var sMatch=oItem._sResultKey.toLowerCase();if(sMatch==this._sCurQuery.toLowerCase()){foundMatch=true;break;}} +return(foundMatch);};YAHOO.widget.AutoComplete.prototype._typeAhead=function(oItem,sQuery){if(!this.typeAhead){return;} +var oTextbox=this._oTextbox;var sValue=this._oTextbox.value;if(!oTextbox.setSelectionRange&&!oTextbox.createTextRange){return;} +var nStart=sValue.length;this._updateValue(oItem);var nEnd=oTextbox.value.length;this._selectText(oTextbox,nStart,nEnd);var sPrefill=oTextbox.value.substr(nStart,nEnd);this.typeAheadEvent.fire(this,sQuery,sPrefill);};YAHOO.widget.AutoComplete.prototype._selectText=function(oTextbox,nStart,nEnd){if(oTextbox.setSelectionRange){oTextbox.setSelectionRange(nStart,nEnd);} +else if(oTextbox.createTextRange){var oTextRange=oTextbox.createTextRange();oTextRange.moveStart("character",nStart);oTextRange.moveEnd("character",nEnd-oTextbox.value.length);oTextRange.select();} +else{oTextbox.select();}};YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers=function(bShow){var bFireEvent=false;var width=this._oContainer._oContent.offsetWidth+"px";var height=this._oContainer._oContent.offsetHeight+"px";if(this.useIFrame&&this._oContainer._oIFrame){bFireEvent=true;if(bShow){this._oContainer._oIFrame.style.width=width;this._oContainer._oIFrame.style.height=height;} +else{this._oContainer._oIFrame.style.width=0;this._oContainer._oIFrame.style.height=0;}} +if(this.useShadow&&this._oContainer._oShadow){bFireEvent=true;if(bShow){this._oContainer._oShadow.style.width=width;this._oContainer._oShadow.style.height=height;} +else{this._oContainer._oShadow.style.width=0;this._oContainer._oShadow.style.height=0;}}};YAHOO.widget.AutoComplete.prototype._toggleContainer=function(bShow){var oContainer=this._oContainer;if(this.alwaysShowContainer&&this._bContainerOpen){return;} +if(!bShow){this._oContainer._oContent.scrollTop=0;var aItems=this._aListItems;if(aItems&&(aItems.length>0)){for(var i=aItems.length-1;i>=0;i--){aItems[i].style.display="none";}} +if(this._oCurItem){this._toggleHighlight(this._oCurItem,"from");} +this._oCurItem=null;this._nDisplayedItems=0;this._sCurQuery=null;} +if(!bShow&&!this._bContainerOpen){oContainer._oContent.style.display="none";return;} +var oAnim=this._oAnim;if(oAnim&&oAnim.getEl()&&(this.animHoriz||this.animVert)){if(!bShow){this._toggleContainerHelpers(bShow);} +if(oAnim.isAnimated()){oAnim.stop();} +var oClone=oContainer._oContent.cloneNode(true);oContainer.appendChild(oClone);oClone.style.top="-9000px";oClone.style.display="block";var wExp=oClone.offsetWidth;var hExp=oClone.offsetHeight;var wColl=(this.animHoriz)?0:wExp;var hColl=(this.animVert)?0:hExp;oAnim.attributes=(bShow)?{width:{to:wExp},height:{to:hExp}}:{width:{to:wColl},height:{to:hColl}};if(bShow&&!this._bContainerOpen){oContainer._oContent.style.width=wColl+"px";oContainer._oContent.style.height=hColl+"px";} +else{oContainer._oContent.style.width=wExp+"px";oContainer._oContent.style.height=hExp+"px";} +oContainer.removeChild(oClone);oClone=null;var oSelf=this;var onAnimComplete=function(){oAnim.onComplete.unsubscribeAll();if(bShow){oSelf.containerExpandEvent.fire(oSelf);} +else{oContainer._oContent.style.display="none";oSelf.containerCollapseEvent.fire(oSelf);} +oSelf._toggleContainerHelpers(bShow);};oContainer._oContent.style.display="block";oAnim.onComplete.subscribe(onAnimComplete);oAnim.animate();this._bContainerOpen=bShow;} +else{if(bShow){oContainer._oContent.style.display="block";this.containerExpandEvent.fire(this);} +else{oContainer._oContent.style.display="none";this.containerCollapseEvent.fire(this);} +this._toggleContainerHelpers(bShow);this._bContainerOpen=bShow;}};YAHOO.widget.AutoComplete.prototype._toggleHighlight=function(oNewItem,sType){var sHighlight=this.highlightClassName;if(this._oCurItem){YAHOO.util.Dom.removeClass(this._oCurItem,sHighlight);} +if((sType=="to")&&sHighlight){YAHOO.util.Dom.addClass(oNewItem,sHighlight);this._oCurItem=oNewItem;}};YAHOO.widget.AutoComplete.prototype._togglePrehighlight=function(oNewItem,sType){if(oNewItem==this._oCurItem){return;} +var sPrehighlight=this.prehighlightClassName;if((sType=="mouseover")&&sPrehighlight){YAHOO.util.Dom.addClass(oNewItem,sPrehighlight);} +else{YAHOO.util.Dom.removeClass(oNewItem,sPrehighlight);}};YAHOO.widget.AutoComplete.prototype._updateValue=function(oItem){var oTextbox=this._oTextbox;var sDelimChar=(this.delimChar)?(this.delimChar[0]||this.delimChar):null;var sSavedQuery=this._sSavedQuery;var sResultKey=oItem._sResultKey;oTextbox.focus();oTextbox.value="";if(sDelimChar){if(sSavedQuery){oTextbox.value=sSavedQuery;} +oTextbox.value+=sResultKey+sDelimChar;if(sDelimChar!=" "){oTextbox.value+=" ";}} +else{oTextbox.value=sResultKey;} +if(oTextbox.type=="textarea"){oTextbox.scrollTop=oTextbox.scrollHeight;} +var end=oTextbox.value.length;this._selectText(oTextbox,end,end);this._oCurItem=oItem;};YAHOO.widget.AutoComplete.prototype._selectItem=function(oItem){this._bItemSelected=true;this._updateValue(oItem);this._cancelIntervalDetection(this);this.itemSelectEvent.fire(this,oItem,oItem._oResultData);this._toggleContainer(false);};YAHOO.widget.AutoComplete.prototype._jumpSelection=function(){if(!this.typeAhead){return;} +else{this._toggleContainer(false);}};YAHOO.widget.AutoComplete.prototype._moveSelection=function(nKeyCode){if(this._bContainerOpen){var oCurItem=this._oCurItem;var nCurItemIndex=-1;if(oCurItem){nCurItemIndex=oCurItem._nItemIndex;} +var nNewItemIndex=(nKeyCode==40)?(nCurItemIndex+1):(nCurItemIndex-1);if(nNewItemIndex<-2||nNewItemIndex>=this._nDisplayedItems){return;} +if(oCurItem){this._toggleHighlight(oCurItem,"from");this.itemArrowFromEvent.fire(this,oCurItem);} +if(nNewItemIndex==-1){if(this.delimChar&&this._sSavedQuery){if(!this._textMatchesOption()){this._oTextbox.value=this._sSavedQuery;} +else{this._oTextbox.value=this._sSavedQuery+this._sCurQuery;}} +else{this._oTextbox.value=this._sCurQuery;} +this._oCurItem=null;return;} +if(nNewItemIndex==-2){this._toggleContainer(false);return;} +var oNewItem=this._aListItems[nNewItemIndex];var oContent=this._oContainer._oContent;var scrollOn=((YAHOO.util.Dom.getStyle(oContent,"overflow")=="auto")||(YAHOO.util.Dom.getStyle(oContent,"overflowY")=="auto"));if(scrollOn&&(nNewItemIndex>-1)&&(nNewItemIndex(oContent.scrollTop+oContent.offsetHeight)){oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;} +else if((oNewItem.offsetTop+oNewItem.offsetHeight)(oContent.scrollTop+oContent.offsetHeight)){this._oContainer._oContent.scrollTop=(oNewItem.offsetTop+oNewItem.offsetHeight)-oContent.offsetHeight;}}} +this._toggleHighlight(oNewItem,"to");this.itemArrowToEvent.fire(this,oNewItem);if(this.typeAhead){this._updateValue(oNewItem);}}};YAHOO.widget.AutoComplete.prototype._onItemMouseover=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseover");} +else{oSelf._toggleHighlight(this,"to");} +oSelf.itemMouseOverEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseout=function(v,oSelf){if(oSelf.prehighlightClassName){oSelf._togglePrehighlight(this,"mouseout");} +else{oSelf._toggleHighlight(this,"from");} +oSelf.itemMouseOutEvent.fire(oSelf,this);};YAHOO.widget.AutoComplete.prototype._onItemMouseclick=function(v,oSelf){oSelf._toggleHighlight(this,"to");oSelf._selectItem(this);};YAHOO.widget.AutoComplete.prototype._onContainerMouseover=function(v,oSelf){oSelf._bOverContainer=true;};YAHOO.widget.AutoComplete.prototype._onContainerMouseout=function(v,oSelf){oSelf._bOverContainer=false;if(oSelf._oCurItem){oSelf._toggleHighlight(oSelf._oCurItem,"to");}};YAHOO.widget.AutoComplete.prototype._onContainerScroll=function(v,oSelf){oSelf._oTextbox.focus();};YAHOO.widget.AutoComplete.prototype._onContainerResize=function(v,oSelf){oSelf._toggleContainerHelpers(oSelf._bContainerOpen);};YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown=function(v,oSelf){var nKeyCode=v.keyCode;switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +if(oSelf._oCurItem){oSelf._selectItem(oSelf._oCurItem);} +else{oSelf._toggleContainer(false);} +break;case 27:oSelf._toggleContainer(false);return;case 39:oSelf._jumpSelection();break;case 38:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;case 40:YAHOO.util.Event.stopEvent(v);oSelf._moveSelection(nKeyCode);break;default:break;}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress=function(v,oSelf){var nKeyCode=v.keyCode;var isMac=(navigator.userAgent.toLowerCase().indexOf("mac")!=-1);if(isMac){switch(nKeyCode){case 9:if(oSelf.delimChar&&(oSelf._nKeyCode!=nKeyCode)){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 13:if(oSelf._nKeyCode!=nKeyCode){if(oSelf._bContainerOpen){YAHOO.util.Event.stopEvent(v);}} +break;case 38:case 40:YAHOO.util.Event.stopEvent(v);break;default:break;}} +else if(nKeyCode==229){oSelf._queryInterval=setInterval(function(){oSelf._onIMEDetected(oSelf);},500);}};YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp=function(v,oSelf){oSelf._initProps();var nKeyCode=v.keyCode;oSelf._nKeyCode=nKeyCode;var sText=this.value;if(oSelf._isIgnoreKey(nKeyCode)||(sText.toLowerCase()==oSelf._sCurQuery)){return;} +else{oSelf.textboxKeyEvent.fire(oSelf,nKeyCode);} +if(oSelf.queryDelay>0){var nDelayID=setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay*1000));if(oSelf._nDelayID!=-1){clearTimeout(oSelf._nDelayID);} +oSelf._nDelayID=nDelayID;} +else{oSelf._sendQuery(sText);}};YAHOO.widget.AutoComplete.prototype._onTextboxFocus=function(v,oSelf){oSelf._oTextbox.setAttribute("autocomplete","off");oSelf._bFocused=true;oSelf.textboxFocusEvent.fire(oSelf);};YAHOO.widget.AutoComplete.prototype._onTextboxBlur=function(v,oSelf){if(!oSelf._bOverContainer||(oSelf._nKeyCode==9)){if(!oSelf._bItemSelected){if(!oSelf._bContainerOpen||(oSelf._bContainerOpen&&!oSelf._textMatchesOption())){if(oSelf.forceSelection){oSelf._clearSelection();} +else{oSelf.unmatchedItemSelectEvent.fire(oSelf,oSelf._sCurQuery);}}} +if(oSelf._bContainerOpen){oSelf._toggleContainer(false);} +oSelf._cancelIntervalDetection(oSelf);oSelf._bFocused=false;oSelf.textboxBlurEvent.fire(oSelf);}};YAHOO.widget.AutoComplete.prototype._onFormSubmit=function(v,oSelf){if(oSelf.allowBrowserAutocomplete){oSelf._oTextbox.setAttribute("autocomplete","on");} +else{oSelf._oTextbox.setAttribute("autocomplete","off");}};YAHOO.widget.DataSource=function(){};YAHOO.widget.DataSource.ERROR_DATANULL="Response data was null";YAHOO.widget.DataSource.ERROR_DATAPARSE="Response data could not be parsed";YAHOO.widget.DataSource.prototype.maxCacheEntries=15;YAHOO.widget.DataSource.prototype.queryMatchContains=false;YAHOO.widget.DataSource.prototype.queryMatchSubset=false;YAHOO.widget.DataSource.prototype.queryMatchCase=false;YAHOO.widget.DataSource.prototype.toString=function(){return"DataSource "+this._sName;};YAHOO.widget.DataSource.prototype.getResults=function(oCallbackFn,sQuery,oParent){var aResults=this._doQueryCache(oCallbackFn,sQuery,oParent);if(aResults.length===0){this.queryEvent.fire(this,oParent,sQuery);this.doQuery(oCallbackFn,sQuery,oParent);}};YAHOO.widget.DataSource.prototype.doQuery=function(oCallbackFn,sQuery,oParent){};YAHOO.widget.DataSource.prototype.flushCache=function(){if(this._aCache){this._aCache=[];} +if(this._aCacheHelper){this._aCacheHelper=[];} +this.cacheFlushEvent.fire(this);};YAHOO.widget.DataSource.prototype.queryEvent=null;YAHOO.widget.DataSource.prototype.cacheQueryEvent=null;YAHOO.widget.DataSource.prototype.getResultsEvent=null;YAHOO.widget.DataSource.prototype.getCachedResultsEvent=null;YAHOO.widget.DataSource.prototype.dataErrorEvent=null;YAHOO.widget.DataSource.prototype.cacheFlushEvent=null;YAHOO.widget.DataSource._nIndex=0;YAHOO.widget.DataSource.prototype._sName=null;YAHOO.widget.DataSource.prototype._aCache=null;YAHOO.widget.DataSource.prototype._init=function(){var maxCacheEntries=this.maxCacheEntries;if(isNaN(maxCacheEntries)||(maxCacheEntries<0)){maxCacheEntries=0;} +if(maxCacheEntries>0&&!this._aCache){this._aCache=[];} +this._sName="instance"+YAHOO.widget.DataSource._nIndex;YAHOO.widget.DataSource._nIndex++;this.queryEvent=new YAHOO.util.CustomEvent("query",this);this.cacheQueryEvent=new YAHOO.util.CustomEvent("cacheQuery",this);this.getResultsEvent=new YAHOO.util.CustomEvent("getResults",this);this.getCachedResultsEvent=new YAHOO.util.CustomEvent("getCachedResults",this);this.dataErrorEvent=new YAHOO.util.CustomEvent("dataError",this);this.cacheFlushEvent=new YAHOO.util.CustomEvent("cacheFlush",this);};YAHOO.widget.DataSource.prototype._addCacheElem=function(oResult){var aCache=this._aCache;if(!aCache||!oResult||!oResult.query||!oResult.results){return;} +if(aCache.length>=this.maxCacheEntries){aCache.shift();} +aCache.push(oResult);};YAHOO.widget.DataSource.prototype._doQueryCache=function(oCallbackFn,sQuery,oParent){var aResults=[];var bMatchFound=false;var aCache=this._aCache;var nCacheLength=(aCache)?aCache.length:0;var bMatchContains=this.queryMatchContains;if((this.maxCacheEntries>0)&&aCache&&(nCacheLength>0)){this.cacheQueryEvent.fire(this,oParent,sQuery);if(!this.queryMatchCase){var sOrigQuery=sQuery;sQuery=sQuery.toLowerCase();} +for(var i=nCacheLength-1;i>=0;i--){var resultObj=aCache[i];var aAllResultItems=resultObj.results;var matchKey=(!this.queryMatchCase)?encodeURIComponent(resultObj.query).toLowerCase():encodeURIComponent(resultObj.query);if(matchKey==sQuery){bMatchFound=true;aResults=aAllResultItems;if(i!=nCacheLength-1){aCache.splice(i,1);this._addCacheElem(resultObj);} +break;} +else if(this.queryMatchSubset){for(var j=sQuery.length-1;j>=0;j--){var subQuery=sQuery.substr(0,j);if(matchKey==subQuery){bMatchFound=true;for(var k=aAllResultItems.length-1;k>=0;k--){var aRecord=aAllResultItems[k];var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aRecord[0]).indexOf(sQuery):encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aRecord);}} +resultObj={};resultObj.query=sQuery;resultObj.results=aResults;this._addCacheElem(resultObj);break;}} +if(bMatchFound){break;}}} +if(bMatchFound){this.getCachedResultsEvent.fire(this,oParent,sOrigQuery,aResults);oCallbackFn(sOrigQuery,aResults,oParent);}} +return aResults;};YAHOO.widget.DS_XHR=function(sScriptURI,aSchema,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aSchema||(aSchema.constructor!=Array)){return;} +else{this.schema=aSchema;} +this.scriptURI=sScriptURI;this._init();};YAHOO.widget.DS_XHR.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_XHR.TYPE_JSON=0;YAHOO.widget.DS_XHR.TYPE_XML=1;YAHOO.widget.DS_XHR.TYPE_FLAT=2;YAHOO.widget.DS_XHR.ERROR_DATAXHR="XHR response failed";YAHOO.widget.DS_XHR.prototype.connMgr=YAHOO.util.Connect;YAHOO.widget.DS_XHR.prototype.connTimeout=0;YAHOO.widget.DS_XHR.prototype.scriptURI=null;YAHOO.widget.DS_XHR.prototype.scriptQueryParam="query";YAHOO.widget.DS_XHR.prototype.scriptQueryAppend="";YAHOO.widget.DS_XHR.prototype.responseType=YAHOO.widget.DS_XHR.TYPE_JSON;YAHOO.widget.DS_XHR.prototype.responseStripAfter="\n0){sUri+="&"+this.scriptQueryAppend;} +var oResponse=null;var oSelf=this;var responseSuccess=function(oResp){if(!oSelf._oConn||(oResp.tId!=oSelf._oConn.tId)){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +for(var foo in oResp){} +if(!isXML){oResp=oResp.responseText;} +else{oResp=oResp.responseXML;} +if(oResp===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var aResults=oSelf.parseResponse(sQuery,oResp,oParent);var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;if(aResults===null){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATAPARSE);aResults=[];} +else{oSelf.getResultsEvent.fire(oSelf,oParent,sQuery,aResults);oSelf._addCacheElem(resultObj);} +oCallbackFn(sQuery,aResults,oParent);};var responseFailure=function(oResp){oSelf.dataErrorEvent.fire(oSelf,oParent,sQuery,YAHOO.widget.DS_XHR.ERROR_DATAXHR);return;};var oCallback={success:responseSuccess,failure:responseFailure};if(!isNaN(this.connTimeout)&&this.connTimeout>0){oCallback.timeout=this.connTimeout;} +if(this._oConn){this.connMgr.abort(this._oConn);} +oSelf._oConn=this.connMgr.asyncRequest("GET",sUri,oCallback,null);};YAHOO.widget.DS_XHR.prototype.parseResponse=function(sQuery,oResponse,oParent){var aSchema=this.schema;var aResults=[];var bError=false;var nEnd=((this.responseStripAfter!=="")&&(oResponse.indexOf))?oResponse.indexOf(this.responseStripAfter):-1;if(nEnd!=-1){oResponse=oResponse.substring(0,nEnd);} +switch(this.responseType){case YAHOO.widget.DS_XHR.TYPE_JSON:var jsonList;if(window.JSON&&(navigator.userAgent.toLowerCase().indexOf('khtml')==-1)){var jsonObjParsed=JSON.parse(oResponse);if(!jsonObjParsed){bError=true;break;} +else{try{jsonList=eval("jsonObjParsed."+aSchema[0]);} +catch(e){bError=true;break;}}} +else{try{while(oResponse.substring(0,1)==" "){oResponse=oResponse.substring(1,oResponse.length);} +if(oResponse.indexOf("{")<0){bError=true;break;} +if(oResponse.indexOf("{}")===0){break;} +var jsonObjRaw=eval("("+oResponse+")");if(!jsonObjRaw){bError=true;break;} +jsonList=eval("(jsonObjRaw."+aSchema[0]+")");} +catch(e){bError=true;break;}} +if(!jsonList){bError=true;break;} +if(jsonList.constructor!=Array){jsonList=[jsonList];} +for(var i=jsonList.length-1;i>=0;i--){var aResultItem=[];var jsonResult=jsonList[i];for(var j=aSchema.length-1;j>=1;j--){var dataFieldValue=jsonResult[aSchema[j]];if(!dataFieldValue){dataFieldValue="";} +aResultItem.unshift(dataFieldValue);} +if(aResultItem.length==1){aResultItem.push(jsonResult);} +aResults.unshift(aResultItem);} +break;case YAHOO.widget.DS_XHR.TYPE_XML:var xmlList=oResponse.getElementsByTagName(aSchema[0]);if(!xmlList){bError=true;break;} +for(var k=xmlList.length-1;k>=0;k--){var result=xmlList.item(k);var aFieldSet=[];for(var m=aSchema.length-1;m>=1;m--){var sValue=null;var xmlAttr=result.attributes.getNamedItem(aSchema[m]);if(xmlAttr){sValue=xmlAttr.value;} +else{var xmlNode=result.getElementsByTagName(aSchema[m]);if(xmlNode&&xmlNode.item(0)&&xmlNode.item(0).firstChild){sValue=xmlNode.item(0).firstChild.nodeValue;} +else{sValue="";}} +aFieldSet.unshift(sValue);} +aResults.unshift(aFieldSet);} +break;case YAHOO.widget.DS_XHR.TYPE_FLAT:if(oResponse.length>0){var newLength=oResponse.length-aSchema[0].length;if(oResponse.substr(newLength)==aSchema[0]){oResponse=oResponse.substr(0,newLength);} +var aRecords=oResponse.split(aSchema[0]);for(var n=aRecords.length-1;n>=0;n--){aResults[n]=aRecords[n].split(aSchema[1]);}} +break;default:break;} +sQuery=null;oResponse=null;oParent=null;if(bError){return null;} +else{return aResults;}};YAHOO.widget.DS_XHR.prototype._oConn=null;YAHOO.widget.DS_JSFunction=function(oFunction,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!oFunction||(oFunction.constructor!=Function)){return;} +else{this.dataFunction=oFunction;this._init();}};YAHOO.widget.DS_JSFunction.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSFunction.prototype.dataFunction=null;YAHOO.widget.DS_JSFunction.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var oFunction=this.dataFunction;var aResults=[];aResults=oFunction(sQuery);if(aResults===null){this.dataErrorEvent.fire(this,oParent,sQuery,YAHOO.widget.DataSource.ERROR_DATANULL);return;} +var resultObj={};resultObj.query=decodeURIComponent(sQuery);resultObj.results=aResults;this._addCacheElem(resultObj);this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);return;};YAHOO.widget.DS_JSArray=function(aData,oConfigs){if(typeof oConfigs=="object"){for(var sConfig in oConfigs){this[sConfig]=oConfigs[sConfig];}} +if(!aData||(aData.constructor!=Array)){return;} +else{this.data=aData;this._init();}};YAHOO.widget.DS_JSArray.prototype=new YAHOO.widget.DataSource();YAHOO.widget.DS_JSArray.prototype.data=null;YAHOO.widget.DS_JSArray.prototype.doQuery=function(oCallbackFn,sQuery,oParent){var aData=this.data;var aResults=[];var bMatchFound=false;var bMatchContains=this.queryMatchContains;if(sQuery){if(!this.queryMatchCase){sQuery=sQuery.toLowerCase();} +for(var i=aData.length-1;i>=0;i--){var aDataset=[];if(aData[i]){if(aData[i].constructor==String){aDataset[0]=aData[i];} +else if(aData[i].constructor==Array){aDataset=aData[i];}} +if(aDataset[0]&&(aDataset[0].constructor==String)){var sKeyIndex=(this.queryMatchCase)?encodeURIComponent(aDataset[0]).indexOf(sQuery):encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery);if((!bMatchContains&&(sKeyIndex===0))||(bMatchContains&&(sKeyIndex>-1))){aResults.unshift(aDataset);}}}} +this.getResultsEvent.fire(this,oParent,sQuery,aResults);oCallbackFn(sQuery,aResults,oParent);}; \ No newline at end of file diff --git a/www/extras/yui/build/autocomplete/autocomplete.js b/www/extras/yui/build/autocomplete/autocomplete.js new file mode 100644 index 000000000..a5722cc58 --- /dev/null +++ b/www/extras/yui/build/autocomplete/autocomplete.js @@ -0,0 +1,3066 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.txt +version: 0.12.0 +*/ + + /** + * The AutoComplete control provides the front-end logic for text-entry suggestion and + * completion functionality. + * + * @module autocomplete + * @requires yahoo, dom, event, datasource + * @optional animation, connection, json + * @namespace YAHOO.widget + * @title AutoComplete Widget + */ + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The AutoComplete class provides the customizable functionality of a plug-and-play DHTML + * auto completion widget. Some key features: + *
          + *
        • Navigate with up/down arrow keys and/or mouse to pick a selection
        • + *
        • The drop down container can "roll down" or "fly out" via configurable + * animation
        • + *
        • UI look-and-feel customizable through CSS, including container + * attributes, borders, position, fonts, etc
        • + *
        + * + * @class AutoComplete + * @constructor + * @param elInput {HTMLElement} DOM element reference of an input field + * @param elInput {String} String ID of an input field + * @param elContainer {HTMLElement} DOM element reference of an existing DIV + * @param elContainer {String} String ID of an existing DIV + * @param oDataSource {Object} Instance of YAHOO.widget.DataSource for query/results + * @param oConfigs {Object} (optional) Object literal of configuration params + */ +YAHOO.widget.AutoComplete = function(elInput,elContainer,oDataSource,oConfigs) { + if(elInput && elContainer && oDataSource) { + // Validate DataSource + if (oDataSource && (oDataSource instanceof YAHOO.widget.DataSource)) { + this.dataSource = oDataSource; + } + else { + return; + } + + // Validate input element + if(YAHOO.util.Dom.inDocument(elInput)) { + if(typeof elInput == "string") { + this._sName = "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput; + this._oTextbox = document.getElementById(elInput); + } + else { + this._sName = (elInput.id) ? + "instance" + YAHOO.widget.AutoComplete._nIndex + " " + elInput.id: + "instance" + YAHOO.widget.AutoComplete._nIndex; + this._oTextbox = elInput; + } + } + else { + return; + } + + // Validate container element + if(YAHOO.util.Dom.inDocument(elContainer)) { + if(typeof elContainer == "string") { + this._oContainer = document.getElementById(elContainer); + } + else { + this._oContainer = elContainer; + } + if(this._oContainer.style.display == "none") { + } + } + else { + return; + } + + // Set any config params passed in to override defaults + if (typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + if (sConfig) { + this[sConfig] = oConfigs[sConfig]; + } + } + } + + // Initialization sequence + this._initContainer(); + this._initProps(); + this._initList(); + this._initContainerHelpers(); + + // Set up events + var oSelf = this; + var oTextbox = this._oTextbox; + // Events are actually for the content module within the container + var oContent = this._oContainer._oContent; + + // Dom events + YAHOO.util.Event.addListener(oTextbox,"keyup",oSelf._onTextboxKeyUp,oSelf); + YAHOO.util.Event.addListener(oTextbox,"keydown",oSelf._onTextboxKeyDown,oSelf); + YAHOO.util.Event.addListener(oTextbox,"focus",oSelf._onTextboxFocus,oSelf); + YAHOO.util.Event.addListener(oTextbox,"blur",oSelf._onTextboxBlur,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseover",oSelf._onContainerMouseover,oSelf); + YAHOO.util.Event.addListener(oContent,"mouseout",oSelf._onContainerMouseout,oSelf); + YAHOO.util.Event.addListener(oContent,"scroll",oSelf._onContainerScroll,oSelf); + YAHOO.util.Event.addListener(oContent,"resize",oSelf._onContainerResize,oSelf); + if(oTextbox.form) { + YAHOO.util.Event.addListener(oTextbox.form,"submit",oSelf._onFormSubmit,oSelf); + } + YAHOO.util.Event.addListener(oTextbox,"keypress",oSelf._onTextboxKeyPress,oSelf); + + // Custom events + this.textboxFocusEvent = new YAHOO.util.CustomEvent("textboxFocus", this); + this.textboxKeyEvent = new YAHOO.util.CustomEvent("textboxKey", this); + this.dataRequestEvent = new YAHOO.util.CustomEvent("dataRequest", this); + this.dataReturnEvent = new YAHOO.util.CustomEvent("dataReturn", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.containerExpandEvent = new YAHOO.util.CustomEvent("containerExpand", this); + this.typeAheadEvent = new YAHOO.util.CustomEvent("typeAhead", this); + this.itemMouseOverEvent = new YAHOO.util.CustomEvent("itemMouseOver", this); + this.itemMouseOutEvent = new YAHOO.util.CustomEvent("itemMouseOut", this); + this.itemArrowToEvent = new YAHOO.util.CustomEvent("itemArrowTo", this); + this.itemArrowFromEvent = new YAHOO.util.CustomEvent("itemArrowFrom", this); + this.itemSelectEvent = new YAHOO.util.CustomEvent("itemSelect", this); + this.unmatchedItemSelectEvent = new YAHOO.util.CustomEvent("unmatchedItemSelect", this); + this.selectionEnforceEvent = new YAHOO.util.CustomEvent("selectionEnforce", this); + this.containerCollapseEvent = new YAHOO.util.CustomEvent("containerCollapse", this); + this.textboxBlurEvent = new YAHOO.util.CustomEvent("textboxBlur", this); + + // Finish up + oTextbox.setAttribute("autocomplete","off"); + YAHOO.widget.AutoComplete._nIndex++; + } + // Required arguments were not found + else { + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * The DataSource object that encapsulates the data used for auto completion. + * This object should be an inherited object from YAHOO.widget.DataSource. + * + * @property dataSource + * @type Object + */ +YAHOO.widget.AutoComplete.prototype.dataSource = null; + +/** + * Number of characters that must be entered before querying for results. A negative value + * effectively turns off the widget. A value of 0 allows queries of null or empty string + * values. + * + * @property minQueryLength + * @type Number + * @default 1 + */ +YAHOO.widget.AutoComplete.prototype.minQueryLength = 1; + +/** + * Maximum number of results to display in results container. + * + * @property maxResultsDisplayed + * @type Number + * @default 10 + */ +YAHOO.widget.AutoComplete.prototype.maxResultsDisplayed = 10; + +/** + * Number of seconds to delay before submitting a query request. If a query + * request is received before a previous one has completed its delay, the + * previous request is cancelled and the new request is set to the delay. + * + * @property queryDelay + * @type Number + * @default 0.5 + */ +YAHOO.widget.AutoComplete.prototype.queryDelay = 0.5; + +/** + * Class name of a highlighted item within results container. + * + * @property highlighClassName + * @type String + * @default "yui-ac-highlight" + */ +YAHOO.widget.AutoComplete.prototype.highlightClassName = "yui-ac-highlight"; + +/** + * Class name of a pre-highlighted item within results container. + * + * @property prehighlightClassName + * @type String + */ +YAHOO.widget.AutoComplete.prototype.prehighlightClassName = null; + +/** + * Query delimiter. A single character separator for multiple delimited + * selections. Multiple delimiter characteres may be defined as an array of + * strings. A null value or empty string indicates that query results cannot + * be delimited. This feature is not recommended if you need forceSelection to + * be true. + * + * @property delimChar + * @type String | String[] + */ +YAHOO.widget.AutoComplete.prototype.delimChar = null; + +/** + * Whether or not the first item in results container should be automatically highlighted + * on expand. + * + * @property autoHighlight + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.autoHighlight = true; + +/** + * Whether or not the input field should be automatically updated + * with the first query result as the user types, auto-selecting the substring + * that the user has not typed. + * + * @property typeAhead + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.typeAhead = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * horizontal direction. + * + * @property animHoriz + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.animHoriz = false; + +/** + * Whether or not to animate the expansion/collapse of the results container in the + * vertical direction. + * + * @property animVert + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.animVert = true; + +/** + * Speed of container expand/collapse animation, in seconds.. + * + * @property animSpeed + * @type Number + * @default 0.3 + */ +YAHOO.widget.AutoComplete.prototype.animSpeed = 0.3; + +/** + * Whether or not to force the user's selection to match one of the query + * results. Enabling this feature essentially transforms the input field into a + * <select> field. This feature is not recommended with delimiter character(s) + * defined. + * + * @property forceSelection + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.forceSelection = false; + +/** + * Whether or not to allow browsers to cache user-typed input in the input + * field. Disabling this feature will prevent the widget from setting the + * autocomplete="off" on the input field. When autocomplete="off" + * and users click the back button after form submission, user-typed input can + * be prefilled by the browser from its cache. This caching of user input may + * not be desired for sensitive data, such as credit card numbers, in which + * case, implementers should consider setting allowBrowserAutocomplete to false. + * + * @property allowBrowserAutocomplete + * @type Boolean + * @default true + */ +YAHOO.widget.AutoComplete.prototype.allowBrowserAutocomplete = true; + +/** + * Whether or not the results container should always be displayed. + * Enabling this feature displays the container when the widget is instantiated + * and prevents the toggling of the container to a collapsed state. + * + * @property alwaysShowContainer + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.alwaysShowContainer = false; + +/** + * Whether or not to use an iFrame to layer over Windows form elements in + * IE. Set to true only when the results container will be on top of a + * <select> field in IE and thus exposed to the IE z-index bug (i.e., + * 5.5 < IE < 7). + * + * @property useIFrame + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useIFrame = false; + +/** + * Whether or not the results container should have a shadow. + * + * @property useShadow + * @type Boolean + * @default false + */ +YAHOO.widget.AutoComplete.prototype.useShadow = false; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the AutoComplete instance. + * + * @method toString + * @return {String} Unique name of the AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.toString = function() { + return "AutoComplete " + this._sName; +}; + + /** + * Returns true if container is in an expanded state, false otherwise. + * + * @method isContainerOpen + * @return {Boolean} Returns true if container is in an expanded state, false otherwise. + */ +YAHOO.widget.AutoComplete.prototype.isContainerOpen = function() { + return this._bContainerOpen; +}; + +/** + * Public accessor to the internal array of DOM <li> elements that + * display query results within the results container. + * + * @method getListItems + * @return {HTMLElement[]} Array of <li> elements within the results container. + */ +YAHOO.widget.AutoComplete.prototype.getListItems = function() { + return this._aListItems; +}; + +/** + * Public accessor to the data held in an <li> element of the + * results container. + * + * @method getListItemData + * @return {Object | Array} Object or array of result data or null + */ +YAHOO.widget.AutoComplete.prototype.getListItemData = function(oListItem) { + if(oListItem._oResultData) { + return oListItem._oResultData; + } + else { + return false; + } +}; + +/** + * Sets HTML markup for the results container header. This markup will be + * inserted within a <div> tag with a class of "ac_hd". + * + * @method setHeader + * @param sHeader {String} HTML markup for results container header. + */ +YAHOO.widget.AutoComplete.prototype.setHeader = function(sHeader) { + if(sHeader) { + if(this._oContainer._oContent._oHeader) { + this._oContainer._oContent._oHeader.innerHTML = sHeader; + this._oContainer._oContent._oHeader.style.display = "block"; + } + } + else { + this._oContainer._oContent._oHeader.innerHTML = ""; + this._oContainer._oContent._oHeader.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container footer. This markup will be + * inserted within a <div> tag with a class of "ac_ft". + * + * @method setFooter + * @param sFooter {String} HTML markup for results container footer. + */ +YAHOO.widget.AutoComplete.prototype.setFooter = function(sFooter) { + if(sFooter) { + if(this._oContainer._oContent._oFooter) { + this._oContainer._oContent._oFooter.innerHTML = sFooter; + this._oContainer._oContent._oFooter.style.display = "block"; + } + } + else { + this._oContainer._oContent._oFooter.innerHTML = ""; + this._oContainer._oContent._oFooter.style.display = "none"; + } +}; + +/** + * Sets HTML markup for the results container body. This markup will be + * inserted within a <div> tag with a class of "ac_bd". + * + * @method setBody + * @param sHeader {String} HTML markup for results container body. + */ +YAHOO.widget.AutoComplete.prototype.setBody = function(sBody) { + if(sBody) { + if(this._oContainer._oContent._oBody) { + this._oContainer._oContent._oBody.innerHTML = sBody; + this._oContainer._oContent._oBody.style.display = "block"; + this._oContainer._oContent.style.display = "block"; + } + } + else { + this._oContainer._oContent._oBody.innerHTML = ""; + this._oContainer._oContent.style.display = "none"; + } + this._maxResultsDisplayed = 0; +}; + +/** + * Overridable method that converts a result item object into HTML markup + * for display. Return data values are accessible via the oResultItem object, + * and the key return value will always be oResultItem[0]. Markup will be + * displayed within <li> element tags in the container. + * + * @method formatResult + * @param oResultItem {Object} Result item representing one query result. Data is held in an array. + * @param sQuery {String} The current query string. + * @return {String} HTML markup of formatted result data. + */ +YAHOO.widget.AutoComplete.prototype.formatResult = function(oResultItem, sQuery) { + var sResult = oResultItem[0]; + if(sResult) { + return sResult; + } + else { + return ""; + } +}; + +/** + * Overridable method called before container expands allows implementers to access data + * and DOM elements. + * + * @method doBeforeExpandContainer + * @return {Boolean} Return true to continue expanding container, false to cancel the expand. + */ +YAHOO.widget.AutoComplete.prototype.doBeforeExpandContainer = function(oResultItem, sQuery) { + return true; +}; + +/** + * Makes query request to the DataSource. + * + * @method sendQuery + * @param sQuery {String} Query string. + */ +YAHOO.widget.AutoComplete.prototype.sendQuery = function(sQuery) { + this._sendQuery(sQuery); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when the input field receives focus. + * + * @event textboxFocusEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxFocusEvent = null; + +/** + * Fired when the input field receives key input. + * + * @event textboxKeyEvent + * @param oSelf {Object} The AutoComplete instance. + * @param nKeycode {Number} The keycode number. + */ +YAHOO.widget.AutoComplete.prototype.textboxKeyEvent = null; + +/** + * Fired when the AutoComplete instance makes a query to the DataSource. + * + * @event dataRequestEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataRequestEvent = null; + +/** + * Fired when the AutoComplete instance receives query results from the data + * source. + * + * @event dataReturnEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param aResults {Array} Results array. + */ +YAHOO.widget.AutoComplete.prototype.dataReturnEvent = null; + +/** + * Fired when the AutoComplete instance does not receive query results from the + * DataSource due to an error. + * + * @event dataErrorEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + */ +YAHOO.widget.AutoComplete.prototype.dataErrorEvent = null; + +/** + * Fired when the results container is expanded. + * + * @event containerExpandEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerExpandEvent = null; + +/** + * Fired when the input field has been prefilled by the type-ahead + * feature. + * + * @event typeAheadEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The query string. + * @param sPrefill {String} The prefill string. + */ +YAHOO.widget.AutoComplete.prototype.typeAheadEvent = null; + +/** + * Fired when result item has been moused over. + * + * @event itemMouseOverEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused to. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOverEvent = null; + +/** + * Fired when result item has been moused out. + * + * @event itemMouseOutEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item moused from. + */ +YAHOO.widget.AutoComplete.prototype.itemMouseOutEvent = null; + +/** + * Fired when result item has been arrowed to. + * + * @event itemArrowToEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed to. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowToEvent = null; + +/** + * Fired when result item has been arrowed away from. + * + * @event itemArrowFromEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The <li> element item arrowed from. + */ +YAHOO.widget.AutoComplete.prototype.itemArrowFromEvent = null; + +/** + * Fired when an item is selected via mouse click, ENTER key, or TAB key. + * + * @event itemSelectEvent + * @param oSelf {Object} The AutoComplete instance. + * @param elItem {HTMLElement} The selected <li> element item. + * @param oData {Object} The data returned for the item, either as an object, + * or mapped from the schema into an array. + */ +YAHOO.widget.AutoComplete.prototype.itemSelectEvent = null; + +/** + * Fired when a user selection does not match any of the displayed result items. + * Note that this event may not behave as expected when delimiter characters + * have been defined. + * + * @event unmatchedItemSelectEvent + * @param oSelf {Object} The AutoComplete instance. + * @param sQuery {String} The user-typed query string. + */ +YAHOO.widget.AutoComplete.prototype.unmatchedItemSelectEvent = null; + +/** + * Fired if forceSelection is enabled and the user's input has been cleared + * because it did not match one of the returned query results. + * + * @event selectionEnforceEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.selectionEnforceEvent = null; + +/** + * Fired when the results container is collapsed. + * + * @event containerCollapseEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.containerCollapseEvent = null; + +/** + * Fired when the input field loses focus. + * + * @event textboxBlurEvent + * @param oSelf {Object} The AutoComplete instance. + */ +YAHOO.widget.AutoComplete.prototype.textboxBlurEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple AutoComplete instances. + * + * @property _nIndex + * @type Number + * @default 0 + * @private + */ +YAHOO.widget.AutoComplete._nIndex = 0; + +/** + * Name of AutoComplete instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sName = null; + +/** + * Text input field DOM element. + * + * @property _oTextbox + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oTextbox = null; + +/** + * Whether or not the input field is currently in focus. If query results come back + * but the user has already moved on, do not proceed with auto complete behavior. + * + * @property _bFocused + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bFocused = true; + +/** + * Animation instance for container expand/collapse. + * + * @property _oAnim + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._oAnim = null; + +/** + * Container DOM element. + * + * @property _oContainer + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oContainer = null; + +/** + * Whether or not the results container is currently open. + * + * @property _bContainerOpen + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bContainerOpen = false; + +/** + * Whether or not the mouse is currently over the results + * container. This is necessary in order to prevent clicks on container items + * from being text input field blur events. + * + * @property _bOverContainer + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bOverContainer = false; + +/** + * Array of <li> elements references that contain query results within the + * results container. + * + * @property _aListItems + * @type Array + * @private + */ +YAHOO.widget.AutoComplete.prototype._aListItems = null; + +/** + * Number of <li> elements currently displayed in results container. + * + * @property _nDisplayedItems + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDisplayedItems = 0; + +/** + * Internal count of <li> elements displayed and hidden in results container. + * + * @property _maxResultsDisplayed + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._maxResultsDisplayed = 0; + +/** + * Current query string + * + * @property _sCurQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sCurQuery = null; + +/** + * Past queries this session (for saving delimited queries). + * + * @property _sSavedQuery + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sSavedQuery = null; + +/** + * Pointer to the currently highlighted <li> element in the container. + * + * @property _oCurItem + * @type HTMLElement + * @private + */ +YAHOO.widget.AutoComplete.prototype._oCurItem = null; + +/** + * Whether or not an item has been selected since the container was populated + * with results. Reset to false by _populateList, and set to true when item is + * selected. + * + * @property _bItemSelected + * @type Boolean + * @private + */ +YAHOO.widget.AutoComplete.prototype._bItemSelected = false; + +/** + * Key code of the last key pressed in textbox. + * + * @property _nKeyCode + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nKeyCode = null; + +/** + * Delay timeout ID. + * + * @property _nDelayID + * @type Number + * @private + */ +YAHOO.widget.AutoComplete.prototype._nDelayID = -1; + +/** + * Src to iFrame used when useIFrame = true. Supports implementations over SSL + * as well. + * + * @property _iFrameSrc + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._iFrameSrc = "javascript:false;"; + +/** + * For users typing via certain IMEs, queries must be triggered by intervals, + * since key events yet supported across all browsers for all IMEs. + * + * @property _queryInterval + * @type Object + * @private + */ +YAHOO.widget.AutoComplete.prototype._queryInterval = null; + +/** + * Internal tracker to last known textbox value, used to determine whether or not + * to trigger a query via interval for certain IME users. + * + * @event _sLastTextboxValue + * @type String + * @private + */ +YAHOO.widget.AutoComplete.prototype._sLastTextboxValue = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Updates and validates latest public config properties. + * + * @method __initProps + * @private + */ +YAHOO.widget.AutoComplete.prototype._initProps = function() { + // Correct any invalid values + var minQueryLength = this.minQueryLength; + if(isNaN(minQueryLength) || (minQueryLength < 1)) { + minQueryLength = 1; + } + var maxResultsDisplayed = this.maxResultsDisplayed; + if(isNaN(this.maxResultsDisplayed) || (this.maxResultsDisplayed < 1)) { + this.maxResultsDisplayed = 10; + } + var queryDelay = this.queryDelay; + if(isNaN(this.queryDelay) || (this.queryDelay < 0)) { + this.queryDelay = 0.5; + } + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + if(typeof aDelimChar == "string") { + this.delimChar = [aDelimChar]; + } + else if(aDelimChar.constructor != Array) { + this.delimChar = null; + } + } + var animSpeed = this.animSpeed; + if((this.animHoriz || this.animVert) && YAHOO.util.Anim) { + if(isNaN(animSpeed) || (animSpeed < 0)) { + animSpeed = 0.3; + } + if(!this._oAnim ) { + oAnim = new YAHOO.util.Anim(this._oContainer._oContent, {}, this.animSpeed); + this._oAnim = oAnim; + } + else { + this._oAnim.duration = animSpeed; + } + } + if(this.forceSelection && this.delimChar) { + } +}; + +/** + * Initializes the results container helpers if they are enabled and do + * not exist + * + * @method _initContainerHelpers + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainerHelpers = function() { + if(this.useShadow && !this._oContainer._oShadow) { + var oShadow = document.createElement("div"); + oShadow.className = "yui-ac-shadow"; + this._oContainer._oShadow = this._oContainer.appendChild(oShadow); + } + if(this.useIFrame && !this._oContainer._oIFrame) { + var oIFrame = document.createElement("iframe"); + oIFrame.src = this._iFrameSrc; + oIFrame.frameBorder = 0; + oIFrame.scrolling = "no"; + oIFrame.style.position = "absolute"; + oIFrame.style.width = "100%"; + oIFrame.style.height = "100%"; + oIFrame.tabIndex = -1; + this._oContainer._oIFrame = this._oContainer.appendChild(oIFrame); + } +}; + +/** + * Initializes the results container once at object creation + * + * @method _initContainer + * @private + */ +YAHOO.widget.AutoComplete.prototype._initContainer = function() { + if(!this._oContainer._oContent) { + // The oContent div helps size the iframe and shadow properly + var oContent = document.createElement("div"); + oContent.className = "yui-ac-content"; + oContent.style.display = "none"; + this._oContainer._oContent = this._oContainer.appendChild(oContent); + + var oHeader = document.createElement("div"); + oHeader.className = "yui-ac-hd"; + oHeader.style.display = "none"; + this._oContainer._oContent._oHeader = this._oContainer._oContent.appendChild(oHeader); + + var oBody = document.createElement("div"); + oBody.className = "yui-ac-bd"; + this._oContainer._oContent._oBody = this._oContainer._oContent.appendChild(oBody); + + var oFooter = document.createElement("div"); + oFooter.className = "yui-ac-ft"; + oFooter.style.display = "none"; + this._oContainer._oContent._oFooter = this._oContainer._oContent.appendChild(oFooter); + } + else { + } +}; + +/** + * Clears out contents of container body and creates up to + * YAHOO.widget.AutoComplete#maxResultsDisplayed <li> elements in an + * <ul> element. + * + * @method _initList + * @private + */ +YAHOO.widget.AutoComplete.prototype._initList = function() { + this._aListItems = []; + while(this._oContainer._oContent._oBody.hasChildNodes()) { + var oldListItems = this.getListItems(); + if(oldListItems) { + for(var oldi = oldListItems.length-1; oldi >= 0; i--) { + oldListItems[oldi] = null; + } + } + this._oContainer._oContent._oBody.innerHTML = ""; + } + + var oList = document.createElement("ul"); + oList = this._oContainer._oContent._oBody.appendChild(oList); + for(var i=0; i= 18 && nKeyCode <= 20) || // alt,pause/break,caps lock + (nKeyCode == 27) || // esc + (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end + (nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up + (nKeyCode == 40) || // down + (nKeyCode >= 44 && nKeyCode <= 45)) { // print screen,insert + return true; + } + return false; +}; + +/** + * Makes query request to the DataSource. + * + * @method _sendQuery + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._sendQuery = function(sQuery) { + // Widget has been effectively turned off + if(this.minQueryLength == -1) { + this._toggleContainer(false); + return; + } + // Delimiter has been enabled + var aDelimChar = (this.delimChar) ? this.delimChar : null; + if(aDelimChar) { + // Loop through all possible delimiters and find the latest one + // A " " may be a false positive if they are defined as delimiters AND + // are used to separate delimited queries + var nDelimIndex = -1; + for(var i = aDelimChar.length-1; i >= 0; i--) { + var nNewIndex = sQuery.lastIndexOf(aDelimChar[i]); + if(nNewIndex > nDelimIndex) { + nDelimIndex = nNewIndex; + } + } + // If we think the last delimiter is a space (" "), make sure it is NOT + // a false positive by also checking the char directly before it + if(aDelimChar[i] == " ") { + for (var j = aDelimChar.length-1; j >= 0; j--) { + if(sQuery[nDelimIndex - 1] == aDelimChar[j]) { + nDelimIndex--; + break; + } + } + } + // A delimiter has been found so extract the latest query + if (nDelimIndex > -1) { + var nQueryStart = nDelimIndex + 1; + // Trim any white space from the beginning... + while(sQuery.charAt(nQueryStart) == " ") { + nQueryStart += 1; + } + // ...and save the rest of the string for later + this._sSavedQuery = sQuery.substring(0,nQueryStart); + // Here is the query itself + sQuery = sQuery.substr(nQueryStart); + } + else if(sQuery.indexOf(this._sSavedQuery) < 0){ + this._sSavedQuery = null; + } + } + + // Don't search queries that are too short + if (sQuery && (sQuery.length < this.minQueryLength) || (!sQuery && this.minQueryLength > 0)) { + if (this._nDelayID != -1) { + clearTimeout(this._nDelayID); + } + this._toggleContainer(false); + return; + } + + sQuery = encodeURIComponent(sQuery); + this._nDelayID = -1; // Reset timeout ID because request has been made + this.dataRequestEvent.fire(this, sQuery); + this.dataSource.getResults(this._populateList, sQuery, this); +}; + +/** + * Populates the array of <li> elements in the container with query + * results. This method is passed to YAHOO.widget.DataSource#getResults as a + * callback function so results from the DataSource instance are returned to the + * AutoComplete instance. + * + * @method _populateList + * @param sQuery {String} The query string. + * @param aResults {Array} An array of query result objects from the DataSource. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._populateList = function(sQuery, aResults, oSelf) { + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, sQuery); + } + if (!oSelf._bFocused || !aResults) { + return; + } + + var isOpera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + var contentStyle = oSelf._oContainer._oContent.style; + contentStyle.width = (!isOpera) ? null : ""; + contentStyle.height = (!isOpera) ? null : ""; + + var sCurQuery = decodeURIComponent(sQuery); + oSelf._sCurQuery = sCurQuery; + oSelf._bItemSelected = false; + + if(oSelf._maxResultsDisplayed != oSelf.maxResultsDisplayed) { + oSelf._initList(); + } + + var nItems = Math.min(aResults.length,oSelf.maxResultsDisplayed); + oSelf._nDisplayedItems = nItems; + if (nItems > 0) { + oSelf._initContainerHelpers(); + var aItems = oSelf._aListItems; + + // Fill items with data + for(var i = nItems-1; i >= 0; i--) { + var oItemi = aItems[i]; + var oResultItemi = aResults[i]; + oItemi.innerHTML = oSelf.formatResult(oResultItemi, sCurQuery); + oItemi.style.display = "list-item"; + oItemi._sResultKey = oResultItemi[0]; + oItemi._oResultData = oResultItemi; + + } + + // Empty out remaining items if any + for(var j = aItems.length-1; j >= nItems ; j--) { + var oItemj = aItems[j]; + oItemj.innerHTML = null; + oItemj.style.display = "none"; + oItemj._sResultKey = null; + oItemj._oResultData = null; + } + + if(oSelf.autoHighlight) { + // Go to the first item + var oFirstItem = aItems[0]; + oSelf._toggleHighlight(oFirstItem,"to"); + oSelf.itemArrowToEvent.fire(oSelf, oFirstItem); + oSelf._typeAhead(oFirstItem,sQuery); + } + else { + oSelf._oCurItem = null; + } + + // Expand the container + var ok = oSelf.doBeforeExpandContainer(oSelf._oTextbox, oSelf._oContainer, sQuery, aResults); + oSelf._toggleContainer(ok); + } + else { + oSelf._toggleContainer(false); + } + oSelf.dataReturnEvent.fire(oSelf, sQuery, aResults); +}; + +/** + * When forceSelection is true and the user attempts + * leave the text input box without selecting an item from the query results, + * the user selection is cleared. + * + * @method _clearSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._clearSelection = function() { + var sValue = this._oTextbox.value; + var sChar = (this.delimChar) ? this.delimChar[0] : null; + var nIndex = (sChar) ? sValue.lastIndexOf(sChar, sValue.length-2) : -1; + if(nIndex > -1) { + this._oTextbox.value = sValue.substring(0,nIndex); + } + else { + this._oTextbox.value = ""; + } + this._sSavedQuery = this._oTextbox.value; + + // Fire custom event + this.selectionEnforceEvent.fire(this); +}; + +/** + * Whether or not user-typed value in the text input box matches any of the + * query results. + * + * @method _textMatchesOption + * @return {Boolean} True if user-input text matches a result, false otherwise. + * @private + */ +YAHOO.widget.AutoComplete.prototype._textMatchesOption = function() { + var foundMatch = false; + + for(var i = this._nDisplayedItems-1; i >= 0 ; i--) { + var oItem = this._aListItems[i]; + var sMatch = oItem._sResultKey.toLowerCase(); + if (sMatch == this._sCurQuery.toLowerCase()) { + foundMatch = true; + break; + } + } + return(foundMatch); +}; + +/** + * Updates in the text input box with the first query result as the user types, + * selecting the substring that the user has not typed. + * + * @method _typeAhead + * @param oItem {HTMLElement} The <li> element item whose data populates the input field. + * @param sQuery {String} Query string. + * @private + */ +YAHOO.widget.AutoComplete.prototype._typeAhead = function(oItem, sQuery) { + // Don't update if turned off + if (!this.typeAhead) { + return; + } + + var oTextbox = this._oTextbox; + var sValue = this._oTextbox.value; // any saved queries plus what user has typed + + // Don't update with type-ahead if text selection is not supported + if(!oTextbox.setSelectionRange && !oTextbox.createTextRange) { + return; + } + + // Select the portion of text that the user has not typed + var nStart = sValue.length; + this._updateValue(oItem); + var nEnd = oTextbox.value.length; + this._selectText(oTextbox,nStart,nEnd); + var sPrefill = oTextbox.value.substr(nStart,nEnd); + this.typeAheadEvent.fire(this,sQuery,sPrefill); +}; + +/** + * Selects text in the input field. + * + * @method _selectText + * @param oTextbox {HTMLElement} Text input box element in which to select text. + * @param nStart {Number} Starting index of text string to select. + * @param nEnd {Number} Ending index of text selection. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectText = function(oTextbox, nStart, nEnd) { + if (oTextbox.setSelectionRange) { // For Mozilla + oTextbox.setSelectionRange(nStart,nEnd); + } + else if (oTextbox.createTextRange) { // For IE + var oTextRange = oTextbox.createTextRange(); + oTextRange.moveStart("character", nStart); + oTextRange.moveEnd("character", nEnd-oTextbox.value.length); + oTextRange.select(); + } + else { + oTextbox.select(); + } +}; + +/** + * Syncs results container with its helpers. + * + * @method _toggleContainerHelpers + * @param bShow {Boolean} True if container is expanded, false if collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainerHelpers = function(bShow) { + var bFireEvent = false; + var width = this._oContainer._oContent.offsetWidth + "px"; + var height = this._oContainer._oContent.offsetHeight + "px"; + + if(this.useIFrame && this._oContainer._oIFrame) { + bFireEvent = true; + if(bShow) { + this._oContainer._oIFrame.style.width = width; + this._oContainer._oIFrame.style.height = height; + } + else { + this._oContainer._oIFrame.style.width = 0; + this._oContainer._oIFrame.style.height = 0; + } + } + if(this.useShadow && this._oContainer._oShadow) { + bFireEvent = true; + if(bShow) { + this._oContainer._oShadow.style.width = width; + this._oContainer._oShadow.style.height = height; + } + else { + this._oContainer._oShadow.style.width = 0; + this._oContainer._oShadow.style.height = 0; + } + } +}; + +/** + * Animates expansion or collapse of the container. + * + * @method _toggleContainer + * @param bShow {Boolean} True if container should be expanded, false if container should be collapsed + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleContainer = function(bShow) { + var oContainer = this._oContainer; + + // Implementer has container always open so don't mess with it + if(this.alwaysShowContainer && this._bContainerOpen) { + return; + } + + // Clear contents of container + if(!bShow) { + this._oContainer._oContent.scrollTop = 0; + var aItems = this._aListItems; + + if(aItems && (aItems.length > 0)) { + for(var i = aItems.length-1; i >= 0 ; i--) { + aItems[i].style.display = "none"; + } + } + + if (this._oCurItem) { + this._toggleHighlight(this._oCurItem,"from"); + } + + this._oCurItem = null; + this._nDisplayedItems = 0; + this._sCurQuery = null; + } + + // Container is already closed + if (!bShow && !this._bContainerOpen) { + oContainer._oContent.style.display = "none"; + return; + } + + // If animation is enabled... + var oAnim = this._oAnim; + if (oAnim && oAnim.getEl() && (this.animHoriz || this.animVert)) { + // If helpers need to be collapsed, do it right away... + // but if helpers need to be expanded, wait until after the container expands + if(!bShow) { + this._toggleContainerHelpers(bShow); + } + + if(oAnim.isAnimated()) { + oAnim.stop(); + } + + // Clone container to grab current size offscreen + var oClone = oContainer._oContent.cloneNode(true); + oContainer.appendChild(oClone); + oClone.style.top = "-9000px"; + oClone.style.display = "block"; + + // Current size of the container is the EXPANDED size + var wExp = oClone.offsetWidth; + var hExp = oClone.offsetHeight; + + // Calculate COLLAPSED sizes based on horiz and vert anim + var wColl = (this.animHoriz) ? 0 : wExp; + var hColl = (this.animVert) ? 0 : hExp; + + // Set animation sizes + oAnim.attributes = (bShow) ? + {width: { to: wExp }, height: { to: hExp }} : + {width: { to: wColl}, height: { to: hColl }}; + + // If opening anew, set to a collapsed size... + if(bShow && !this._bContainerOpen) { + oContainer._oContent.style.width = wColl+"px"; + oContainer._oContent.style.height = hColl+"px"; + } + // Else, set it to its last known size. + else { + oContainer._oContent.style.width = wExp+"px"; + oContainer._oContent.style.height = hExp+"px"; + } + + oContainer.removeChild(oClone); + oClone = null; + + var oSelf = this; + var onAnimComplete = function() { + // Finish the collapse + oAnim.onComplete.unsubscribeAll(); + + if(bShow) { + oSelf.containerExpandEvent.fire(oSelf); + } + else { + oContainer._oContent.style.display = "none"; + oSelf.containerCollapseEvent.fire(oSelf); + } + oSelf._toggleContainerHelpers(bShow); + }; + + // Display container and animate it + oContainer._oContent.style.display = "block"; + oAnim.onComplete.subscribe(onAnimComplete); + oAnim.animate(); + this._bContainerOpen = bShow; + } + // Else don't animate, just show or hide + else { + if(bShow) { + oContainer._oContent.style.display = "block"; + this.containerExpandEvent.fire(this); + } + else { + oContainer._oContent.style.display = "none"; + this.containerCollapseEvent.fire(this); + } + this._toggleContainerHelpers(bShow); + this._bContainerOpen = bShow; + } + +}; + +/** + * Toggles the highlight on or off for an item in the container, and also cleans + * up highlighting of any previous item. + * + * @method _toggleHighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) { + var sHighlight = this.highlightClassName; + if(this._oCurItem) { + // Remove highlight from old item + YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight); + } + + if((sType == "to") && sHighlight) { + // Apply highlight to new item + YAHOO.util.Dom.addClass(oNewItem, sHighlight); + this._oCurItem = oNewItem; + } +}; + +/** + * Toggles the pre-highlight on or off for an item in the container. + * + * @method _togglePrehighlight + * @param oNewItem {HTMLElement} The <li> element item to receive highlight behavior. + * @param sType {String} Type "mouseover" will toggle highlight on, and "mouseout" will toggle highlight off. + * @private + */ +YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) { + if(oNewItem == this._oCurItem) { + return; + } + + var sPrehighlight = this.prehighlightClassName; + if((sType == "mouseover") && sPrehighlight) { + // Apply prehighlight to new item + YAHOO.util.Dom.addClass(oNewItem, sPrehighlight); + } + else { + // Remove prehighlight from old item + YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight); + } +}; + +/** + * Updates the text input box value with selected query result. If a delimiter + * has been defined, then the value gets appended with the delimiter. + * + * @method _updateValue + * @param oItem {HTMLElement} The <li> element item with which to update the value. + * @private + */ +YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) { + var oTextbox = this._oTextbox; + var sDelimChar = (this.delimChar) ? (this.delimChar[0] || this.delimChar) : null; + var sSavedQuery = this._sSavedQuery; + var sResultKey = oItem._sResultKey; + oTextbox.focus(); + + // First clear text field + oTextbox.value = ""; + // Grab data to put into text field + if(sDelimChar) { + if(sSavedQuery) { + oTextbox.value = sSavedQuery; + } + oTextbox.value += sResultKey + sDelimChar; + if(sDelimChar != " ") { + oTextbox.value += " "; + } + } + else { oTextbox.value = sResultKey; } + + // scroll to bottom of textarea if necessary + if(oTextbox.type == "textarea") { + oTextbox.scrollTop = oTextbox.scrollHeight; + } + + // move cursor to end + var end = oTextbox.value.length; + this._selectText(oTextbox,end,end); + + this._oCurItem = oItem; +}; + +/** + * Selects a result item from the container + * + * @method _selectItem + * @param oItem {HTMLElement} The selected <li> element item. + * @private + */ +YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) { + this._bItemSelected = true; + this._updateValue(oItem); + this._cancelIntervalDetection(this); + this.itemSelectEvent.fire(this, oItem, oItem._oResultData); + this._toggleContainer(false); +}; + +/** + * For values updated by type-ahead, the right arrow key jumps to the end + * of the textbox, otherwise the container is closed. + * + * @method _jumpSelection + * @private + */ +YAHOO.widget.AutoComplete.prototype._jumpSelection = function() { + if(!this.typeAhead) { + return; + } + else { + this._toggleContainer(false); + } +}; + +/** + * Triggered by up and down arrow keys, changes the current highlighted + * <li> element item. Scrolls container if necessary. + * + * @method _moveSelection + * @param nKeyCode {Number} Code of key pressed. + * @private + */ +YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) { + if(this._bContainerOpen) { + // Determine current item's id number + var oCurItem = this._oCurItem; + var nCurItemIndex = -1; + + if (oCurItem) { + nCurItemIndex = oCurItem._nItemIndex; + } + + var nNewItemIndex = (nKeyCode == 40) ? + (nCurItemIndex + 1) : (nCurItemIndex - 1); + + // Out of bounds + if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) { + return; + } + + if (oCurItem) { + // Unhighlight current item + this._toggleHighlight(oCurItem, "from"); + this.itemArrowFromEvent.fire(this, oCurItem); + } + if (nNewItemIndex == -1) { + // Go back to query (remove type-ahead string) + if(this.delimChar && this._sSavedQuery) { + if (!this._textMatchesOption()) { + this._oTextbox.value = this._sSavedQuery; + } + else { + this._oTextbox.value = this._sSavedQuery + this._sCurQuery; + } + } + else { + this._oTextbox.value = this._sCurQuery; + } + this._oCurItem = null; + return; + } + if (nNewItemIndex == -2) { + // Close container + this._toggleContainer(false); + return; + } + + var oNewItem = this._aListItems[nNewItemIndex]; + + // Scroll the container if necessary + var oContent = this._oContainer._oContent; + var scrollOn = ((YAHOO.util.Dom.getStyle(oContent,"overflow") == "auto") || + (YAHOO.util.Dom.getStyle(oContent,"overflowY") == "auto")); + if(scrollOn && (nNewItemIndex > -1) && + (nNewItemIndex < this._nDisplayedItems)) { + // User is keying down + if(nKeyCode == 40) { + // Bottom of selected item is below scroll area... + if((oNewItem.offsetTop+oNewItem.offsetHeight) > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of scroll area to bottom of selected item + oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + // Bottom of selected item is above scroll area... + else if((oNewItem.offsetTop+oNewItem.offsetHeight) < oContent.scrollTop) { + // Set top of selected item to top of scroll area + oContent.scrollTop = oNewItem.offsetTop; + + } + } + // User is keying up + else { + // Top of selected item is above scroll area + if(oNewItem.offsetTop < oContent.scrollTop) { + // Set top of scroll area to top of selected item + this._oContainer._oContent.scrollTop = oNewItem.offsetTop; + } + // Top of selected item is below scroll area + else if(oNewItem.offsetTop > (oContent.scrollTop + oContent.offsetHeight)) { + // Set bottom of selected item to bottom of scroll area + this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - oContent.offsetHeight; + } + } + } + + this._toggleHighlight(oNewItem, "to"); + this.itemArrowToEvent.fire(this, oNewItem); + if(this.typeAhead) { + this._updateValue(oNewItem); + } + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private event handlers +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Handles <li> element mouseover events in the container. + * + * @method _onItemMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseover = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseover"); + } + else { + oSelf._toggleHighlight(this,"to"); + } + + oSelf.itemMouseOverEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element mouseout events in the container. + * + * @method _onItemMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseout = function(v,oSelf) { + if(oSelf.prehighlightClassName) { + oSelf._togglePrehighlight(this,"mouseout"); + } + else { + oSelf._toggleHighlight(this,"from"); + } + + oSelf.itemMouseOutEvent.fire(oSelf, this); +}; + +/** + * Handles <li> element click events in the container. + * + * @method _onItemMouseclick + * @param v {HTMLEvent} The click event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onItemMouseclick = function(v,oSelf) { + // In case item has not been moused over + oSelf._toggleHighlight(this,"to"); + oSelf._selectItem(this); +}; + +/** + * Handles container mouseover events. + * + * @method _onContainerMouseover + * @param v {HTMLEvent} The mouseover event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseover = function(v,oSelf) { + oSelf._bOverContainer = true; +}; + +/** + * Handles container mouseout events. + * + * @method _onContainerMouseout + * @param v {HTMLEvent} The mouseout event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerMouseout = function(v,oSelf) { + oSelf._bOverContainer = false; + // If container is still active + if(oSelf._oCurItem) { + oSelf._toggleHighlight(oSelf._oCurItem,"to"); + } +}; + +/** + * Handles container scroll events. + * + * @method _onContainerScroll + * @param v {HTMLEvent} The scroll event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerScroll = function(v,oSelf) { + oSelf._oTextbox.focus(); +}; + +/** + * Handles container resize events. + * + * @method _onContainerResize + * @param v {HTMLEvent} The resize event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onContainerResize = function(v,oSelf) { + oSelf._toggleContainerHelpers(oSelf._bContainerOpen); +}; + +/** + * Handles textbox keydown events of functional keys, mainly for UI behavior. + * + * @method _onTextboxKeyDown + * @param v {HTMLEvent} The keydown event. + * @param oSelf {object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyDown = function(v,oSelf) { + var nKeyCode = v.keyCode; + + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + // select an item or clear out + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + if(oSelf._oCurItem) { + oSelf._selectItem(oSelf._oCurItem); + } + else { + oSelf._toggleContainer(false); + } + break; + case 27: // esc + oSelf._toggleContainer(false); + return; + case 39: // right + oSelf._jumpSelection(); + break; + case 38: // up + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + case 40: // down + YAHOO.util.Event.stopEvent(v); + oSelf._moveSelection(nKeyCode); + break; + default: + break; + } +}; + +/** + * Handles textbox keypress events. + * @method _onTextboxKeyPress + * @param v {HTMLEvent} The keypress event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyPress = function(v,oSelf) { + var nKeyCode = v.keyCode; + + //Expose only to Mac browsers, where stopEvent is ineffective on keydown events (bug 790337) + var isMac = (navigator.userAgent.toLowerCase().indexOf("mac") != -1); + if(isMac) { + switch (nKeyCode) { + case 9: // tab + if(oSelf.delimChar && (oSelf._nKeyCode != nKeyCode)) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 13: // enter + if(oSelf._nKeyCode != nKeyCode) { + if(oSelf._bContainerOpen) { + YAHOO.util.Event.stopEvent(v); + } + } + break; + case 38: // up + case 40: // down + YAHOO.util.Event.stopEvent(v); + break; + default: + break; + } + } + + //TODO: (?) limit only to non-IE, non-Mac-FF for Korean IME support (bug 811948) + // Korean IME detected + else if(nKeyCode == 229) { + oSelf._queryInterval = setInterval(function() { oSelf._onIMEDetected(oSelf); },500); + } +}; + +/** + * Handles textbox keyup events that trigger queries. + * + * @method _onTextboxKeyUp + * @param v {HTMLEvent} The keyup event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxKeyUp = function(v,oSelf) { + // Check to see if any of the public properties have been updated + oSelf._initProps(); + + var nKeyCode = v.keyCode; + oSelf._nKeyCode = nKeyCode; + var sText = this.value; //string in textbox + + // Filter out chars that don't trigger queries + if (oSelf._isIgnoreKey(nKeyCode) || (sText.toLowerCase() == oSelf._sCurQuery)) { + return; + } + else { + oSelf.textboxKeyEvent.fire(oSelf, nKeyCode); + } + + // Set timeout on the request + if (oSelf.queryDelay > 0) { + var nDelayID = + setTimeout(function(){oSelf._sendQuery(sText);},(oSelf.queryDelay * 1000)); + + if (oSelf._nDelayID != -1) { + clearTimeout(oSelf._nDelayID); + } + + oSelf._nDelayID = nDelayID; + } + else { + // No delay so send request immediately + oSelf._sendQuery(sText); + } +}; + +/** + * Handles text input box receiving focus. + * + * @method _onTextboxFocus + * @param v {HTMLEvent} The focus event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxFocus = function (v,oSelf) { + oSelf._oTextbox.setAttribute("autocomplete","off"); + oSelf._bFocused = true; + oSelf.textboxFocusEvent.fire(oSelf); +}; + +/** + * Handles text input box losing focus. + * + * @method _onTextboxBlur + * @param v {HTMLEvent} The focus event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onTextboxBlur = function (v,oSelf) { + // Don't treat as a blur if it was a selection via mouse click + if(!oSelf._bOverContainer || (oSelf._nKeyCode == 9)) { + // Current query needs to be validated + if(!oSelf._bItemSelected) { + if(!oSelf._bContainerOpen || (oSelf._bContainerOpen && !oSelf._textMatchesOption())) { + if(oSelf.forceSelection) { + oSelf._clearSelection(); + } + else { + oSelf.unmatchedItemSelectEvent.fire(oSelf, oSelf._sCurQuery); + } + } + } + + if(oSelf._bContainerOpen) { + oSelf._toggleContainer(false); + } + oSelf._cancelIntervalDetection(oSelf); + oSelf._bFocused = false; + oSelf.textboxBlurEvent.fire(oSelf); + } +}; + +/** + * Handles form submission event. + * + * @method _onFormSubmit + * @param v {HTMLEvent} The submit event. + * @param oSelf {Object} The AutoComplete instance. + * @private + */ +YAHOO.widget.AutoComplete.prototype._onFormSubmit = function(v,oSelf) { + if(oSelf.allowBrowserAutocomplete) { + oSelf._oTextbox.setAttribute("autocomplete","on"); + } + else { + oSelf._oTextbox.setAttribute("autocomplete","off"); + } +}; +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * The DataSource classes manages sending a request and returning response from a live + * database. Supported data include local JavaScript arrays and objects and databases + * accessible via XHR connections. Supported response formats include JavaScript arrays, + * JSON, XML, and flat-file textual data. + * + * @class DataSource + * @constructor + */ +YAHOO.widget.DataSource = function() { + /* abstract class */ +}; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Error message for null data responses. + * + * @property ERROR_DATANULL + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATANULL = "Response data was null"; + +/** + * Error message for data responses with parsing errors. + * + * @property ERROR_DATAPARSE + * @type String + * @static + * @final + */ +YAHOO.widget.DataSource.ERROR_DATAPARSE = "Response data could not be parsed"; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Max size of the local cache. Set to 0 to turn off caching. Caching is + * useful to reduce the number of server connections. Recommended only for data + * sources that return comprehensive results for queries or when stale data is + * not an issue. + * + * @property maxCacheEntries + * @type Number + * @default 15 + */ +YAHOO.widget.DataSource.prototype.maxCacheEntries = 15; + +/** + * Use this to equate cache matching with the type of matching done by your live + * data source. If caching is on and queryMatchContains is true, the cache + * returns results that "contain" the query string. By default, + * queryMatchContains is set to false, meaning the cache only returns results + * that "start with" the query string. + * + * @property queryMatchContains + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchContains = false; + +/** + * Enables query subset matching. If caching is on and queryMatchSubset is + * true, substrings of queries will return matching cached results. For + * instance, if the first query is for "abc" susequent queries that start with + * "abc", like "abcd", will be queried against the cache, and not the live data + * source. Recommended only for DataSources that return comprehensive results + * for queries with very few characters. + * + * @property queryMatchSubset + * @type Boolean + * @default false + * + */ +YAHOO.widget.DataSource.prototype.queryMatchSubset = false; + +/** + * Enables query case-sensitivity matching. If caching is on and + * queryMatchCase is true, queries will only return results for case-sensitive + * matches. + * + * @property queryMatchCase + * @type Boolean + * @default false + */ +YAHOO.widget.DataSource.prototype.queryMatchCase = false; + + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + + /** + * Public accessor to the unique name of the DataSource instance. + * + * @method toString + * @return {String} Unique name of the DataSource instance + */ +YAHOO.widget.DataSource.prototype.toString = function() { + return "DataSource " + this._sName; +}; + +/** + * Retrieves query results, first checking the local cache, then making the + * query request to the live data source as defined by the function doQuery. + * + * @method getResults + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) { + + // First look in cache + var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent); + + // Not in cache, so get results from server + if(aResults.length === 0) { + this.queryEvent.fire(this, oParent, sQuery); + this.doQuery(oCallbackFn, sQuery, oParent); + } +}; + +/** + * Abstract method implemented by subclasses to make a query to the live data + * source. Must call the callback function with the response returned from the + * query. Populates cache (if enabled). + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function implemented by oParent to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + /* override this */ +}; + +/** + * Flushes cache. + * + * @method flushCache + */ +YAHOO.widget.DataSource.prototype.flushCache = function() { + if(this._aCache) { + this._aCache = []; + } + if(this._aCacheHelper) { + this._aCacheHelper = []; + } + this.cacheFlushEvent.fire(this); +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Public events +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Fired when a query is made to the live data source. + * + * @event queryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.queryEvent = null; + +/** + * Fired when a query is made to the local cache. + * + * @event cacheQueryEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + */ +YAHOO.widget.DataSource.prototype.cacheQueryEvent = null; + +/** + * Fired when data is retrieved from the live data source. + * + * @event getResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getResultsEvent = null; + +/** + * Fired when data is retrieved from the local cache. + * + * @event getCachedResultsEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param aResults {Object[]} Array of result objects. + */ +YAHOO.widget.DataSource.prototype.getCachedResultsEvent = null; + +/** + * Fired when an error is encountered with the live data source. + * + * @event dataErrorEvent + * @param oSelf {Object} The DataSource instance. + * @param oParent {Object} The requesting object. + * @param sQuery {String} The query string. + * @param sMsg {String} Error message string + */ +YAHOO.widget.DataSource.prototype.dataErrorEvent = null; + +/** + * Fired when the local cache is flushed. + * + * @event cacheFlushEvent + * @param oSelf {Object} The DataSource instance + */ +YAHOO.widget.DataSource.prototype.cacheFlushEvent = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Internal class variable to index multiple DataSource instances. + * + * @property _nIndex + * @type Number + * @private + * @static + */ +YAHOO.widget.DataSource._nIndex = 0; + +/** + * Name of DataSource instance. + * + * @property _sName + * @type String + * @private + */ +YAHOO.widget.DataSource.prototype._sName = null; + +/** + * Local cache of data result objects indexed chronologically. + * + * @property _aCache + * @type Object[] + * @private + */ +YAHOO.widget.DataSource.prototype._aCache = null; + + +///////////////////////////////////////////////////////////////////////////// +// +// Private methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Initializes DataSource instance. + * + * @method _init + * @private + */ +YAHOO.widget.DataSource.prototype._init = function() { + // Validate and initialize public configs + var maxCacheEntries = this.maxCacheEntries; + if(isNaN(maxCacheEntries) || (maxCacheEntries < 0)) { + maxCacheEntries = 0; + } + // Initialize local cache + if(maxCacheEntries > 0 && !this._aCache) { + this._aCache = []; + } + + this._sName = "instance" + YAHOO.widget.DataSource._nIndex; + YAHOO.widget.DataSource._nIndex++; + + this.queryEvent = new YAHOO.util.CustomEvent("query", this); + this.cacheQueryEvent = new YAHOO.util.CustomEvent("cacheQuery", this); + this.getResultsEvent = new YAHOO.util.CustomEvent("getResults", this); + this.getCachedResultsEvent = new YAHOO.util.CustomEvent("getCachedResults", this); + this.dataErrorEvent = new YAHOO.util.CustomEvent("dataError", this); + this.cacheFlushEvent = new YAHOO.util.CustomEvent("cacheFlush", this); +}; + +/** + * Adds a result object to the local cache, evicting the oldest element if the + * cache is full. Newer items will have higher indexes, the oldest item will have + * index of 0. + * + * @method _addCacheElem + * @param oResult {Object} Data result object, including array of results. + * @private + */ +YAHOO.widget.DataSource.prototype._addCacheElem = function(oResult) { + var aCache = this._aCache; + // Don't add if anything important is missing. + if(!aCache || !oResult || !oResult.query || !oResult.results) { + return; + } + + // If the cache is full, make room by removing from index=0 + if(aCache.length >= this.maxCacheEntries) { + aCache.shift(); + } + + // Add to cache, at the end of the array + aCache.push(oResult); +}; + +/** + * Queries the local cache for results. If query has been cached, the callback + * function is called with the results, and the cached is refreshed so that it + * is now the newest element. + * + * @method _doQueryCache + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + * @return aResults {Object[]} Array of results from local cache if found, otherwise null. + * @private + */ +YAHOO.widget.DataSource.prototype._doQueryCache = function(oCallbackFn, sQuery, oParent) { + var aResults = []; + var bMatchFound = false; + var aCache = this._aCache; + var nCacheLength = (aCache) ? aCache.length : 0; + var bMatchContains = this.queryMatchContains; + + // If cache is enabled... + if((this.maxCacheEntries > 0) && aCache && (nCacheLength > 0)) { + this.cacheQueryEvent.fire(this, oParent, sQuery); + // If case is unimportant, normalize query now instead of in loops + if(!this.queryMatchCase) { + var sOrigQuery = sQuery; + sQuery = sQuery.toLowerCase(); + } + + // Loop through each cached element's query property... + for(var i = nCacheLength-1; i >= 0; i--) { + var resultObj = aCache[i]; + var aAllResultItems = resultObj.results; + // If case is unimportant, normalize match key for comparison + var matchKey = (!this.queryMatchCase) ? + encodeURIComponent(resultObj.query).toLowerCase(): + encodeURIComponent(resultObj.query); + + // If a cached match key exactly matches the query... + if(matchKey == sQuery) { + // Stash all result objects into aResult[] and stop looping through the cache. + bMatchFound = true; + aResults = aAllResultItems; + + // The matching cache element was not the most recent, + // so now we need to refresh the cache. + if(i != nCacheLength-1) { + // Remove element from its original location + aCache.splice(i,1); + // Add element as newest + this._addCacheElem(resultObj); + } + break; + } + // Else if this query is not an exact match and subset matching is enabled... + else if(this.queryMatchSubset) { + // Loop through substrings of each cached element's query property... + for(var j = sQuery.length-1; j >= 0 ; j--) { + var subQuery = sQuery.substr(0,j); + + // If a substring of a cached sQuery exactly matches the query... + if(matchKey == subQuery) { + bMatchFound = true; + + // Go through each cached result object to match against the query... + for(var k = aAllResultItems.length-1; k >= 0; k--) { + var aRecord = aAllResultItems[k]; + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aRecord[0]).indexOf(sQuery): + encodeURIComponent(aRecord[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aRecord); + } + } + + // Add the subset match result set object as the newest element to cache, + // and stop looping through the cache. + resultObj = {}; + resultObj.query = sQuery; + resultObj.results = aResults; + this._addCacheElem(resultObj); + break; + } + } + if(bMatchFound) { + break; + } + } + } + + // If there was a match, send along the results. + if(bMatchFound) { + this.getCachedResultsEvent.fire(this, oParent, sOrigQuery, aResults); + oCallbackFn(sOrigQuery, aResults, oParent); + } + } + return aResults; +}; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using XML HTTP requests that return + * query results. + * + * @class DS_XHR + * @extends YAHOO.widget.DataSource + * @requires connection + * @constructor + * @param sScriptURI {String} Absolute or relative URI to script that returns query + * results as JSON, XML, or delimited flat-file data. + * @param aSchema {String[]} Data schema definition of results. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_XHR = function(sScriptURI, aSchema, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aSchema || (aSchema.constructor != Array)) { + return; + } + else { + this.schema = aSchema; + } + this.scriptURI = sScriptURI; + this._init(); +}; + +YAHOO.widget.DS_XHR.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public constants +// +///////////////////////////////////////////////////////////////////////////// + +/** + * JSON data type. + * + * @property TYPE_JSON + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_JSON = 0; + +/** + * XML data type. + * + * @property TYPE_XML + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_XML = 1; + +/** + * Flat-file data type. + * + * @property TYPE_FLAT + * @type Number + * @static + * @final + */ +YAHOO.widget.DS_XHR.TYPE_FLAT = 2; + +/** + * Error message for XHR failure. + * + * @property ERROR_DATAXHR + * @type String + * @static + * @final + */ +YAHOO.widget.DS_XHR.ERROR_DATAXHR = "XHR response failed"; + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Alias to YUI Connection Manager. Allows implementers to specify their own + * subclasses of the YUI Connection Manager utility. + * + * @property connMgr + * @type Object + * @default YAHOO.util.Connect + */ +YAHOO.widget.DS_XHR.prototype.connMgr = YAHOO.util.Connect; + +/** + * Number of milliseconds the XHR connection will wait for a server response. A + * a value of zero indicates the XHR connection will wait forever. Any value + * greater than zero will use the Connection utility's Auto-Abort feature. + * + * @property connTimeout + * @type Number + * @default 0 + */ +YAHOO.widget.DS_XHR.prototype.connTimeout = 0; + +/** + * Absolute or relative URI to script that returns query results. For instance, + * queries will be sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptURI + * @type String + */ +YAHOO.widget.DS_XHR.prototype.scriptURI = null; + +/** + * Query string parameter name sent to scriptURI. For instance, queries will be + * sent to <scriptURI>?<scriptQueryParam>=userinput + * + * @property scriptQueryParam + * @type String + * @default "query" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryParam = "query"; + +/** + * String of key/value pairs to append to requests made to scriptURI. Define + * this string when you want to send additional query parameters to your script. + * When defined, queries will be sent to + * <scriptURI>?<scriptQueryParam>=userinput&<scriptQueryAppend> + * + * @property scriptQueryAppend + * @type String + * @default "" + */ +YAHOO.widget.DS_XHR.prototype.scriptQueryAppend = ""; + +/** + * XHR response data type. Other types that may be defined are YAHOO.widget.DS_XHR.TYPE_XML + * and YAHOO.widget.DS_XHR.TYPE_FLAT. + * + * @property responseType + * @type String + * @default YAHOO.widget.DS_XHR.TYPE_JSON + */ +YAHOO.widget.DS_XHR.prototype.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; + +/** + * String after which to strip results. If the results from the XHR are sent + * back as HTML, the gzip HTML comment appears at the end of the data and should + * be ignored. + * + * @property responseStripAfter + * @type String + * @default "\n<!-" + */ +YAHOO.widget.DS_XHR.prototype.responseStripAfter = "\n 0) { + sUri += "&" + this.scriptQueryAppend; + } + var oResponse = null; + + var oSelf = this; + /* + * Sets up ajax request callback + * + * @param {object} oReq HTTPXMLRequest object + * @private + */ + var responseSuccess = function(oResp) { + // Response ID does not match last made request ID. + if(!oSelf._oConn || (oResp.tId != oSelf._oConn.tId)) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } +//DEBUG +for(var foo in oResp) { +} + if(!isXML) { + oResp = oResp.responseText; + } + else { + oResp = oResp.responseXML; + } + if(oResp === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var aResults = oSelf.parseResponse(sQuery, oResp, oParent); + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + if(aResults === null) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATAPARSE); + aResults = []; + } + else { + oSelf.getResultsEvent.fire(oSelf, oParent, sQuery, aResults); + oSelf._addCacheElem(resultObj); + } + oCallbackFn(sQuery, aResults, oParent); + }; + + var responseFailure = function(oResp) { + oSelf.dataErrorEvent.fire(oSelf, oParent, sQuery, YAHOO.widget.DS_XHR.ERROR_DATAXHR); + return; + }; + + var oCallback = { + success:responseSuccess, + failure:responseFailure + }; + + if(!isNaN(this.connTimeout) && this.connTimeout > 0) { + oCallback.timeout = this.connTimeout; + } + + if(this._oConn) { + this.connMgr.abort(this._oConn); + } + + oSelf._oConn = this.connMgr.asyncRequest("GET", sUri, oCallback, null); +}; + +/** + * Parses raw response data into an array of result objects. The result data key + * is always stashed in the [0] element of each result object. + * + * @method parseResponse + * @param sQuery {String} Query string. + * @param oResponse {Object} The raw response data to parse. + * @param oParent {Object} The object instance that has requested data. + * @returns {Object[]} Array of result objects. + */ +YAHOO.widget.DS_XHR.prototype.parseResponse = function(sQuery, oResponse, oParent) { + var aSchema = this.schema; + var aResults = []; + var bError = false; + + // Strip out comment at the end of results + var nEnd = ((this.responseStripAfter !== "") && (oResponse.indexOf)) ? + oResponse.indexOf(this.responseStripAfter) : -1; + if(nEnd != -1) { + oResponse = oResponse.substring(0,nEnd); + } + + switch (this.responseType) { + case YAHOO.widget.DS_XHR.TYPE_JSON: + var jsonList; + // Divert KHTML clients from JSON lib + if(window.JSON && (navigator.userAgent.toLowerCase().indexOf('khtml')== -1)) { + // Use the JSON utility if available + var jsonObjParsed = JSON.parse(oResponse); + if(!jsonObjParsed) { + bError = true; + break; + } + else { + try { + // eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("jsonObjParsed." + aSchema[0]); + } + catch(e) { + bError = true; + break; + } + } + } + else { + // Parse the JSON response as a string + try { + // Trim leading spaces + while (oResponse.substring(0,1) == " ") { + oResponse = oResponse.substring(1, oResponse.length); + } + + // Invalid JSON response + if(oResponse.indexOf("{") < 0) { + bError = true; + break; + } + + // Empty (but not invalid) JSON response + if(oResponse.indexOf("{}") === 0) { + break; + } + + // Turn the string into an object literal... + // ...eval is necessary here + var jsonObjRaw = eval("(" + oResponse + ")"); + if(!jsonObjRaw) { + bError = true; + break; + } + + // Grab the object member that contains an array of all reponses... + // ...eval is necessary here since aSchema[0] is of unknown depth + jsonList = eval("(jsonObjRaw." + aSchema[0]+")"); + } + catch(e) { + bError = true; + break; + } + } + + if(!jsonList) { + bError = true; + break; + } + + if(jsonList.constructor != Array) { + jsonList = [jsonList]; + } + + // Loop through the array of all responses... + for(var i = jsonList.length-1; i >= 0 ; i--) { + var aResultItem = []; + var jsonResult = jsonList[i]; + // ...and loop through each data field value of each response + for(var j = aSchema.length-1; j >= 1 ; j--) { + // ...and capture data into an array mapped according to the schema... + var dataFieldValue = jsonResult[aSchema[j]]; + if(!dataFieldValue) { + dataFieldValue = ""; + } + aResultItem.unshift(dataFieldValue); + } + // If schema isn't well defined, pass along the entire result object + if(aResultItem.length == 1) { + aResultItem.push(jsonResult); + } + // Capture the array of data field values in an array of results + aResults.unshift(aResultItem); + } + break; + case YAHOO.widget.DS_XHR.TYPE_XML: + // Get the collection of results + var xmlList = oResponse.getElementsByTagName(aSchema[0]); + if(!xmlList) { + bError = true; + break; + } + // Loop through each result + for(var k = xmlList.length-1; k >= 0 ; k--) { + var result = xmlList.item(k); + var aFieldSet = []; + // Loop through each data field in each result using the schema + for(var m = aSchema.length-1; m >= 1 ; m--) { + var sValue = null; + // Values may be held in an attribute... + var xmlAttr = result.attributes.getNamedItem(aSchema[m]); + if(xmlAttr) { + sValue = xmlAttr.value; + } + // ...or in a node + else{ + var xmlNode = result.getElementsByTagName(aSchema[m]); + if(xmlNode && xmlNode.item(0) && xmlNode.item(0).firstChild) { + sValue = xmlNode.item(0).firstChild.nodeValue; + } + else { + sValue = ""; + } + } + // Capture the schema-mapped data field values into an array + aFieldSet.unshift(sValue); + } + // Capture each array of values into an array of results + aResults.unshift(aFieldSet); + } + break; + case YAHOO.widget.DS_XHR.TYPE_FLAT: + if(oResponse.length > 0) { + // Delete the last line delimiter at the end of the data if it exists + var newLength = oResponse.length-aSchema[0].length; + if(oResponse.substr(newLength) == aSchema[0]) { + oResponse = oResponse.substr(0, newLength); + } + var aRecords = oResponse.split(aSchema[0]); + for(var n = aRecords.length-1; n >= 0; n--) { + aResults[n] = aRecords[n].split(aSchema[1]); + } + } + break; + default: + break; + } + sQuery = null; + oResponse = null; + oParent = null; + if(bError) { + return null; + } + else { + return aResults; + } +}; + +///////////////////////////////////////////////////////////////////////////// +// +// Private member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * XHR connection object. + * + * @property _oConn + * @type Object + * @private + */ +YAHOO.widget.DS_XHR.prototype._oConn = null; + + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript function as + * its live data source. + * + * @class DS_JSFunction + * @constructor + * @extends YAHOO.widget.DataSource + * @param oFunction {String} In-memory Javascript function that returns query results as an array of objects. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSFunction = function(oFunction, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!oFunction || (oFunction.constructor != Function)) { + return; + } + else { + this.dataFunction = oFunction; + this._init(); + } +}; + +YAHOO.widget.DS_JSFunction.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript function that returns query results. + * + * @property dataFunction + * @type HTMLFunction + */ +YAHOO.widget.DS_JSFunction.prototype.dataFunction = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by function for results. Results are + * passed back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSFunction.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var oFunction = this.dataFunction; + var aResults = []; + + aResults = oFunction(sQuery); + if(aResults === null) { + this.dataErrorEvent.fire(this, oParent, sQuery, YAHOO.widget.DataSource.ERROR_DATANULL); + return; + } + + var resultObj = {}; + resultObj.query = decodeURIComponent(sQuery); + resultObj.results = aResults; + this._addCacheElem(resultObj); + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); + return; +}; + +/****************************************************************************/ +/****************************************************************************/ +/****************************************************************************/ + +/** + * Implementation of YAHOO.widget.DataSource using a native Javascript array as + * its live data source. + * + * @class DS_JSArray + * @constructor + * @extends YAHOO.widget.DataSource + * @param aData {String[]} In-memory Javascript array of simple string data. + * @param oConfigs {Object} (optional) Object literal of config params. + */ +YAHOO.widget.DS_JSArray = function(aData, oConfigs) { + // Set any config params passed in to override defaults + if(typeof oConfigs == "object") { + for(var sConfig in oConfigs) { + this[sConfig] = oConfigs[sConfig]; + } + } + + // Initialization sequence + if(!aData || (aData.constructor != Array)) { + return; + } + else { + this.data = aData; + this._init(); + } +}; + +YAHOO.widget.DS_JSArray.prototype = new YAHOO.widget.DataSource(); + +///////////////////////////////////////////////////////////////////////////// +// +// Public member variables +// +///////////////////////////////////////////////////////////////////////////// + +/** + * In-memory Javascript array of strings. + * + * @property data + * @type Array + */ +YAHOO.widget.DS_JSArray.prototype.data = null; + +///////////////////////////////////////////////////////////////////////////// +// +// Public methods +// +///////////////////////////////////////////////////////////////////////////// + +/** + * Queries the live data source defined by data for results. Results are passed + * back to a callback function. + * + * @method doQuery + * @param oCallbackFn {HTMLFunction} Callback function defined by oParent object to which to return results. + * @param sQuery {String} Query string. + * @param oParent {Object} The object instance that has requested data. + */ +YAHOO.widget.DS_JSArray.prototype.doQuery = function(oCallbackFn, sQuery, oParent) { + var aData = this.data; // the array + var aResults = []; // container for results + var bMatchFound = false; + var bMatchContains = this.queryMatchContains; + if(sQuery) { + if(!this.queryMatchCase) { + sQuery = sQuery.toLowerCase(); + } + + // Loop through each element of the array... + // which can be a string or an array of strings + for(var i = aData.length-1; i >= 0; i--) { + var aDataset = []; + + if(aData[i]) { + if(aData[i].constructor == String) { + aDataset[0] = aData[i]; + } + else if(aData[i].constructor == Array) { + aDataset = aData[i]; + } + } + + if(aDataset[0] && (aDataset[0].constructor == String)) { + var sKeyIndex = (this.queryMatchCase) ? + encodeURIComponent(aDataset[0]).indexOf(sQuery): + encodeURIComponent(aDataset[0]).toLowerCase().indexOf(sQuery); + + // A STARTSWITH match is when the query is found at the beginning of the key string... + if((!bMatchContains && (sKeyIndex === 0)) || + // A CONTAINS match is when the query is found anywhere within the key string... + (bMatchContains && (sKeyIndex > -1))) { + // Stash a match into aResults[]. + aResults.unshift(aDataset); + } + } + } + } + + this.getResultsEvent.fire(this, oParent, sQuery, aResults); + oCallbackFn(sQuery, aResults, oParent); +}; diff --git a/www/extras/yui/build/calendar/README b/www/extras/yui/build/calendar/README new file mode 100644 index 000000000..de02c14a0 --- /dev/null +++ b/www/extras/yui/build/calendar/README @@ -0,0 +1,107 @@ +Calendar Release Notes + +*** version 0.12 *** + + - New documentation format implemented + - Calendar2up and Calendar_Core are now deprecated. Now, Calendar alone + represents the single Calendar instance, and CalendarGroup represents an + n-up instance, defaulting to 2up + - Added semantic style classes to Calendar elements to allow for custom + styling solely using CSS. + - Remapped all configuration properties to use the Config object + (familiar to those who use the Container collection of controls). + Property names are the same as their previous counterparts, but wrapped + into Calendar.cfg, allowing for runtime reconfiguration of most + properties. + - Added "title" property for setting the Calendar title + - Added "close" property for enabling and disabling the close icon + - Added "iframe" property for enabling an iframe shim in Internet + Explorer 6 and below to fix the select bleed-through bug + - pageDate moved to property: "pagedate" + - selectedDates moved to property: "selected" + - minDate moved to property : "mindate", which accepts a JavaScript Date + object like its predecessor, but also supports string dates + - maxDate moved to property : "maxdate", which accepts a JavaScript Date + object like its predecessor, but also supports string dates + - Moved style declarations to initStyles function + - Optimized event handling in + doSelectCell/doCellMouseOver/doCellMouseOut by only attaching the + listener to the outer Calendar container, and only reacting to events on + cells with the "selectable" CSS class. + - Added domEventMap field for applying DOM event listeners to cells + containing specific class and tag combinations. + - Moved all cell DOM event attachment to applyListeners function + - Added getDateByCellId / getDateFieldsByCellId helper functions + - Corrected DateMath.getWeekNumber to comply with ISO week number + handling + - Separated renderCellDefault style portions into styleCellDefault + function for easy extension + - Deprecated onBeforeSelect. Created beforeSelectEvent which + automatically subscribes to its deprecated predecessor. + - Deprecated onSelect. Created selectEvent, which automatically + subscribes to its deprecated predecessor. + - Deprecated onBeforeDeselect. Created beforeSelectEvent which + automatically subscribes to its deprecated predecessor. + - Deprecated onDeselect. Created beforeDeselectEvent, which + automatically subscribes to its deprecated predecessor. + - Deprecated onChangePage. Created changePageEvent, which automatically + subscribes to its deprecated predecessor. + - Deprecated onRender. Created renderEvent, which automatically + subscribes to its deprecated predecessor. + - Deprecated onReset. Created resetEvent, which automatically subscribes + to its deprecated predecessor. + - Deprecated onClear. Created clearEvent, which automatically subscribes + to its deprecated predecessor. + - Corrected setMonth documentation to refer to 0-11 indexed months. + - Added show and hide methods to Calendar for setting the Calendar's + display property. + - Optimized internal render classes to use innerHTML and string buffers + - Removed wireCustomEvents function + - Removed wireDefaultEvents function + - Removed doNextMonth / doPreviousMonth + - Removed all buildShell (header, body, footer) functions, since the + Calendar shell is now built dynamically on each render + - Wired all CalendarGroup events and configuration properties to be + properly delegated to Calendar + - Augmented CalendarGroup with all built-in renderers, label functions, + hide, show, and initStyles, creating API transparency between Calendar + and CalendarGroup. + - Made all tagName, createElement, and entity references XHTML compliant + - Fixed Daylight Saving Time bug for Brazilian time zone + +*** version 0.11.3 *** + + - Calendar_Core: Added arguments for selected/deselected dates to + onSelect/onDeselect + - CalendarGroup: Fixed bug where selected dates passed to constructor + were not represented in selectedDates + - Calendar2up: Now displays correctly in Opera 9 + +*** version 0.11.0 *** + + - DateMath: DateMath.add now properly adds weeks + - DateMath: between() function added + - DateMath: getWeekNumber() fixed to take starting day of week into + account + - All references to Calendar's built in CSS class handlers are removed, + replaced with calls to Dom utility (addClass, removeClass) + - Several CSS class constants now have clearer names + - All CSS classes are now properly namespaced to avoid CSS conflicts + - Fixed table:hover bug in CSS + - Calendar no longer requires the container ID and variable name to + match in order for month navigation to function properly + - Calendar month navigation arrows are now represented as background + images + +*** version 0.10.0 *** + + - Major performance improvements from attaching DOM events to associated + table cells only once, when the Calendar shell is built + - DOM events for mouseover/mouseout are now fired for all browsers (not + just Internet Explorer) + - Reset functionality bug fixed for 2-up Calendar view + +*** version 0.9.0 *** + +* Initial release + diff --git a/www/extras/yui/build/calendar/assets/calendar.css b/www/extras/yui/build/calendar/assets/calendar.css new file mode 100644 index 000000000..0723f9430 --- /dev/null +++ b/www/extras/yui/build/calendar/assets/calendar.css @@ -0,0 +1,191 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +Version 0.12 +*/ + +.yui-calcontainer { + position:relative; + padding:5px; + background-color:#F7F9FB; + border:1px solid #7B9EBD; + float:left; + overflow:hidden; +} + +.yui-calcontainer iframe { + position:absolute; + border:none; + margin:0;padding:0; + left:-1px; + top:-1px; + z-index:0; + width:50em; + height:50em; +} + +.yui-calcontainer.multi { + padding:0; +} + +.yui-calcontainer.multi .groupcal { + padding:5px; + background-color:transparent; + z-index:1; + float:left; + position:relative; + border:none; +} + +.yui-calcontainer .title { + font:100% sans-serif; + color:#000; + font-weight:bold; + margin-bottom:5px; + height:25px; + position:absolute; + top:3px;left:5px; + z-index:1; +} + +.yui-calcontainer .close-icon { + position:absolute; + right:3px; + top:3px; + border:none; + z-index:1; +} + +/* Calendar element styles */ + +.yui-calendar { + font:100% sans-serif; + text-align:center; + border-spacing:0; + border-collapse:separate; + position:relative; +} + +.yui-calcontainer.withtitle { + padding-top:1.5em; +} + +.yui-calendar .calnavleft { + position:absolute; + background-repeat:no-repeat; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + left:2px; + z-index:1; +} + +.yui-calendar .calnavright { + position:absolute; + background-repeat:no-repeat; + cursor:pointer; + top:2px; + bottom:0; + width:9px; + height:12px; + right:2px; + z-index:1; +} + +.yui-calendar td.calcell { + padding:.1em .2em; + border:1px solid #E0E0E0; + text-align:center; +} + +.yui-calendar td.calcell a { + color:#003DB8; + text-decoration:none; +} + +.yui-calendar td.calcell.today { + border:1px solid #000; +} + +.yui-calendar td.calcell.oom { + cursor:default; + color:#999; + background-color:#EEE; + border:1px solid #E0E0E0; +} + +.yui-calendar td.calcell.selected { + color:#003DB8; + background-color:#FFF19F; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover { + cursor:pointer; + color:#FFF; + background-color:#FF9900; + border:1px solid #FF9900; +} + +.yui-calendar td.calcell.calcellhover a { + color:#FFF; +} + +.yui-calendar td.calcell.restricted { + text-decoration:line-through; +} + +.yui-calendar td.calcell.previous { + color:#CCC; +} + +.yui-calendar td.calcell.highlight1 { background-color:#CCFF99; } +.yui-calendar td.calcell.highlight2 { background-color:#99CCFF; } +.yui-calendar td.calcell.highlight3 { background-color:#FFCCCC; } +.yui-calendar td.calcell.highlight4 { background-color:#CCFF99; } + +.yui-calendar .calhead { + border:1px solid #E0E0E0; + vertical-align:middle; + background-color:#FFF; +} + +.yui-calendar .calheader { + position:relative; + width:100%; + text-align:center; +} + +.yui-calendar .calheader img { + border:none; +} + +.yui-calendar .calweekdaycell { + color:#666; + font-weight:normal; + text-align:center; + width:1.5em; +} + +.yui-calendar .calfoot { + background-color:#EEE; +} + +.yui-calendar .calrowhead, .yui-calendar .calrowfoot { + color:#666; + font-size:9px; + font-style:italic; + font-weight:normal; + width:15px; +} + +.yui-calendar .calrowhead { + border-right-width:2px; +} + +/*Specific changes for calendar running under fonts/reset */ +.yui-calendar a:hover {background:inherit;} +p#clear {clear:left; padding-top:10px;} diff --git a/www/extras/yui/build/calendar/assets/callt.gif b/www/extras/yui/build/calendar/assets/callt.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6cc8da5b221d372ea075b3a4a10211d3a23cb51 GIT binary patch literal 93 zcmZ?wbhEHb|1*Gr;!hSv1_o9J9S{$smVsF* qV%6o-OdT896eo&R8_GI9Z+s-tb-65V<*lvjzBf272=!xPum%9G>mWw} literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/calendar/assets/calrt.gif b/www/extras/yui/build/calendar/assets/calrt.gif new file mode 100644 index 0000000000000000000000000000000000000000..ee137b2ff769d99132234b67f1e528daf65cb397 GIT binary patch literal 94 zcmZ?wbhEHb|1*Gr;!hSv1_o9J9S{$smVsG0 rV)Ip7rjCbGR9fsBH@3+N1|(QayL)o!6Ro<}FL)f+p7oi^z+epk(%c}| literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/calendar/assets/calx.gif b/www/extras/yui/build/calendar/assets/calx.gif new file mode 100644 index 0000000000000000000000000000000000000000..27e7bc36e4524623db3c43f4d86717a703f37406 GIT binary patch literal 88 zcmZ?wbhEHb6lCCKn8?J?-rj!k;>G{}|1&T!DE?$&WME)o&;ha;K=KSsnmzrMhu-GT qE4kQMmbu}I7_0#*o**Fr literal 0 HcmV?d00001 diff --git a/www/extras/yui/build/calendar/calendar-debug.js b/www/extras/yui/build/calendar/calendar-debug.js new file mode 100644 index 000000000..339698005 --- /dev/null +++ b/www/extras/yui/build/calendar/calendar-debug.js @@ -0,0 +1,4277 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version 0.12.0 +*/ + +/** +* Config is a utility used within an Object to allow the implementer to maintain a list of local configuration properties and listen for changes to those properties dynamically using CustomEvent. The initial values are also maintained so that the configuration can be reset at any given point to its initial state. +* @class YAHOO.util.Config +* @constructor +* @param {Object} owner The owner Object to which this Config Object belongs +*/ +YAHOO.util.Config = function(owner) { + if (owner) { + this.init(owner); + } else { + YAHOO.log("No owner specified for Config object", "error"); + } +}; + +YAHOO.util.Config.prototype = { + + /** + * Object reference to the owner of this Config Object + * @property owner + * @type Object + */ + owner : null, + + /** + * Boolean flag that specifies whether a queue is currently being executed + * @property queueInProgress + * @type Boolean + */ + queueInProgress : false, + + + /** + * Validates that the value passed in is a Boolean. + * @method checkBoolean + * @param {Object} val The value to validate + * @return {Boolean} true, if the value is valid + */ + checkBoolean: function(val) { + if (typeof val == 'boolean') { + return true; + } else { + return false; + } + }, + + /** + * Validates that the value passed in is a number. + * @method checkNumber + * @param {Object} val The value to validate + * @return {Boolean} true, if the value is valid + */ + checkNumber: function(val) { + if (isNaN(val)) { + return false; + } else { + return true; + } + } +}; + + +/** +* Initializes the configuration Object and all of its local members. +* @method init +* @param {Object} owner The owner Object to which this Config Object belongs +*/ +YAHOO.util.Config.prototype.init = function(owner) { + + this.owner = owner; + + /** + * Object reference to the owner of this Config Object + * @event configChangedEvent + */ + this.configChangedEvent = new YAHOO.util.CustomEvent("configChanged"); + this.queueInProgress = false; + + /* Private Members */ + + /** + * Maintains the local collection of configuration property objects and their specified values + * @property config + * @private + * @type Object + */ + var config = {}; + + /** + * Maintains the local collection of configuration property objects as they were initially applied. + * This object is used when resetting a property. + * @property initialConfig + * @private + * @type Object + */ + var initialConfig = {}; + + /** + * Maintains the local, normalized CustomEvent queue + * @property eventQueue + * @private + * @type Object + */ + var eventQueue = []; + + /** + * Fires a configuration property event using the specified value. + * @method fireEvent + * @private + * @param {String} key The configuration property's name + * @param {value} Object The value of the correct type for the property + */ + var fireEvent = function( key, value ) { + YAHOO.log("Firing Config event: " + key + "=" + value, "info"); + + key = key.toLowerCase(); + + var property = config[key]; + + if (typeof property != 'undefined' && property.event) { + property.event.fire(value); + } + }; + /* End Private Members */ + + /** + * Adds a property to the Config Object's private config hash. + * @method addProperty + * @param {String} key The configuration property's name + * @param {Object} propertyObject The Object containing all of this property's arguments + */ + this.addProperty = function( key, propertyObject ) { + key = key.toLowerCase(); + + YAHOO.log("Added property: " + key, "info"); + + config[key] = propertyObject; + + propertyObject.event = new YAHOO.util.CustomEvent(key); + propertyObject.key = key; + + if (propertyObject.handler) { + propertyObject.event.subscribe(propertyObject.handler, this.owner, true); + } + + this.setProperty(key, propertyObject.value, true); + + if (! propertyObject.suppressEvent) { + this.queueProperty(key, propertyObject.value); + } + }; + + /** + * Returns a key-value configuration map of the values currently set in the Config Object. + * @method getConfig + * @return {Object} The current config, represented in a key-value map + */ + this.getConfig = function() { + var cfg = {}; + + for (var prop in config) { + var property = config[prop]; + if (typeof property != 'undefined' && property.event) { + cfg[prop] = property.value; + } + } + + return cfg; + }; + + /** + * Returns the value of specified property. + * @method getProperty + * @param {String} key The name of the property + * @return {Object} The value of the specified property + */ + this.getProperty = function(key) { + key = key.toLowerCase(); + + var property = config[key]; + if (typeof property != 'undefined' && property.event) { + return property.value; + } else { + return undefined; + } + }; + + /** + * Resets the specified property's value to its initial value. + * @method resetProperty + * @param {String} key The name of the property + * @return {Boolean} True is the property was reset, false if not + */ + this.resetProperty = function(key) { + key = key.toLowerCase(); + + var property = config[key]; + if (typeof property != 'undefined' && property.event) { + if (initialConfig[key] && initialConfig[key] != 'undefined') { + this.setProperty(key, initialConfig[key]); + } + return true; + } else { + return false; + } + }; + + /** + * Sets the value of a property. If the silent property is passed as true, the property's event will not be fired. + * @method setProperty + * @param {String} key The name of the property + * @param {String} value The value to set the property to + * @param {Boolean} silent Whether the value should be set silently, without firing the property event. + * @return {Boolean} True, if the set was successful, false if it failed. + */ + this.setProperty = function(key, value, silent) { + key = key.toLowerCase(); + + YAHOO.log("setProperty: " + key + "=" + value, "info"); + + if (this.queueInProgress && ! silent) { + this.queueProperty(key,value); // Currently running through a queue... + return true; + } else { + var property = config[key]; + if (typeof property != 'undefined' && property.event) { + if (property.validator && ! property.validator(value)) { // validator + return false; + } else { + property.value = value; + if (! silent) { + fireEvent(key, value); + this.configChangedEvent.fire([key, value]); + } + return true; + } + } else { + return false; + } + } + }; + + /** + * Sets the value of a property and queues its event to execute. If the event is already scheduled to execute, it is + * moved from its current position to the end of the queue. + * @method queueProperty + * @param {String} key The name of the property + * @param {String} value The value to set the property to + * @return {Boolean} true, if the set was successful, false if it failed. + */ + this.queueProperty = function(key, value) { + key = key.toLowerCase(); + + YAHOO.log("queueProperty: " + key + "=" + value, "info"); + + var property = config[key]; + + if (typeof property != 'undefined' && property.event) { + if (typeof value != 'undefined' && property.validator && ! property.validator(value)) { // validator + return false; + } else { + + if (typeof value != 'undefined') { + property.value = value; + } else { + value = property.value; + } + + var foundDuplicate = false; + + for (var i=0;i 11) { + while (newMonth > 11) { + newMonth -= 12; + years += 1; + } + } + + d.setMonth(newMonth); + d.setFullYear(date.getFullYear() + years); + break; + case this.DAY: + d.setDate(date.getDate() + amount); + break; + case this.YEAR: + d.setFullYear(date.getFullYear() + amount); + break; + case this.WEEK: + d.setDate(date.getDate() + (amount * 7)); + break; + } + return d; + }, + + /** + * Subtracts the specified amount of time from the this instance. + * @method subtract + * @param {Date} date The JavaScript Date object to perform subtraction on + * @param {Number} field The this field constant to be used for performing subtraction. + * @param {Number} amount The number of units (measured in the field constant) to subtract from the date. + * @return {Date} The resulting Date object + */ + subtract : function(date, field, amount) { + return this.add(date, field, (amount*-1)); + }, + + /** + * Determines whether a given date is before another date on the calendar. + * @method before + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs before the compared date; false if not. + */ + before : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() < ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is after another date on the calendar. + * @method after + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs after the compared date; false if not. + */ + after : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() > ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is between two other dates on the calendar. + * @method between + * @param {Date} date The date to check for + * @param {Date} dateBegin The start of the range + * @param {Date} dateEnd The end of the range + * @return {Boolean} true if the date occurs between the compared dates; false if not. + */ + between : function(date, dateBegin, dateEnd) { + if (this.after(date, dateBegin) && this.before(date, dateEnd)) { + return true; + } else { + return false; + } + }, + + /** + * Retrieves a JavaScript Date object representing January 1 of any given year. + * @method getJan1 + * @param {Number} calendarYear The calendar year for which to retrieve January 1 + * @return {Date} January 1 of the calendar year specified. + */ + getJan1 : function(calendarYear) { + return new Date(calendarYear,0,1); + }, + + /** + * Calculates the number of days the specified date is from January 1 of the specified calendar year. + * Passing January 1 to this function would return an offset value of zero. + * @method getDayOffset + * @param {Date} date The JavaScript date for which to find the offset + * @param {Number} calendarYear The calendar year to use for determining the offset + * @return {Number} The number of days since January 1 of the given year + */ + getDayOffset : function(date, calendarYear) { + var beginYear = this.getJan1(calendarYear); // Find the start of the year. This will be in week 1. + + // Find the number of days the passed in date is away from the calendar year start + var dayOffset = Math.ceil((date.getTime()-beginYear.getTime()) / this.ONE_DAY_MS); + return dayOffset; + }, + + /** + * Calculates the week number for the given date. This function assumes that week 1 is the + * week in which January 1 appears, regardless of whether the week consists of a full 7 days. + * The calendar year can be specified to help find what a the week number would be for a given + * date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or + * week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction + * easily. + * @method getWeekNumber + * @param {Date} date The JavaScript date for which to find the week number + * @param {Number} calendarYear OPTIONAL - The calendar year to use for determining the week number. Default is + * the calendar year of parameter "date". + * @param {Number} weekStartsOn OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday). + * @return {Number} The week number of the given date. + */ + getWeekNumber : function(date, calendarYear) { + date = this.clearTime(date); + var nearestThurs = new Date(date.getTime() + (4 * this.ONE_DAY_MS) - ((date.getDay()) * this.ONE_DAY_MS)); + + var jan1 = new Date(nearestThurs.getFullYear(),0,1); + var dayOfYear = ((nearestThurs.getTime() - jan1.getTime()) / this.ONE_DAY_MS) - 1; + + var weekNum = Math.ceil((dayOfYear)/ 7); + return weekNum; + }, + + /** + * Determines if a given week overlaps two different years. + * @method isYearOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different years. + */ + isYearOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getFullYear() != weekBeginDate.getFullYear()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Determines if a given week overlaps two different months. + * @method isMonthOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different months. + */ + isMonthOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getMonth() != weekBeginDate.getMonth()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Gets the first day of a month containing a given date. + * @method findMonthStart + * @param {Date} date The JavaScript Date used to calculate the month start + * @return {Date} The JavaScript Date representing the first day of the month + */ + findMonthStart : function(date) { + var start = new Date(date.getFullYear(), date.getMonth(), 1); + return start; + }, + + /** + * Gets the last day of a month containing a given date. + * @method findMonthEnd + * @param {Date} date The JavaScript Date used to calculate the month end + * @return {Date} The JavaScript Date representing the last day of the month + */ + findMonthEnd : function(date) { + var start = this.findMonthStart(date); + var nextMonth = this.add(start, this.MONTH, 1); + var end = this.subtract(nextMonth, this.DAY, 1); + return end; + }, + + /** + * Clears the time fields from a given date, effectively setting the time to midnight. + * @method clearTime + * @param {Date} date The JavaScript Date for which the time fields will be cleared + * @return {Date} The JavaScript Date cleared of all time fields + */ + clearTime : function(date) { + date.setHours(12,0,0,0); + return date; + } +}; + +/** +* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month ("one-up") or two-month ("two-up") interface. Calendars are generated entirely via script and can be navigated without any page refreshes. +* @module Calendar +* @title Calendar Widget +* @namespace YAHOO.widget +* @requires yahoo,dom,event +*/ + +/** +* Calendar is the base class for the Calendar widget. In its most basic +* implementation, it has the ability to render a calendar widget on the page +* that can be manipulated to select a single date, move back and forth between +* months and years. +*

        To construct the placeholder for the calendar widget, the code is as +* follows: +*

        +* <div id="cal1Container"></div> +* +* Note that the table can be replaced with any kind of element. +*

        +* @namespace YAHOO.widget +* @class Calendar +* @constructor +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.Calendar = function(id, containerId, config) { + this.init(id, containerId, config); +}; + +/** +* The path to be used for images loaded for the Calendar +* @property YAHOO.widget.Calendar.IMG_ROOT +* @static +* @type String +*/ +YAHOO.widget.Calendar.IMG_ROOT = (window.location.href.toLowerCase().indexOf("https") === 0 ? "https://a248.e.akamai.net/sec.yimg.com/i/" : "http://us.i1.yimg.com/us.yimg.com/i/"); + +/** +* Type constant used for renderers to represent an individual date (M/D/Y) +* @property YAHOO.widget.Calendar.DATE +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.DATE = "D"; + +/** +* Type constant used for renderers to represent an individual date across any year (M/D) +* @property YAHOO.widget.Calendar.MONTH_DAY +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MONTH_DAY = "MD"; + +/** +* Type constant used for renderers to represent a weekday +* @property YAHOO.widget.Calendar.WEEKDAY +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.WEEKDAY = "WD"; + +/** +* Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y) +* @property YAHOO.widget.Calendar.RANGE +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.RANGE = "R"; + +/** +* Type constant used for renderers to represent a month across any year +* @property YAHOO.widget.Calendar.MONTH +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MONTH = "M"; + +/** +* Constant that represents the total number of date cells that are displayed in a given month +* @property YAHOO.widget.Calendar.DISPLAY_DAYS +* @static +* @final +* @type Number +*/ +YAHOO.widget.Calendar.DISPLAY_DAYS = 42; + +/** +* Constant used for halting the execution of the remainder of the render stack +* @property YAHOO.widget.Calendar.STOP_RENDER +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.STOP_RENDER = "S"; + +YAHOO.widget.Calendar.prototype = { + + /** + * The configuration object used to set up the calendars various locale and style options. + * @property Config + * @private + * @deprecated Configuration properties should be set by calling Calendar.cfg.setProperty. + * @type Object + */ + Config : null, + + /** + * The parent CalendarGroup, only to be set explicitly by the parent group + * @property parent + * @type CalendarGroup + */ + parent : null, + + /** + * The index of this item in the parent group + * @property index + * @type Number + */ + index : -1, + + /** + * The collection of calendar table cells + * @property cells + * @type HTMLTableCellElement[] + */ + cells : null, + + /** + * The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D]. + * @property cellDates + * @type Array[](Number[]) + */ + cellDates : null, + + /** + * The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page. + * @property id + * @type String + */ + id : null, + + /** + * The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered. + * @property oDomContainer + * @type HTMLElement + */ + oDomContainer : null, + + /** + * A Date object representing today's date. + * @property today + * @type Date + */ + today : null, + + /** + * The list of render functions, along with required parameters, used to render cells. + * @property renderStack + * @type Array[] + */ + renderStack : null, + + /** + * A copy of the initial render functions created before rendering. + * @property _renderStack + * @private + * @type Array + */ + _renderStack : null, + + /** + * A Date object representing the month/year that the calendar is initially set to + * @property _pageDate + * @private + * @type Date + */ + _pageDate : null, + + /** + * The private list of initially selected dates. + * @property _selectedDates + * @private + * @type Array + */ + _selectedDates : null, + + /** + * A map of DOM event handlers to attach to cells associated with specific CSS class names + * @property domEventMap + * @type Object + */ + domEventMap : null +}; + + + +/** +* Initializes the Calendar widget. +* @method init +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.Calendar.prototype.init = function(id, containerId, config) { + this.logger = new YAHOO.widget.LogWriter("Calendar_Core " + id); + + this.initEvents(); + this.today = new Date(); + YAHOO.widget.DateMath.clearTime(this.today); + + this.id = id; + this.oDomContainer = document.getElementById(containerId); + if (! this.oDomContainer) { + this.logger.log("No valid container present.", "error"); + } + + /** + * The Config object used to hold the configuration variables for the Calendar + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the Calendar's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the Calendar's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.initStyles(); + + YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER); + YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE); + + this.cellDates = []; + this.cells = []; + this.renderStack = []; + this._renderStack = []; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); +}; + +/** +* Renders the built-in IFRAME shim for the IE6 and below +* @method configIframe +*/ +YAHOO.widget.Calendar.prototype.configIframe = function(type, args, obj) { + var useIframe = args[0]; + + if (YAHOO.util.Dom.inDocument(this.oDomContainer)) { + if (useIframe) { + var pos = YAHOO.util.Dom.getStyle(this.oDomContainer, "position"); + + if (this.browser == "ie" && (pos == "absolute" || pos == "relative")) { + if (! YAHOO.util.Dom.inDocument(this.iframe)) { + this.iframe = document.createElement("iframe"); + this.iframe.src = "javascript:false;"; + YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0"); + this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild); + } + } + } else { + if (this.iframe) { + if (this.iframe.parentNode) { + this.iframe.parentNode.removeChild(this.iframe); + } + this.iframe = null; + } + } + } +}; + +/** +* Default handler for the "title" property +* @method configTitle +*/ +YAHOO.widget.Calendar.prototype.configTitle = function(type, args, obj) { + var title = args[0]; + var close = this.cfg.getProperty("close"); + + var titleDiv; + + if (title && title !== "") { + titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div"); + titleDiv.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE; + titleDiv.innerHTML = title; + this.oDomContainer.insertBefore(titleDiv, this.oDomContainer.firstChild); + YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle"); + } else { + titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null; + + if (titleDiv) { + YAHOO.util.Event.purgeElement(titleDiv); + this.oDomContainer.removeChild(titleDiv); + } + if (! close) { + YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle"); + } + } +}; + +/** +* Default handler for the "close" property +* @method configClose +*/ +YAHOO.widget.Calendar.prototype.configClose = function(type, args, obj) { + var close = args[0]; + var title = this.cfg.getProperty("title"); + + var linkClose; + + if (close === true) { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a"); + linkClose.href = "javascript:void(null);"; + linkClose.className = "link-close"; + YAHOO.util.Event.addListener(linkClose, "click", this.hide, this, true); + var imgClose = document.createElement("img"); + imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + "us/my/bn/x_d.gif"; + imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE; + linkClose.appendChild(imgClose); + this.oDomContainer.appendChild(linkClose); + YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle"); + } else { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null; + + if (linkClose) { + YAHOO.util.Event.purgeElement(linkClose); + this.oDomContainer.removeChild(linkClose); + } + if (! title || title === "") { + YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle"); + } + } +}; + +/** +* Initializes Calendar's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.Calendar.prototype.initEvents = function() { + + /** + * Fired before a selection is made + * @event beforeSelectEvent + */ + this.beforeSelectEvent = new YAHOO.util.CustomEvent("beforeSelect"); + + /** + * Fired when a selection is made + * @event selectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + this.selectEvent = new YAHOO.util.CustomEvent("select"); + + /** + * Fired before a selection is made + * @event beforeDeselectEvent + */ + this.beforeDeselectEvent = new YAHOO.util.CustomEvent("beforeDeselect"); + + /** + * Fired when a selection is made + * @event deselectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + this.deselectEvent = new YAHOO.util.CustomEvent("deselect"); + + /** + * Fired when the Calendar page is changed + * @event changePageEvent + */ + this.changePageEvent = new YAHOO.util.CustomEvent("changePage"); + + /** + * Fired before the Calendar is rendered + * @event beforeRenderEvent + */ + this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender"); + + /** + * Fired when the Calendar is rendered + * @event renderEvent + */ + this.renderEvent = new YAHOO.util.CustomEvent("render"); + + /** + * Fired when the Calendar is reset + * @event resetEvent + */ + this.resetEvent = new YAHOO.util.CustomEvent("reset"); + + /** + * Fired when the Calendar is cleared + * @event clearEvent + */ + this.clearEvent = new YAHOO.util.CustomEvent("clear"); + + this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true); + this.selectEvent.subscribe(this.onSelect, this, true); + this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true); + this.deselectEvent.subscribe(this.onDeselect, this, true); + this.changePageEvent.subscribe(this.onChangePage, this, true); + this.renderEvent.subscribe(this.onRender, this, true); + this.resetEvent.subscribe(this.onReset, this, true); + this.clearEvent.subscribe(this.onClear, this, true); +}; + + +/** +* The default event function that is attached to a date link within a calendar cell +* when the calendar is rendered. +* @method doSelectCell +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doSelectCell = function(e, cal) { + var target = YAHOO.util.Event.getTarget(e); + + var cell,index,d,date; + + while (target.tagName.toLowerCase() != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + cell = target; + + if (YAHOO.util.Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) { + index = cell.id.split("cell")[1]; + d = cal.cellDates[index]; + date = new Date(d[0],d[1]-1,d[2]); + + cal.logger.log("Selecting cell " + index + " via click", "info"); + + if (cal.Options.MULTI_SELECT) { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + + var cellDate = cal.cellDates[index]; + var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate); + + if (cellDateIndex > -1) { + cal.deselectCell(index); + } else { + cal.selectCell(index); + } + + } else { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + cal.selectCell(index); + } + } +}; + +/** +* The event that is executed when the user hovers over a cell +* @method doCellMouseOver +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doCellMouseOver = function(e, cal) { + var target; + if (e) { + target = YAHOO.util.Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + YAHOO.util.Dom.addClass(target, cal.Style.CSS_CELL_HOVER); + } +}; + +/** +* The event that is executed when the user moves the mouse out of a cell +* @method doCellMouseOut +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doCellMouseOut = function(e, cal) { + var target; + if (e) { + target = YAHOO.util.Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + YAHOO.util.Dom.removeClass(target, cal.Style.CSS_CELL_HOVER); + } +}; + +YAHOO.widget.Calendar.prototype.setupConfig = function() { + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * @config selected + * @type String + * @default [] + */ + this.cfg.addProperty("selected", { value:[], handler:this.configSelected } ); + + /** + * The title to display above the Calendar's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty("title", { value:"", handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this Calendar + * @config close + * @type Boolean + * @default false + */ + this.cfg.addProperty("close", { value:false, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * @config iframe + * @type Boolean + * @default true + */ + this.cfg.addProperty("iframe", { value:true, handler:this.configIframe, validator:this.cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String + * @default null + */ + this.cfg.addProperty("mindate", { value:null, handler:this.configMinDate } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty("maxdate", { value:null, handler:this.configMaxDate } ); + + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + this.cfg.addProperty("MULTI_SELECT", { value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + this.cfg.addProperty("START_WEEKDAY", { value:0, handler:this.configOptions, validator:this.cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + this.cfg.addProperty("SHOW_WEEKDAYS", { value:true, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif" + */ + this.cfg.addProperty("NAV_ARROW_LEFT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.configOptions } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif" + */ + this.cfg.addProperty("NAV_ARROW_RIGHT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.configOptions } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + this.cfg.addProperty("MONTHS_SHORT", { value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.configLocale } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + this.cfg.addProperty("MONTHS_LONG", { value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.configLocale } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + this.cfg.addProperty("WEEKDAYS_1CHAR", { value:["S", "M", "T", "W", "T", "F", "S"], handler:this.configLocale } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + this.cfg.addProperty("WEEKDAYS_SHORT", { value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.configLocale } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + this.cfg.addProperty("WEEKDAYS_MEDIUM", { value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.configLocale } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + this.cfg.addProperty("WEEKDAYS_LONG", { value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.configLocale } ); + + /** + * Refreshes the locale values used to build the Calendar. + * @method refreshLocale + * @private + */ + var refreshLocale = function() { + this.cfg.refireEvent("LOCALE_MONTHS"); + this.cfg.refireEvent("LOCALE_WEEKDAYS"); + }; + + this.cfg.subscribeToConfigEvent("START_WEEKDAY", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("MONTHS_SHORT", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("MONTHS_LONG", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_1CHAR", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_SHORT", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_MEDIUM", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_LONG", refreshLocale, this, true); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + this.cfg.addProperty("LOCALE_MONTHS", { value:"long", handler:this.configLocaleValues } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + this.cfg.addProperty("LOCALE_WEEKDAYS", { value:"short", handler:this.configLocaleValues } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + this.cfg.addProperty("DATE_DELIMITER", { value:",", handler:this.configLocale } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.configLocale } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.configLocale } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MY_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MY_YEAR_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MD_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MD_DAY_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MDY_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MDY_DAY_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + this.cfg.addProperty("MDY_YEAR_POSITION", { value:3, handler:this.configLocale, validator:this.cfg.checkNumber } ); +}; + +/** +* The default handler for the "pagedate" property +* @method configPageDate +*/ +YAHOO.widget.Calendar.prototype.configPageDate = function(type, args, obj) { + var val = args[0]; + var month, year, aMonthYear; + + if (val) { + if (val instanceof Date) { + val = YAHOO.widget.DateMath.findMonthStart(val); + this.cfg.setProperty("pagedate", val, true); + if (! this._pageDate) { + this._pageDate = this.cfg.getProperty("pagedate"); + } + return; + } else { + aMonthYear = val.split(this.cfg.getProperty("DATE_FIELD_DELIMITER")); + month = parseInt(aMonthYear[this.cfg.getProperty("MY_MONTH_POSITION")-1], 10)-1; + year = parseInt(aMonthYear[this.cfg.getProperty("MY_YEAR_POSITION")-1], 10); + } + } else { + month = this.today.getMonth(); + year = this.today.getFullYear(); + } + + this.cfg.setProperty("pagedate", new Date(year, month, 1), true); + + this.logger.log("Set month/year to " + month + "/" + year, "info"); + + if (! this._pageDate) { + this._pageDate = this.cfg.getProperty("pagedate"); + } +}; + +/** +* The default handler for the "mindate" property +* @method configMinDate +*/ +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) { + var val = args[0]; + if (typeof val == 'string') { + val = this._parseDate(val); + this.cfg.setProperty("mindate", new Date(val[0],(val[1]-1),val[2])); + } +}; + +/** +* The default handler for the "maxdate" property +* @method configMaxDate +*/ +YAHOO.widget.Calendar.prototype.configMaxDate = function(type, args, obj) { + var val = args[0]; + if (typeof val == 'string') { + val = this._parseDate(val); + this.cfg.setProperty("maxdate", new Date(val[0],(val[1]-1),val[2])); + } +}; + +/** +* The default handler for the "selected" property +* @method configSelected +*/ +YAHOO.widget.Calendar.prototype.configSelected = function(type, args, obj) { + var selected = args[0]; + + if (selected) { + if (typeof selected == 'string') { + this.cfg.setProperty("selected", this._parseDates(selected), true); + } + } + if (! this._selectedDates) { + this._selectedDates = this.cfg.getProperty("selected"); + } +}; + +/** +* The default handler for all configuration options properties +* @method configOptions +*/ +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + this.Options[type] = val; +}; + +/** +* The default handler for all configuration locale properties +* @method configLocale +*/ +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + this.Locale[type] = val; + + this.cfg.refireEvent("LOCALE_MONTHS"); + this.cfg.refireEvent("LOCALE_WEEKDAYS"); + +}; + +/** +* The default handler for all configuration locale field length properties +* @method configLocaleValues +*/ +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + + switch (type) { + case "LOCALE_MONTHS": + switch (val) { + case "short": + this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_SHORT").concat(); + break; + case "long": + this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_LONG").concat(); + break; + } + break; + case "LOCALE_WEEKDAYS": + switch (val) { + case "1char": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_1CHAR").concat(); + break; + case "short": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_SHORT").concat(); + break; + case "medium": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_MEDIUM").concat(); + break; + case "long": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_LONG").concat(); + break; + } + + var START_WEEKDAY = this.cfg.getProperty("START_WEEKDAY"); + + if (START_WEEKDAY > 0) { + for (var w=0;w'; + html[html.length] = '
        '; + + var renderLeft, renderRight = false; + + if (this.parent) { + if (this.index === 0) { + renderLeft = true; + } + if (this.index == (this.parent.cfg.getProperty("pages") -1)) { + renderRight = true; + } + } else { + renderLeft = true; + renderRight = true; + } + + var cal = this.parent || this; + + if (renderLeft) { + html[html.length] = ' '; + } + + html[html.length] = this.buildMonthLabel(); + + if (renderRight) { + html[html.length] = ' '; + } + + + html[html.length] = '
        '; + html[html.length] = ''; + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEKDAYS")) { + html = this.buildWeekdays(html); + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the Calendar's weekday headers. +* @method buildWeekdays +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.buildWeekdays = function(html) { + + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { + html[html.length] = ' '; + } + + for(var i=0;i'; + } + + if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { + html[html.length] = ' '; + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the calendar body. +* @method renderBody +* @param {Date} workingDate The current working Date being used for the render process +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderBody = function(workingDate, html) { + this.logger.log("Rendering body", "info"); + + var startDay = this.cfg.getProperty("START_WEEKDAY"); + + this.preMonthDays = workingDate.getDay(); + if (startDay > 0) { + this.preMonthDays -= startDay; + } + if (this.preMonthDays < 0) { + this.preMonthDays += 7; + } + + this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate(); + this.postMonthDays = YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays; + + this.logger.log(this.preMonthDays + " preciding out-of-month days", "info"); + this.logger.log(this.monthDays + " month days", "info"); + this.logger.log(this.postMonthDays + " post-month days", "info"); + + workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays); + this.logger.log("Calendar page starts on " + workingDate, "info"); + + var useDate,weekNum,weekClass; + useDate = this.cfg.getProperty("pagedate"); + + html[html.length] = ''; + + var i = 0; + + var tempDiv = document.createElement("div"); + var cell = document.createElement("td"); + tempDiv.appendChild(cell); + + var jan1 = new Date(useDate.getFullYear(),0,1); + + var cal = this.parent || this; + + for (var r=0;r<6;r++) { + + weekNum = YAHOO.widget.DateMath.getWeekNumber(workingDate, useDate.getFullYear(), startDay); + + weekClass = "w" + weekNum; + + if (r !== 0 && this.isDateOOM(workingDate) && this.cfg.getProperty("HIDE_BLANK_WEEKS") === true) { + break; + } else { + + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { html = this.renderRowHeader(weekNum, html); } + + for (var d=0;d<7;d++){ // Render actual days + + var cellRenderers = []; + + this.clearElement(cell); + + YAHOO.util.Dom.addClass(cell, "calcell"); + + cell.id = this.id + "_cell" + i; + this.logger.log("Rendering cell " + cell.id + " (" + workingDate.getFullYear() + "-" + (workingDate.getMonth()+1) + "-" + workingDate.getDate() + ")", "cellrender"); + + cell.innerHTML = i; + + var renderer = null; + + if (workingDate.getFullYear() == this.today.getFullYear() && + workingDate.getMonth() == this.today.getMonth() && + workingDate.getDate() == this.today.getDate()) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleToday; + } + + this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates + + if (this.isDateOOM(workingDate)) { + cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth; + } else { + + YAHOO.util.Dom.addClass(cell, "wd" + workingDate.getDay()); + YAHOO.util.Dom.addClass(cell, "d" + workingDate.getDate()); + + for (var s=0;s= d1.getTime() && workingDate.getTime() <= d2.getTime()) { + renderer = rArray[2]; + + if (workingDate.getTime()==d2.getTime()) { + this.renderStack.splice(s,1); + } + } + break; + case YAHOO.widget.Calendar.WEEKDAY: + + var weekday = rArray[1][0]; + if (workingDate.getDay()+1 == weekday) { + renderer = rArray[2]; + } + break; + case YAHOO.widget.Calendar.MONTH: + + month = rArray[1][0]; + if (workingDate.getMonth()+1 == month) { + renderer = rArray[2]; + } + break; + } + + if (renderer) { + cellRenderers[cellRenderers.length]=renderer; + } + } + + } + + if (this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]) > -1) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; + } + + var mindate = this.cfg.getProperty("mindate"); + var maxdate = this.cfg.getProperty("maxdate"); + + if (mindate) { + mindate = YAHOO.widget.DateMath.clearTime(mindate); + } + if (maxdate) { + maxdate = YAHOO.widget.DateMath.clearTime(maxdate); + } + + if ( + (mindate && (workingDate.getTime() < mindate.getTime())) || + (maxdate && (workingDate.getTime() > maxdate.getTime())) + ) { + cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate; + } else { + cellRenderers[cellRenderers.length]=cal.styleCellDefault; + cellRenderers[cellRenderers.length]=cal.renderCellDefault; + } + + + + for (var x=0;x= 0 && i <= 6) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TOP); + } + if ((i % 7) === 0) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_LEFT); + } + if (((i+1) % 7) === 0) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RIGHT); + } + + var postDays = this.postMonthDays; + if (postDays >= 7 && this.cfg.getProperty("HIDE_BLANK_WEEKS")) { + var blankWeeks = Math.floor(postDays/7); + for (var p=0;p= ((this.preMonthDays+postDays+this.monthDays)-7)) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM); + } + + html[html.length] = tempDiv.innerHTML; + + i++; + } + + if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { html = this.renderRowFooter(weekNum, html); } + + html[html.length] = ''; + } + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the calendar footer. In the default implementation, there is +* no footer. +* @method renderFooter +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderFooter = function(html) { return html; }; + +/** +* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute +* when the method is called: renderHeader, renderBody, renderFooter. +* Refer to the documentation for those methods for information on +* individual render tasks. +* @method render +*/ +YAHOO.widget.Calendar.prototype.render = function() { + this.beforeRenderEvent.fire(); + + // Find starting day of the current month + var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty("pagedate")); + + this.resetRenderers(); + this.cellDates.length = 0; + + YAHOO.util.Event.purgeElement(this.oDomContainer, true); + + var html = []; + + html[html.length] = ''; + html = this.renderHeader(html); + html = this.renderBody(workingDate, html); + html = this.renderFooter(html); + html[html.length] = '
        '; + + this.oDomContainer.innerHTML = html.join("\n"); + + this.applyListeners(); + this.cells = this.oDomContainer.getElementsByTagName("td"); + + this.cfg.refireEvent("title"); + this.cfg.refireEvent("close"); + this.cfg.refireEvent("iframe"); + + this.renderEvent.fire(); +}; + +/** +* Applies the Calendar's DOM listeners to applicable elements. +* @method applyListeners +*/ +YAHOO.widget.Calendar.prototype.applyListeners = function() { + + var root = this.oDomContainer; + var cal = this.parent || this; + + var linkLeft, linkRight; + + linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, "a", root); + linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, "a", root); + + if (linkLeft) { + this.linkLeft = linkLeft[0]; + YAHOO.util.Event.addListener(this.linkLeft, "mousedown", cal.previousMonth, cal, true); + } + + if (linkRight) { + this.linkRight = linkRight[0]; + YAHOO.util.Event.addListener(this.linkRight, "mousedown", cal.nextMonth, cal, true); + } + + if (this.domEventMap) { + var el,elements; + for (var cls in this.domEventMap) { + if (this.domEventMap.hasOwnProperty(cls)) { + var items = this.domEventMap[cls]; + + if (! (items instanceof Array)) { + items = [items]; + } + + for (var i=0;i'; + return html; +}; + +/** +* Renders the row footer for a week. +* @method renderRowFooter +* @param {Number} weekNum The week number of the current row +* @param {Array} cell The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderRowFooter = function(weekNum, html) { + html[html.length] = '' + weekNum + ''; + return html; +}; + +/** +* Renders a single standard calendar cell in the calendar widget table. +* All logic for determining how a standard default cell will be rendered is +* encapsulated in this method, and must be accounted for when extending the +* widget class. +* @method renderCellDefault +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellDefault = function(workingDate, cell) { + cell.innerHTML = '' + this.buildDayLabel(workingDate) + ""; +}; + +/** +* Styles a selectable cell. +* @method styleCellDefault +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.styleCellDefault = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTABLE); +}; + + +/** +* Renders a single standard calendar cell using the CSS hightlight1 style +* @method renderCellStyleHighlight1 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight1 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT1); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight2 style +* @method renderCellStyleHighlight2 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight2 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT2); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight3 style +* @method renderCellStyleHighlight3 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight3 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT3); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight4 style +* @method renderCellStyleHighlight4 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight4 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT4); +}; + +/** +* Applies the default style used for rendering today's date to the current calendar cell +* @method renderCellStyleToday +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleToday = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TODAY); +}; + +/** +* Applies the default style used for rendering selected dates to the current calendar cell +* @method renderCellStyleSelected +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleSelected = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTED); +}; + +/** +* Applies the default style used for rendering dates that are not a part of the current +* month (preceding or trailing the cells for the current month) +* @method renderCellNotThisMonth +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderCellNotThisMonth = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOM); + cell.innerHTML=workingDate.getDate(); + return YAHOO.widget.Calendar.STOP_RENDER; +}; + +/** +* Renders the current calendar cell as a non-selectable "black-out" date using the default +* restricted style. +* @method renderBodyCellRestricted +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderBodyCellRestricted = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL); + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RESTRICTED); + cell.innerHTML=workingDate.getDate(); + return YAHOO.widget.Calendar.STOP_RENDER; +}; + +// END BUILT-IN TABLE CELL RENDERERS + +// BEGIN MONTH NAVIGATION METHODS + +/** +* Adds the designated number of months to the current calendar month, and sets the current +* calendar page date to the new month. +* @method addMonths +* @param {Number} count The number of months to add to the current calendar +*/ +YAHOO.widget.Calendar.prototype.addMonths = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Subtracts the designated number of months from the current calendar month, and sets the current +* calendar page date to the new month. +* @method subtractMonths +* @param {Number} count The number of months to subtract from the current calendar +*/ +YAHOO.widget.Calendar.prototype.subtractMonths = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Adds the designated number of years to the current calendar, and sets the current +* calendar page date to the new month. +* @method addYears +* @param {Number} count The number of years to add to the current calendar +*/ +YAHOO.widget.Calendar.prototype.addYears = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Subtcats the designated number of years from the current calendar, and sets the current +* calendar page date to the new month. +* @method subtractYears +* @param {Number} count The number of years to subtract from the current calendar +*/ +YAHOO.widget.Calendar.prototype.subtractYears = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Navigates to the next month page in the calendar widget. +* @method nextMonth +*/ +YAHOO.widget.Calendar.prototype.nextMonth = function() { + this.addMonths(1); +}; + +/** +* Navigates to the previous month page in the calendar widget. +* @method previousMonth +*/ +YAHOO.widget.Calendar.prototype.previousMonth = function() { + this.subtractMonths(1); +}; + +/** +* Navigates to the next year in the currently selected month in the calendar widget. +* @method nextYear +*/ +YAHOO.widget.Calendar.prototype.nextYear = function() { + this.addYears(1); +}; + +/** +* Navigates to the previous year in the currently selected month in the calendar widget. +* @method previousYear +*/ +YAHOO.widget.Calendar.prototype.previousYear = function() { + this.subtractYears(1); +}; + +// END MONTH NAVIGATION METHODS + +// BEGIN SELECTION METHODS + +/** +* Resets the calendar widget to the originally selected month and year, and +* sets the calendar to the initial selection(s). +* @method reset +*/ +YAHOO.widget.Calendar.prototype.reset = function() { + this.cfg.resetProperty("selected"); + this.cfg.resetProperty("pagedate"); + this.resetEvent.fire(); +}; + +/** +* Clears the selected dates in the current calendar widget and sets the calendar +* to the current month and year. +* @method clear +*/ +YAHOO.widget.Calendar.prototype.clear = function() { + this.cfg.setProperty("selected", []); + this.cfg.setProperty("pagedate", new Date(this.today.getTime())); + this.clearEvent.fire(); +}; + +/** +* Selects a date or a collection of dates on the current calendar. This method, by default, +* does not call the render method explicitly. Once selection has completed, render must be +* called for the changes to be reflected visually. +* @method select +* @param {String/Date/Date[]} date The date string of dates to select in the current calendar. Valid formats are +* individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). +* Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). +* This method can also take a JavaScript Date object or an array of Date objects. +* @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. +*/ +YAHOO.widget.Calendar.prototype.select = function(date) { + this.logger.log("Select: " + date, "info"); + + this.beforeSelectEvent.fire(); + + var selected = this.cfg.getProperty("selected"); + var aToBeSelected = this._toFieldArray(date); + this.logger.log("Selection field array: " + aToBeSelected, "info"); + + for (var a=0;a -1) { + if (this.cfg.getProperty("pagedate").getMonth() == dCellDate.getMonth() && + this.cfg.getProperty("pagedate").getFullYear() == dCellDate.getFullYear()) { + YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED); + } + + selected.splice(cellDateIndex, 1); + } + + + if (this.parent) { + this.parent.cfg.setProperty("selected", selected); + } else { + this.cfg.setProperty("selected", selected); + } + + this.deselectEvent.fire(selectDate); + return this.getSelectedDates(); +}; + +/** +* Deselects all dates on the current calendar. +* @method deselectAll +* @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. +* Assuming that this function executes properly, the return value should be an empty array. +* However, the empty array is returned for the sake of being able to check the selection status +* of the calendar. +*/ +YAHOO.widget.Calendar.prototype.deselectAll = function() { + this.beforeDeselectEvent.fire(); + + var selected = this.cfg.getProperty("selected"); + var count = selected.length; + var sel = selected.concat(); + + if (this.parent) { + this.parent.cfg.setProperty("selected", []); + } else { + this.cfg.setProperty("selected", []); + } + + if (count > 0) { + this.deselectEvent.fire(sel); + } + + return this.getSelectedDates(); +}; + +// END SELECTION METHODS + +// BEGIN TYPE CONVERSION METHODS + +/** +* Converts a date (either a JavaScript Date object, or a date string) to the internal data structure +* used to represent dates: [[yyyy,mm,dd],[yyyy,mm,dd]]. +* @method _toFieldArray +* @private +* @param {String/Date/Date[]} date The date string of dates to deselect in the current calendar. Valid formats are +* individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). +* Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). +* This method can also take a JavaScript Date object or an array of Date objects. +* @return {Array[](Number[])} Array of date field arrays +*/ +YAHOO.widget.Calendar.prototype._toFieldArray = function(date) { + var returnDate = []; + + if (date instanceof Date) { + returnDate = [[date.getFullYear(), date.getMonth()+1, date.getDate()]]; + } else if (typeof date == 'string') { + returnDate = this._parseDates(date); + } else if (date instanceof Array) { + for (var i=0;i +*
        +*
        +* +* The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers. +* @namespace YAHOO.widget +* @class CalendarGroup +* @constructor +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.CalendarGroup = function(id, containerId, config) { + if (arguments.length > 0) { + this.init(id, containerId, config); + } +}; + +/** +* Initializes the calendar group. All subclasses must call this method in order for the +* group to be initialized properly. +* @method init +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.CalendarGroup.prototype.init = function(id, containerId, config) { + this.logger = new YAHOO.widget.LogWriter("CalendarGroup " + id); + + this.initEvents(); + this.initStyles(); + + /** + * The collection of Calendar pages contained within the CalendarGroup + * @property pages + * @type YAHOO.widget.Calendar[] + */ + this.pages = []; + + /** + * The unique id associated with the CalendarGroup + * @property id + * @type String + */ + this.id = id; + + /** + * The unique id associated with the CalendarGroup container + * @property containerId + * @type String + */ + this.containerId = containerId; + + /** + * The outer containing element for the CalendarGroup + * @property oDomContainer + * @type HTMLElement + */ + this.oDomContainer = document.getElementById(containerId); + + YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_CONTAINER); + YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_MULTI_UP); + + /** + * The Config object used to hold the configuration variables for the CalendarGroup + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the CalendarGroup's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the CalendarGroup's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); + + // OPERA HACK FOR MISWRAPPED FLOATS + if (this.browser == "opera"){ + var fixWidth = function() { + var startW = this.oDomContainer.offsetWidth; + var w = 0; + for (var p=0;p 0) { + this.oDomContainer.style.width = w + "px"; + } + }; + this.renderEvent.subscribe(fixWidth,this,true); + } + + this.logger.log("Initialized " + pageCount + "-page CalendarGroup", "info"); +}; + + +YAHOO.widget.CalendarGroup.prototype.setupConfig = function() { + /** + * The number of pages to include in the CalendarGroup. This value can only be set once, in the CalendarGroup's constructor arguments. + * @config pages + * @type Number + * @default 2 + */ + this.cfg.addProperty("pages", { value:2, validator:this.cfg.checkNumber, handler:this.configPages } ); + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * @config selected + * @type String + * @default [] + */ + this.cfg.addProperty("selected", { value:[], handler:this.delegateConfig } ); + + /** + * The title to display above the CalendarGroup's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty("title", { value:"", handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this CalendarGroup + * @config close + * @type Boolean + * @default false + */ + this.cfg.addProperty("close", { value:false, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * @config iframe + * @type Boolean + * @default true + */ + this.cfg.addProperty("iframe", { value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String + * @default null + */ + this.cfg.addProperty("mindate", { value:null, handler:this.delegateConfig } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty("maxdate", { value:null, handler:this.delegateConfig } ); + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + this.cfg.addProperty("MULTI_SELECT", { value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + this.cfg.addProperty("START_WEEKDAY", { value:0, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + this.cfg.addProperty("SHOW_WEEKDAYS", { value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif" + */ + this.cfg.addProperty("NAV_ARROW_LEFT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.delegateConfig } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif" + */ + this.cfg.addProperty("NAV_ARROW_RIGHT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.delegateConfig } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + this.cfg.addProperty("MONTHS_SHORT", { value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.delegateConfig } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + this.cfg.addProperty("MONTHS_LONG", { value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.delegateConfig } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + this.cfg.addProperty("WEEKDAYS_1CHAR", { value:["S", "M", "T", "W", "T", "F", "S"], handler:this.delegateConfig } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + this.cfg.addProperty("WEEKDAYS_SHORT", { value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.delegateConfig } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + this.cfg.addProperty("WEEKDAYS_MEDIUM", { value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.delegateConfig } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + this.cfg.addProperty("WEEKDAYS_LONG", { value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.delegateConfig } ); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + this.cfg.addProperty("LOCALE_MONTHS", { value:"long", handler:this.delegateConfig } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + this.cfg.addProperty("LOCALE_WEEKDAYS", { value:"short", handler:this.delegateConfig } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + this.cfg.addProperty("DATE_DELIMITER", { value:",", handler:this.delegateConfig } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.delegateConfig } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.delegateConfig } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MY_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MY_YEAR_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MD_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MD_DAY_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MDY_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MDY_DAY_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + this.cfg.addProperty("MDY_YEAR_POSITION", { value:3, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + +}; + +/** +* Initializes CalendarGroup's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.CalendarGroup.prototype.initEvents = function() { + var me = this; + + /** + * Proxy subscriber to subscribe to the CalendarGroup's child Calendars' CustomEvents + * @method sub + * @private + * @param {Function} fn The function to subscribe to this CustomEvent + * @param {Object} obj The CustomEvent's scope object + * @param {Boolean} bOverride Whether or not to apply scope correction + */ + var sub = function(fn, obj, bOverride) { + for (var p=0;p0) { + year+=1; + } + cal.setYear(year); + } +}; +/** +* Calls the render function of all child calendars within the group. +* @method render +*/ +YAHOO.widget.CalendarGroup.prototype.render = function() { + this.renderHeader(); + for (var p=0;p=0;--p) { + var cal = this.pages[p]; + cal.previousMonth(); + } +}; + +/** +* Navigates to the next year in the currently selected month in the calendar widget. +* @method nextYear +*/ +YAHOO.widget.CalendarGroup.prototype.nextYear = function() { + for (var p=0;p11){while(newMonth>11){newMonth-=12;years+=1;}} +d.setMonth(newMonth);d.setFullYear(date.getFullYear()+years);break;case this.DAY:d.setDate(date.getDate()+amount);break;case this.YEAR:d.setFullYear(date.getFullYear()+amount);break;case this.WEEK:d.setDate(date.getDate()+(amount*7));break;} +return d;},subtract:function(date,field,amount){return this.add(date,field,(amount*-1));},before:function(date,compareTo){var ms=compareTo.getTime();if(date.getTime()ms){return true;}else{return false;}},between:function(date,dateBegin,dateEnd){if(this.after(date,dateBegin)&&this.before(date,dateEnd)){return true;}else{return false;}},getJan1:function(calendarYear){return new Date(calendarYear,0,1);},getDayOffset:function(date,calendarYear){var beginYear=this.getJan1(calendarYear);var dayOffset=Math.ceil((date.getTime()-beginYear.getTime())/this.ONE_DAY_MS);return dayOffset;},getWeekNumber:function(date,calendarYear){date=this.clearTime(date);var nearestThurs=new Date(date.getTime()+(4*this.ONE_DAY_MS)-((date.getDay())*this.ONE_DAY_MS));var jan1=new Date(nearestThurs.getFullYear(),0,1);var dayOfYear=((nearestThurs.getTime()-jan1.getTime())/this.ONE_DAY_MS)-1;var weekNum=Math.ceil((dayOfYear)/7);return weekNum;},isYearOverlapWeek:function(weekBeginDate){var overlaps=false;var nextWeek=this.add(weekBeginDate,this.DAY,6);if(nextWeek.getFullYear()!=weekBeginDate.getFullYear()){overlaps=true;} +return overlaps;},isMonthOverlapWeek:function(weekBeginDate){var overlaps=false;var nextWeek=this.add(weekBeginDate,this.DAY,6);if(nextWeek.getMonth()!=weekBeginDate.getMonth()){overlaps=true;} +return overlaps;},findMonthStart:function(date){var start=new Date(date.getFullYear(),date.getMonth(),1);return start;},findMonthEnd:function(date){var start=this.findMonthStart(date);var nextMonth=this.add(start,this.MONTH,1);var end=this.subtract(nextMonth,this.DAY,1);return end;},clearTime:function(date){date.setHours(12,0,0,0);return date;}};YAHOO.widget.Calendar=function(id,containerId,config){this.init(id,containerId,config);};YAHOO.widget.Calendar.IMG_ROOT=(window.location.href.toLowerCase().indexOf("https")===0?"https://a248.e.akamai.net/sec.yimg.com/i/":"http://us.i1.yimg.com/us.yimg.com/i/");YAHOO.widget.Calendar.DATE="D";YAHOO.widget.Calendar.MONTH_DAY="MD";YAHOO.widget.Calendar.WEEKDAY="WD";YAHOO.widget.Calendar.RANGE="R";YAHOO.widget.Calendar.MONTH="M";YAHOO.widget.Calendar.DISPLAY_DAYS=42;YAHOO.widget.Calendar.STOP_RENDER="S";YAHOO.widget.Calendar.prototype={Config:null,parent:null,index:-1,cells:null,cellDates:null,id:null,oDomContainer:null,today:null,renderStack:null,_renderStack:null,_pageDate:null,_selectedDates:null,domEventMap:null};YAHOO.widget.Calendar.prototype.init=function(id,containerId,config){this.initEvents();this.today=new Date();YAHOO.widget.DateMath.clearTime(this.today);this.id=id;this.oDomContainer=document.getElementById(containerId);this.cfg=new YAHOO.util.Config(this);this.Options={};this.Locale={};this.initStyles();YAHOO.util.Dom.addClass(this.oDomContainer,this.Style.CSS_CONTAINER);YAHOO.util.Dom.addClass(this.oDomContainer,this.Style.CSS_SINGLE);this.cellDates=[];this.cells=[];this.renderStack=[];this._renderStack=[];this.setupConfig();if(config){this.cfg.applyConfig(config,true);} +this.cfg.fireQueue();};YAHOO.widget.Calendar.prototype.configIframe=function(type,args,obj){var useIframe=args[0];if(YAHOO.util.Dom.inDocument(this.oDomContainer)){if(useIframe){var pos=YAHOO.util.Dom.getStyle(this.oDomContainer,"position");if(this.browser=="ie"&&(pos=="absolute"||pos=="relative")){if(!YAHOO.util.Dom.inDocument(this.iframe)){this.iframe=document.createElement("iframe");this.iframe.src="javascript:false;";YAHOO.util.Dom.setStyle(this.iframe,"opacity","0");this.oDomContainer.insertBefore(this.iframe,this.oDomContainer.firstChild);}}}else{if(this.iframe){if(this.iframe.parentNode){this.iframe.parentNode.removeChild(this.iframe);} +this.iframe=null;}}}};YAHOO.widget.Calendar.prototype.configTitle=function(type,args,obj){var title=args[0];var close=this.cfg.getProperty("close");var titleDiv;if(title&&title!==""){titleDiv=YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE,"div",this.oDomContainer)[0]||document.createElement("div");titleDiv.className=YAHOO.widget.CalendarGroup.CSS_2UPTITLE;titleDiv.innerHTML=title;this.oDomContainer.insertBefore(titleDiv,this.oDomContainer.firstChild);YAHOO.util.Dom.addClass(this.oDomContainer,"withtitle");}else{titleDiv=YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE,"div",this.oDomContainer)[0]||null;if(titleDiv){YAHOO.util.Event.purgeElement(titleDiv);this.oDomContainer.removeChild(titleDiv);} +if(!close){YAHOO.util.Dom.removeClass(this.oDomContainer,"withtitle");}}};YAHOO.widget.Calendar.prototype.configClose=function(type,args,obj){var close=args[0];var title=this.cfg.getProperty("title");var linkClose;if(close===true){linkClose=YAHOO.util.Dom.getElementsByClassName("link-close","a",this.oDomContainer)[0]||document.createElement("a");linkClose.href="javascript:void(null);";linkClose.className="link-close";YAHOO.util.Event.addListener(linkClose,"click",this.hide,this,true);var imgClose=document.createElement("img");imgClose.src=YAHOO.widget.Calendar.IMG_ROOT+"us/my/bn/x_d.gif";imgClose.className=YAHOO.widget.CalendarGroup.CSS_2UPCLOSE;linkClose.appendChild(imgClose);this.oDomContainer.appendChild(linkClose);YAHOO.util.Dom.addClass(this.oDomContainer,"withtitle");}else{linkClose=YAHOO.util.Dom.getElementsByClassName("link-close","a",this.oDomContainer)[0]||null;if(linkClose){YAHOO.util.Event.purgeElement(linkClose);this.oDomContainer.removeChild(linkClose);} +if(!title||title===""){YAHOO.util.Dom.removeClass(this.oDomContainer,"withtitle");}}};YAHOO.widget.Calendar.prototype.initEvents=function(){this.beforeSelectEvent=new YAHOO.util.CustomEvent("beforeSelect");this.selectEvent=new YAHOO.util.CustomEvent("select");this.beforeDeselectEvent=new YAHOO.util.CustomEvent("beforeDeselect");this.deselectEvent=new YAHOO.util.CustomEvent("deselect");this.changePageEvent=new YAHOO.util.CustomEvent("changePage");this.beforeRenderEvent=new YAHOO.util.CustomEvent("beforeRender");this.renderEvent=new YAHOO.util.CustomEvent("render");this.resetEvent=new YAHOO.util.CustomEvent("reset");this.clearEvent=new YAHOO.util.CustomEvent("clear");this.beforeSelectEvent.subscribe(this.onBeforeSelect,this,true);this.selectEvent.subscribe(this.onSelect,this,true);this.beforeDeselectEvent.subscribe(this.onBeforeDeselect,this,true);this.deselectEvent.subscribe(this.onDeselect,this,true);this.changePageEvent.subscribe(this.onChangePage,this,true);this.renderEvent.subscribe(this.onRender,this,true);this.resetEvent.subscribe(this.onReset,this,true);this.clearEvent.subscribe(this.onClear,this,true);};YAHOO.widget.Calendar.prototype.doSelectCell=function(e,cal){var target=YAHOO.util.Event.getTarget(e);var cell,index,d,date;while(target.tagName.toLowerCase()!="td"&&!YAHOO.util.Dom.hasClass(target,cal.Style.CSS_CELL_SELECTABLE)){target=target.parentNode;if(target.tagName.toLowerCase()=="html"){return;}} +cell=target;if(YAHOO.util.Dom.hasClass(cell,cal.Style.CSS_CELL_SELECTABLE)){index=cell.id.split("cell")[1];d=cal.cellDates[index];date=new Date(d[0],d[1]-1,d[2]);var link;if(cal.Options.MULTI_SELECT){link=cell.getElementsByTagName("a")[0];if(link){link.blur();} +var cellDate=cal.cellDates[index];var cellDateIndex=cal._indexOfSelectedFieldArray(cellDate);if(cellDateIndex>-1){cal.deselectCell(index);}else{cal.selectCell(index);}}else{link=cell.getElementsByTagName("a")[0];if(link){link.blur();} +cal.selectCell(index);}}};YAHOO.widget.Calendar.prototype.doCellMouseOver=function(e,cal){var target;if(e){target=YAHOO.util.Event.getTarget(e);}else{target=this;} +while(target.tagName.toLowerCase()!="td"){target=target.parentNode;if(target.tagName.toLowerCase()=="html"){return;}} +if(YAHOO.util.Dom.hasClass(target,cal.Style.CSS_CELL_SELECTABLE)){YAHOO.util.Dom.addClass(target,cal.Style.CSS_CELL_HOVER);}};YAHOO.widget.Calendar.prototype.doCellMouseOut=function(e,cal){var target;if(e){target=YAHOO.util.Event.getTarget(e);}else{target=this;} +while(target.tagName.toLowerCase()!="td"){target=target.parentNode;if(target.tagName.toLowerCase()=="html"){return;}} +if(YAHOO.util.Dom.hasClass(target,cal.Style.CSS_CELL_SELECTABLE)){YAHOO.util.Dom.removeClass(target,cal.Style.CSS_CELL_HOVER);}};YAHOO.widget.Calendar.prototype.setupConfig=function(){this.cfg.addProperty("pagedate",{value:new Date(),handler:this.configPageDate});this.cfg.addProperty("selected",{value:[],handler:this.configSelected});this.cfg.addProperty("title",{value:"",handler:this.configTitle});this.cfg.addProperty("close",{value:false,handler:this.configClose});this.cfg.addProperty("iframe",{value:true,handler:this.configIframe,validator:this.cfg.checkBoolean});this.cfg.addProperty("mindate",{value:null,handler:this.configMinDate});this.cfg.addProperty("maxdate",{value:null,handler:this.configMaxDate});this.cfg.addProperty("MULTI_SELECT",{value:false,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty("START_WEEKDAY",{value:0,handler:this.configOptions,validator:this.cfg.checkNumber});this.cfg.addProperty("SHOW_WEEKDAYS",{value:true,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty("SHOW_WEEK_HEADER",{value:false,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty("SHOW_WEEK_FOOTER",{value:false,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty("HIDE_BLANK_WEEKS",{value:false,handler:this.configOptions,validator:this.cfg.checkBoolean});this.cfg.addProperty("NAV_ARROW_LEFT",{value:YAHOO.widget.Calendar.IMG_ROOT+"us/tr/callt.gif",handler:this.configOptions});this.cfg.addProperty("NAV_ARROW_RIGHT",{value:YAHOO.widget.Calendar.IMG_ROOT+"us/tr/calrt.gif",handler:this.configOptions});this.cfg.addProperty("MONTHS_SHORT",{value:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],handler:this.configLocale});this.cfg.addProperty("MONTHS_LONG",{value:["January","February","March","April","May","June","July","August","September","October","November","December"],handler:this.configLocale});this.cfg.addProperty("WEEKDAYS_1CHAR",{value:["S","M","T","W","T","F","S"],handler:this.configLocale});this.cfg.addProperty("WEEKDAYS_SHORT",{value:["Su","Mo","Tu","We","Th","Fr","Sa"],handler:this.configLocale});this.cfg.addProperty("WEEKDAYS_MEDIUM",{value:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],handler:this.configLocale});this.cfg.addProperty("WEEKDAYS_LONG",{value:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],handler:this.configLocale});var refreshLocale=function(){this.cfg.refireEvent("LOCALE_MONTHS");this.cfg.refireEvent("LOCALE_WEEKDAYS");};this.cfg.subscribeToConfigEvent("START_WEEKDAY",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("MONTHS_SHORT",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("MONTHS_LONG",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("WEEKDAYS_1CHAR",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("WEEKDAYS_SHORT",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("WEEKDAYS_MEDIUM",refreshLocale,this,true);this.cfg.subscribeToConfigEvent("WEEKDAYS_LONG",refreshLocale,this,true);this.cfg.addProperty("LOCALE_MONTHS",{value:"long",handler:this.configLocaleValues});this.cfg.addProperty("LOCALE_WEEKDAYS",{value:"short",handler:this.configLocaleValues});this.cfg.addProperty("DATE_DELIMITER",{value:",",handler:this.configLocale});this.cfg.addProperty("DATE_FIELD_DELIMITER",{value:"/",handler:this.configLocale});this.cfg.addProperty("DATE_RANGE_DELIMITER",{value:"-",handler:this.configLocale});this.cfg.addProperty("MY_MONTH_POSITION",{value:1,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MY_YEAR_POSITION",{value:2,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MD_MONTH_POSITION",{value:1,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MD_DAY_POSITION",{value:2,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_MONTH_POSITION",{value:1,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_DAY_POSITION",{value:2,handler:this.configLocale,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_YEAR_POSITION",{value:3,handler:this.configLocale,validator:this.cfg.checkNumber});};YAHOO.widget.Calendar.prototype.configPageDate=function(type,args,obj){var val=args[0];var month,year,aMonthYear;if(val){if(val instanceof Date){val=YAHOO.widget.DateMath.findMonthStart(val);this.cfg.setProperty("pagedate",val,true);if(!this._pageDate){this._pageDate=this.cfg.getProperty("pagedate");} +return;}else{aMonthYear=val.split(this.cfg.getProperty("DATE_FIELD_DELIMITER"));month=parseInt(aMonthYear[this.cfg.getProperty("MY_MONTH_POSITION")-1],10)-1;year=parseInt(aMonthYear[this.cfg.getProperty("MY_YEAR_POSITION")-1],10);}}else{month=this.today.getMonth();year=this.today.getFullYear();} +this.cfg.setProperty("pagedate",new Date(year,month,1),true);if(!this._pageDate){this._pageDate=this.cfg.getProperty("pagedate");}};YAHOO.widget.Calendar.prototype.configMinDate=function(type,args,obj){var val=args[0];if(typeof val=='string'){val=this._parseDate(val);this.cfg.setProperty("mindate",new Date(val[0],(val[1]-1),val[2]));}};YAHOO.widget.Calendar.prototype.configMaxDate=function(type,args,obj){var val=args[0];if(typeof val=='string'){val=this._parseDate(val);this.cfg.setProperty("maxdate",new Date(val[0],(val[1]-1),val[2]));}};YAHOO.widget.Calendar.prototype.configSelected=function(type,args,obj){var selected=args[0];if(selected){if(typeof selected=='string'){this.cfg.setProperty("selected",this._parseDates(selected),true);}} +if(!this._selectedDates){this._selectedDates=this.cfg.getProperty("selected");}};YAHOO.widget.Calendar.prototype.configOptions=function(type,args,obj){type=type.toUpperCase();var val=args[0];this.Options[type]=val;};YAHOO.widget.Calendar.prototype.configLocale=function(type,args,obj){type=type.toUpperCase();var val=args[0];this.Locale[type]=val;this.cfg.refireEvent("LOCALE_MONTHS");this.cfg.refireEvent("LOCALE_WEEKDAYS");};YAHOO.widget.Calendar.prototype.configLocaleValues=function(type,args,obj){type=type.toUpperCase();var val=args[0];switch(type){case"LOCALE_MONTHS":switch(val){case"short":this.Locale.LOCALE_MONTHS=this.cfg.getProperty("MONTHS_SHORT").concat();break;case"long":this.Locale.LOCALE_MONTHS=this.cfg.getProperty("MONTHS_LONG").concat();break;} +break;case"LOCALE_WEEKDAYS":switch(val){case"1char":this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty("WEEKDAYS_1CHAR").concat();break;case"short":this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty("WEEKDAYS_SHORT").concat();break;case"medium":this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty("WEEKDAYS_MEDIUM").concat();break;case"long":this.Locale.LOCALE_WEEKDAYS=this.cfg.getProperty("WEEKDAYS_LONG").concat();break;} +var START_WEEKDAY=this.cfg.getProperty("START_WEEKDAY");if(START_WEEKDAY>0){for(var w=0;w';html[html.length]='
        ';var renderLeft,renderRight=false;if(this.parent){if(this.index===0){renderLeft=true;} +if(this.index==(this.parent.cfg.getProperty("pages")-1)){renderRight=true;}}else{renderLeft=true;renderRight=true;} +var cal=this.parent||this;if(renderLeft){html[html.length]=' ';} +html[html.length]=this.buildMonthLabel();if(renderRight){html[html.length]=' ';} +html[html.length]='
        ';html[html.length]='';html[html.length]='';if(this.cfg.getProperty("SHOW_WEEKDAYS")){html=this.buildWeekdays(html);} +html[html.length]='';return html;};YAHOO.widget.Calendar.prototype.buildWeekdays=function(html){html[html.length]='';if(this.cfg.getProperty("SHOW_WEEK_HEADER")){html[html.length]=' ';} +for(var i=0;i'+this.Locale.LOCALE_WEEKDAYS[i]+'';} +if(this.cfg.getProperty("SHOW_WEEK_FOOTER")){html[html.length]=' ';} +html[html.length]='';return html;};YAHOO.widget.Calendar.prototype.renderBody=function(workingDate,html){var startDay=this.cfg.getProperty("START_WEEKDAY");this.preMonthDays=workingDate.getDay();if(startDay>0){this.preMonthDays-=startDay;} +if(this.preMonthDays<0){this.preMonthDays+=7;} +this.monthDays=YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate();this.postMonthDays=YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays;workingDate=YAHOO.widget.DateMath.subtract(workingDate,YAHOO.widget.DateMath.DAY,this.preMonthDays);var useDate,weekNum,weekClass;useDate=this.cfg.getProperty("pagedate");html[html.length]='';var i=0;var tempDiv=document.createElement("div");var cell=document.createElement("td");tempDiv.appendChild(cell);var jan1=new Date(useDate.getFullYear(),0,1);var cal=this.parent||this;for(var r=0;r<6;r++){weekNum=YAHOO.widget.DateMath.getWeekNumber(workingDate,useDate.getFullYear(),startDay);weekClass="w"+weekNum;if(r!==0&&this.isDateOOM(workingDate)&&this.cfg.getProperty("HIDE_BLANK_WEEKS")===true){break;}else{html[html.length]='';if(this.cfg.getProperty("SHOW_WEEK_HEADER")){html=this.renderRowHeader(weekNum,html);} +for(var d=0;d<7;d++){var cellRenderers=[];this.clearElement(cell);YAHOO.util.Dom.addClass(cell,"calcell");cell.id=this.id+"_cell"+i;cell.innerHTML=i;var renderer=null;if(workingDate.getFullYear()==this.today.getFullYear()&&workingDate.getMonth()==this.today.getMonth()&&workingDate.getDate()==this.today.getDate()){cellRenderers[cellRenderers.length]=cal.renderCellStyleToday;} +this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()];if(this.isDateOOM(workingDate)){cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth;}else{YAHOO.util.Dom.addClass(cell,"wd"+workingDate.getDay());YAHOO.util.Dom.addClass(cell,"d"+workingDate.getDate());for(var s=0;s=d1.getTime()&&workingDate.getTime()<=d2.getTime()){renderer=rArray[2];if(workingDate.getTime()==d2.getTime()){this.renderStack.splice(s,1);}} +break;case YAHOO.widget.Calendar.WEEKDAY:var weekday=rArray[1][0];if(workingDate.getDay()+1==weekday){renderer=rArray[2];} +break;case YAHOO.widget.Calendar.MONTH:month=rArray[1][0];if(workingDate.getMonth()+1==month){renderer=rArray[2];} +break;} +if(renderer){cellRenderers[cellRenderers.length]=renderer;}}} +if(this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()])>-1){cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected;} +var mindate=this.cfg.getProperty("mindate");var maxdate=this.cfg.getProperty("maxdate");if(mindate){mindate=YAHOO.widget.DateMath.clearTime(mindate);} +if(maxdate){maxdate=YAHOO.widget.DateMath.clearTime(maxdate);} +if((mindate&&(workingDate.getTime()maxdate.getTime()))){cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate;}else{cellRenderers[cellRenderers.length]=cal.styleCellDefault;cellRenderers[cellRenderers.length]=cal.renderCellDefault;} +for(var x=0;x=0&&i<=6){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_TOP);} +if((i%7)===0){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_LEFT);} +if(((i+1)%7)===0){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_RIGHT);} +var postDays=this.postMonthDays;if(postDays>=7&&this.cfg.getProperty("HIDE_BLANK_WEEKS")){var blankWeeks=Math.floor(postDays/7);for(var p=0;p=((this.preMonthDays+postDays+this.monthDays)-7)){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_BOTTOM);} +html[html.length]=tempDiv.innerHTML;i++;} +if(this.cfg.getProperty("SHOW_WEEK_FOOTER")){html=this.renderRowFooter(weekNum,html);} +html[html.length]='';}} +html[html.length]='';return html;};YAHOO.widget.Calendar.prototype.renderFooter=function(html){return html;};YAHOO.widget.Calendar.prototype.render=function(){this.beforeRenderEvent.fire();var workingDate=YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty("pagedate"));this.resetRenderers();this.cellDates.length=0;YAHOO.util.Event.purgeElement(this.oDomContainer,true);var html=[];html[html.length]='';html=this.renderHeader(html);html=this.renderBody(workingDate,html);html=this.renderFooter(html);html[html.length]='
        ';this.oDomContainer.innerHTML=html.join("\n");this.applyListeners();this.cells=this.oDomContainer.getElementsByTagName("td");this.cfg.refireEvent("title");this.cfg.refireEvent("close");this.cfg.refireEvent("iframe");this.renderEvent.fire();};YAHOO.widget.Calendar.prototype.applyListeners=function(){var root=this.oDomContainer;var cal=this.parent||this;var linkLeft,linkRight;linkLeft=YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT,"a",root);linkRight=YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT,"a",root);if(linkLeft){this.linkLeft=linkLeft[0];YAHOO.util.Event.addListener(this.linkLeft,"mousedown",cal.previousMonth,cal,true);} +if(linkRight){this.linkRight=linkRight[0];YAHOO.util.Event.addListener(this.linkRight,"mousedown",cal.nextMonth,cal,true);} +if(this.domEventMap){var el,elements;for(var cls in this.domEventMap){if(this.domEventMap.hasOwnProperty(cls)){var items=this.domEventMap[cls];if(!(items instanceof Array)){items=[items];} +for(var i=0;i'+weekNum+'';return html;};YAHOO.widget.Calendar.prototype.renderRowFooter=function(weekNum,html){html[html.length]=''+weekNum+'';return html;};YAHOO.widget.Calendar.prototype.renderCellDefault=function(workingDate,cell){cell.innerHTML=''+this.buildDayLabel(workingDate)+"";};YAHOO.widget.Calendar.prototype.styleCellDefault=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_SELECTABLE);};YAHOO.widget.Calendar.prototype.renderCellStyleHighlight1=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_HIGHLIGHT1);};YAHOO.widget.Calendar.prototype.renderCellStyleHighlight2=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_HIGHLIGHT2);};YAHOO.widget.Calendar.prototype.renderCellStyleHighlight3=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_HIGHLIGHT3);};YAHOO.widget.Calendar.prototype.renderCellStyleHighlight4=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_HIGHLIGHT4);};YAHOO.widget.Calendar.prototype.renderCellStyleToday=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_TODAY);};YAHOO.widget.Calendar.prototype.renderCellStyleSelected=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_SELECTED);};YAHOO.widget.Calendar.prototype.renderCellNotThisMonth=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_OOM);cell.innerHTML=workingDate.getDate();return YAHOO.widget.Calendar.STOP_RENDER;};YAHOO.widget.Calendar.prototype.renderBodyCellRestricted=function(workingDate,cell){YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL);YAHOO.util.Dom.addClass(cell,this.Style.CSS_CELL_RESTRICTED);cell.innerHTML=workingDate.getDate();return YAHOO.widget.Calendar.STOP_RENDER;};YAHOO.widget.Calendar.prototype.addMonths=function(count){this.cfg.setProperty("pagedate",YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"),YAHOO.widget.DateMath.MONTH,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.subtractMonths=function(count){this.cfg.setProperty("pagedate",YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"),YAHOO.widget.DateMath.MONTH,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.addYears=function(count){this.cfg.setProperty("pagedate",YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"),YAHOO.widget.DateMath.YEAR,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.subtractYears=function(count){this.cfg.setProperty("pagedate",YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"),YAHOO.widget.DateMath.YEAR,count));this.resetRenderers();this.changePageEvent.fire();};YAHOO.widget.Calendar.prototype.nextMonth=function(){this.addMonths(1);};YAHOO.widget.Calendar.prototype.previousMonth=function(){this.subtractMonths(1);};YAHOO.widget.Calendar.prototype.nextYear=function(){this.addYears(1);};YAHOO.widget.Calendar.prototype.previousYear=function(){this.subtractYears(1);};YAHOO.widget.Calendar.prototype.reset=function(){this.cfg.resetProperty("selected");this.cfg.resetProperty("pagedate");this.resetEvent.fire();};YAHOO.widget.Calendar.prototype.clear=function(){this.cfg.setProperty("selected",[]);this.cfg.setProperty("pagedate",new Date(this.today.getTime()));this.clearEvent.fire();};YAHOO.widget.Calendar.prototype.select=function(date){this.beforeSelectEvent.fire();var selected=this.cfg.getProperty("selected");var aToBeSelected=this._toFieldArray(date);for(var a=0;a-1){if(this.cfg.getProperty("pagedate").getMonth()==dCellDate.getMonth()&&this.cfg.getProperty("pagedate").getFullYear()==dCellDate.getFullYear()){YAHOO.util.Dom.removeClass(cell,this.Style.CSS_CELL_SELECTED);} +selected.splice(cellDateIndex,1);} +if(this.parent){this.parent.cfg.setProperty("selected",selected);}else{this.cfg.setProperty("selected",selected);} +this.deselectEvent.fire(selectDate);return this.getSelectedDates();};YAHOO.widget.Calendar.prototype.deselectAll=function(){this.beforeDeselectEvent.fire();var selected=this.cfg.getProperty("selected");var count=selected.length;var sel=selected.concat();if(this.parent){this.parent.cfg.setProperty("selected",[]);}else{this.cfg.setProperty("selected",[]);} +if(count>0){this.deselectEvent.fire(sel);} +return this.getSelectedDates();};YAHOO.widget.Calendar.prototype._toFieldArray=function(date){var returnDate=[];if(date instanceof Date){returnDate=[[date.getFullYear(),date.getMonth()+1,date.getDate()]];}else if(typeof date=='string'){returnDate=this._parseDates(date);}else if(date instanceof Array){for(var i=0;i0){this.init(id,containerId,config);}};YAHOO.widget.CalendarGroup.prototype.init=function(id,containerId,config){this.initEvents();this.initStyles();this.pages=[];this.id=id;this.containerId=containerId;this.oDomContainer=document.getElementById(containerId);YAHOO.util.Dom.addClass(this.oDomContainer,YAHOO.widget.CalendarGroup.CSS_CONTAINER);YAHOO.util.Dom.addClass(this.oDomContainer,YAHOO.widget.CalendarGroup.CSS_MULTI_UP);this.cfg=new YAHOO.util.Config(this);this.Options={};this.Locale={};this.setupConfig();if(config){this.cfg.applyConfig(config,true);} +this.cfg.fireQueue();if(this.browser=="opera"){var fixWidth=function(){var startW=this.oDomContainer.offsetWidth;var w=0;for(var p=0;p0){this.oDomContainer.style.width=w+"px";}};this.renderEvent.subscribe(fixWidth,this,true);}};YAHOO.widget.CalendarGroup.prototype.setupConfig=function(){this.cfg.addProperty("pages",{value:2,validator:this.cfg.checkNumber,handler:this.configPages});this.cfg.addProperty("pagedate",{value:new Date(),handler:this.configPageDate});this.cfg.addProperty("selected",{value:[],handler:this.delegateConfig});this.cfg.addProperty("title",{value:"",handler:this.configTitle});this.cfg.addProperty("close",{value:false,handler:this.configClose});this.cfg.addProperty("iframe",{value:true,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("mindate",{value:null,handler:this.delegateConfig});this.cfg.addProperty("maxdate",{value:null,handler:this.delegateConfig});this.cfg.addProperty("MULTI_SELECT",{value:false,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("START_WEEKDAY",{value:0,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("SHOW_WEEKDAYS",{value:true,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("SHOW_WEEK_HEADER",{value:false,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("SHOW_WEEK_FOOTER",{value:false,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("HIDE_BLANK_WEEKS",{value:false,handler:this.delegateConfig,validator:this.cfg.checkBoolean});this.cfg.addProperty("NAV_ARROW_LEFT",{value:YAHOO.widget.Calendar.IMG_ROOT+"us/tr/callt.gif",handler:this.delegateConfig});this.cfg.addProperty("NAV_ARROW_RIGHT",{value:YAHOO.widget.Calendar.IMG_ROOT+"us/tr/calrt.gif",handler:this.delegateConfig});this.cfg.addProperty("MONTHS_SHORT",{value:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],handler:this.delegateConfig});this.cfg.addProperty("MONTHS_LONG",{value:["January","February","March","April","May","June","July","August","September","October","November","December"],handler:this.delegateConfig});this.cfg.addProperty("WEEKDAYS_1CHAR",{value:["S","M","T","W","T","F","S"],handler:this.delegateConfig});this.cfg.addProperty("WEEKDAYS_SHORT",{value:["Su","Mo","Tu","We","Th","Fr","Sa"],handler:this.delegateConfig});this.cfg.addProperty("WEEKDAYS_MEDIUM",{value:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],handler:this.delegateConfig});this.cfg.addProperty("WEEKDAYS_LONG",{value:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],handler:this.delegateConfig});this.cfg.addProperty("LOCALE_MONTHS",{value:"long",handler:this.delegateConfig});this.cfg.addProperty("LOCALE_WEEKDAYS",{value:"short",handler:this.delegateConfig});this.cfg.addProperty("DATE_DELIMITER",{value:",",handler:this.delegateConfig});this.cfg.addProperty("DATE_FIELD_DELIMITER",{value:"/",handler:this.delegateConfig});this.cfg.addProperty("DATE_RANGE_DELIMITER",{value:"-",handler:this.delegateConfig});this.cfg.addProperty("MY_MONTH_POSITION",{value:1,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MY_YEAR_POSITION",{value:2,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MD_MONTH_POSITION",{value:1,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MD_DAY_POSITION",{value:2,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_MONTH_POSITION",{value:1,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_DAY_POSITION",{value:2,handler:this.delegateConfig,validator:this.cfg.checkNumber});this.cfg.addProperty("MDY_YEAR_POSITION",{value:3,handler:this.delegateConfig,validator:this.cfg.checkNumber});};YAHOO.widget.CalendarGroup.prototype.initEvents=function(){var me=this;var sub=function(fn,obj,bOverride){for(var p=0;p0){year+=1;} +cal.setYear(year);}};YAHOO.widget.CalendarGroup.prototype.render=function(){this.renderHeader();for(var p=0;p=0;--p){var cal=this.pages[p];cal.previousMonth();}};YAHOO.widget.CalendarGroup.prototype.nextYear=function(){for(var p=0;p 11) { + while (newMonth > 11) { + newMonth -= 12; + years += 1; + } + } + + d.setMonth(newMonth); + d.setFullYear(date.getFullYear() + years); + break; + case this.DAY: + d.setDate(date.getDate() + amount); + break; + case this.YEAR: + d.setFullYear(date.getFullYear() + amount); + break; + case this.WEEK: + d.setDate(date.getDate() + (amount * 7)); + break; + } + return d; + }, + + /** + * Subtracts the specified amount of time from the this instance. + * @method subtract + * @param {Date} date The JavaScript Date object to perform subtraction on + * @param {Number} field The this field constant to be used for performing subtraction. + * @param {Number} amount The number of units (measured in the field constant) to subtract from the date. + * @return {Date} The resulting Date object + */ + subtract : function(date, field, amount) { + return this.add(date, field, (amount*-1)); + }, + + /** + * Determines whether a given date is before another date on the calendar. + * @method before + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs before the compared date; false if not. + */ + before : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() < ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is after another date on the calendar. + * @method after + * @param {Date} date The Date object to compare with the compare argument + * @param {Date} compareTo The Date object to use for the comparison + * @return {Boolean} true if the date occurs after the compared date; false if not. + */ + after : function(date, compareTo) { + var ms = compareTo.getTime(); + if (date.getTime() > ms) { + return true; + } else { + return false; + } + }, + + /** + * Determines whether a given date is between two other dates on the calendar. + * @method between + * @param {Date} date The date to check for + * @param {Date} dateBegin The start of the range + * @param {Date} dateEnd The end of the range + * @return {Boolean} true if the date occurs between the compared dates; false if not. + */ + between : function(date, dateBegin, dateEnd) { + if (this.after(date, dateBegin) && this.before(date, dateEnd)) { + return true; + } else { + return false; + } + }, + + /** + * Retrieves a JavaScript Date object representing January 1 of any given year. + * @method getJan1 + * @param {Number} calendarYear The calendar year for which to retrieve January 1 + * @return {Date} January 1 of the calendar year specified. + */ + getJan1 : function(calendarYear) { + return new Date(calendarYear,0,1); + }, + + /** + * Calculates the number of days the specified date is from January 1 of the specified calendar year. + * Passing January 1 to this function would return an offset value of zero. + * @method getDayOffset + * @param {Date} date The JavaScript date for which to find the offset + * @param {Number} calendarYear The calendar year to use for determining the offset + * @return {Number} The number of days since January 1 of the given year + */ + getDayOffset : function(date, calendarYear) { + var beginYear = this.getJan1(calendarYear); // Find the start of the year. This will be in week 1. + + // Find the number of days the passed in date is away from the calendar year start + var dayOffset = Math.ceil((date.getTime()-beginYear.getTime()) / this.ONE_DAY_MS); + return dayOffset; + }, + + /** + * Calculates the week number for the given date. This function assumes that week 1 is the + * week in which January 1 appears, regardless of whether the week consists of a full 7 days. + * The calendar year can be specified to help find what a the week number would be for a given + * date if the date overlaps years. For instance, a week may be considered week 1 of 2005, or + * week 53 of 2004. Specifying the optional calendarYear allows one to make this distinction + * easily. + * @method getWeekNumber + * @param {Date} date The JavaScript date for which to find the week number + * @param {Number} calendarYear OPTIONAL - The calendar year to use for determining the week number. Default is + * the calendar year of parameter "date". + * @param {Number} weekStartsOn OPTIONAL - The integer (0-6) representing which day a week begins on. Default is 0 (for Sunday). + * @return {Number} The week number of the given date. + */ + getWeekNumber : function(date, calendarYear) { + date = this.clearTime(date); + var nearestThurs = new Date(date.getTime() + (4 * this.ONE_DAY_MS) - ((date.getDay()) * this.ONE_DAY_MS)); + + var jan1 = new Date(nearestThurs.getFullYear(),0,1); + var dayOfYear = ((nearestThurs.getTime() - jan1.getTime()) / this.ONE_DAY_MS) - 1; + + var weekNum = Math.ceil((dayOfYear)/ 7); + return weekNum; + }, + + /** + * Determines if a given week overlaps two different years. + * @method isYearOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different years. + */ + isYearOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getFullYear() != weekBeginDate.getFullYear()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Determines if a given week overlaps two different months. + * @method isMonthOverlapWeek + * @param {Date} weekBeginDate The JavaScript Date representing the first day of the week. + * @return {Boolean} true if the date overlaps two different months. + */ + isMonthOverlapWeek : function(weekBeginDate) { + var overlaps = false; + var nextWeek = this.add(weekBeginDate, this.DAY, 6); + if (nextWeek.getMonth() != weekBeginDate.getMonth()) { + overlaps = true; + } + return overlaps; + }, + + /** + * Gets the first day of a month containing a given date. + * @method findMonthStart + * @param {Date} date The JavaScript Date used to calculate the month start + * @return {Date} The JavaScript Date representing the first day of the month + */ + findMonthStart : function(date) { + var start = new Date(date.getFullYear(), date.getMonth(), 1); + return start; + }, + + /** + * Gets the last day of a month containing a given date. + * @method findMonthEnd + * @param {Date} date The JavaScript Date used to calculate the month end + * @return {Date} The JavaScript Date representing the last day of the month + */ + findMonthEnd : function(date) { + var start = this.findMonthStart(date); + var nextMonth = this.add(start, this.MONTH, 1); + var end = this.subtract(nextMonth, this.DAY, 1); + return end; + }, + + /** + * Clears the time fields from a given date, effectively setting the time to midnight. + * @method clearTime + * @param {Date} date The JavaScript Date for which the time fields will be cleared + * @return {Date} The JavaScript Date cleared of all time fields + */ + clearTime : function(date) { + date.setHours(12,0,0,0); + return date; + } +}; + +/** +* The Calendar component is a UI control that enables users to choose one or more dates from a graphical calendar presented in a one-month ("one-up") or two-month ("two-up") interface. Calendars are generated entirely via script and can be navigated without any page refreshes. +* @module Calendar +* @title Calendar Widget +* @namespace YAHOO.widget +* @requires yahoo,dom,event +*/ + +/** +* Calendar is the base class for the Calendar widget. In its most basic +* implementation, it has the ability to render a calendar widget on the page +* that can be manipulated to select a single date, move back and forth between +* months and years. +*

        To construct the placeholder for the calendar widget, the code is as +* follows: +*

        +* <div id="cal1Container"></div> +* +* Note that the table can be replaced with any kind of element. +*

        +* @namespace YAHOO.widget +* @class Calendar +* @constructor +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.Calendar = function(id, containerId, config) { + this.init(id, containerId, config); +}; + +/** +* The path to be used for images loaded for the Calendar +* @property YAHOO.widget.Calendar.IMG_ROOT +* @static +* @type String +*/ +YAHOO.widget.Calendar.IMG_ROOT = (window.location.href.toLowerCase().indexOf("https") === 0 ? "https://a248.e.akamai.net/sec.yimg.com/i/" : "http://us.i1.yimg.com/us.yimg.com/i/"); + +/** +* Type constant used for renderers to represent an individual date (M/D/Y) +* @property YAHOO.widget.Calendar.DATE +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.DATE = "D"; + +/** +* Type constant used for renderers to represent an individual date across any year (M/D) +* @property YAHOO.widget.Calendar.MONTH_DAY +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MONTH_DAY = "MD"; + +/** +* Type constant used for renderers to represent a weekday +* @property YAHOO.widget.Calendar.WEEKDAY +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.WEEKDAY = "WD"; + +/** +* Type constant used for renderers to represent a range of individual dates (M/D/Y-M/D/Y) +* @property YAHOO.widget.Calendar.RANGE +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.RANGE = "R"; + +/** +* Type constant used for renderers to represent a month across any year +* @property YAHOO.widget.Calendar.MONTH +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.MONTH = "M"; + +/** +* Constant that represents the total number of date cells that are displayed in a given month +* @property YAHOO.widget.Calendar.DISPLAY_DAYS +* @static +* @final +* @type Number +*/ +YAHOO.widget.Calendar.DISPLAY_DAYS = 42; + +/** +* Constant used for halting the execution of the remainder of the render stack +* @property YAHOO.widget.Calendar.STOP_RENDER +* @static +* @final +* @type String +*/ +YAHOO.widget.Calendar.STOP_RENDER = "S"; + +YAHOO.widget.Calendar.prototype = { + + /** + * The configuration object used to set up the calendars various locale and style options. + * @property Config + * @private + * @deprecated Configuration properties should be set by calling Calendar.cfg.setProperty. + * @type Object + */ + Config : null, + + /** + * The parent CalendarGroup, only to be set explicitly by the parent group + * @property parent + * @type CalendarGroup + */ + parent : null, + + /** + * The index of this item in the parent group + * @property index + * @type Number + */ + index : -1, + + /** + * The collection of calendar table cells + * @property cells + * @type HTMLTableCellElement[] + */ + cells : null, + + /** + * The collection of calendar cell dates that is parallel to the cells collection. The array contains dates field arrays in the format of [YYYY, M, D]. + * @property cellDates + * @type Array[](Number[]) + */ + cellDates : null, + + /** + * The id that uniquely identifies this calendar. This id should match the id of the placeholder element on the page. + * @property id + * @type String + */ + id : null, + + /** + * The DOM element reference that points to this calendar's container element. The calendar will be inserted into this element when the shell is rendered. + * @property oDomContainer + * @type HTMLElement + */ + oDomContainer : null, + + /** + * A Date object representing today's date. + * @property today + * @type Date + */ + today : null, + + /** + * The list of render functions, along with required parameters, used to render cells. + * @property renderStack + * @type Array[] + */ + renderStack : null, + + /** + * A copy of the initial render functions created before rendering. + * @property _renderStack + * @private + * @type Array + */ + _renderStack : null, + + /** + * A Date object representing the month/year that the calendar is initially set to + * @property _pageDate + * @private + * @type Date + */ + _pageDate : null, + + /** + * The private list of initially selected dates. + * @property _selectedDates + * @private + * @type Array + */ + _selectedDates : null, + + /** + * A map of DOM event handlers to attach to cells associated with specific CSS class names + * @property domEventMap + * @type Object + */ + domEventMap : null +}; + + + +/** +* Initializes the Calendar widget. +* @method init +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.Calendar.prototype.init = function(id, containerId, config) { + this.initEvents(); + this.today = new Date(); + YAHOO.widget.DateMath.clearTime(this.today); + + this.id = id; + this.oDomContainer = document.getElementById(containerId); + + /** + * The Config object used to hold the configuration variables for the Calendar + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the Calendar's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the Calendar's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.initStyles(); + + YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_CONTAINER); + YAHOO.util.Dom.addClass(this.oDomContainer, this.Style.CSS_SINGLE); + + this.cellDates = []; + this.cells = []; + this.renderStack = []; + this._renderStack = []; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); +}; + +/** +* Renders the built-in IFRAME shim for the IE6 and below +* @method configIframe +*/ +YAHOO.widget.Calendar.prototype.configIframe = function(type, args, obj) { + var useIframe = args[0]; + + if (YAHOO.util.Dom.inDocument(this.oDomContainer)) { + if (useIframe) { + var pos = YAHOO.util.Dom.getStyle(this.oDomContainer, "position"); + + if (this.browser == "ie" && (pos == "absolute" || pos == "relative")) { + if (! YAHOO.util.Dom.inDocument(this.iframe)) { + this.iframe = document.createElement("iframe"); + this.iframe.src = "javascript:false;"; + YAHOO.util.Dom.setStyle(this.iframe, "opacity", "0"); + this.oDomContainer.insertBefore(this.iframe, this.oDomContainer.firstChild); + } + } + } else { + if (this.iframe) { + if (this.iframe.parentNode) { + this.iframe.parentNode.removeChild(this.iframe); + } + this.iframe = null; + } + } + } +}; + +/** +* Default handler for the "title" property +* @method configTitle +*/ +YAHOO.widget.Calendar.prototype.configTitle = function(type, args, obj) { + var title = args[0]; + var close = this.cfg.getProperty("close"); + + var titleDiv; + + if (title && title !== "") { + titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || document.createElement("div"); + titleDiv.className = YAHOO.widget.CalendarGroup.CSS_2UPTITLE; + titleDiv.innerHTML = title; + this.oDomContainer.insertBefore(titleDiv, this.oDomContainer.firstChild); + YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle"); + } else { + titleDiv = YAHOO.util.Dom.getElementsByClassName(YAHOO.widget.CalendarGroup.CSS_2UPTITLE, "div", this.oDomContainer)[0] || null; + + if (titleDiv) { + YAHOO.util.Event.purgeElement(titleDiv); + this.oDomContainer.removeChild(titleDiv); + } + if (! close) { + YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle"); + } + } +}; + +/** +* Default handler for the "close" property +* @method configClose +*/ +YAHOO.widget.Calendar.prototype.configClose = function(type, args, obj) { + var close = args[0]; + var title = this.cfg.getProperty("title"); + + var linkClose; + + if (close === true) { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || document.createElement("a"); + linkClose.href = "javascript:void(null);"; + linkClose.className = "link-close"; + YAHOO.util.Event.addListener(linkClose, "click", this.hide, this, true); + var imgClose = document.createElement("img"); + imgClose.src = YAHOO.widget.Calendar.IMG_ROOT + "us/my/bn/x_d.gif"; + imgClose.className = YAHOO.widget.CalendarGroup.CSS_2UPCLOSE; + linkClose.appendChild(imgClose); + this.oDomContainer.appendChild(linkClose); + YAHOO.util.Dom.addClass(this.oDomContainer, "withtitle"); + } else { + linkClose = YAHOO.util.Dom.getElementsByClassName("link-close", "a", this.oDomContainer)[0] || null; + + if (linkClose) { + YAHOO.util.Event.purgeElement(linkClose); + this.oDomContainer.removeChild(linkClose); + } + if (! title || title === "") { + YAHOO.util.Dom.removeClass(this.oDomContainer, "withtitle"); + } + } +}; + +/** +* Initializes Calendar's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.Calendar.prototype.initEvents = function() { + + /** + * Fired before a selection is made + * @event beforeSelectEvent + */ + this.beforeSelectEvent = new YAHOO.util.CustomEvent("beforeSelect"); + + /** + * Fired when a selection is made + * @event selectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + this.selectEvent = new YAHOO.util.CustomEvent("select"); + + /** + * Fired before a selection is made + * @event beforeDeselectEvent + */ + this.beforeDeselectEvent = new YAHOO.util.CustomEvent("beforeDeselect"); + + /** + * Fired when a selection is made + * @event deselectEvent + * @param {Array} Array of Date field arrays in the format [YYYY, MM, DD]. + */ + this.deselectEvent = new YAHOO.util.CustomEvent("deselect"); + + /** + * Fired when the Calendar page is changed + * @event changePageEvent + */ + this.changePageEvent = new YAHOO.util.CustomEvent("changePage"); + + /** + * Fired before the Calendar is rendered + * @event beforeRenderEvent + */ + this.beforeRenderEvent = new YAHOO.util.CustomEvent("beforeRender"); + + /** + * Fired when the Calendar is rendered + * @event renderEvent + */ + this.renderEvent = new YAHOO.util.CustomEvent("render"); + + /** + * Fired when the Calendar is reset + * @event resetEvent + */ + this.resetEvent = new YAHOO.util.CustomEvent("reset"); + + /** + * Fired when the Calendar is cleared + * @event clearEvent + */ + this.clearEvent = new YAHOO.util.CustomEvent("clear"); + + this.beforeSelectEvent.subscribe(this.onBeforeSelect, this, true); + this.selectEvent.subscribe(this.onSelect, this, true); + this.beforeDeselectEvent.subscribe(this.onBeforeDeselect, this, true); + this.deselectEvent.subscribe(this.onDeselect, this, true); + this.changePageEvent.subscribe(this.onChangePage, this, true); + this.renderEvent.subscribe(this.onRender, this, true); + this.resetEvent.subscribe(this.onReset, this, true); + this.clearEvent.subscribe(this.onClear, this, true); +}; + + +/** +* The default event function that is attached to a date link within a calendar cell +* when the calendar is rendered. +* @method doSelectCell +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doSelectCell = function(e, cal) { + var target = YAHOO.util.Event.getTarget(e); + + var cell,index,d,date; + + while (target.tagName.toLowerCase() != "td" && ! YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + cell = target; + + if (YAHOO.util.Dom.hasClass(cell, cal.Style.CSS_CELL_SELECTABLE)) { + index = cell.id.split("cell")[1]; + d = cal.cellDates[index]; + date = new Date(d[0],d[1]-1,d[2]); + + var link; + + if (cal.Options.MULTI_SELECT) { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + + var cellDate = cal.cellDates[index]; + var cellDateIndex = cal._indexOfSelectedFieldArray(cellDate); + + if (cellDateIndex > -1) { + cal.deselectCell(index); + } else { + cal.selectCell(index); + } + + } else { + link = cell.getElementsByTagName("a")[0]; + if (link) { + link.blur(); + } + cal.selectCell(index); + } + } +}; + +/** +* The event that is executed when the user hovers over a cell +* @method doCellMouseOver +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doCellMouseOver = function(e, cal) { + var target; + if (e) { + target = YAHOO.util.Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + YAHOO.util.Dom.addClass(target, cal.Style.CSS_CELL_HOVER); + } +}; + +/** +* The event that is executed when the user moves the mouse out of a cell +* @method doCellMouseOut +* @param {DOMEvent} e The event +* @param {Calendar} cal A reference to the calendar passed by the Event utility +*/ +YAHOO.widget.Calendar.prototype.doCellMouseOut = function(e, cal) { + var target; + if (e) { + target = YAHOO.util.Event.getTarget(e); + } else { + target = this; + } + + while (target.tagName.toLowerCase() != "td") { + target = target.parentNode; + if (target.tagName.toLowerCase() == "html") { + return; + } + } + + if (YAHOO.util.Dom.hasClass(target, cal.Style.CSS_CELL_SELECTABLE)) { + YAHOO.util.Dom.removeClass(target, cal.Style.CSS_CELL_HOVER); + } +}; + +YAHOO.widget.Calendar.prototype.setupConfig = function() { + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * @config selected + * @type String + * @default [] + */ + this.cfg.addProperty("selected", { value:[], handler:this.configSelected } ); + + /** + * The title to display above the Calendar's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty("title", { value:"", handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this Calendar + * @config close + * @type Boolean + * @default false + */ + this.cfg.addProperty("close", { value:false, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * @config iframe + * @type Boolean + * @default true + */ + this.cfg.addProperty("iframe", { value:true, handler:this.configIframe, validator:this.cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String + * @default null + */ + this.cfg.addProperty("mindate", { value:null, handler:this.configMinDate } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty("maxdate", { value:null, handler:this.configMaxDate } ); + + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + this.cfg.addProperty("MULTI_SELECT", { value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + this.cfg.addProperty("START_WEEKDAY", { value:0, handler:this.configOptions, validator:this.cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + this.cfg.addProperty("SHOW_WEEKDAYS", { value:true, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.configOptions, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif" + */ + this.cfg.addProperty("NAV_ARROW_LEFT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.configOptions } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif" + */ + this.cfg.addProperty("NAV_ARROW_RIGHT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.configOptions } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + this.cfg.addProperty("MONTHS_SHORT", { value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.configLocale } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + this.cfg.addProperty("MONTHS_LONG", { value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.configLocale } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + this.cfg.addProperty("WEEKDAYS_1CHAR", { value:["S", "M", "T", "W", "T", "F", "S"], handler:this.configLocale } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + this.cfg.addProperty("WEEKDAYS_SHORT", { value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.configLocale } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + this.cfg.addProperty("WEEKDAYS_MEDIUM", { value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.configLocale } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + this.cfg.addProperty("WEEKDAYS_LONG", { value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.configLocale } ); + + /** + * Refreshes the locale values used to build the Calendar. + * @method refreshLocale + * @private + */ + var refreshLocale = function() { + this.cfg.refireEvent("LOCALE_MONTHS"); + this.cfg.refireEvent("LOCALE_WEEKDAYS"); + }; + + this.cfg.subscribeToConfigEvent("START_WEEKDAY", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("MONTHS_SHORT", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("MONTHS_LONG", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_1CHAR", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_SHORT", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_MEDIUM", refreshLocale, this, true); + this.cfg.subscribeToConfigEvent("WEEKDAYS_LONG", refreshLocale, this, true); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + this.cfg.addProperty("LOCALE_MONTHS", { value:"long", handler:this.configLocaleValues } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + this.cfg.addProperty("LOCALE_WEEKDAYS", { value:"short", handler:this.configLocaleValues } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + this.cfg.addProperty("DATE_DELIMITER", { value:",", handler:this.configLocale } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.configLocale } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.configLocale } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MY_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MY_YEAR_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MD_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MD_DAY_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MDY_MONTH_POSITION", { value:1, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MDY_DAY_POSITION", { value:2, handler:this.configLocale, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + this.cfg.addProperty("MDY_YEAR_POSITION", { value:3, handler:this.configLocale, validator:this.cfg.checkNumber } ); +}; + +/** +* The default handler for the "pagedate" property +* @method configPageDate +*/ +YAHOO.widget.Calendar.prototype.configPageDate = function(type, args, obj) { + var val = args[0]; + var month, year, aMonthYear; + + if (val) { + if (val instanceof Date) { + val = YAHOO.widget.DateMath.findMonthStart(val); + this.cfg.setProperty("pagedate", val, true); + if (! this._pageDate) { + this._pageDate = this.cfg.getProperty("pagedate"); + } + return; + } else { + aMonthYear = val.split(this.cfg.getProperty("DATE_FIELD_DELIMITER")); + month = parseInt(aMonthYear[this.cfg.getProperty("MY_MONTH_POSITION")-1], 10)-1; + year = parseInt(aMonthYear[this.cfg.getProperty("MY_YEAR_POSITION")-1], 10); + } + } else { + month = this.today.getMonth(); + year = this.today.getFullYear(); + } + + this.cfg.setProperty("pagedate", new Date(year, month, 1), true); + if (! this._pageDate) { + this._pageDate = this.cfg.getProperty("pagedate"); + } +}; + +/** +* The default handler for the "mindate" property +* @method configMinDate +*/ +YAHOO.widget.Calendar.prototype.configMinDate = function(type, args, obj) { + var val = args[0]; + if (typeof val == 'string') { + val = this._parseDate(val); + this.cfg.setProperty("mindate", new Date(val[0],(val[1]-1),val[2])); + } +}; + +/** +* The default handler for the "maxdate" property +* @method configMaxDate +*/ +YAHOO.widget.Calendar.prototype.configMaxDate = function(type, args, obj) { + var val = args[0]; + if (typeof val == 'string') { + val = this._parseDate(val); + this.cfg.setProperty("maxdate", new Date(val[0],(val[1]-1),val[2])); + } +}; + +/** +* The default handler for the "selected" property +* @method configSelected +*/ +YAHOO.widget.Calendar.prototype.configSelected = function(type, args, obj) { + var selected = args[0]; + + if (selected) { + if (typeof selected == 'string') { + this.cfg.setProperty("selected", this._parseDates(selected), true); + } + } + if (! this._selectedDates) { + this._selectedDates = this.cfg.getProperty("selected"); + } +}; + +/** +* The default handler for all configuration options properties +* @method configOptions +*/ +YAHOO.widget.Calendar.prototype.configOptions = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + this.Options[type] = val; +}; + +/** +* The default handler for all configuration locale properties +* @method configLocale +*/ +YAHOO.widget.Calendar.prototype.configLocale = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + this.Locale[type] = val; + + this.cfg.refireEvent("LOCALE_MONTHS"); + this.cfg.refireEvent("LOCALE_WEEKDAYS"); + +}; + +/** +* The default handler for all configuration locale field length properties +* @method configLocaleValues +*/ +YAHOO.widget.Calendar.prototype.configLocaleValues = function(type, args, obj) { + type = type.toUpperCase(); + var val = args[0]; + + switch (type) { + case "LOCALE_MONTHS": + switch (val) { + case "short": + this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_SHORT").concat(); + break; + case "long": + this.Locale.LOCALE_MONTHS = this.cfg.getProperty("MONTHS_LONG").concat(); + break; + } + break; + case "LOCALE_WEEKDAYS": + switch (val) { + case "1char": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_1CHAR").concat(); + break; + case "short": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_SHORT").concat(); + break; + case "medium": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_MEDIUM").concat(); + break; + case "long": + this.Locale.LOCALE_WEEKDAYS = this.cfg.getProperty("WEEKDAYS_LONG").concat(); + break; + } + + var START_WEEKDAY = this.cfg.getProperty("START_WEEKDAY"); + + if (START_WEEKDAY > 0) { + for (var w=0;w'; + html[html.length] = '
        '; + + var renderLeft, renderRight = false; + + if (this.parent) { + if (this.index === 0) { + renderLeft = true; + } + if (this.index == (this.parent.cfg.getProperty("pages") -1)) { + renderRight = true; + } + } else { + renderLeft = true; + renderRight = true; + } + + var cal = this.parent || this; + + if (renderLeft) { + html[html.length] = ' '; + } + + html[html.length] = this.buildMonthLabel(); + + if (renderRight) { + html[html.length] = ' '; + } + + + html[html.length] = '
        '; + html[html.length] = ''; + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEKDAYS")) { + html = this.buildWeekdays(html); + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the Calendar's weekday headers. +* @method buildWeekdays +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.buildWeekdays = function(html) { + + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { + html[html.length] = ' '; + } + + for(var i=0;i'; + } + + if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { + html[html.length] = ' '; + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the calendar body. +* @method renderBody +* @param {Date} workingDate The current working Date being used for the render process +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderBody = function(workingDate, html) { + + var startDay = this.cfg.getProperty("START_WEEKDAY"); + + this.preMonthDays = workingDate.getDay(); + if (startDay > 0) { + this.preMonthDays -= startDay; + } + if (this.preMonthDays < 0) { + this.preMonthDays += 7; + } + + this.monthDays = YAHOO.widget.DateMath.findMonthEnd(workingDate).getDate(); + this.postMonthDays = YAHOO.widget.Calendar.DISPLAY_DAYS-this.preMonthDays-this.monthDays; + + workingDate = YAHOO.widget.DateMath.subtract(workingDate, YAHOO.widget.DateMath.DAY, this.preMonthDays); + + var useDate,weekNum,weekClass; + useDate = this.cfg.getProperty("pagedate"); + + html[html.length] = ''; + + var i = 0; + + var tempDiv = document.createElement("div"); + var cell = document.createElement("td"); + tempDiv.appendChild(cell); + + var jan1 = new Date(useDate.getFullYear(),0,1); + + var cal = this.parent || this; + + for (var r=0;r<6;r++) { + + weekNum = YAHOO.widget.DateMath.getWeekNumber(workingDate, useDate.getFullYear(), startDay); + + weekClass = "w" + weekNum; + + if (r !== 0 && this.isDateOOM(workingDate) && this.cfg.getProperty("HIDE_BLANK_WEEKS") === true) { + break; + } else { + + html[html.length] = ''; + + if (this.cfg.getProperty("SHOW_WEEK_HEADER")) { html = this.renderRowHeader(weekNum, html); } + + for (var d=0;d<7;d++){ // Render actual days + + var cellRenderers = []; + + this.clearElement(cell); + + YAHOO.util.Dom.addClass(cell, "calcell"); + + cell.id = this.id + "_cell" + i; + + cell.innerHTML = i; + + var renderer = null; + + if (workingDate.getFullYear() == this.today.getFullYear() && + workingDate.getMonth() == this.today.getMonth() && + workingDate.getDate() == this.today.getDate()) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleToday; + } + + this.cellDates[this.cellDates.length]=[workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]; // Add this date to cellDates + + if (this.isDateOOM(workingDate)) { + cellRenderers[cellRenderers.length]=cal.renderCellNotThisMonth; + } else { + + YAHOO.util.Dom.addClass(cell, "wd" + workingDate.getDay()); + YAHOO.util.Dom.addClass(cell, "d" + workingDate.getDate()); + + for (var s=0;s= d1.getTime() && workingDate.getTime() <= d2.getTime()) { + renderer = rArray[2]; + + if (workingDate.getTime()==d2.getTime()) { + this.renderStack.splice(s,1); + } + } + break; + case YAHOO.widget.Calendar.WEEKDAY: + + var weekday = rArray[1][0]; + if (workingDate.getDay()+1 == weekday) { + renderer = rArray[2]; + } + break; + case YAHOO.widget.Calendar.MONTH: + + month = rArray[1][0]; + if (workingDate.getMonth()+1 == month) { + renderer = rArray[2]; + } + break; + } + + if (renderer) { + cellRenderers[cellRenderers.length]=renderer; + } + } + + } + + if (this._indexOfSelectedFieldArray([workingDate.getFullYear(),workingDate.getMonth()+1,workingDate.getDate()]) > -1) { + cellRenderers[cellRenderers.length]=cal.renderCellStyleSelected; + } + + var mindate = this.cfg.getProperty("mindate"); + var maxdate = this.cfg.getProperty("maxdate"); + + if (mindate) { + mindate = YAHOO.widget.DateMath.clearTime(mindate); + } + if (maxdate) { + maxdate = YAHOO.widget.DateMath.clearTime(maxdate); + } + + if ( + (mindate && (workingDate.getTime() < mindate.getTime())) || + (maxdate && (workingDate.getTime() > maxdate.getTime())) + ) { + cellRenderers[cellRenderers.length]=cal.renderOutOfBoundsDate; + } else { + cellRenderers[cellRenderers.length]=cal.styleCellDefault; + cellRenderers[cellRenderers.length]=cal.renderCellDefault; + } + + + + for (var x=0;x= 0 && i <= 6) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TOP); + } + if ((i % 7) === 0) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_LEFT); + } + if (((i+1) % 7) === 0) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RIGHT); + } + + var postDays = this.postMonthDays; + if (postDays >= 7 && this.cfg.getProperty("HIDE_BLANK_WEEKS")) { + var blankWeeks = Math.floor(postDays/7); + for (var p=0;p= ((this.preMonthDays+postDays+this.monthDays)-7)) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_BOTTOM); + } + + html[html.length] = tempDiv.innerHTML; + + i++; + } + + if (this.cfg.getProperty("SHOW_WEEK_FOOTER")) { html = this.renderRowFooter(weekNum, html); } + + html[html.length] = ''; + } + } + + html[html.length] = ''; + + return html; +}; + +/** +* Renders the calendar footer. In the default implementation, there is +* no footer. +* @method renderFooter +* @param {Array} html The current working HTML array +* @return {Array} The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderFooter = function(html) { return html; }; + +/** +* Renders the calendar after it has been configured. The render() method has a specific call chain that will execute +* when the method is called: renderHeader, renderBody, renderFooter. +* Refer to the documentation for those methods for information on +* individual render tasks. +* @method render +*/ +YAHOO.widget.Calendar.prototype.render = function() { + this.beforeRenderEvent.fire(); + + // Find starting day of the current month + var workingDate = YAHOO.widget.DateMath.findMonthStart(this.cfg.getProperty("pagedate")); + + this.resetRenderers(); + this.cellDates.length = 0; + + YAHOO.util.Event.purgeElement(this.oDomContainer, true); + + var html = []; + + html[html.length] = ''; + html = this.renderHeader(html); + html = this.renderBody(workingDate, html); + html = this.renderFooter(html); + html[html.length] = '
        '; + + this.oDomContainer.innerHTML = html.join("\n"); + + this.applyListeners(); + this.cells = this.oDomContainer.getElementsByTagName("td"); + + this.cfg.refireEvent("title"); + this.cfg.refireEvent("close"); + this.cfg.refireEvent("iframe"); + + this.renderEvent.fire(); +}; + +/** +* Applies the Calendar's DOM listeners to applicable elements. +* @method applyListeners +*/ +YAHOO.widget.Calendar.prototype.applyListeners = function() { + + var root = this.oDomContainer; + var cal = this.parent || this; + + var linkLeft, linkRight; + + linkLeft = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_LEFT, "a", root); + linkRight = YAHOO.util.Dom.getElementsByClassName(this.Style.CSS_NAV_RIGHT, "a", root); + + if (linkLeft) { + this.linkLeft = linkLeft[0]; + YAHOO.util.Event.addListener(this.linkLeft, "mousedown", cal.previousMonth, cal, true); + } + + if (linkRight) { + this.linkRight = linkRight[0]; + YAHOO.util.Event.addListener(this.linkRight, "mousedown", cal.nextMonth, cal, true); + } + + if (this.domEventMap) { + var el,elements; + for (var cls in this.domEventMap) { + if (this.domEventMap.hasOwnProperty(cls)) { + var items = this.domEventMap[cls]; + + if (! (items instanceof Array)) { + items = [items]; + } + + for (var i=0;i'; + return html; +}; + +/** +* Renders the row footer for a week. +* @method renderRowFooter +* @param {Number} weekNum The week number of the current row +* @param {Array} cell The current working HTML array +*/ +YAHOO.widget.Calendar.prototype.renderRowFooter = function(weekNum, html) { + html[html.length] = '' + weekNum + ''; + return html; +}; + +/** +* Renders a single standard calendar cell in the calendar widget table. +* All logic for determining how a standard default cell will be rendered is +* encapsulated in this method, and must be accounted for when extending the +* widget class. +* @method renderCellDefault +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellDefault = function(workingDate, cell) { + cell.innerHTML = '' + this.buildDayLabel(workingDate) + ""; +}; + +/** +* Styles a selectable cell. +* @method styleCellDefault +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.styleCellDefault = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTABLE); +}; + + +/** +* Renders a single standard calendar cell using the CSS hightlight1 style +* @method renderCellStyleHighlight1 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight1 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT1); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight2 style +* @method renderCellStyleHighlight2 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight2 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT2); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight3 style +* @method renderCellStyleHighlight3 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight3 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT3); +}; + +/** +* Renders a single standard calendar cell using the CSS hightlight4 style +* @method renderCellStyleHighlight4 +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleHighlight4 = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_HIGHLIGHT4); +}; + +/** +* Applies the default style used for rendering today's date to the current calendar cell +* @method renderCellStyleToday +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleToday = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_TODAY); +}; + +/** +* Applies the default style used for rendering selected dates to the current calendar cell +* @method renderCellStyleSelected +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderCellStyleSelected = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_SELECTED); +}; + +/** +* Applies the default style used for rendering dates that are not a part of the current +* month (preceding or trailing the cells for the current month) +* @method renderCellNotThisMonth +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderCellNotThisMonth = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_OOM); + cell.innerHTML=workingDate.getDate(); + return YAHOO.widget.Calendar.STOP_RENDER; +}; + +/** +* Renders the current calendar cell as a non-selectable "black-out" date using the default +* restricted style. +* @method renderBodyCellRestricted +* @param {Date} workingDate The current working Date object being used to generate the calendar +* @param {HTMLTableCellElement} cell The current working cell in the calendar +* @return {String} YAHOO.widget.Calendar.STOP_RENDER if rendering should stop with this style, null or nothing if rendering +* should not be terminated +*/ +YAHOO.widget.Calendar.prototype.renderBodyCellRestricted = function(workingDate, cell) { + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL); + YAHOO.util.Dom.addClass(cell, this.Style.CSS_CELL_RESTRICTED); + cell.innerHTML=workingDate.getDate(); + return YAHOO.widget.Calendar.STOP_RENDER; +}; + +// END BUILT-IN TABLE CELL RENDERERS + +// BEGIN MONTH NAVIGATION METHODS + +/** +* Adds the designated number of months to the current calendar month, and sets the current +* calendar page date to the new month. +* @method addMonths +* @param {Number} count The number of months to add to the current calendar +*/ +YAHOO.widget.Calendar.prototype.addMonths = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Subtracts the designated number of months from the current calendar month, and sets the current +* calendar page date to the new month. +* @method subtractMonths +* @param {Number} count The number of months to subtract from the current calendar +*/ +YAHOO.widget.Calendar.prototype.subtractMonths = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.MONTH, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Adds the designated number of years to the current calendar, and sets the current +* calendar page date to the new month. +* @method addYears +* @param {Number} count The number of years to add to the current calendar +*/ +YAHOO.widget.Calendar.prototype.addYears = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.add(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Subtcats the designated number of years from the current calendar, and sets the current +* calendar page date to the new month. +* @method subtractYears +* @param {Number} count The number of years to subtract from the current calendar +*/ +YAHOO.widget.Calendar.prototype.subtractYears = function(count) { + this.cfg.setProperty("pagedate", YAHOO.widget.DateMath.subtract(this.cfg.getProperty("pagedate"), YAHOO.widget.DateMath.YEAR, count)); + this.resetRenderers(); + this.changePageEvent.fire(); +}; + +/** +* Navigates to the next month page in the calendar widget. +* @method nextMonth +*/ +YAHOO.widget.Calendar.prototype.nextMonth = function() { + this.addMonths(1); +}; + +/** +* Navigates to the previous month page in the calendar widget. +* @method previousMonth +*/ +YAHOO.widget.Calendar.prototype.previousMonth = function() { + this.subtractMonths(1); +}; + +/** +* Navigates to the next year in the currently selected month in the calendar widget. +* @method nextYear +*/ +YAHOO.widget.Calendar.prototype.nextYear = function() { + this.addYears(1); +}; + +/** +* Navigates to the previous year in the currently selected month in the calendar widget. +* @method previousYear +*/ +YAHOO.widget.Calendar.prototype.previousYear = function() { + this.subtractYears(1); +}; + +// END MONTH NAVIGATION METHODS + +// BEGIN SELECTION METHODS + +/** +* Resets the calendar widget to the originally selected month and year, and +* sets the calendar to the initial selection(s). +* @method reset +*/ +YAHOO.widget.Calendar.prototype.reset = function() { + this.cfg.resetProperty("selected"); + this.cfg.resetProperty("pagedate"); + this.resetEvent.fire(); +}; + +/** +* Clears the selected dates in the current calendar widget and sets the calendar +* to the current month and year. +* @method clear +*/ +YAHOO.widget.Calendar.prototype.clear = function() { + this.cfg.setProperty("selected", []); + this.cfg.setProperty("pagedate", new Date(this.today.getTime())); + this.clearEvent.fire(); +}; + +/** +* Selects a date or a collection of dates on the current calendar. This method, by default, +* does not call the render method explicitly. Once selection has completed, render must be +* called for the changes to be reflected visually. +* @method select +* @param {String/Date/Date[]} date The date string of dates to select in the current calendar. Valid formats are +* individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). +* Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). +* This method can also take a JavaScript Date object or an array of Date objects. +* @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. +*/ +YAHOO.widget.Calendar.prototype.select = function(date) { + this.beforeSelectEvent.fire(); + + var selected = this.cfg.getProperty("selected"); + var aToBeSelected = this._toFieldArray(date); + + for (var a=0;a -1) { + if (this.cfg.getProperty("pagedate").getMonth() == dCellDate.getMonth() && + this.cfg.getProperty("pagedate").getFullYear() == dCellDate.getFullYear()) { + YAHOO.util.Dom.removeClass(cell, this.Style.CSS_CELL_SELECTED); + } + + selected.splice(cellDateIndex, 1); + } + + + if (this.parent) { + this.parent.cfg.setProperty("selected", selected); + } else { + this.cfg.setProperty("selected", selected); + } + + this.deselectEvent.fire(selectDate); + return this.getSelectedDates(); +}; + +/** +* Deselects all dates on the current calendar. +* @method deselectAll +* @return {Date[]} Array of JavaScript Date objects representing all individual dates that are currently selected. +* Assuming that this function executes properly, the return value should be an empty array. +* However, the empty array is returned for the sake of being able to check the selection status +* of the calendar. +*/ +YAHOO.widget.Calendar.prototype.deselectAll = function() { + this.beforeDeselectEvent.fire(); + + var selected = this.cfg.getProperty("selected"); + var count = selected.length; + var sel = selected.concat(); + + if (this.parent) { + this.parent.cfg.setProperty("selected", []); + } else { + this.cfg.setProperty("selected", []); + } + + if (count > 0) { + this.deselectEvent.fire(sel); + } + + return this.getSelectedDates(); +}; + +// END SELECTION METHODS + +// BEGIN TYPE CONVERSION METHODS + +/** +* Converts a date (either a JavaScript Date object, or a date string) to the internal data structure +* used to represent dates: [[yyyy,mm,dd],[yyyy,mm,dd]]. +* @method _toFieldArray +* @private +* @param {String/Date/Date[]} date The date string of dates to deselect in the current calendar. Valid formats are +* individual date(s) (12/24/2005,12/26/2005) or date range(s) (12/24/2005-1/1/2006). +* Multiple comma-delimited dates can also be passed to this method (12/24/2005,12/11/2005-12/13/2005). +* This method can also take a JavaScript Date object or an array of Date objects. +* @return {Array[](Number[])} Array of date field arrays +*/ +YAHOO.widget.Calendar.prototype._toFieldArray = function(date) { + var returnDate = []; + + if (date instanceof Date) { + returnDate = [[date.getFullYear(), date.getMonth()+1, date.getDate()]]; + } else if (typeof date == 'string') { + returnDate = this._parseDates(date); + } else if (date instanceof Array) { + for (var i=0;i +*
        +*
        +* +* The tables for the calendars ("cal1_0" and "cal1_1") will be inserted into those containers. +* @namespace YAHOO.widget +* @class CalendarGroup +* @constructor +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.CalendarGroup = function(id, containerId, config) { + if (arguments.length > 0) { + this.init(id, containerId, config); + } +}; + +/** +* Initializes the calendar group. All subclasses must call this method in order for the +* group to be initialized properly. +* @method init +* @param {String} id The id of the table element that will represent the calendar widget +* @param {String} containerId The id of the container div element that will wrap the calendar table +* @param {Object} config The configuration object containing the Calendar's arguments +*/ +YAHOO.widget.CalendarGroup.prototype.init = function(id, containerId, config) { + this.initEvents(); + this.initStyles(); + + /** + * The collection of Calendar pages contained within the CalendarGroup + * @property pages + * @type YAHOO.widget.Calendar[] + */ + this.pages = []; + + /** + * The unique id associated with the CalendarGroup + * @property id + * @type String + */ + this.id = id; + + /** + * The unique id associated with the CalendarGroup container + * @property containerId + * @type String + */ + this.containerId = containerId; + + /** + * The outer containing element for the CalendarGroup + * @property oDomContainer + * @type HTMLElement + */ + this.oDomContainer = document.getElementById(containerId); + + YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_CONTAINER); + YAHOO.util.Dom.addClass(this.oDomContainer, YAHOO.widget.CalendarGroup.CSS_MULTI_UP); + + /** + * The Config object used to hold the configuration variables for the CalendarGroup + * @property cfg + * @type YAHOO.util.Config + */ + this.cfg = new YAHOO.util.Config(this); + + /** + * The local object which contains the CalendarGroup's options + * @property Options + * @type Object + */ + this.Options = {}; + + /** + * The local object which contains the CalendarGroup's locale settings + * @property Locale + * @type Object + */ + this.Locale = {}; + + this.setupConfig(); + + if (config) { + this.cfg.applyConfig(config, true); + } + + this.cfg.fireQueue(); + + // OPERA HACK FOR MISWRAPPED FLOATS + if (this.browser == "opera"){ + var fixWidth = function() { + var startW = this.oDomContainer.offsetWidth; + var w = 0; + for (var p=0;p 0) { + this.oDomContainer.style.width = w + "px"; + } + }; + this.renderEvent.subscribe(fixWidth,this,true); + } +}; + + +YAHOO.widget.CalendarGroup.prototype.setupConfig = function() { + /** + * The number of pages to include in the CalendarGroup. This value can only be set once, in the CalendarGroup's constructor arguments. + * @config pages + * @type Number + * @default 2 + */ + this.cfg.addProperty("pages", { value:2, validator:this.cfg.checkNumber, handler:this.configPages } ); + + /** + * The month/year representing the current visible Calendar date (mm/yyyy) + * @config pagedate + * @type String + * @default today's date + */ + this.cfg.addProperty("pagedate", { value:new Date(), handler:this.configPageDate } ); + + /** + * The date or range of dates representing the current Calendar selection + * @config selected + * @type String + * @default [] + */ + this.cfg.addProperty("selected", { value:[], handler:this.delegateConfig } ); + + /** + * The title to display above the CalendarGroup's month header + * @config title + * @type String + * @default "" + */ + this.cfg.addProperty("title", { value:"", handler:this.configTitle } ); + + /** + * Whether or not a close button should be displayed for this CalendarGroup + * @config close + * @type Boolean + * @default false + */ + this.cfg.addProperty("close", { value:false, handler:this.configClose } ); + + /** + * Whether or not an iframe shim should be placed under the Calendar to prevent select boxes from bleeding through in Internet Explorer 6 and below. + * @config iframe + * @type Boolean + * @default true + */ + this.cfg.addProperty("iframe", { value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The minimum selectable date in the current Calendar (mm/dd/yyyy) + * @config mindate + * @type String + * @default null + */ + this.cfg.addProperty("mindate", { value:null, handler:this.delegateConfig } ); + + /** + * The maximum selectable date in the current Calendar (mm/dd/yyyy) + * @config maxdate + * @type String + * @default null + */ + this.cfg.addProperty("maxdate", { value:null, handler:this.delegateConfig } ); + + // Options properties + + /** + * True if the Calendar should allow multiple selections. False by default. + * @config MULTI_SELECT + * @type Boolean + * @default false + */ + this.cfg.addProperty("MULTI_SELECT", { value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The weekday the week begins on. Default is 0 (Sunday). + * @config START_WEEKDAY + * @type number + * @default 0 + */ + this.cfg.addProperty("START_WEEKDAY", { value:0, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * True if the Calendar should show weekday labels. True by default. + * @config SHOW_WEEKDAYS + * @type Boolean + * @default true + */ + this.cfg.addProperty("SHOW_WEEKDAYS", { value:true, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row headers. False by default. + * @config SHOW_WEEK_HEADER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_HEADER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should show week row footers. False by default. + * @config SHOW_WEEK_FOOTER + * @type Boolean + * @default false + */ + this.cfg.addProperty("SHOW_WEEK_FOOTER",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * True if the Calendar should suppress weeks that are not a part of the current month. False by default. + * @config HIDE_BLANK_WEEKS + * @type Boolean + * @default false + */ + this.cfg.addProperty("HIDE_BLANK_WEEKS",{ value:false, handler:this.delegateConfig, validator:this.cfg.checkBoolean } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_LEFT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif" + */ + this.cfg.addProperty("NAV_ARROW_LEFT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/callt.gif", handler:this.delegateConfig } ); + + /** + * The image that should be used for the left navigation arrow. + * @config NAV_ARROW_RIGHT + * @type String + * @default YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif" + */ + this.cfg.addProperty("NAV_ARROW_RIGHT", { value:YAHOO.widget.Calendar.IMG_ROOT + "us/tr/calrt.gif", handler:this.delegateConfig } ); + + // Locale properties + + /** + * The short month labels for the current locale. + * @config MONTHS_SHORT + * @type String[] + * @default ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + */ + this.cfg.addProperty("MONTHS_SHORT", { value:["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], handler:this.delegateConfig } ); + + /** + * The long month labels for the current locale. + * @config MONTHS_LONG + * @type String[] + * @default ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" + */ + this.cfg.addProperty("MONTHS_LONG", { value:["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], handler:this.delegateConfig } ); + + /** + * The 1-character weekday labels for the current locale. + * @config WEEKDAYS_1CHAR + * @type String[] + * @default ["S", "M", "T", "W", "T", "F", "S"] + */ + this.cfg.addProperty("WEEKDAYS_1CHAR", { value:["S", "M", "T", "W", "T", "F", "S"], handler:this.delegateConfig } ); + + /** + * The short weekday labels for the current locale. + * @config WEEKDAYS_SHORT + * @type String[] + * @default ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"] + */ + this.cfg.addProperty("WEEKDAYS_SHORT", { value:["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], handler:this.delegateConfig } ); + + /** + * The medium weekday labels for the current locale. + * @config WEEKDAYS_MEDIUM + * @type String[] + * @default ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + */ + this.cfg.addProperty("WEEKDAYS_MEDIUM", { value:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], handler:this.delegateConfig } ); + + /** + * The long weekday labels for the current locale. + * @config WEEKDAYS_LONG + * @type String[] + * @default ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + */ + this.cfg.addProperty("WEEKDAYS_LONG", { value:["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], handler:this.delegateConfig } ); + + /** + * The setting that determines which length of month labels should be used. Possible values are "short" and "long". + * @config LOCALE_MONTHS + * @type String + * @default "long" + */ + this.cfg.addProperty("LOCALE_MONTHS", { value:"long", handler:this.delegateConfig } ); + + /** + * The setting that determines which length of weekday labels should be used. Possible values are "1char", "short", "medium", and "long". + * @config LOCALE_WEEKDAYS + * @type String + * @default "short" + */ + this.cfg.addProperty("LOCALE_WEEKDAYS", { value:"short", handler:this.delegateConfig } ); + + /** + * The value used to delimit individual dates in a date string passed to various Calendar functions. + * @config DATE_DELIMITER + * @type String + * @default "," + */ + this.cfg.addProperty("DATE_DELIMITER", { value:",", handler:this.delegateConfig } ); + + /** + * The value used to delimit date fields in a date string passed to various Calendar functions. + * @config DATE_FIELD_DELIMITER + * @type String + * @default "/" + */ + this.cfg.addProperty("DATE_FIELD_DELIMITER",{ value:"/", handler:this.delegateConfig } ); + + /** + * The value used to delimit date ranges in a date string passed to various Calendar functions. + * @config DATE_RANGE_DELIMITER + * @type String + * @default "-" + */ + this.cfg.addProperty("DATE_RANGE_DELIMITER",{ value:"-", handler:this.delegateConfig } ); + + /** + * The position of the month in a month/year date string + * @config MY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MY_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/year date string + * @config MY_YEAR_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MY_YEAR_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day date string + * @config MD_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MD_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/year date string + * @config MD_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MD_DAY_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the month in a month/day/year date string + * @config MDY_MONTH_POSITION + * @type Number + * @default 1 + */ + this.cfg.addProperty("MDY_MONTH_POSITION", { value:1, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the day in a month/day/year date string + * @config MDY_DAY_POSITION + * @type Number + * @default 2 + */ + this.cfg.addProperty("MDY_DAY_POSITION", { value:2, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + + /** + * The position of the year in a month/day/year date string + * @config MDY_YEAR_POSITION + * @type Number + * @default 3 + */ + this.cfg.addProperty("MDY_YEAR_POSITION", { value:3, handler:this.delegateConfig, validator:this.cfg.checkNumber } ); + +}; + +/** +* Initializes CalendarGroup's built-in CustomEvents +* @method initEvents +*/ +YAHOO.widget.CalendarGroup.prototype.initEvents = function() { + var me = this; + + /** + * Proxy subscriber to subscribe to the CalendarGroup's child Calendars' CustomEvents + * @method sub + * @private + * @param {Function} fn The function to subscribe to this CustomEvent + * @param {Object} obj The CustomEvent's scope object + * @param {Boolean} bOverride Whether or not to apply scope correction + */ + var sub = function(fn, obj, bOverride) { + for (var p=0;p0) { + year+=1; + } + cal.setYear(year); + } +}; +/** +* Calls the render function of all child calendars within the group. +* @method render +*/ +YAHOO.widget.CalendarGroup.prototype.render = function() { + this.renderHeader(); + for (var p=0;p=0;--p) { + var cal = this.pages[p]; + cal.previousMonth(); + } +}; + +/** +* Navigates to the next year in the currently selected month in the calendar widget. +* @method nextYear +*/ +YAHOO.widget.CalendarGroup.prototype.nextYear = function() { + for (var p=0;p
        + * Alternatively: + * + * YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true}); + * + * @TODO this really should be an indexed array. Alternatively this + * method could accept both. + * @method refreshCache + * @param {Object} groups an associative array of groups to refresh + * @static + */ + refreshCache: function(groups) { + this.logger.log("refreshing element location cache"); + for (var sGroup in groups) { + if ("string" != typeof sGroup) { + continue; + } + for (var i in this.ids[sGroup]) { + var oDD = this.ids[sGroup][i]; + + if (this.isTypeOfDD(oDD)) { + // if (this.isTypeOfDD(oDD) && oDD.isTarget) { + var loc = this.getLocation(oDD); + if (loc) { + this.locationCache[oDD.id] = loc; + } else { + delete this.locationCache[oDD.id]; + this.logger.log("Could not get the loc for " + oDD.id, + "warn"); + // this will unregister the drag and drop object if + // the element is not in a usable state + // oDD.unreg(); + } + } + } + } + }, + + /** + * This checks to make sure an element exists and is in the DOM. The + * main purpose is to handle cases where innerHTML is used to remove + * drag and drop objects from the DOM. IE provides an 'unspecified + * error' when trying to access the offsetParent of such an element + * @method verifyEl + * @param {HTMLElement} el the element to check + * @return {boolean} true if the element looks usable + * @static + */ + verifyEl: function(el) { + try { + if (el) { + var parent = el.offsetParent; + if (parent) { + return true; + } + } + } catch(e) { + this.logger.log("detected problem with an element"); + } + + return false; + }, + + /** + * Returns a Region object containing the drag and drop element's position + * and size, including the padding configured for it + * @method getLocation + * @param {DragDrop} oDD the drag and drop object to get the + * location for + * @return {YAHOO.util.Region} a Region object representing the total area + * the element occupies, including any padding + * the instance is configured for. + * @static + */ + getLocation: function(oDD) { + if (! this.isTypeOfDD(oDD)) { + this.logger.log(oDD + " is not a DD obj"); + return null; + } + + var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l; + + try { + pos= YAHOO.util.Dom.getXY(el); + } catch (e) { } + + if (!pos) { + this.logger.log("getXY failed"); + return null; + } + + x1 = pos[0]; + x2 = x1 + el.offsetWidth; + y1 = pos[1]; + y2 = y1 + el.offsetHeight; + + t = y1 - oDD.padding[0]; + r = x2 + oDD.padding[1]; + b = y2 + oDD.padding[2]; + l = x1 - oDD.padding[3]; + + return new YAHOO.util.Region( t, r, b, l ); + }, + + /** + * Checks the cursor location to see if it over the target + * @method isOverTarget + * @param {YAHOO.util.Point} pt The point to evaluate + * @param {DragDrop} oTarget the DragDrop object we are inspecting + * @return {boolean} true if the mouse is over the target + * @private + * @static + */ + isOverTarget: function(pt, oTarget, intersect) { + // use cache if available + var loc = this.locationCache[oTarget.id]; + if (!loc || !this.useCache) { + this.logger.log("cache not populated"); + loc = this.getLocation(oTarget); + this.locationCache[oTarget.id] = loc; + + this.logger.log("cache: " + loc); + } + + if (!loc) { + this.logger.log("could not get the location of the element"); + return false; + } + + //this.logger.log("loc: " + loc + ", pt: " + pt); + oTarget.cursorIsOver = loc.contains( pt ); + + // DragDrop is using this as a sanity check for the initial mousedown + // in this case we are done. In POINT mode, if the drag obj has no + // contraints, we are also done. Otherwise we need to evaluate the + // location of the target as related to the actual location of the + // dragged element. + var dc = this.dragCurrent; + if (!dc || !dc.getTargetCoord || + (!intersect && !dc.constrainX && !dc.constrainY)) { + return oTarget.cursorIsOver; + } + + oTarget.overlap = null; + + // Get the current location of the drag element, this is the + // location of the mouse event less the delta that represents + // where the original mousedown happened on the element. We + // need to consider constraints and ticks as well. + var pos = dc.getTargetCoord(pt.x, pt.y); + + var el = dc.getDragEl(); + var curRegion = new YAHOO.util.Region( pos.y, + pos.x + el.offsetWidth, + pos.y + el.offsetHeight, + pos.x ); + + var overlap = curRegion.intersect(loc); + + if (overlap) { + oTarget.overlap = overlap; + return (intersect) ? true : oTarget.cursorIsOver; + } else { + return false; + } + }, + + /** + * unload event handler + * @method _onUnload + * @private + * @static + */ + _onUnload: function(e, me) { + this.unregAll(); + }, + + /** + * Cleans up the drag and drop events and objects. + * @method unregAll + * @private + * @static + */ + unregAll: function() { + this.logger.log("unregister all"); + + if (this.dragCurrent) { + this.stopDrag(); + this.dragCurrent = null; + } + + this._execOnAll("unreg", []); + + for (i in this.elementCache) { + delete this.elementCache[i]; + } + + this.elementCache = {}; + this.ids = {}; + }, + + /** + * A cache of DOM elements + * @property elementCache + * @private + * @static + */ + elementCache: {}, + + /** + * Get the wrapper for the DOM element specified + * @method getElWrapper + * @param {String} id the id of the element to get + * @return {YAHOO.util.DDM.ElementWrapper} the wrapped element + * @private + * @deprecated This wrapper isn't that useful + * @static + */ + getElWrapper: function(id) { + var oWrapper = this.elementCache[id]; + if (!oWrapper || !oWrapper.el) { + oWrapper = this.elementCache[id] = + new this.ElementWrapper(YAHOO.util.Dom.get(id)); + } + return oWrapper; + }, + + /** + * Returns the actual DOM element + * @method getElement + * @param {String} id the id of the elment to get + * @return {Object} The element + * @deprecated use YAHOO.util.Dom.get instead + * @static + */ + getElement: function(id) { + return YAHOO.util.Dom.get(id); + }, + + /** + * Returns the style property for the DOM element (i.e., + * document.getElById(id).style) + * @method getCss + * @param {String} id the id of the elment to get + * @return {Object} The style property of the element + * @deprecated use YAHOO.util.Dom instead + * @static + */ + getCss: function(id) { + var el = YAHOO.util.Dom.get(id); + return (el) ? el.style : null; + }, + + /** + * Inner class for cached elements + * @class DragDropMgr.ElementWrapper + * @for DragDropMgr + * @private + * @deprecated + */ + ElementWrapper: function(el) { + /** + * The element + * @property el + */ + this.el = el || null; + /** + * The element id + * @property id + */ + this.id = this.el && el.id; + /** + * A reference to the style property + * @property css + */ + this.css = this.el && el.style; + }, + + /** + * Returns the X position of an html element + * @method getPosX + * @param el the element for which to get the position + * @return {int} the X coordinate + * @for DragDropMgr + * @deprecated use YAHOO.util.Dom.getX instead + * @static + */ + getPosX: function(el) { + return YAHOO.util.Dom.getX(el); + }, + + /** + * Returns the Y position of an html element + * @method getPosY + * @param el the element for which to get the position + * @return {int} the Y coordinate + * @deprecated use YAHOO.util.Dom.getY instead + * @static + */ + getPosY: function(el) { + return YAHOO.util.Dom.getY(el); + }, + + /** + * Swap two nodes. In IE, we use the native method, for others we + * emulate the IE behavior + * @method swapNode + * @param n1 the first node to swap + * @param n2 the other node to swap + * @static + */ + swapNode: function(n1, n2) { + if (n1.swapNode) { + n1.swapNode(n2); + } else { + var p = n2.parentNode; + var s = n2.nextSibling; + + if (s == n1) { + p.insertBefore(n1, n2); + } else if (n2 == n1.nextSibling) { + p.insertBefore(n2, n1); + } else { + n1.parentNode.replaceChild(n2, n1); + p.insertBefore(n1, s); + } + } + }, + + /** + * Returns the current scroll position + * @method getScroll + * @private + * @static + */ + getScroll: function () { + var t, l, dde=document.documentElement, db=document.body; + if (dde && (dde.scrollTop || dde.scrollLeft)) { + t = dde.scrollTop; + l = dde.scrollLeft; + } else if (db) { + t = db.scrollTop; + l = db.scrollLeft; + } else { + YAHOO.log("could not get scroll property"); + } + return { top: t, left: l }; + }, + + /** + * Returns the specified element style property + * @method getStyle + * @param {HTMLElement} el the element + * @param {string} styleProp the style property + * @return {string} The value of the style property + * @deprecated use YAHOO.util.Dom.getStyle + * @static + */ + getStyle: function(el, styleProp) { + return YAHOO.util.Dom.getStyle(el, styleProp); + }, + + /** + * Gets the scrollTop + * @method getScrollTop + * @return {int} the document's scrollTop + * @static + */ + getScrollTop: function () { return this.getScroll().top; }, + + /** + * Gets the scrollLeft + * @method getScrollLeft + * @return {int} the document's scrollTop + * @static + */ + getScrollLeft: function () { return this.getScroll().left; }, + + /** + * Sets the x/y position of an element to the location of the + * target element. + * @method moveToEl + * @param {HTMLElement} moveEl The element to move + * @param {HTMLElement} targetEl The position reference element + * @static + */ + moveToEl: function (moveEl, targetEl) { + var aCoord = YAHOO.util.Dom.getXY(targetEl); + this.logger.log("moveToEl: " + aCoord); + YAHOO.util.Dom.setXY(moveEl, aCoord); + }, + + /** + * Gets the client height + * @method getClientHeight + * @return {int} client height in px + * @deprecated use YAHOO.util.Dom.getViewportHeight instead + * @static + */ + getClientHeight: function() { + return YAHOO.util.Dom.getViewportHeight(); + }, + + /** + * Gets the client width + * @method getClientWidth + * @return {int} client width in px + * @deprecated use YAHOO.util.Dom.getViewportWidth instead + * @static + */ + getClientWidth: function() { + return YAHOO.util.Dom.getViewportWidth(); + }, + + /** + * Numeric array sort function + * @method numericSort + * @static + */ + numericSort: function(a, b) { return (a - b); }, + + /** + * Internal counter + * @property _timeoutCount + * @private + * @static + */ + _timeoutCount: 0, + + /** + * Trying to make the load order less important. Without this we get + * an error if this file is loaded before the Event Utility. + * @method _addListeners + * @private + * @static + */ + _addListeners: function() { + var DDM = YAHOO.util.DDM; + if ( YAHOO.util.Event && document ) { + DDM._onLoad(); + } else { + if (DDM._timeoutCount > 2000) { + DDM.logger.log("DragDrop requires the Event Utility"); + } else { + setTimeout(DDM._addListeners, 10); + if (document && document.body) { + DDM._timeoutCount += 1; + } + } + } + }, + + /** + * Recursively searches the immediate parent and all child nodes for + * the handle element in order to determine wheter or not it was + * clicked. + * @method handleWasClicked + * @param node the html element to inspect + * @static + */ + handleWasClicked: function(node, id) { + if (this.isHandle(id, node.id)) { + this.logger.log("clicked node is a handle"); + return true; + } else { + // check to see if this is a text node child of the one we want + var p = node.parentNode; + // this.logger.log("p: " + p); + + while (p) { + if (this.isHandle(id, p.id)) { + return true; + } else { + this.logger.log(p.id + " is not a handle"); + p = p.parentNode; + } + } + } + + return false; + } + + }; + +}(); + +// shorter alias, save a few bytes +YAHOO.util.DDM = YAHOO.util.DragDropMgr; +YAHOO.util.DDM._addListeners(); + +} + +/** + * A DragDrop implementation where the linked element follows the + * mouse cursor during a drag. + * @class DD + * @extends YAHOO.util.DragDrop + * @constructor + * @param {String} id the id of the linked element + * @param {String} sGroup the group of related DragDrop items + * @param {object} config an object containing configurable attributes + * Valid properties for DD: + * scroll + */ +YAHOO.util.DD = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +YAHOO.extend(YAHOO.util.DD, YAHOO.util.DragDrop, { + + /** + * When set to true, the utility automatically tries to scroll the browser + * window wehn a drag and drop element is dragged near the viewport boundary. + * Defaults to true. + * @property scroll + * @type boolean + */ + scroll: true, + + /** + * Sets the pointer offset to the distance between the linked element's top + * left corner and the location the element was clicked + * @method autoOffset + * @param {int} iPageX the X coordinate of the click + * @param {int} iPageY the Y coordinate of the click + */ + autoOffset: function(iPageX, iPageY) { + var x = iPageX - this.startPageX; + var y = iPageY - this.startPageY; + this.setDelta(x, y); + // this.logger.log("autoOffset el pos: " + aCoord + ", delta: " + x + "," + y); + }, + + /** + * Sets the pointer offset. You can call this directly to force the + * offset to be in a particular location (e.g., pass in 0,0 to set it + * to the center of the object, as done in YAHOO.widget.Slider) + * @method setDelta + * @param {int} iDeltaX the distance from the left + * @param {int} iDeltaY the distance from the top + */ + setDelta: function(iDeltaX, iDeltaY) { + this.deltaX = iDeltaX; + this.deltaY = iDeltaY; + this.logger.log("deltaX:" + this.deltaX + ", deltaY:" + this.deltaY); + }, + + /** + * Sets the drag element to the location of the mousedown or click event, + * maintaining the cursor location relative to the location on the element + * that was clicked. Override this if you want to place the element in a + * location other than where the cursor is. + * @method setDragElPos + * @param {int} iPageX the X coordinate of the mousedown or drag event + * @param {int} iPageY the Y coordinate of the mousedown or drag event + */ + setDragElPos: function(iPageX, iPageY) { + // the first time we do this, we are going to check to make sure + // the element has css positioning + + var el = this.getDragEl(); + this.alignElWithMouse(el, iPageX, iPageY); + }, + + /** + * Sets the element to the location of the mousedown or click event, + * maintaining the cursor location relative to the location on the element + * that was clicked. Override this if you want to place the element in a + * location other than where the cursor is. + * @method alignElWithMouse + * @param {HTMLElement} el the element to move + * @param {int} iPageX the X coordinate of the mousedown or drag event + * @param {int} iPageY the Y coordinate of the mousedown or drag event + */ + alignElWithMouse: function(el, iPageX, iPageY) { + var oCoord = this.getTargetCoord(iPageX, iPageY); + // this.logger.log("****alignElWithMouse : " + el.id + ", " + aCoord + ", " + el.style.display); + + if (!this.deltaSetXY) { + var aCoord = [oCoord.x, oCoord.y]; + YAHOO.util.Dom.setXY(el, aCoord); + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; + } else { + YAHOO.util.Dom.setStyle(el, "left", (oCoord.x + this.deltaSetXY[0]) + "px"); + YAHOO.util.Dom.setStyle(el, "top", (oCoord.y + this.deltaSetXY[1]) + "px"); + } + + this.cachePosition(oCoord.x, oCoord.y); + this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); + }, + + /** + * Saves the most recent position so that we can reset the constraints and + * tick marks on-demand. We need to know this so that we can calculate the + * number of pixels the element is offset from its original position. + * @method cachePosition + * @param iPageX the current x position (optional, this just makes it so we + * don't have to look it up again) + * @param iPageY the current y position (optional, this just makes it so we + * don't have to look it up again) + */ + cachePosition: function(iPageX, iPageY) { + if (iPageX) { + this.lastPageX = iPageX; + this.lastPageY = iPageY; + } else { + var aCoord = YAHOO.util.Dom.getXY(this.getEl()); + this.lastPageX = aCoord[0]; + this.lastPageY = aCoord[1]; + } + }, + + /** + * Auto-scroll the window if the dragged object has been moved beyond the + * visible window boundary. + * @method autoScroll + * @param {int} x the drag element's x position + * @param {int} y the drag element's y position + * @param {int} h the height of the drag element + * @param {int} w the width of the drag element + * @private + */ + autoScroll: function(x, y, h, w) { + + if (this.scroll) { + // The client height + var clientH = this.DDM.getClientHeight(); + + // The client width + var clientW = this.DDM.getClientWidth(); + + // The amt scrolled down + var st = this.DDM.getScrollTop(); + + // The amt scrolled right + var sl = this.DDM.getScrollLeft(); + + // Location of the bottom of the element + var bot = h + y; + + // Location of the right of the element + var right = w + x; + + // The distance from the cursor to the bottom of the visible area, + // adjusted so that we don't scroll if the cursor is beyond the + // element drag constraints + var toBot = (clientH + st - y - this.deltaY); + + // The distance from the cursor to the right of the visible area + var toRight = (clientW + sl - x - this.deltaX); + + // this.logger.log( " x: " + x + " y: " + y + " h: " + h + + // " clientH: " + clientH + " clientW: " + clientW + + // " st: " + st + " sl: " + sl + " bot: " + bot + + // " right: " + right + " toBot: " + toBot + " toRight: " + toRight); + + // How close to the edge the cursor must be before we scroll + // var thresh = (document.all) ? 100 : 40; + var thresh = 40; + + // How many pixels to scroll per autoscroll op. This helps to reduce + // clunky scrolling. IE is more sensitive about this ... it needs this + // value to be higher. + var scrAmt = (document.all) ? 80 : 30; + + // Scroll down if we are near the bottom of the visible page and the + // obj extends below the crease + if ( bot > clientH && toBot < thresh ) { + window.scrollTo(sl, st + scrAmt); + } + + // Scroll up if the window is scrolled down and the top of the object + // goes above the top border + if ( y < st && st > 0 && y - st < thresh ) { + window.scrollTo(sl, st - scrAmt); + } + + // Scroll right if the obj is beyond the right border and the cursor is + // near the border. + if ( right > clientW && toRight < thresh ) { + window.scrollTo(sl + scrAmt, st); + } + + // Scroll left if the window has been scrolled to the right and the obj + // extends past the left border + if ( x < sl && sl > 0 && x - sl < thresh ) { + window.scrollTo(sl - scrAmt, st); + } + } + }, + + /** + * Finds the location the element should be placed if we want to move + * it to where the mouse location less the click offset would place us. + * @method getTargetCoord + * @param {int} iPageX the X coordinate of the click + * @param {int} iPageY the Y coordinate of the click + * @return an object that contains the coordinates (Object.x and Object.y) + * @private + */ + getTargetCoord: function(iPageX, iPageY) { + + // this.logger.log("getTargetCoord: " + iPageX + ", " + iPageY); + + var x = iPageX - this.deltaX; + var y = iPageY - this.deltaY; + + if (this.constrainX) { + if (x < this.minX) { x = this.minX; } + if (x > this.maxX) { x = this.maxX; } + } + + if (this.constrainY) { + if (y < this.minY) { y = this.minY; } + if (y > this.maxY) { y = this.maxY; } + } + + x = this.getTick(x, this.xTicks); + y = this.getTick(y, this.yTicks); + + // this.logger.log("getTargetCoord " + + // " iPageX: " + iPageX + + // " iPageY: " + iPageY + + // " x: " + x + ", y: " + y); + + return {x:x, y:y}; + }, + + /* + * Sets up config options specific to this class. Overrides + * YAHOO.util.DragDrop, but all versions of this method through the + * inheritance chain are called + */ + applyConfig: function() { + YAHOO.util.DD.superclass.applyConfig.call(this); + this.scroll = (this.config.scroll !== false); + }, + + /* + * Event that fires prior to the onMouseDown event. Overrides + * YAHOO.util.DragDrop. + */ + b4MouseDown: function(e) { + // this.resetConstraints(); + this.autoOffset(YAHOO.util.Event.getPageX(e), + YAHOO.util.Event.getPageY(e)); + }, + + /* + * Event that fires prior to the onDrag event. Overrides + * YAHOO.util.DragDrop. + */ + b4Drag: function(e) { + this.setDragElPos(YAHOO.util.Event.getPageX(e), + YAHOO.util.Event.getPageY(e)); + }, + + toString: function() { + return ("DD " + this.id); + } + + ////////////////////////////////////////////////////////////////////////// + // Debugging ygDragDrop events that can be overridden + ////////////////////////////////////////////////////////////////////////// + /* + startDrag: function(x, y) { + this.logger.log(this.id.toString() + " startDrag"); + }, + + onDrag: function(e) { + this.logger.log(this.id.toString() + " onDrag"); + }, + + onDragEnter: function(e, id) { + this.logger.log(this.id.toString() + " onDragEnter: " + id); + }, + + onDragOver: function(e, id) { + this.logger.log(this.id.toString() + " onDragOver: " + id); + }, + + onDragOut: function(e, id) { + this.logger.log(this.id.toString() + " onDragOut: " + id); + }, + + onDragDrop: function(e, id) { + this.logger.log(this.id.toString() + " onDragDrop: " + id); + }, + + endDrag: function(e) { + this.logger.log(this.id.toString() + " endDrag"); + } + + */ + +}); +/** + * A DragDrop implementation that inserts an empty, bordered div into + * the document that follows the cursor during drag operations. At the time of + * the click, the frame div is resized to the dimensions of the linked html + * element, and moved to the exact location of the linked element. + * + * References to the "frame" element refer to the single proxy element that + * was created to be dragged in place of all DDProxy elements on the + * page. + * + * @class DDProxy + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the linked html element + * @param {String} sGroup the group of related DragDrop objects + * @param {object} config an object containing configurable attributes + * Valid properties for DDProxy in addition to those in DragDrop: + * resizeFrame, centerFrame, dragElId + */ +YAHOO.util.DDProxy = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + this.initFrame(); + } +}; + +/** + * The default drag frame div id + * @property YAHOO.util.DDProxy.dragElId + * @type String + * @static + */ +YAHOO.util.DDProxy.dragElId = "ygddfdiv"; + +YAHOO.extend(YAHOO.util.DDProxy, YAHOO.util.DD, { + + /** + * By default we resize the drag frame to be the same size as the element + * we want to drag (this is to get the frame effect). We can turn it off + * if we want a different behavior. + * @property resizeFrame + * @type boolean + */ + resizeFrame: true, + + /** + * By default the frame is positioned exactly where the drag element is, so + * we use the cursor offset provided by YAHOO.util.DD. Another option that works only if + * you do not have constraints on the obj is to have the drag frame centered + * around the cursor. Set centerFrame to true for this effect. + * @property centerFrame + * @type boolean + */ + centerFrame: false, + + /** + * Creates the proxy element if it does not yet exist + * @method createFrame + */ + createFrame: function() { + var self = this; + var body = document.body; + + if (!body || !body.firstChild) { + setTimeout( function() { self.createFrame(); }, 50 ); + return; + } + + var div = this.getDragEl(); + + if (!div) { + div = document.createElement("div"); + div.id = this.dragElId; + var s = div.style; + + s.position = "absolute"; + s.visibility = "hidden"; + s.cursor = "move"; + s.border = "2px solid #aaa"; + s.zIndex = 999; + + // appendChild can blow up IE if invoked prior to the window load event + // while rendering a table. It is possible there are other scenarios + // that would cause this to happen as well. + body.insertBefore(div, body.firstChild); + } + }, + + /** + * Initialization for the drag frame element. Must be called in the + * constructor of all subclasses + * @method initFrame + */ + initFrame: function() { + this.createFrame(); + }, + + applyConfig: function() { + this.logger.log("DDProxy applyConfig"); + YAHOO.util.DDProxy.superclass.applyConfig.call(this); + + this.resizeFrame = (this.config.resizeFrame !== false); + this.centerFrame = (this.config.centerFrame); + this.setDragElId(this.config.dragElId || YAHOO.util.DDProxy.dragElId); + }, + + /** + * Resizes the drag frame to the dimensions of the clicked object, positions + * it over the object, and finally displays it + * @method showFrame + * @param {int} iPageX X click position + * @param {int} iPageY Y click position + * @private + */ + showFrame: function(iPageX, iPageY) { + var el = this.getEl(); + var dragEl = this.getDragEl(); + var s = dragEl.style; + + this._resizeProxy(); + + if (this.centerFrame) { + this.setDelta( Math.round(parseInt(s.width, 10)/2), + Math.round(parseInt(s.height, 10)/2) ); + } + + this.setDragElPos(iPageX, iPageY); + + YAHOO.util.Dom.setStyle(dragEl, "visibility", "visible"); + }, + + /** + * The proxy is automatically resized to the dimensions of the linked + * element when a drag is initiated, unless resizeFrame is set to false + * @method _resizeProxy + * @private + */ + _resizeProxy: function() { + if (this.resizeFrame) { + var DOM = YAHOO.util.Dom; + var el = this.getEl(); + var dragEl = this.getDragEl(); + + var bt = parseInt( DOM.getStyle(dragEl, "borderTopWidth" ), 10); + var br = parseInt( DOM.getStyle(dragEl, "borderRightWidth" ), 10); + var bb = parseInt( DOM.getStyle(dragEl, "borderBottomWidth" ), 10); + var bl = parseInt( DOM.getStyle(dragEl, "borderLeftWidth" ), 10); + + if (isNaN(bt)) { bt = 0; } + if (isNaN(br)) { br = 0; } + if (isNaN(bb)) { bb = 0; } + if (isNaN(bl)) { bl = 0; } + + this.logger.log("proxy size: " + bt + " " + br + " " + bb + " " + bl); + + var newWidth = Math.max(0, el.offsetWidth - br - bl); + var newHeight = Math.max(0, el.offsetHeight - bt - bb); + + this.logger.log("Resizing proxy element"); + + DOM.setStyle( dragEl, "width", newWidth + "px" ); + DOM.setStyle( dragEl, "height", newHeight + "px" ); + } + }, + + // overrides YAHOO.util.DragDrop + b4MouseDown: function(e) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.autoOffset(x, y); + this.setDragElPos(x, y); + }, + + // overrides YAHOO.util.DragDrop + b4StartDrag: function(x, y) { + // show the drag frame + this.logger.log("start drag show frame, x: " + x + ", y: " + y); + this.showFrame(x, y); + }, + + // overrides YAHOO.util.DragDrop + b4EndDrag: function(e) { + this.logger.log(this.id + " b4EndDrag"); + YAHOO.util.Dom.setStyle(this.getDragEl(), "visibility", "hidden"); + }, + + // overrides YAHOO.util.DragDrop + // By default we try to move the element to the last location of the frame. + // This is so that the default behavior mirrors that of YAHOO.util.DD. + endDrag: function(e) { + var DOM = YAHOO.util.Dom; + this.logger.log(this.id + " endDrag"); + var lel = this.getEl(); + var del = this.getDragEl(); + + // Show the drag frame briefly so we can get its position + // del.style.visibility = ""; + DOM.setStyle(del, "visibility", ""); + + // Hide the linked element before the move to get around a Safari + // rendering bug. + //lel.style.visibility = "hidden"; + DOM.setStyle(lel, "visibility", "hidden"); + YAHOO.util.DDM.moveToEl(lel, del); + //del.style.visibility = "hidden"; + DOM.setStyle(del, "visibility", "hidden"); + //lel.style.visibility = ""; + DOM.setStyle(lel, "visibility", ""); + }, + + toString: function() { + return ("DDProxy " + this.id); + } + +}); +/** + * A DragDrop implementation that does not move, but can be a drop + * target. You would get the same result by simply omitting implementation + * for the event callbacks, but this way we reduce the processing cost of the + * event listener and the callbacks. + * @class DDTarget + * @extends YAHOO.util.DragDrop + * @constructor + * @param {String} id the id of the element that is a drop target + * @param {String} sGroup the group of related DragDrop objects + * @param {object} config an object containing configurable attributes + * Valid properties for DDTarget in addition to those in + * DragDrop: + * none + */ +YAHOO.util.DDTarget = function(id, sGroup, config) { + if (id) { + this.initTarget(id, sGroup, config); + } +}; + +// YAHOO.util.DDTarget.prototype = new YAHOO.util.DragDrop(); +YAHOO.extend(YAHOO.util.DDTarget, YAHOO.util.DragDrop, { + toString: function() { + return ("DDTarget " + this.id); + } +}); diff --git a/www/extras/yui/build/dragdrop/dragdrop-min.js b/www/extras/yui/build/dragdrop/dragdrop-min.js new file mode 100644 index 000000000..56293cf8f --- /dev/null +++ b/www/extras/yui/build/dragdrop/dragdrop-min.js @@ -0,0 +1 @@ +/* Copyright (c) 2006, Yahoo! Inc. All rights reserved.Code licensed under the BSD License:http://developer.yahoo.net/yui/license.txt version: 0.12.0 */ (function(){var _1=YAHOO.util.Event;var _2=YAHOO.util.Dom;YAHOO.util.DragDrop=function(id,_4,_5){if(id){this.init(id,_4,_5);}};YAHOO.util.DragDrop.prototype={id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,b4StartDrag:function(x,y){},startDrag:function(x,y){},b4Drag:function(e){},onDrag:function(e){},onDragEnter:function(e,id){},b4DragOver:function(e){},onDragOver:function(e,id){},b4DragOut:function(e){},onDragOut:function(e,id){},b4DragDrop:function(e){},onDragDrop:function(e,id){},onInvalidDrop:function(e){},b4EndDrag:function(e){},endDrag:function(e){},b4MouseDown:function(e){},onMouseDown:function(e){},onMouseUp:function(e){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=_2.get(this.id);}return this._domRef;},getDragEl:function(){return _2.get(this.dragElId);},init:function(id,_9,_10){this.initTarget(id,_9,_10);_1.on(this.id,"mousedown",this.handleMouseDown,this,true);},initTarget:function(id,_11,_12){this.config=_12||{};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.id=id;this.addToGroup((_11)?_11:"default");this.handleElId=id;_1.onAvailable(id,this.handleOnAvailable,this,true);this.setDragElId(id);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(_13,_14,_15,_16){if(!_14&&0!==_14){this.padding=[_13,_13,_13,_13];}else{if(!_15&&0!==_15){this.padding=[_13,_14,_13,_14];}else{this.padding=[_13,_14,_15,_16];}}},setInitPosition:function(_17,_18){var el=this.getEl();if(!this.DDM.verifyEl(el)){return;}var dx=_17||0;var dy=_18||0;var p=_2.getXY(el);this.initPageX=p[0]-dx;this.initPageY=p[1]-dy;this.lastPageX=p[0];this.lastPageY=p[1];this.setStartPosition(p);},setStartPosition:function(pos){var p=pos||_2.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=p[0];this.startPageY=p[1];},addToGroup:function(_24){this.groups[_24]=true;this.DDM.regDragDrop(this,_24);},removeFromGroup:function(_25){if(this.groups[_25]){delete this.groups[_25];}this.DDM.removeDDFromGroup(this,_25);},setDragElId:function(id){this.dragElId=id;},setHandleElId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.handleElId=id;this.DDM.regHandle(this.id,id);},setOuterHandleElId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}_1.on(id,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(id);this.hasOuterHandles=true;},unreg:function(){_1.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return (this.DDM.isLocked()||this.locked);},handleMouseDown:function(e,oDD){var _27=e.which||e.button;if(this.primaryButtonOnly&&_27>1){return;}if(this.isLocked()){return;}this.DDM.refreshCache(this.groups);var pt=new YAHOO.util.Point(_1.getPageX(e),_1.getPageY(e));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(pt,this)){}else{if(this.clickValidator(e)){this.setStartPosition();this.b4MouseDown(e);this.onMouseDown(e);this.DDM.handleMouseDown(e,this);this.DDM.stopEvent(e);}else{}}},clickValidator:function(e){var _29=_1.getTarget(e);return (this.isValidHandleChild(_29)&&(this.id==this.handleElId||this.DDM.handleWasClicked(_29,this.id)));},addInvalidHandleType:function(_30){var _31=_30.toUpperCase();this.invalidHandleTypes[_31]=_31;},addInvalidHandleId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}this.invalidHandleIds[id]=id;},addInvalidHandleClass:function(_32){this.invalidHandleClasses.push(_32);},removeInvalidHandleType:function(_33){var _34=_33.toUpperCase();delete this.invalidHandleTypes[_34];},removeInvalidHandleId:function(id){if(typeof id!=="string"){YAHOO.log("id is not a string, assuming it is an HTMLElement");id=_2.generateId(id);}delete this.invalidHandleIds[id];},removeInvalidHandleClass:function(_35){for(var i=0,len=this.invalidHandleClasses.length;i=this.minX;i=i-_41){if(!_42[i]){this.xTicks[this.xTicks.length]=i;_42[i]=true;}}for(i=this.initPageX;i<=this.maxX;i=i+_41){if(!_42[i]){this.xTicks[this.xTicks.length]=i;_42[i]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(_43,_44){this.yTicks=[];this.yTickSize=_44;var _45={};for(var i=this.initPageY;i>=this.minY;i=i-_44){if(!_45[i]){this.yTicks[this.yTicks.length]=i;_45[i]=true;}}for(i=this.initPageY;i<=this.maxY;i=i+_44){if(!_45[i]){this.yTicks[this.yTicks.length]=i;_45[i]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(_46,_47,_48){this.leftConstraint=_46;this.rightConstraint=_47;this.minX=this.initPageX-_46;this.maxX=this.initPageX+_47;if(_48){this.setXTicks(this.initPageX,_48);}this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(iUp,_50,_51){this.topConstraint=iUp;this.bottomConstraint=_50;this.minY=this.initPageY-iUp;this.maxY=this.initPageY+_50;if(_51){this.setYTicks(this.initPageY,_51);}this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var dx=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var dy=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(dx,dy);}else{this.setInitPosition();}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(val,_53){if(!_53){return val;}else{if(_53[0]>=val){return _53[0];}else{for(var i=0,len=_53.length;i=val){var _55=val-_53[i];var _56=_53[_54]-val;return (_56>_55)?_53[i]:_53[_54];}}return _53[_53.length-1];}}},toString:function(){return ("DragDrop "+this.id);}};})();if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var _57=YAHOO.util.Event;return {ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initalized:false,locked:false,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,mode:0,_execOnAll:function(_58,_59){for(var i in this.ids){for(var j in this.ids[i]){var oDD=this.ids[i][j];if(!this.isTypeOfDD(oDD)){continue;}oDD[_58].apply(oDD,_59);}}},_onLoad:function(){this.init();_57.on(document,"mouseup",this.handleMouseUp,this,true);_57.on(document,"mousemove",this.handleMouseMove,this,true);_57.on(window,"unload",this._onUnload,this,true);_57.on(window,"resize",this._onResize,this,true);},_onResize:function(e){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,regDragDrop:function(oDD,_61){if(!this.initialized){this.init();}if(!this.ids[_61]){this.ids[_61]={};}this.ids[_61][oDD.id]=oDD;},removeDDFromGroup:function(oDD,_62){if(!this.ids[_62]){this.ids[_62]={};}var obj=this.ids[_62];if(obj&&obj[oDD.id]){delete obj[oDD.id];}},_remove:function(oDD){for(var g in oDD.groups){if(g&&this.ids[g][oDD.id]){delete this.ids[g][oDD.id];}}delete this.handleIds[oDD.id];},regHandle:function(_65,_66){if(!this.handleIds[_65]){this.handleIds[_65]={};}this.handleIds[_65][_66]=_66;},isDragDrop:function(id){return (this.getDDById(id))?true:false;},getRelated:function(_67,_68){var _69=[];for(var i in _67.groups){for(j in this.ids[i]){var dd=this.ids[i][j];if(!this.isTypeOfDD(dd)){continue;}if(!_68||dd.isTarget){_69[_69.length]=dd;}}}return _69;},isLegalTarget:function(oDD,_71){var _72=this.getRelated(oDD,true);for(var i=0,len=_72.length;ithis.clickPixelThresh||_77>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){this.dragCurrent.b4Drag(e);this.dragCurrent.onDrag(e);this.fireEvents(e,false);}this.stopEvent(e);return true;},fireEvents:function(e,_78){var dc=this.dragCurrent;if(!dc||dc.isLocked()){return;}var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);var pt=new YAHOO.util.Point(x,y);var _80=[];var _81=[];var _82=[];var _83=[];var _84=[];for(var i in this.dragOvers){var ddo=this.dragOvers[i];if(!this.isTypeOfDD(ddo)){continue;}if(!this.isOverTarget(pt,ddo,this.mode)){_81.push(ddo);}_80[i]=true;delete this.dragOvers[i];}for(var _86 in dc.groups){if("string"!=typeof _86){continue;}for(i in this.ids[_86]){var oDD=this.ids[_86][i];if(!this.isTypeOfDD(oDD)){continue;}if(oDD.isTarget&&!oDD.isLocked()&&oDD!=dc){if(this.isOverTarget(pt,oDD,this.mode)){if(_78){_83.push(oDD);}else{if(!_80[oDD.id]){_84.push(oDD);}else{_82.push(oDD);}this.dragOvers[oDD.id]=oDD;}}}}}if(this.mode){if(_81.length){dc.b4DragOut(e,_81);dc.onDragOut(e,_81);}if(_84.length){dc.onDragEnter(e,_84);}if(_82.length){dc.b4DragOver(e,_82);dc.onDragOver(e,_82);}if(_83.length){dc.b4DragDrop(e,_83);dc.onDragDrop(e,_83);}}else{var len=0;for(i=0,len=_81.length;i2000){}else{setTimeout(DDM._addListeners,10);if(document&&document.body){DDM._timeoutCount+=1;}}}},handleWasClicked:function(node,id){if(this.isHandle(id,node.id)){return true;}else{var p=node.parentNode;while(p){if(this.isHandle(id,p.id)){return true;}else{p=p.parentNode;}}}return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();}YAHOO.util.DD=function(id,_111,_112){if(id){this.init(id,_111,_112);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(_113,_114){var x=_113-this.startPageX;var y=_114-this.startPageY;this.setDelta(x,y);},setDelta:function(_115,_116){this.deltaX=_115;this.deltaY=_116;},setDragElPos:function(_117,_118){var el=this.getDragEl();this.alignElWithMouse(el,_117,_118);},alignElWithMouse:function(el,_119,_120){var _121=this.getTargetCoord(_119,_120);if(!this.deltaSetXY){var _122=[_121.x,_121.y];YAHOO.util.Dom.setXY(el,_122);var _123=parseInt(YAHOO.util.Dom.getStyle(el,"left"),10);var _124=parseInt(YAHOO.util.Dom.getStyle(el,"top"),10);this.deltaSetXY=[_123-_121.x,_124-_121.y];}else{YAHOO.util.Dom.setStyle(el,"left",(_121.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(el,"top",(_121.y+this.deltaSetXY[1])+"px");}this.cachePosition(_121.x,_121.y);this.autoScroll(_121.x,_121.y,el.offsetHeight,el.offsetWidth);},cachePosition:function(_125,_126){if(_125){this.lastPageX=_125;this.lastPageY=_126;}else{var _127=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=_127[0];this.lastPageY=_127[1];}},autoScroll:function(x,y,h,w){if(this.scroll){var _130=this.DDM.getClientHeight();var _131=this.DDM.getClientWidth();var st=this.DDM.getScrollTop();var sl=this.DDM.getScrollLeft();var bot=h+y;var _135=w+x;var _136=(_130+st-y-this.deltaY);var _137=(_131+sl-x-this.deltaX);var _138=40;var _139=(document.all)?80:30;if(bot>_130&&_136<_138){window.scrollTo(sl,st+_139);}if(y0&&y-st<_138){window.scrollTo(sl,st-_139);}if(_135>_131&&_137<_138){window.scrollTo(sl+_139,st);}if(x0&&x-sl<_138){window.scrollTo(sl-_139,st);}}},getTargetCoord:function(_140,_141){var x=_140-this.deltaX;var y=_141-this.deltaY;if(this.constrainX){if(xthis.maxX){x=this.maxX;}}if(this.constrainY){if(ythis.maxY){y=this.maxY;}}x=this.getTick(x,this.xTicks);y=this.getTick(y,this.yTicks);return {x:x,y:y};},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(e){this.autoOffset(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},b4Drag:function(e){this.setDragElPos(YAHOO.util.Event.getPageX(e),YAHOO.util.Event.getPageY(e));},toString:function(){return ("DD "+this.id);}});YAHOO.util.DDProxy=function(id,_142,_143){if(id){this.init(id,_142,_143);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var self=this;var body=document.body;if(!body||!body.firstChild){setTimeout(function(){self.createFrame();},50);return;}var div=this.getDragEl();if(!div){div=document.createElement("div");div.id=this.dragElId;var s=div.style;s.position="absolute";s.visibility="hidden";s.cursor="move";s.border="2px solid #aaa";s.zIndex=999;body.insertBefore(div,body.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(_147,_148){var el=this.getEl();var _149=this.getDragEl();var s=_149.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(s.width,10)/2),Math.round(parseInt(s.height,10)/2));}this.setDragElPos(_147,_148);YAHOO.util.Dom.setStyle(_149,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var DOM=YAHOO.util.Dom;var el=this.getEl();var _151=this.getDragEl();var bt=parseInt(DOM.getStyle(_151,"borderTopWidth"),10);var br=parseInt(DOM.getStyle(_151,"borderRightWidth"),10);var bb=parseInt(DOM.getStyle(_151,"borderBottomWidth"),10);var bl=parseInt(DOM.getStyle(_151,"borderLeftWidth"),10);if(isNaN(bt)){bt=0;}if(isNaN(br)){br=0;}if(isNaN(bb)){bb=0;}if(isNaN(bl)){bl=0;}var _156=Math.max(0,el.offsetWidth-br-bl);var _157=Math.max(0,el.offsetHeight-bt-bb);DOM.setStyle(_151,"width",_156+"px");DOM.setStyle(_151,"height",_157+"px");}},b4MouseDown:function(e){var x=YAHOO.util.Event.getPageX(e);var y=YAHOO.util.Event.getPageY(e);this.autoOffset(x,y);this.setDragElPos(x,y);},b4StartDrag:function(x,y){this.showFrame(x,y);},b4EndDrag:function(e){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(e){var DOM=YAHOO.util.Dom;var lel=this.getEl();var del=this.getDragEl();DOM.setStyle(del,"visibility","");DOM.setStyle(lel,"visibility","hidden");YAHOO.util.DDM.moveToEl(lel,del);DOM.setStyle(del,"visibility","hidden");DOM.setStyle(lel,"visibility","");},toString:function(){return ("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(id,_160,_161){if(id){this.initTarget(id,_160,_161);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return ("DDTarget "+this.id);}}); \ No newline at end of file diff --git a/www/extras/yui/build/dragdrop/dragdrop.js b/www/extras/yui/build/dragdrop/dragdrop.js new file mode 100644 index 000000000..43a0f61dc --- /dev/null +++ b/www/extras/yui/build/dragdrop/dragdrop.js @@ -0,0 +1,2940 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ + +(function() { + +var Event=YAHOO.util.Event; +var Dom=YAHOO.util.Dom; + +/** + * Defines the interface and base operation of items that that can be + * dragged or can be drop targets. It was designed to be extended, overriding + * the event handlers for startDrag, onDrag, onDragOver, onDragOut. + * Up to three html elements can be associated with a DragDrop instance: + *
          + *
        • linked element: the element that is passed into the constructor. + * This is the element which defines the boundaries for interaction with + * other DragDrop objects.
        • + *
        • handle element(s): The drag operation only occurs if the element that + * was clicked matches a handle element. By default this is the linked + * element, but there are times that you will want only a portion of the + * linked element to initiate the drag operation, and the setHandleElId() + * method provides a way to define this.
        • + *
        • drag element: this represents an the element that would be moved along + * with the cursor during a drag operation. By default, this is the linked + * element itself as in {@link YAHOO.util.DD}. setDragElId() lets you define + * a separate element that would be moved, as in {@link YAHOO.util.DDProxy} + *
        • + *
        + * This class should not be instantiated until the onload event to ensure that + * the associated elements are available. + * The following would define a DragDrop obj that would interact with any + * other DragDrop obj in the "group1" group: + *
        + *  dd = new YAHOO.util.DragDrop("div1", "group1");
        + * 
        + * Since none of the event handlers have been implemented, nothing would + * actually happen if you were to run the code above. Normally you would + * override this class or one of the default implementations, but you can + * also override the methods you want on an instance of the class... + *
        + *  dd.onDragDrop = function(e, id) {
        + *    alert("dd was dropped on " + id);
        + *  }
        + * 
        + * @namespace YAHOO.util + * @class DragDrop + * @constructor + * @param {String} id of the element that is linked to this instance + * @param {String} sGroup the group of related DragDrop objects + * @param {object} config an object containing configurable attributes + * Valid properties for DragDrop: + * padding, isTarget, maintainOffset, primaryButtonOnly + */ +YAHOO.util.DragDrop = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +YAHOO.util.DragDrop.prototype = { + + /** + * The id of the element associated with this object. This is what we + * refer to as the "linked element" because the size and position of + * this element is used to determine when the drag and drop objects have + * interacted. + * @property id + * @type String + */ + id: null, + + /** + * Configuration attributes passed into the constructor + * @property config + * @type object + */ + config: null, + + /** + * The id of the element that will be dragged. By default this is same + * as the linked element , but could be changed to another element. Ex: + * YAHOO.util.DDProxy + * @property dragElId + * @type String + * @private + */ + dragElId: null, + + /** + * the id of the element that initiates the drag operation. By default + * this is the linked element, but could be changed to be a child of this + * element. This lets us do things like only starting the drag when the + * header element within the linked html element is clicked. + * @property handleElId + * @type String + * @private + */ + handleElId: null, + + /** + * An associative array of HTML tags that will be ignored if clicked. + * @property invalidHandleTypes + * @type {string: string} + */ + invalidHandleTypes: null, + + /** + * An associative array of ids for elements that will be ignored if clicked + * @property invalidHandleIds + * @type {string: string} + */ + invalidHandleIds: null, + + /** + * An indexted array of css class names for elements that will be ignored + * if clicked. + * @property invalidHandleClasses + * @type string[] + */ + invalidHandleClasses: null, + + /** + * The linked element's absolute X position at the time the drag was + * started + * @property startPageX + * @type int + * @private + */ + startPageX: 0, + + /** + * The linked element's absolute X position at the time the drag was + * started + * @property startPageY + * @type int + * @private + */ + startPageY: 0, + + /** + * The group defines a logical collection of DragDrop objects that are + * related. Instances only get events when interacting with other + * DragDrop object in the same group. This lets us define multiple + * groups using a single DragDrop subclass if we want. + * @property groups + * @type {string: string} + */ + groups: null, + + /** + * Individual drag/drop instances can be locked. This will prevent + * onmousedown start drag. + * @property locked + * @type boolean + * @private + */ + locked: false, + + /** + * Lock this instance + * @method lock + */ + lock: function() { this.locked = true; }, + + /** + * Unlock this instace + * @method unlock + */ + unlock: function() { this.locked = false; }, + + /** + * By default, all insances can be a drop target. This can be disabled by + * setting isTarget to false. + * @method isTarget + * @type boolean + */ + isTarget: true, + + /** + * The padding configured for this drag and drop object for calculating + * the drop zone intersection with this object. + * @method padding + * @type int[] + */ + padding: null, + + /** + * Cached reference to the linked element + * @property _domRef + * @private + */ + _domRef: null, + + /** + * Internal typeof flag + * @property __ygDragDrop + * @private + */ + __ygDragDrop: true, + + /** + * Set to true when horizontal contraints are applied + * @property constrainX + * @type boolean + * @private + */ + constrainX: false, + + /** + * Set to true when vertical contraints are applied + * @property constrainY + * @type boolean + * @private + */ + constrainY: false, + + /** + * The left constraint + * @property minX + * @type int + * @private + */ + minX: 0, + + /** + * The right constraint + * @property maxX + * @type int + * @private + */ + maxX: 0, + + /** + * The up constraint + * @property minY + * @type int + * @type int + * @private + */ + minY: 0, + + /** + * The down constraint + * @property maxY + * @type int + * @private + */ + maxY: 0, + + /** + * Maintain offsets when we resetconstraints. Set to true when you want + * the position of the element relative to its parent to stay the same + * when the page changes + * + * @property maintainOffset + * @type boolean + */ + maintainOffset: false, + + /** + * Array of pixel locations the element will snap to if we specified a + * horizontal graduation/interval. This array is generated automatically + * when you define a tick interval. + * @property xTicks + * @type int[] + */ + xTicks: null, + + /** + * Array of pixel locations the element will snap to if we specified a + * vertical graduation/interval. This array is generated automatically + * when you define a tick interval. + * @property yTicks + * @type int[] + */ + yTicks: null, + + /** + * By default the drag and drop instance will only respond to the primary + * button click (left button for a right-handed mouse). Set to true to + * allow drag and drop to start with any mouse click that is propogated + * by the browser + * @property primaryButtonOnly + * @type boolean + */ + primaryButtonOnly: true, + + /** + * The availabe property is false until the linked dom element is accessible. + * @property available + * @type boolean + */ + available: false, + + /** + * By default, drags can only be initiated if the mousedown occurs in the + * region the linked element is. This is done in part to work around a + * bug in some browsers that mis-report the mousedown if the previous + * mouseup happened outside of the window. This property is set to true + * if outer handles are defined. + * + * @property hasOuterHandles + * @type boolean + * @default false + */ + hasOuterHandles: false, + + /** + * Code that executes immediately before the startDrag event + * @method b4StartDrag + * @private + */ + b4StartDrag: function(x, y) { }, + + /** + * Abstract method called after a drag/drop object is clicked + * and the drag or mousedown time thresholds have beeen met. + * @method startDrag + * @param {int} X click location + * @param {int} Y click location + */ + startDrag: function(x, y) { /* override this */ }, + + /** + * Code that executes immediately before the onDrag event + * @method b4Drag + * @private + */ + b4Drag: function(e) { }, + + /** + * Abstract method called during the onMouseMove event while dragging an + * object. + * @method onDrag + * @param {Event} e the mousemove event + */ + onDrag: function(e) { /* override this */ }, + + /** + * Abstract method called when this element fist begins hovering over + * another DragDrop obj + * @method onDragEnter + * @param {Event} e the mousemove event + * @param {String|DragDrop[]} id In POINT mode, the element + * id this is hovering over. In INTERSECT mode, an array of one or more + * dragdrop items being hovered over. + */ + onDragEnter: function(e, id) { /* override this */ }, + + /** + * Code that executes immediately before the onDragOver event + * @method b4DragOver + * @private + */ + b4DragOver: function(e) { }, + + /** + * Abstract method called when this element is hovering over another + * DragDrop obj + * @method onDragOver + * @param {Event} e the mousemove event + * @param {String|DragDrop[]} id In POINT mode, the element + * id this is hovering over. In INTERSECT mode, an array of dd items + * being hovered over. + */ + onDragOver: function(e, id) { /* override this */ }, + + /** + * Code that executes immediately before the onDragOut event + * @method b4DragOut + * @private + */ + b4DragOut: function(e) { }, + + /** + * Abstract method called when we are no longer hovering over an element + * @method onDragOut + * @param {Event} e the mousemove event + * @param {String|DragDrop[]} id In POINT mode, the element + * id this was hovering over. In INTERSECT mode, an array of dd items + * that the mouse is no longer over. + */ + onDragOut: function(e, id) { /* override this */ }, + + /** + * Code that executes immediately before the onDragDrop event + * @method b4DragDrop + * @private + */ + b4DragDrop: function(e) { }, + + /** + * Abstract method called when this item is dropped on another DragDrop + * obj + * @method onDragDrop + * @param {Event} e the mouseup event + * @param {String|DragDrop[]} id In POINT mode, the element + * id this was dropped on. In INTERSECT mode, an array of dd items this + * was dropped on. + */ + onDragDrop: function(e, id) { /* override this */ }, + + /** + * Abstract method called when this item is dropped on an area with no + * drop target + * @method onInvalidDrop + * @param {Event} e the mouseup event + */ + onInvalidDrop: function(e) { /* override this */ }, + + /** + * Code that executes immediately before the endDrag event + * @method b4EndDrag + * @private + */ + b4EndDrag: function(e) { }, + + /** + * Fired when we are done dragging the object + * @method endDrag + * @param {Event} e the mouseup event + */ + endDrag: function(e) { /* override this */ }, + + /** + * Code executed immediately before the onMouseDown event + * @method b4MouseDown + * @param {Event} e the mousedown event + * @private + */ + b4MouseDown: function(e) { }, + + /** + * Event handler that fires when a drag/drop obj gets a mousedown + * @method onMouseDown + * @param {Event} e the mousedown event + */ + onMouseDown: function(e) { /* override this */ }, + + /** + * Event handler that fires when a drag/drop obj gets a mouseup + * @method onMouseUp + * @param {Event} e the mouseup event + */ + onMouseUp: function(e) { /* override this */ }, + + /** + * Override the onAvailable method to do what is needed after the initial + * position was determined. + * @method onAvailable + */ + onAvailable: function () { + }, + + /** + * Returns a reference to the linked element + * @method getEl + * @return {HTMLElement} the html element + */ + getEl: function() { + if (!this._domRef) { + this._domRef = Dom.get(this.id); + } + + return this._domRef; + }, + + /** + * Returns a reference to the actual element to drag. By default this is + * the same as the html element, but it can be assigned to another + * element. An example of this can be found in YAHOO.util.DDProxy + * @method getDragEl + * @return {HTMLElement} the html element + */ + getDragEl: function() { + return Dom.get(this.dragElId); + }, + + /** + * Sets up the DragDrop object. Must be called in the constructor of any + * YAHOO.util.DragDrop subclass + * @method init + * @param id the id of the linked element + * @param {String} sGroup the group of related items + * @param {object} config configuration attributes + */ + init: function(id, sGroup, config) { + this.initTarget(id, sGroup, config); + Event.on(this.id, "mousedown", this.handleMouseDown, this, true); + // Event.on(this.id, "selectstart", Event.preventDefault); + }, + + /** + * Initializes Targeting functionality only... the object does not + * get a mousedown handler. + * @method initTarget + * @param id the id of the linked element + * @param {String} sGroup the group of related items + * @param {object} config configuration attributes + */ + initTarget: function(id, sGroup, config) { + + // configuration attributes + this.config = config || {}; + + // create a local reference to the drag and drop manager + this.DDM = YAHOO.util.DDM; + // initialize the groups array + this.groups = {}; + + // assume that we have an element reference instead of an id if the + // parameter is not a string + if (typeof id !== "string") { + YAHOO.log("id is not a string, assuming it is an HTMLElement"); + id = Dom.generateId(id); + } + + // set the id + this.id = id; + + // add to an interaction group + this.addToGroup((sGroup) ? sGroup : "default"); + + // We don't want to register this as the handle with the manager + // so we just set the id rather than calling the setter. + this.handleElId = id; + + Event.onAvailable(id, this.handleOnAvailable, this, true); + + + // the linked element is the element that gets dragged by default + this.setDragElId(id); + + // by default, clicked anchors will not start drag operations. + // @TODO what else should be here? Probably form fields. + this.invalidHandleTypes = { A: "A" }; + this.invalidHandleIds = {}; + this.invalidHandleClasses = []; + + this.applyConfig(); + }, + + /** + * Applies the configuration parameters that were passed into the constructor. + * This is supposed to happen at each level through the inheritance chain. So + * a DDProxy implentation will execute apply config on DDProxy, DD, and + * DragDrop in order to get all of the parameters that are available in + * each object. + * @method applyConfig + */ + applyConfig: function() { + + // configurable properties: + // padding, isTarget, maintainOffset, primaryButtonOnly + this.padding = this.config.padding || [0, 0, 0, 0]; + this.isTarget = (this.config.isTarget !== false); + this.maintainOffset = (this.config.maintainOffset); + this.primaryButtonOnly = (this.config.primaryButtonOnly !== false); + + }, + + /** + * Executed when the linked element is available + * @method handleOnAvailable + * @private + */ + handleOnAvailable: function() { + this.available = true; + this.resetConstraints(); + this.onAvailable(); + }, + + /** + * Configures the padding for the target zone in px. Effectively expands + * (or reduces) the virtual object size for targeting calculations. + * Supports css-style shorthand; if only one parameter is passed, all sides + * will have that padding, and if only two are passed, the top and bottom + * will have the first param, the left and right the second. + * @method setPadding + * @param {int} iTop Top pad + * @param {int} iRight Right pad + * @param {int} iBot Bot pad + * @param {int} iLeft Left pad + */ + setPadding: function(iTop, iRight, iBot, iLeft) { + // this.padding = [iLeft, iRight, iTop, iBot]; + if (!iRight && 0 !== iRight) { + this.padding = [iTop, iTop, iTop, iTop]; + } else if (!iBot && 0 !== iBot) { + this.padding = [iTop, iRight, iTop, iRight]; + } else { + this.padding = [iTop, iRight, iBot, iLeft]; + } + }, + + /** + * Stores the initial placement of the linked element. + * @method setInitialPosition + * @param {int} diffX the X offset, default 0 + * @param {int} diffY the Y offset, default 0 + */ + setInitPosition: function(diffX, diffY) { + var el = this.getEl(); + + if (!this.DDM.verifyEl(el)) { + return; + } + + var dx = diffX || 0; + var dy = diffY || 0; + + var p = Dom.getXY( el ); + + this.initPageX = p[0] - dx; + this.initPageY = p[1] - dy; + + this.lastPageX = p[0]; + this.lastPageY = p[1]; + + + this.setStartPosition(p); + }, + + /** + * Sets the start position of the element. This is set when the obj + * is initialized, the reset when a drag is started. + * @method setStartPosition + * @param pos current position (from previous lookup) + * @private + */ + setStartPosition: function(pos) { + var p = pos || Dom.getXY( this.getEl() ); + this.deltaSetXY = null; + + this.startPageX = p[0]; + this.startPageY = p[1]; + }, + + /** + * Add this instance to a group of related drag/drop objects. All + * instances belong to at least one group, and can belong to as many + * groups as needed. + * @method addToGroup + * @param sGroup {string} the name of the group + */ + addToGroup: function(sGroup) { + this.groups[sGroup] = true; + this.DDM.regDragDrop(this, sGroup); + }, + + /** + * Remove's this instance from the supplied interaction group + * @method removeFromGroup + * @param {string} sGroup The group to drop + */ + removeFromGroup: function(sGroup) { + if (this.groups[sGroup]) { + delete this.groups[sGroup]; + } + + this.DDM.removeDDFromGroup(this, sGroup); + }, + + /** + * Allows you to specify that an element other than the linked element + * will be moved with the cursor during a drag + * @method setDragElId + * @param id {string} the id of the element that will be used to initiate the drag + */ + setDragElId: function(id) { + this.dragElId = id; + }, + + /** + * Allows you to specify a child of the linked element that should be + * used to initiate the drag operation. An example of this would be if + * you have a content div with text and links. Clicking anywhere in the + * content area would normally start the drag operation. Use this method + * to specify that an element inside of the content div is the element + * that starts the drag operation. + * @method setHandleElId + * @param id {string} the id of the element that will be used to + * initiate the drag. + */ + setHandleElId: function(id) { + if (typeof id !== "string") { + YAHOO.log("id is not a string, assuming it is an HTMLElement"); + id = Dom.generateId(id); + } + this.handleElId = id; + this.DDM.regHandle(this.id, id); + }, + + /** + * Allows you to set an element outside of the linked element as a drag + * handle + * @method setOuterHandleElId + * @param id the id of the element that will be used to initiate the drag + */ + setOuterHandleElId: function(id) { + if (typeof id !== "string") { + YAHOO.log("id is not a string, assuming it is an HTMLElement"); + id = Dom.generateId(id); + } + Event.on(id, "mousedown", + this.handleMouseDown, this, true); + this.setHandleElId(id); + + this.hasOuterHandles = true; + }, + + /** + * Remove all drag and drop hooks for this element + * @method unreg + */ + unreg: function() { + Event.removeListener(this.id, "mousedown", + this.handleMouseDown); + this._domRef = null; + this.DDM._remove(this); + }, + + /** + * Returns true if this instance is locked, or the drag drop mgr is locked + * (meaning that all drag/drop is disabled on the page.) + * @method isLocked + * @return {boolean} true if this obj or all drag/drop is locked, else + * false + */ + isLocked: function() { + return (this.DDM.isLocked() || this.locked); + }, + + /** + * Fired when this object is clicked + * @method handleMouseDown + * @param {Event} e + * @param {YAHOO.util.DragDrop} oDD the clicked dd object (this dd obj) + * @private + */ + handleMouseDown: function(e, oDD) { + + var button = e.which || e.button; + + if (this.primaryButtonOnly && button > 1) { + return; + } + + if (this.isLocked()) { + return; + } + + this.DDM.refreshCache(this.groups); + // var self = this; + // setTimeout( function() { self.DDM.refreshCache(self.groups); }, 0); + + // Only process the event if we really clicked within the linked + // element. The reason we make this check is that in the case that + // another element was moved between the clicked element and the + // cursor in the time between the mousedown and mouseup events. When + // this happens, the element gets the next mousedown event + // regardless of where on the screen it happened. + var pt = new YAHOO.util.Point(Event.getPageX(e), Event.getPageY(e)); + if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) ) { + } else { + if (this.clickValidator(e)) { + + + // set the initial element position + this.setStartPosition(); + + + this.b4MouseDown(e); + this.onMouseDown(e); + this.DDM.handleMouseDown(e, this); + + this.DDM.stopEvent(e); + } else { + + + } + } + }, + + clickValidator: function(e) { + var target = Event.getTarget(e); + return ( this.isValidHandleChild(target) && + (this.id == this.handleElId || + this.DDM.handleWasClicked(target, this.id)) ); + }, + + /** + * Allows you to specify a tag name that should not start a drag operation + * when clicked. This is designed to facilitate embedding links within a + * drag handle that do something other than start the drag. + * @method addInvalidHandleType + * @param {string} tagName the type of element to exclude + */ + addInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + this.invalidHandleTypes[type] = type; + }, + + /** + * Lets you to specify an element id for a child of a drag handle + * that should not initiate a drag + * @method addInvalidHandleId + * @param {string} id the element id of the element you wish to ignore + */ + addInvalidHandleId: function(id) { + if (typeof id !== "string") { + YAHOO.log("id is not a string, assuming it is an HTMLElement"); + id = Dom.generateId(id); + } + this.invalidHandleIds[id] = id; + }, + + /** + * Lets you specify a css class of elements that will not initiate a drag + * @method addInvalidHandleClass + * @param {string} cssClass the class of the elements you wish to ignore + */ + addInvalidHandleClass: function(cssClass) { + this.invalidHandleClasses.push(cssClass); + }, + + /** + * Unsets an excluded tag name set by addInvalidHandleType + * @method removeInvalidHandleType + * @param {string} tagName the type of element to unexclude + */ + removeInvalidHandleType: function(tagName) { + var type = tagName.toUpperCase(); + // this.invalidHandleTypes[type] = null; + delete this.invalidHandleTypes[type]; + }, + + /** + * Unsets an invalid handle id + * @method removeInvalidHandleId + * @param {string} id the id of the element to re-enable + */ + removeInvalidHandleId: function(id) { + if (typeof id !== "string") { + YAHOO.log("id is not a string, assuming it is an HTMLElement"); + id = Dom.generateId(id); + } + delete this.invalidHandleIds[id]; + }, + + /** + * Unsets an invalid css class + * @method removeInvalidHandleClass + * @param {string} cssClass the class of the element(s) you wish to + * re-enable + */ + removeInvalidHandleClass: function(cssClass) { + for (var i=0, len=this.invalidHandleClasses.length; i= this.minX; i = i - iTickSize) { + if (!tickMap[i]) { + this.xTicks[this.xTicks.length] = i; + tickMap[i] = true; + } + } + + for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) { + if (!tickMap[i]) { + this.xTicks[this.xTicks.length] = i; + tickMap[i] = true; + } + } + + this.xTicks.sort(this.DDM.numericSort) ; + }, + + /** + * Create the array of vertical tick marks if an interval was specified in + * setYConstraint(). + * @method setYTicks + * @private + */ + setYTicks: function(iStartY, iTickSize) { + this.yTicks = []; + this.yTickSize = iTickSize; + + var tickMap = {}; + + for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) { + if (!tickMap[i]) { + this.yTicks[this.yTicks.length] = i; + tickMap[i] = true; + } + } + + for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) { + if (!tickMap[i]) { + this.yTicks[this.yTicks.length] = i; + tickMap[i] = true; + } + } + + this.yTicks.sort(this.DDM.numericSort) ; + }, + + /** + * By default, the element can be dragged any place on the screen. Use + * this method to limit the horizontal travel of the element. Pass in + * 0,0 for the parameters if you want to lock the drag to the y axis. + * @method setXConstraint + * @param {int} iLeft the number of pixels the element can move to the left + * @param {int} iRight the number of pixels the element can move to the + * right + * @param {int} iTickSize optional parameter for specifying that the + * element + * should move iTickSize pixels at a time. + */ + setXConstraint: function(iLeft, iRight, iTickSize) { + this.leftConstraint = iLeft; + this.rightConstraint = iRight; + + this.minX = this.initPageX - iLeft; + this.maxX = this.initPageX + iRight; + if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); } + + this.constrainX = true; + }, + + /** + * Clears any constraints applied to this instance. Also clears ticks + * since they can't exist independent of a constraint at this time. + * @method clearConstraints + */ + clearConstraints: function() { + this.constrainX = false; + this.constrainY = false; + this.clearTicks(); + }, + + /** + * Clears any tick interval defined for this instance + * @method clearTicks + */ + clearTicks: function() { + this.xTicks = null; + this.yTicks = null; + this.xTickSize = 0; + this.yTickSize = 0; + }, + + /** + * By default, the element can be dragged any place on the screen. Set + * this to limit the vertical travel of the element. Pass in 0,0 for the + * parameters if you want to lock the drag to the x axis. + * @method setYConstraint + * @param {int} iUp the number of pixels the element can move up + * @param {int} iDown the number of pixels the element can move down + * @param {int} iTickSize optional parameter for specifying that the + * element should move iTickSize pixels at a time. + */ + setYConstraint: function(iUp, iDown, iTickSize) { + this.topConstraint = iUp; + this.bottomConstraint = iDown; + + this.minY = this.initPageY - iUp; + this.maxY = this.initPageY + iDown; + if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); } + + this.constrainY = true; + + }, + + /** + * resetConstraints must be called if you manually reposition a dd element. + * @method resetConstraints + * @param {boolean} maintainOffset + */ + resetConstraints: function() { + + + // Maintain offsets if necessary + if (this.initPageX || this.initPageX === 0) { + // figure out how much this thing has moved + var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0; + var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0; + + this.setInitPosition(dx, dy); + + // This is the first time we have detected the element's position + } else { + this.setInitPosition(); + } + + if (this.constrainX) { + this.setXConstraint( this.leftConstraint, + this.rightConstraint, + this.xTickSize ); + } + + if (this.constrainY) { + this.setYConstraint( this.topConstraint, + this.bottomConstraint, + this.yTickSize ); + } + }, + + /** + * Normally the drag element is moved pixel by pixel, but we can specify + * that it move a number of pixels at a time. This method resolves the + * location when we have it set up like this. + * @method getTick + * @param {int} val where we want to place the object + * @param {int[]} tickArray sorted array of valid points + * @return {int} the closest tick + * @private + */ + getTick: function(val, tickArray) { + + if (!tickArray) { + // If tick interval is not defined, it is effectively 1 pixel, + // so we return the value passed to us. + return val; + } else if (tickArray[0] >= val) { + // The value is lower than the first tick, so we return the first + // tick. + return tickArray[0]; + } else { + for (var i=0, len=tickArray.length; i= val) { + var diff1 = val - tickArray[i]; + var diff2 = tickArray[next] - val; + return (diff2 > diff1) ? tickArray[i] : tickArray[next]; + } + } + + // The value is larger than the last tick, so we return the last + // tick. + return tickArray[tickArray.length - 1]; + } + }, + + /** + * toString method + * @method toString + * @return {string} string representation of the dd obj + */ + toString: function() { + return ("DragDrop " + this.id); + } + +}; + +})(); +/** + * The drag and drop utility provides a framework for building drag and drop + * applications. In addition to enabling drag and drop for specific elements, + * the drag and drop elements are tracked by the manager class, and the + * interactions between the various elements are tracked during the drag and + * the implementing code is notified about these important moments. + * @module dragdrop + * @title Drag and Drop + * @requires yahoo,dom,event + * @namespace YAHOO.util + */ + +// Only load the library once. Rewriting the manager class would orphan +// existing drag and drop instances. +if (!YAHOO.util.DragDropMgr) { + +/** + * DragDropMgr is a singleton that tracks the element interaction for + * all DragDrop items in the window. Generally, you will not call + * this class directly, but it does have helper methods that could + * be useful in your DragDrop implementations. + * @class DragDropMgr + * @static + */ +YAHOO.util.DragDropMgr = function() { + + var Event = YAHOO.util.Event; + + return { + + /** + * Two dimensional Array of registered DragDrop objects. The first + * dimension is the DragDrop item group, the second the DragDrop + * object. + * @property ids + * @type {string: string} + * @private + * @static + */ + ids: {}, + + /** + * Array of element ids defined as drag handles. Used to determine + * if the element that generated the mousedown event is actually the + * handle and not the html element itself. + * @property handleIds + * @type {string: string} + * @private + * @static + */ + handleIds: {}, + + /** + * the DragDrop object that is currently being dragged + * @property dragCurrent + * @type DragDrop + * @private + * @static + **/ + dragCurrent: null, + + /** + * the DragDrop object(s) that are being hovered over + * @property dragOvers + * @type Array + * @private + * @static + */ + dragOvers: {}, + + /** + * the X distance between the cursor and the object being dragged + * @property deltaX + * @type int + * @private + * @static + */ + deltaX: 0, + + /** + * the Y distance between the cursor and the object being dragged + * @property deltaY + * @type int + * @private + * @static + */ + deltaY: 0, + + /** + * Flag to determine if we should prevent the default behavior of the + * events we define. By default this is true, but this can be set to + * false if you need the default behavior (not recommended) + * @property preventDefault + * @type boolean + * @static + */ + preventDefault: true, + + /** + * Flag to determine if we should stop the propagation of the events + * we generate. This is true by default but you may want to set it to + * false if the html element contains other features that require the + * mouse click. + * @property stopPropagation + * @type boolean + * @static + */ + stopPropagation: true, + + /** + * Internal flag that is set to true when drag and drop has been + * intialized + * @property initialized + * @private + * @static + */ + initalized: false, + + /** + * All drag and drop can be disabled. + * @property locked + * @private + * @static + */ + locked: false, + + /** + * Called the first time an element is registered. + * @method init + * @private + * @static + */ + init: function() { + this.initialized = true; + }, + + /** + * In point mode, drag and drop interaction is defined by the + * location of the cursor during the drag/drop + * @property POINT + * @type int + * @static + */ + POINT: 0, + + /** + * In intersect mode, drag and drop interactio nis defined by the + * overlap of two or more drag and drop objects. + * @property INTERSECT + * @type int + * @static + */ + INTERSECT: 1, + + /** + * The current drag and drop mode. Default: POINT + * @property mode + * @type int + * @static + */ + mode: 0, + + /** + * Runs method on all drag and drop objects + * @method _execOnAll + * @private + * @static + */ + _execOnAll: function(sMethod, args) { + for (var i in this.ids) { + for (var j in this.ids[i]) { + var oDD = this.ids[i][j]; + if (! this.isTypeOfDD(oDD)) { + continue; + } + oDD[sMethod].apply(oDD, args); + } + } + }, + + /** + * Drag and drop initialization. Sets up the global event handlers + * @method _onLoad + * @private + * @static + */ + _onLoad: function() { + + this.init(); + + + Event.on(document, "mouseup", this.handleMouseUp, this, true); + Event.on(document, "mousemove", this.handleMouseMove, this, true); + Event.on(window, "unload", this._onUnload, this, true); + Event.on(window, "resize", this._onResize, this, true); + // Event.on(window, "mouseout", this._test); + + }, + + /** + * Reset constraints on all drag and drop objs + * @method _onResize + * @private + * @static + */ + _onResize: function(e) { + this._execOnAll("resetConstraints", []); + }, + + /** + * Lock all drag and drop functionality + * @method lock + * @static + */ + lock: function() { this.locked = true; }, + + /** + * Unlock all drag and drop functionality + * @method unlock + * @static + */ + unlock: function() { this.locked = false; }, + + /** + * Is drag and drop locked? + * @method isLocked + * @return {boolean} True if drag and drop is locked, false otherwise. + * @static + */ + isLocked: function() { return this.locked; }, + + /** + * Location cache that is set for all drag drop objects when a drag is + * initiated, cleared when the drag is finished. + * @property locationCache + * @private + * @static + */ + locationCache: {}, + + /** + * Set useCache to false if you want to force object the lookup of each + * drag and drop linked element constantly during a drag. + * @property useCache + * @type boolean + * @static + */ + useCache: true, + + /** + * The number of pixels that the mouse needs to move after the + * mousedown before the drag is initiated. Default=3; + * @property clickPixelThresh + * @type int + * @static + */ + clickPixelThresh: 3, + + /** + * The number of milliseconds after the mousedown event to initiate the + * drag if we don't get a mouseup event. Default=1000 + * @property clickTimeThresh + * @type int + * @static + */ + clickTimeThresh: 1000, + + /** + * Flag that indicates that either the drag pixel threshold or the + * mousdown time threshold has been met + * @property dragThreshMet + * @type boolean + * @private + * @static + */ + dragThreshMet: false, + + /** + * Timeout used for the click time threshold + * @property clickTimeout + * @type Object + * @private + * @static + */ + clickTimeout: null, + + /** + * The X position of the mousedown event stored for later use when a + * drag threshold is met. + * @property startX + * @type int + * @private + * @static + */ + startX: 0, + + /** + * The Y position of the mousedown event stored for later use when a + * drag threshold is met. + * @property startY + * @type int + * @private + * @static + */ + startY: 0, + + /** + * Each DragDrop instance must be registered with the DragDropMgr. + * This is executed in DragDrop.init() + * @method regDragDrop + * @param {DragDrop} oDD the DragDrop object to register + * @param {String} sGroup the name of the group this element belongs to + * @static + */ + regDragDrop: function(oDD, sGroup) { + if (!this.initialized) { this.init(); } + + if (!this.ids[sGroup]) { + this.ids[sGroup] = {}; + } + this.ids[sGroup][oDD.id] = oDD; + }, + + /** + * Removes the supplied dd instance from the supplied group. Executed + * by DragDrop.removeFromGroup, so don't call this function directly. + * @method removeDDFromGroup + * @private + * @static + */ + removeDDFromGroup: function(oDD, sGroup) { + if (!this.ids[sGroup]) { + this.ids[sGroup] = {}; + } + + var obj = this.ids[sGroup]; + if (obj && obj[oDD.id]) { + delete obj[oDD.id]; + } + }, + + /** + * Unregisters a drag and drop item. This is executed in + * DragDrop.unreg, use that method instead of calling this directly. + * @method _remove + * @private + * @static + */ + _remove: function(oDD) { + for (var g in oDD.groups) { + if (g && this.ids[g][oDD.id]) { + delete this.ids[g][oDD.id]; + } + } + delete this.handleIds[oDD.id]; + }, + + /** + * Each DragDrop handle element must be registered. This is done + * automatically when executing DragDrop.setHandleElId() + * @method regHandle + * @param {String} sDDId the DragDrop id this element is a handle for + * @param {String} sHandleId the id of the element that is the drag + * handle + * @static + */ + regHandle: function(sDDId, sHandleId) { + if (!this.handleIds[sDDId]) { + this.handleIds[sDDId] = {}; + } + this.handleIds[sDDId][sHandleId] = sHandleId; + }, + + /** + * Utility function to determine if a given element has been + * registered as a drag drop item. + * @method isDragDrop + * @param {String} id the element id to check + * @return {boolean} true if this element is a DragDrop item, + * false otherwise + * @static + */ + isDragDrop: function(id) { + return ( this.getDDById(id) ) ? true : false; + }, + + /** + * Returns the drag and drop instances that are in all groups the + * passed in instance belongs to. + * @method getRelated + * @param {DragDrop} p_oDD the obj to get related data for + * @param {boolean} bTargetsOnly if true, only return targetable objs + * @return {DragDrop[]} the related instances + * @static + */ + getRelated: function(p_oDD, bTargetsOnly) { + var oDDs = []; + for (var i in p_oDD.groups) { + for (j in this.ids[i]) { + var dd = this.ids[i][j]; + if (! this.isTypeOfDD(dd)) { + continue; + } + if (!bTargetsOnly || dd.isTarget) { + oDDs[oDDs.length] = dd; + } + } + } + + return oDDs; + }, + + /** + * Returns true if the specified dd target is a legal target for + * the specifice drag obj + * @method isLegalTarget + * @param {DragDrop} the drag obj + * @param {DragDrop} the target + * @return {boolean} true if the target is a legal target for the + * dd obj + * @static + */ + isLegalTarget: function (oDD, oTargetDD) { + var targets = this.getRelated(oDD, true); + for (var i=0, len=targets.length;i this.clickPixelThresh || + diffY > this.clickPixelThresh) { + this.startDrag(this.startX, this.startY); + } + } + + if (this.dragThreshMet) { + this.dragCurrent.b4Drag(e); + this.dragCurrent.onDrag(e); + this.fireEvents(e, false); + } + + this.stopEvent(e); + + return true; + }, + + /** + * Iterates over all of the DragDrop elements to find ones we are + * hovering over or dropping on + * @method fireEvents + * @param {Event} e the event + * @param {boolean} isDrop is this a drop op or a mouseover op? + * @private + * @static + */ + fireEvents: function(e, isDrop) { + var dc = this.dragCurrent; + + // If the user did the mouse up outside of the window, we could + // get here even though we have ended the drag. + if (!dc || dc.isLocked()) { + return; + } + + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + var pt = new YAHOO.util.Point(x,y); + + // cache the previous dragOver array + var oldOvers = []; + + var outEvts = []; + var overEvts = []; + var dropEvts = []; + var enterEvts = []; + + // Check to see if the object(s) we were hovering over is no longer + // being hovered over so we can fire the onDragOut event + for (var i in this.dragOvers) { + + var ddo = this.dragOvers[i]; + + if (! this.isTypeOfDD(ddo)) { + continue; + } + + if (! this.isOverTarget(pt, ddo, this.mode)) { + outEvts.push( ddo ); + } + + oldOvers[i] = true; + delete this.dragOvers[i]; + } + + for (var sGroup in dc.groups) { + + if ("string" != typeof sGroup) { + continue; + } + + for (i in this.ids[sGroup]) { + var oDD = this.ids[sGroup][i]; + if (! this.isTypeOfDD(oDD)) { + continue; + } + + if (oDD.isTarget && !oDD.isLocked() && oDD != dc) { + if (this.isOverTarget(pt, oDD, this.mode)) { + // look for drop interactions + if (isDrop) { + dropEvts.push( oDD ); + // look for drag enter and drag over interactions + } else { + + // initial drag over: dragEnter fires + if (!oldOvers[oDD.id]) { + enterEvts.push( oDD ); + // subsequent drag overs: dragOver fires + } else { + overEvts.push( oDD ); + } + + this.dragOvers[oDD.id] = oDD; + } + } + } + } + } + + if (this.mode) { + if (outEvts.length) { + dc.b4DragOut(e, outEvts); + dc.onDragOut(e, outEvts); + } + + if (enterEvts.length) { + dc.onDragEnter(e, enterEvts); + } + + if (overEvts.length) { + dc.b4DragOver(e, overEvts); + dc.onDragOver(e, overEvts); + } + + if (dropEvts.length) { + dc.b4DragDrop(e, dropEvts); + dc.onDragDrop(e, dropEvts); + } + + } else { + // fire dragout events + var len = 0; + for (i=0, len=outEvts.length; i + * YAHOO.util.DragDropMgr.refreshCache(ddinstance.groups); + * + * Alternatively: + * + * YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true}); + * + * @TODO this really should be an indexed array. Alternatively this + * method could accept both. + * @method refreshCache + * @param {Object} groups an associative array of groups to refresh + * @static + */ + refreshCache: function(groups) { + for (var sGroup in groups) { + if ("string" != typeof sGroup) { + continue; + } + for (var i in this.ids[sGroup]) { + var oDD = this.ids[sGroup][i]; + + if (this.isTypeOfDD(oDD)) { + // if (this.isTypeOfDD(oDD) && oDD.isTarget) { + var loc = this.getLocation(oDD); + if (loc) { + this.locationCache[oDD.id] = loc; + } else { + delete this.locationCache[oDD.id]; + // this will unregister the drag and drop object if + // the element is not in a usable state + // oDD.unreg(); + } + } + } + } + }, + + /** + * This checks to make sure an element exists and is in the DOM. The + * main purpose is to handle cases where innerHTML is used to remove + * drag and drop objects from the DOM. IE provides an 'unspecified + * error' when trying to access the offsetParent of such an element + * @method verifyEl + * @param {HTMLElement} el the element to check + * @return {boolean} true if the element looks usable + * @static + */ + verifyEl: function(el) { + try { + if (el) { + var parent = el.offsetParent; + if (parent) { + return true; + } + } + } catch(e) { + } + + return false; + }, + + /** + * Returns a Region object containing the drag and drop element's position + * and size, including the padding configured for it + * @method getLocation + * @param {DragDrop} oDD the drag and drop object to get the + * location for + * @return {YAHOO.util.Region} a Region object representing the total area + * the element occupies, including any padding + * the instance is configured for. + * @static + */ + getLocation: function(oDD) { + if (! this.isTypeOfDD(oDD)) { + return null; + } + + var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l; + + try { + pos= YAHOO.util.Dom.getXY(el); + } catch (e) { } + + if (!pos) { + return null; + } + + x1 = pos[0]; + x2 = x1 + el.offsetWidth; + y1 = pos[1]; + y2 = y1 + el.offsetHeight; + + t = y1 - oDD.padding[0]; + r = x2 + oDD.padding[1]; + b = y2 + oDD.padding[2]; + l = x1 - oDD.padding[3]; + + return new YAHOO.util.Region( t, r, b, l ); + }, + + /** + * Checks the cursor location to see if it over the target + * @method isOverTarget + * @param {YAHOO.util.Point} pt The point to evaluate + * @param {DragDrop} oTarget the DragDrop object we are inspecting + * @return {boolean} true if the mouse is over the target + * @private + * @static + */ + isOverTarget: function(pt, oTarget, intersect) { + // use cache if available + var loc = this.locationCache[oTarget.id]; + if (!loc || !this.useCache) { + loc = this.getLocation(oTarget); + this.locationCache[oTarget.id] = loc; + + } + + if (!loc) { + return false; + } + + oTarget.cursorIsOver = loc.contains( pt ); + + // DragDrop is using this as a sanity check for the initial mousedown + // in this case we are done. In POINT mode, if the drag obj has no + // contraints, we are also done. Otherwise we need to evaluate the + // location of the target as related to the actual location of the + // dragged element. + var dc = this.dragCurrent; + if (!dc || !dc.getTargetCoord || + (!intersect && !dc.constrainX && !dc.constrainY)) { + return oTarget.cursorIsOver; + } + + oTarget.overlap = null; + + // Get the current location of the drag element, this is the + // location of the mouse event less the delta that represents + // where the original mousedown happened on the element. We + // need to consider constraints and ticks as well. + var pos = dc.getTargetCoord(pt.x, pt.y); + + var el = dc.getDragEl(); + var curRegion = new YAHOO.util.Region( pos.y, + pos.x + el.offsetWidth, + pos.y + el.offsetHeight, + pos.x ); + + var overlap = curRegion.intersect(loc); + + if (overlap) { + oTarget.overlap = overlap; + return (intersect) ? true : oTarget.cursorIsOver; + } else { + return false; + } + }, + + /** + * unload event handler + * @method _onUnload + * @private + * @static + */ + _onUnload: function(e, me) { + this.unregAll(); + }, + + /** + * Cleans up the drag and drop events and objects. + * @method unregAll + * @private + * @static + */ + unregAll: function() { + + if (this.dragCurrent) { + this.stopDrag(); + this.dragCurrent = null; + } + + this._execOnAll("unreg", []); + + for (i in this.elementCache) { + delete this.elementCache[i]; + } + + this.elementCache = {}; + this.ids = {}; + }, + + /** + * A cache of DOM elements + * @property elementCache + * @private + * @static + */ + elementCache: {}, + + /** + * Get the wrapper for the DOM element specified + * @method getElWrapper + * @param {String} id the id of the element to get + * @return {YAHOO.util.DDM.ElementWrapper} the wrapped element + * @private + * @deprecated This wrapper isn't that useful + * @static + */ + getElWrapper: function(id) { + var oWrapper = this.elementCache[id]; + if (!oWrapper || !oWrapper.el) { + oWrapper = this.elementCache[id] = + new this.ElementWrapper(YAHOO.util.Dom.get(id)); + } + return oWrapper; + }, + + /** + * Returns the actual DOM element + * @method getElement + * @param {String} id the id of the elment to get + * @return {Object} The element + * @deprecated use YAHOO.util.Dom.get instead + * @static + */ + getElement: function(id) { + return YAHOO.util.Dom.get(id); + }, + + /** + * Returns the style property for the DOM element (i.e., + * document.getElById(id).style) + * @method getCss + * @param {String} id the id of the elment to get + * @return {Object} The style property of the element + * @deprecated use YAHOO.util.Dom instead + * @static + */ + getCss: function(id) { + var el = YAHOO.util.Dom.get(id); + return (el) ? el.style : null; + }, + + /** + * Inner class for cached elements + * @class DragDropMgr.ElementWrapper + * @for DragDropMgr + * @private + * @deprecated + */ + ElementWrapper: function(el) { + /** + * The element + * @property el + */ + this.el = el || null; + /** + * The element id + * @property id + */ + this.id = this.el && el.id; + /** + * A reference to the style property + * @property css + */ + this.css = this.el && el.style; + }, + + /** + * Returns the X position of an html element + * @method getPosX + * @param el the element for which to get the position + * @return {int} the X coordinate + * @for DragDropMgr + * @deprecated use YAHOO.util.Dom.getX instead + * @static + */ + getPosX: function(el) { + return YAHOO.util.Dom.getX(el); + }, + + /** + * Returns the Y position of an html element + * @method getPosY + * @param el the element for which to get the position + * @return {int} the Y coordinate + * @deprecated use YAHOO.util.Dom.getY instead + * @static + */ + getPosY: function(el) { + return YAHOO.util.Dom.getY(el); + }, + + /** + * Swap two nodes. In IE, we use the native method, for others we + * emulate the IE behavior + * @method swapNode + * @param n1 the first node to swap + * @param n2 the other node to swap + * @static + */ + swapNode: function(n1, n2) { + if (n1.swapNode) { + n1.swapNode(n2); + } else { + var p = n2.parentNode; + var s = n2.nextSibling; + + if (s == n1) { + p.insertBefore(n1, n2); + } else if (n2 == n1.nextSibling) { + p.insertBefore(n2, n1); + } else { + n1.parentNode.replaceChild(n2, n1); + p.insertBefore(n1, s); + } + } + }, + + /** + * Returns the current scroll position + * @method getScroll + * @private + * @static + */ + getScroll: function () { + var t, l, dde=document.documentElement, db=document.body; + if (dde && (dde.scrollTop || dde.scrollLeft)) { + t = dde.scrollTop; + l = dde.scrollLeft; + } else if (db) { + t = db.scrollTop; + l = db.scrollLeft; + } else { + YAHOO.log("could not get scroll property"); + } + return { top: t, left: l }; + }, + + /** + * Returns the specified element style property + * @method getStyle + * @param {HTMLElement} el the element + * @param {string} styleProp the style property + * @return {string} The value of the style property + * @deprecated use YAHOO.util.Dom.getStyle + * @static + */ + getStyle: function(el, styleProp) { + return YAHOO.util.Dom.getStyle(el, styleProp); + }, + + /** + * Gets the scrollTop + * @method getScrollTop + * @return {int} the document's scrollTop + * @static + */ + getScrollTop: function () { return this.getScroll().top; }, + + /** + * Gets the scrollLeft + * @method getScrollLeft + * @return {int} the document's scrollTop + * @static + */ + getScrollLeft: function () { return this.getScroll().left; }, + + /** + * Sets the x/y position of an element to the location of the + * target element. + * @method moveToEl + * @param {HTMLElement} moveEl The element to move + * @param {HTMLElement} targetEl The position reference element + * @static + */ + moveToEl: function (moveEl, targetEl) { + var aCoord = YAHOO.util.Dom.getXY(targetEl); + YAHOO.util.Dom.setXY(moveEl, aCoord); + }, + + /** + * Gets the client height + * @method getClientHeight + * @return {int} client height in px + * @deprecated use YAHOO.util.Dom.getViewportHeight instead + * @static + */ + getClientHeight: function() { + return YAHOO.util.Dom.getViewportHeight(); + }, + + /** + * Gets the client width + * @method getClientWidth + * @return {int} client width in px + * @deprecated use YAHOO.util.Dom.getViewportWidth instead + * @static + */ + getClientWidth: function() { + return YAHOO.util.Dom.getViewportWidth(); + }, + + /** + * Numeric array sort function + * @method numericSort + * @static + */ + numericSort: function(a, b) { return (a - b); }, + + /** + * Internal counter + * @property _timeoutCount + * @private + * @static + */ + _timeoutCount: 0, + + /** + * Trying to make the load order less important. Without this we get + * an error if this file is loaded before the Event Utility. + * @method _addListeners + * @private + * @static + */ + _addListeners: function() { + var DDM = YAHOO.util.DDM; + if ( YAHOO.util.Event && document ) { + DDM._onLoad(); + } else { + if (DDM._timeoutCount > 2000) { + } else { + setTimeout(DDM._addListeners, 10); + if (document && document.body) { + DDM._timeoutCount += 1; + } + } + } + }, + + /** + * Recursively searches the immediate parent and all child nodes for + * the handle element in order to determine wheter or not it was + * clicked. + * @method handleWasClicked + * @param node the html element to inspect + * @static + */ + handleWasClicked: function(node, id) { + if (this.isHandle(id, node.id)) { + return true; + } else { + // check to see if this is a text node child of the one we want + var p = node.parentNode; + + while (p) { + if (this.isHandle(id, p.id)) { + return true; + } else { + p = p.parentNode; + } + } + } + + return false; + } + + }; + +}(); + +// shorter alias, save a few bytes +YAHOO.util.DDM = YAHOO.util.DragDropMgr; +YAHOO.util.DDM._addListeners(); + +} + +/** + * A DragDrop implementation where the linked element follows the + * mouse cursor during a drag. + * @class DD + * @extends YAHOO.util.DragDrop + * @constructor + * @param {String} id the id of the linked element + * @param {String} sGroup the group of related DragDrop items + * @param {object} config an object containing configurable attributes + * Valid properties for DD: + * scroll + */ +YAHOO.util.DD = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + } +}; + +YAHOO.extend(YAHOO.util.DD, YAHOO.util.DragDrop, { + + /** + * When set to true, the utility automatically tries to scroll the browser + * window wehn a drag and drop element is dragged near the viewport boundary. + * Defaults to true. + * @property scroll + * @type boolean + */ + scroll: true, + + /** + * Sets the pointer offset to the distance between the linked element's top + * left corner and the location the element was clicked + * @method autoOffset + * @param {int} iPageX the X coordinate of the click + * @param {int} iPageY the Y coordinate of the click + */ + autoOffset: function(iPageX, iPageY) { + var x = iPageX - this.startPageX; + var y = iPageY - this.startPageY; + this.setDelta(x, y); + }, + + /** + * Sets the pointer offset. You can call this directly to force the + * offset to be in a particular location (e.g., pass in 0,0 to set it + * to the center of the object, as done in YAHOO.widget.Slider) + * @method setDelta + * @param {int} iDeltaX the distance from the left + * @param {int} iDeltaY the distance from the top + */ + setDelta: function(iDeltaX, iDeltaY) { + this.deltaX = iDeltaX; + this.deltaY = iDeltaY; + }, + + /** + * Sets the drag element to the location of the mousedown or click event, + * maintaining the cursor location relative to the location on the element + * that was clicked. Override this if you want to place the element in a + * location other than where the cursor is. + * @method setDragElPos + * @param {int} iPageX the X coordinate of the mousedown or drag event + * @param {int} iPageY the Y coordinate of the mousedown or drag event + */ + setDragElPos: function(iPageX, iPageY) { + // the first time we do this, we are going to check to make sure + // the element has css positioning + + var el = this.getDragEl(); + this.alignElWithMouse(el, iPageX, iPageY); + }, + + /** + * Sets the element to the location of the mousedown or click event, + * maintaining the cursor location relative to the location on the element + * that was clicked. Override this if you want to place the element in a + * location other than where the cursor is. + * @method alignElWithMouse + * @param {HTMLElement} el the element to move + * @param {int} iPageX the X coordinate of the mousedown or drag event + * @param {int} iPageY the Y coordinate of the mousedown or drag event + */ + alignElWithMouse: function(el, iPageX, iPageY) { + var oCoord = this.getTargetCoord(iPageX, iPageY); + + if (!this.deltaSetXY) { + var aCoord = [oCoord.x, oCoord.y]; + YAHOO.util.Dom.setXY(el, aCoord); + var newLeft = parseInt( YAHOO.util.Dom.getStyle(el, "left"), 10 ); + var newTop = parseInt( YAHOO.util.Dom.getStyle(el, "top" ), 10 ); + + this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ]; + } else { + YAHOO.util.Dom.setStyle(el, "left", (oCoord.x + this.deltaSetXY[0]) + "px"); + YAHOO.util.Dom.setStyle(el, "top", (oCoord.y + this.deltaSetXY[1]) + "px"); + } + + this.cachePosition(oCoord.x, oCoord.y); + this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth); + }, + + /** + * Saves the most recent position so that we can reset the constraints and + * tick marks on-demand. We need to know this so that we can calculate the + * number of pixels the element is offset from its original position. + * @method cachePosition + * @param iPageX the current x position (optional, this just makes it so we + * don't have to look it up again) + * @param iPageY the current y position (optional, this just makes it so we + * don't have to look it up again) + */ + cachePosition: function(iPageX, iPageY) { + if (iPageX) { + this.lastPageX = iPageX; + this.lastPageY = iPageY; + } else { + var aCoord = YAHOO.util.Dom.getXY(this.getEl()); + this.lastPageX = aCoord[0]; + this.lastPageY = aCoord[1]; + } + }, + + /** + * Auto-scroll the window if the dragged object has been moved beyond the + * visible window boundary. + * @method autoScroll + * @param {int} x the drag element's x position + * @param {int} y the drag element's y position + * @param {int} h the height of the drag element + * @param {int} w the width of the drag element + * @private + */ + autoScroll: function(x, y, h, w) { + + if (this.scroll) { + // The client height + var clientH = this.DDM.getClientHeight(); + + // The client width + var clientW = this.DDM.getClientWidth(); + + // The amt scrolled down + var st = this.DDM.getScrollTop(); + + // The amt scrolled right + var sl = this.DDM.getScrollLeft(); + + // Location of the bottom of the element + var bot = h + y; + + // Location of the right of the element + var right = w + x; + + // The distance from the cursor to the bottom of the visible area, + // adjusted so that we don't scroll if the cursor is beyond the + // element drag constraints + var toBot = (clientH + st - y - this.deltaY); + + // The distance from the cursor to the right of the visible area + var toRight = (clientW + sl - x - this.deltaX); + + + // How close to the edge the cursor must be before we scroll + // var thresh = (document.all) ? 100 : 40; + var thresh = 40; + + // How many pixels to scroll per autoscroll op. This helps to reduce + // clunky scrolling. IE is more sensitive about this ... it needs this + // value to be higher. + var scrAmt = (document.all) ? 80 : 30; + + // Scroll down if we are near the bottom of the visible page and the + // obj extends below the crease + if ( bot > clientH && toBot < thresh ) { + window.scrollTo(sl, st + scrAmt); + } + + // Scroll up if the window is scrolled down and the top of the object + // goes above the top border + if ( y < st && st > 0 && y - st < thresh ) { + window.scrollTo(sl, st - scrAmt); + } + + // Scroll right if the obj is beyond the right border and the cursor is + // near the border. + if ( right > clientW && toRight < thresh ) { + window.scrollTo(sl + scrAmt, st); + } + + // Scroll left if the window has been scrolled to the right and the obj + // extends past the left border + if ( x < sl && sl > 0 && x - sl < thresh ) { + window.scrollTo(sl - scrAmt, st); + } + } + }, + + /** + * Finds the location the element should be placed if we want to move + * it to where the mouse location less the click offset would place us. + * @method getTargetCoord + * @param {int} iPageX the X coordinate of the click + * @param {int} iPageY the Y coordinate of the click + * @return an object that contains the coordinates (Object.x and Object.y) + * @private + */ + getTargetCoord: function(iPageX, iPageY) { + + + var x = iPageX - this.deltaX; + var y = iPageY - this.deltaY; + + if (this.constrainX) { + if (x < this.minX) { x = this.minX; } + if (x > this.maxX) { x = this.maxX; } + } + + if (this.constrainY) { + if (y < this.minY) { y = this.minY; } + if (y > this.maxY) { y = this.maxY; } + } + + x = this.getTick(x, this.xTicks); + y = this.getTick(y, this.yTicks); + + + return {x:x, y:y}; + }, + + /* + * Sets up config options specific to this class. Overrides + * YAHOO.util.DragDrop, but all versions of this method through the + * inheritance chain are called + */ + applyConfig: function() { + YAHOO.util.DD.superclass.applyConfig.call(this); + this.scroll = (this.config.scroll !== false); + }, + + /* + * Event that fires prior to the onMouseDown event. Overrides + * YAHOO.util.DragDrop. + */ + b4MouseDown: function(e) { + // this.resetConstraints(); + this.autoOffset(YAHOO.util.Event.getPageX(e), + YAHOO.util.Event.getPageY(e)); + }, + + /* + * Event that fires prior to the onDrag event. Overrides + * YAHOO.util.DragDrop. + */ + b4Drag: function(e) { + this.setDragElPos(YAHOO.util.Event.getPageX(e), + YAHOO.util.Event.getPageY(e)); + }, + + toString: function() { + return ("DD " + this.id); + } + + ////////////////////////////////////////////////////////////////////////// + // Debugging ygDragDrop events that can be overridden + ////////////////////////////////////////////////////////////////////////// + /* + startDrag: function(x, y) { + }, + + onDrag: function(e) { + }, + + onDragEnter: function(e, id) { + }, + + onDragOver: function(e, id) { + }, + + onDragOut: function(e, id) { + }, + + onDragDrop: function(e, id) { + }, + + endDrag: function(e) { + } + + */ + +}); +/** + * A DragDrop implementation that inserts an empty, bordered div into + * the document that follows the cursor during drag operations. At the time of + * the click, the frame div is resized to the dimensions of the linked html + * element, and moved to the exact location of the linked element. + * + * References to the "frame" element refer to the single proxy element that + * was created to be dragged in place of all DDProxy elements on the + * page. + * + * @class DDProxy + * @extends YAHOO.util.DD + * @constructor + * @param {String} id the id of the linked html element + * @param {String} sGroup the group of related DragDrop objects + * @param {object} config an object containing configurable attributes + * Valid properties for DDProxy in addition to those in DragDrop: + * resizeFrame, centerFrame, dragElId + */ +YAHOO.util.DDProxy = function(id, sGroup, config) { + if (id) { + this.init(id, sGroup, config); + this.initFrame(); + } +}; + +/** + * The default drag frame div id + * @property YAHOO.util.DDProxy.dragElId + * @type String + * @static + */ +YAHOO.util.DDProxy.dragElId = "ygddfdiv"; + +YAHOO.extend(YAHOO.util.DDProxy, YAHOO.util.DD, { + + /** + * By default we resize the drag frame to be the same size as the element + * we want to drag (this is to get the frame effect). We can turn it off + * if we want a different behavior. + * @property resizeFrame + * @type boolean + */ + resizeFrame: true, + + /** + * By default the frame is positioned exactly where the drag element is, so + * we use the cursor offset provided by YAHOO.util.DD. Another option that works only if + * you do not have constraints on the obj is to have the drag frame centered + * around the cursor. Set centerFrame to true for this effect. + * @property centerFrame + * @type boolean + */ + centerFrame: false, + + /** + * Creates the proxy element if it does not yet exist + * @method createFrame + */ + createFrame: function() { + var self = this; + var body = document.body; + + if (!body || !body.firstChild) { + setTimeout( function() { self.createFrame(); }, 50 ); + return; + } + + var div = this.getDragEl(); + + if (!div) { + div = document.createElement("div"); + div.id = this.dragElId; + var s = div.style; + + s.position = "absolute"; + s.visibility = "hidden"; + s.cursor = "move"; + s.border = "2px solid #aaa"; + s.zIndex = 999; + + // appendChild can blow up IE if invoked prior to the window load event + // while rendering a table. It is possible there are other scenarios + // that would cause this to happen as well. + body.insertBefore(div, body.firstChild); + } + }, + + /** + * Initialization for the drag frame element. Must be called in the + * constructor of all subclasses + * @method initFrame + */ + initFrame: function() { + this.createFrame(); + }, + + applyConfig: function() { + YAHOO.util.DDProxy.superclass.applyConfig.call(this); + + this.resizeFrame = (this.config.resizeFrame !== false); + this.centerFrame = (this.config.centerFrame); + this.setDragElId(this.config.dragElId || YAHOO.util.DDProxy.dragElId); + }, + + /** + * Resizes the drag frame to the dimensions of the clicked object, positions + * it over the object, and finally displays it + * @method showFrame + * @param {int} iPageX X click position + * @param {int} iPageY Y click position + * @private + */ + showFrame: function(iPageX, iPageY) { + var el = this.getEl(); + var dragEl = this.getDragEl(); + var s = dragEl.style; + + this._resizeProxy(); + + if (this.centerFrame) { + this.setDelta( Math.round(parseInt(s.width, 10)/2), + Math.round(parseInt(s.height, 10)/2) ); + } + + this.setDragElPos(iPageX, iPageY); + + YAHOO.util.Dom.setStyle(dragEl, "visibility", "visible"); + }, + + /** + * The proxy is automatically resized to the dimensions of the linked + * element when a drag is initiated, unless resizeFrame is set to false + * @method _resizeProxy + * @private + */ + _resizeProxy: function() { + if (this.resizeFrame) { + var DOM = YAHOO.util.Dom; + var el = this.getEl(); + var dragEl = this.getDragEl(); + + var bt = parseInt( DOM.getStyle(dragEl, "borderTopWidth" ), 10); + var br = parseInt( DOM.getStyle(dragEl, "borderRightWidth" ), 10); + var bb = parseInt( DOM.getStyle(dragEl, "borderBottomWidth" ), 10); + var bl = parseInt( DOM.getStyle(dragEl, "borderLeftWidth" ), 10); + + if (isNaN(bt)) { bt = 0; } + if (isNaN(br)) { br = 0; } + if (isNaN(bb)) { bb = 0; } + if (isNaN(bl)) { bl = 0; } + + + var newWidth = Math.max(0, el.offsetWidth - br - bl); + var newHeight = Math.max(0, el.offsetHeight - bt - bb); + + + DOM.setStyle( dragEl, "width", newWidth + "px" ); + DOM.setStyle( dragEl, "height", newHeight + "px" ); + } + }, + + // overrides YAHOO.util.DragDrop + b4MouseDown: function(e) { + var x = YAHOO.util.Event.getPageX(e); + var y = YAHOO.util.Event.getPageY(e); + this.autoOffset(x, y); + this.setDragElPos(x, y); + }, + + // overrides YAHOO.util.DragDrop + b4StartDrag: function(x, y) { + // show the drag frame + this.showFrame(x, y); + }, + + // overrides YAHOO.util.DragDrop + b4EndDrag: function(e) { + YAHOO.util.Dom.setStyle(this.getDragEl(), "visibility", "hidden"); + }, + + // overrides YAHOO.util.DragDrop + // By default we try to move the element to the last location of the frame. + // This is so that the default behavior mirrors that of YAHOO.util.DD. + endDrag: function(e) { + var DOM = YAHOO.util.Dom; + var lel = this.getEl(); + var del = this.getDragEl(); + + // Show the drag frame briefly so we can get its position + // del.style.visibility = ""; + DOM.setStyle(del, "visibility", ""); + + // Hide the linked element before the move to get around a Safari + // rendering bug. + //lel.style.visibility = "hidden"; + DOM.setStyle(lel, "visibility", "hidden"); + YAHOO.util.DDM.moveToEl(lel, del); + //del.style.visibility = "hidden"; + DOM.setStyle(del, "visibility", "hidden"); + //lel.style.visibility = ""; + DOM.setStyle(lel, "visibility", ""); + }, + + toString: function() { + return ("DDProxy " + this.id); + } + +}); +/** + * A DragDrop implementation that does not move, but can be a drop + * target. You would get the same result by simply omitting implementation + * for the event callbacks, but this way we reduce the processing cost of the + * event listener and the callbacks. + * @class DDTarget + * @extends YAHOO.util.DragDrop + * @constructor + * @param {String} id the id of the element that is a drop target + * @param {String} sGroup the group of related DragDrop objects + * @param {object} config an object containing configurable attributes + * Valid properties for DDTarget in addition to those in + * DragDrop: + * none + */ +YAHOO.util.DDTarget = function(id, sGroup, config) { + if (id) { + this.initTarget(id, sGroup, config); + } +}; + +// YAHOO.util.DDTarget.prototype = new YAHOO.util.DragDrop(); +YAHOO.extend(YAHOO.util.DDTarget, YAHOO.util.DragDrop, { + toString: function() { + return ("DDTarget " + this.id); + } +}); diff --git a/www/extras/yui/build/event/README b/www/extras/yui/build/event/README new file mode 100644 index 000000000..e6b1f9349 --- /dev/null +++ b/www/extras/yui/build/event/README @@ -0,0 +1,122 @@ + +YUI Library - Event - Release Notes + +0.12.0 + + * If the function argument is not provided to Event.removeListener, all + all listeners for the specified event type on the element will be removed. + + * CustomEvent now has an optional parameter that defines the signature of + the listeners for this event. Two signatures are supported: + + YAHOO.util.CustomEvent.LIST: + param1: event name + param2: array of arguments provided to fire() + param3: the custom object supplied to subscribe() + + YAHOO.util.CustomEvent.FLAT: + param1: the first argument provided to fire() + param2: the custom object supplied to subscribe() + + The new flat signature makes it possible to provide a better API + when using custom events, and it makes it possible to transparently + wrap DOM events. + + * The parameters for overriding scope in both Event.addListener, and + CustomEvent.subscribe have been augmented. In addition to the + previous behavior where a true value would make the previous parameter + the execution scope, an object can be supplied instead. If an object + is provided, that object becomes the scope obj. This makes it possible + to pass a both a custom object and adjust the scope to a different object. + + * Added EventProvider, which is a wrapper for CustomEvent that makes it + possible to subscribe to events by name, whether or not the event has + been created. This class was designed to be used with YAHOO.augment. + EventProvider custom events are created with the new FLAT listener + signature. + + * CustomEvent subscribers can return false to stop the propagation of + the event. + + * CustomEvents now have an onSubscribe custom event that can used to the + case where a subscriber subscribes to an one-time event that has already + happened. Also provides a way for the implementer to defer initialization + logic until after the first subscription. + + * Event.getCharCode now always returns keyCode if charCode is not available. + + * Added Event.onContentReady, which is similar to onAvailable, but it also + checks simblings to try to determine when the element's children are + available. + +0.11.4 + + * Fixed a memory leak in IE6 that occurred when the utility was hosted in + an iframe. + + * Fixed an issue with Safari click listeners when listeners were removed. + +0.11.3 + + * The listener cache is now pruned when events are removed. This fixes + a performance issue when adding many listeners, removing them, and + adding them again repeatedly. + + * Safari click listeners will work correctly if a bound element is removed + from the DOM and a new element with the same ID is added. + + * Removed the code that automatically unsubscribed custom event listeners. + +0.11.0 + + * Added Event.purgeElement which will remove all listeners added via + addListener from the supplied element. If an optional "type" parameter + is supplied, only events of that type will be removed. Optionally, the + purge can be performed recursively on the element's children as well. + + * Added Event.getListeners which will return all listeners attached to + a given element.. either all listeners or listeners of a specific type. + + * getTarget now automatically resolves text nodes. The optional parameter + for this feature is now deprecated. + + * getRelatedTarget now resolves text nodes for the browsers that return the + text node rather than its host HTML element. + + * CustomEvent now logs the custom event activity if the logger widget is available + +0.10.0 + + * Added Safari dblclick to the list of legacy events. + + * When multiple identical event handlers are defined, multiple calls + to removeListener can now remove all of them. + + * removeListener works properly for unload events + + * Legacy event bookkeeping is more efficient, improving the performance for + adding Safari click events. + + * _unload() is more efficient, improving the page transition experience in + Safari in particular. + + * addListener, removeListener now return false if the function argument is + not valid. + + * Fixed an operator precedence issue in getCharCode. + + * Added Event.getXY, which returns [Event.getPageX(e), Event.getPageY(e)] + + * Added Event.onAvailable, which will execute the callback when the element + with the supplied id is found. Currently searches periodically until the + window load event or for up to 10 seconds after the onAvailable method + was executed. + + * The lazy listener attachment process now will poll beyond the window load + event in order to better handle the case when a listener is defined + late in the page but before the element is in the dom. + + * Fixed browser detection for Opera installations reporting as IE. + + * It is now possible to remove and re-add legacy events (Safari click event). + diff --git a/www/extras/yui/build/event/event-debug.js b/www/extras/yui/build/event/event-debug.js new file mode 100644 index 000000000..77094e3cb --- /dev/null +++ b/www/extras/yui/build/event/event-debug.js @@ -0,0 +1,1766 @@ +/* +Copyright (c) 2006, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.net/yui/license.txt +version: 0.12.0 +*/ + + +/** + * The CustomEvent class lets you define events for your application + * that can be subscribed to by one or more independent component. + * + * @param {String} type The type of event, which is passed to the callback + * when the event fires + * @param {Object} oScope The context the event will fire from. "this" will + * refer to this object in the callback. Default value: + * the window object. The listener can override this. + * @param {boolean} silent pass true to prevent the event from writing to + * the log system + * @namespace YAHOO.util + * @class CustomEvent + * @constructor + */ +YAHOO.util.CustomEvent = function(type, oScope, silent, signature) { + + /** + * The type of event, returned to subscribers when the event fires + * @property type + * @type string + */ + this.type = type; + + /** + * The scope the the event will fire from by default. Defaults to the window + * obj + * @property scope + * @type object + */ + this.scope = oScope || window; + + /** + * By default all custom events are logged in the debug build, set silent + * to true to disable logging for this event. + * @property silent + * @type boolean + */ + this.silent = silent; + + /** + * Custom events support two styles of arguments provided to the event + * subscribers. + *
          + *
        • YAHOO.util.CustomEvent.LIST: + *
            + *
          • param1: event name
          • + *
          • param2: array of arguments sent to fire
          • + *
          • param3: a custom object supplied by the subscriber
          • + *
          + *
        • + *
        • YAHOO.util.CustomEvent.FLAT + *
            + *
          • param1: the first argument passed to fire. If you need to + * pass multiple parameters, use and array or object literal
          • + *
          • param2: a custom object supplied by the subscriber
          • + *
          + *
        • + *
        + * @property signature + * @type int + */ + this.signature = signature || YAHOO.util.CustomEvent.LIST; + + /** + * The subscribers to this event + * @property subscribers + * @type Subscriber[] + */ + this.subscribers = []; + + if (!this.silent) { + YAHOO.log( "Creating " + this, "info", "Event" ); + } + + var onsubscribeType = "_YUICEOnSubscribe"; + + // Only add subscribe events for events that are not generated by + // CustomEvent + if (type !== onsubscribeType) { + + /** + * Custom events provide a custom event that fires whenever there is + * a new subscriber to the event. This provides an opportunity to + * handle the case where there is a non-repeating event that has + * already fired has a new subscriber. + * + * @event subscribeEvent + * @type YAHOO.util.CustomEvent + * @param {Function} fn The function to execute + * @param {Object} obj An object to be passed along when the event + * fires + * @param {boolean|Object} override If true, the obj passed in becomes + * the execution scope of the listener. + * if an object, that object becomes the + * the execution scope. + */ + this.subscribeEvent = + new YAHOO.util.CustomEvent(onsubscribeType, this, true); + + } +}; + +/** + * Subscriber listener sigature constant. The LIST type returns three + * parameters: the event type, the array of args passed to fire, and + * the optional custom object + * @property YAHOO.util.CustomEvent.LIST + * @static + * @type int + */ +YAHOO.util.CustomEvent.LIST = 0; + +/** + * Subscriber listener sigature constant. The FLAT type returns two + * parameters: the first argument passed to fire and the optional + * custom object + * @property YAHOO.util.CustomEvent.FLAT + * @static + * @type int + */ +YAHOO.util.CustomEvent.FLAT = 1; + +YAHOO.util.CustomEvent.prototype = { + + /** + * Subscribes the caller to this event + * @method subscribe + * @param {Function} fn The function to execute + * @param {Object} obj An object to be passed along when the event + * fires + * @param {boolean|Object} override If true, the obj passed in becomes + * the execution scope of the listener. + * if an object, that object becomes the + * the execution scope. + */ + subscribe: function(fn, obj, override) { + if (this.subscribeEvent) { + this.subscribeEvent.fire(fn, obj, override); + } + + this.subscribers.push( new YAHOO.util.Subscriber(fn, obj, override) ); + }, + + /** + * Unsubscribes the caller from this event + * @method unsubscribe + * @param {Function} fn The function to execute + * @param {Object} obj The custom object passed to subscribe (optional) + * @return {boolean} True if the subscriber was found and detached. + */ + unsubscribe: function(fn, obj) { + var found = false; + for (var i=0, len=this.subscribers.length; i + *
      • The type of event
      • + *
      • All of the arguments fire() was executed with as an array
      • + *
      • The custom object (if any) that was passed into the subscribe() + * method
      • + *
      + * @method fire + * @param {Object*} arguments an arbitrary set of parameters to pass to + * the handler. + */ + fire: function() { + var len=this.subscribers.length; + if (!len && this.silent) { + return true; + } + + var args=[], ret=true, i; + + for (i=0; i" + (i+1) + ": " + s, + "info", "Event" ); + } + + var scope = s.getScope(this.scope); + + if (this.signature == YAHOO.util.CustomEvent.FLAT) { + var param = null; + if (args.length > 0) { + param = args[0]; + } + ret = s.fn.call(scope, param, s.obj); + } else { + ret = s.fn.call(scope, this.type, args, s.obj); + } + if (false === ret) { + if (!this.silent) { + YAHOO.log("Event cancelled, subscriber " + i + + " of " + len); + } + + //break; + return false; + } + } + } + + return true; + }, + + /** + * Removes all listeners + * @method unsubscribeAll + */ + unsubscribeAll: function() { + for (var i=0, len=this.subscribers.length; i